本文介紹小程式資料上報外掛程式及自訂方法
一、外掛程式架構及QuickTracking上報外掛程式整體介紹

1. 前端部分說明
小程式整合 "MiniApp PageEvent Report JS-library" 擷取 "小程式頁面生命週期事件" 並通過jsapi發送給LifeCycleService。
注意:此功能僅支援WindVane
1.1 如何整合
如下,在小程式的html檔案中引入通過script標籤引入https://g.alicdn.com/code/npm/@alife/windvane-page-lifecycle-hooks/0.1.0/index.js,
注意該js的引入順序,必須在引入windvane.js後。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no, maximum-scale=1.0,viewport-fit=cover" />
<title>EMAS-WindVane JSBridge Demo</title>
<link rel="stylesheet" href="static/css/main.css" />
</head>
<body>
<div id="app"></div>
<!-- <script src="//g.alicdn.com/code/lib/react/18.2.0/umd/react.development.js"></script> -->
<!-- <script src="//g.alicdn.com/code/lib/react-dom/18.2.0/umd/react-dom.development.js"></script> -->
<!-- <script src="https://as.alipayobjects.com/g/component/fastclick/1.0.6/fastclick.js"></script> -->
<script src="https://g.alicdn.com/mtb/lib-windvane/3.0.0/windvane.js"></script>
<script src="https://g.alicdn.com/code/npm/@alife/windvane-page-lifecycle-hooks/0.1.0/index.js"></script>
<script src="static/js/bundle.js"></script>
</body>
</html>
1.2 同步小程式生命週期
小程式的生命週期如下:
onPageStart: 小程式初始化完成時觸發,全域只觸發一次
onPageShow: 小程式開啟頁面或從後台進入前台顯示時觸發
onPageHide:小程式離開頁面或從前台到後台時觸發
onPageEnd:小程式關閉
小程式上報的頁面參數如下:
url:當前頁面url,如 https://g.alicdn.com/superapp-fe-templates/JSAPITest/1.0.1/index.html#/
fullUrl:當前頁面url,如 https://g.alicdn.com/superapp-fe-templates/JSAPITest/1.0.1/index.html?spm=defwork.home.0.0.3f085c4bPdhs2c#/
title:當前頁面標題
userAgent: 當前裝置的navigator.userAgent, 如"Mozilla/5.0 (Linux; Android 11; IN2010 Build/RP1A.201005.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/132.0.6834.163 Mobile Safari/537.36 TTID/600000@DemoApp_Android_1.0.0 WindVane/8.5.0"
viewportHeight: 當前視窗高度,如744
viewportWidth: 當前視窗寬度,如384
referrer: 當前請求頁面的來源頁面的地址,如 https://1511899753493821546496.app.mini.windvane.suite.emas.alibaba.com/
user_id:目前使用者userId,在容器初始化註冊的EMASUserInfoService(iOS),IUserInfoService(Android )中的userId參數
mini_app_id:當前開啟的小程式的appId
mini_app_version: 當前開啟的小程式版本號碼
mini_app_type: 當前開啟的小程式類型,如windvane 或者 uniapp
app_code: 應用id, 容器初始化傳入的appCode
timestamp:頁面觸發目前時間戳
1.2.1 開啟小程式
如圖會調用JSAPI, WVMiniPageEvent上報onPageStart、onPageShow,並上報如圖的頁面參數

1.2.2 頁面跳轉
如圖會調用JSAPI, WVMiniPageEvent上報onPageHide當前頁面,onPageShow目標頁面,並上報如圖的頁面參數

1.2.3 前台切後台
如圖會調用JSAPI, WVMiniPageEvent上報onPageHide當前頁面,並上報如圖的頁面參數

1.2.4 後台切前台
如圖會調用JSAPI, WVMiniPageEvent上報onPageShow當前頁面,並上報如圖的頁面參數

1.2.5 關閉小程式
如圖會調用JSAPI, WVMiniPageEvent上報onPageHide、onPageEnd,並上報如圖的頁面參數

2. 用戶端說明
2.1 MiniApp Event: 監聽小程式生命週期事件 包括
MiniApp Life Cycle Event | Android Activity | iOS ViewController |
start | onCreate | viewDidLoad |
show | onResume | [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationWillEnterForeground:) name:UIApplicationWillEnterForegroundNotification object:nil]; |
hide | onPause | [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidEnterBackground:) name:UIApplicationDidEnterBackgroundNotification object:nil]; |
close | onDestory | viewWillDisappear (if (self.isMovingFromParentViewController|| self.navigationController.isBeingDismissed)) |
2.2 MiniAppPageEvent(僅支援WindVane): 監聽小程式頁面生命週期事件
2.3 PluginService:外掛程式架構用於外掛程式管理
用於註冊外掛程式
用於擷取指定外掛程式
2.4 LifeCycleService:
用於接收 MiniApp PageEvent Report JS-library 通過jsapi(MiniAppPageEvent jsapi)發送過來的小程式頁面生命週期事件MiniApp PageEvent Report JS-library
用於監聽 小程式周期(MiniApp Event)事件
將 小程式頁面生命週期事件 & 小程式生命週期事件 通過觀察者對象(Observer/Callback)發送給上報外掛程式
目前LifeCycleService 監聽的生命週期事件如下
事件類型/Event Type | 小程式頁面事件 Mini App Page Event | 小程式事件 Mini App Event |
開啟start | YES | YES |
顯示show | YES | YES |
隱藏hide | YES | YES |
關閉end/close | YES (only for Android) | YES |
二、自訂外掛程式開發 Custom Plugin Development
1. 匯入依賴包.
implementation com.aliyun.emas.suite.foundation:mini-app-plugin-base:1.0.0pod 'MiniAppPluginBase'2. 外掛程式開發.
import com.alibaba.emas.android.windvane.mini.app.pluginsdk.plugin.BasePlugin;
public class CustomPlugin extends BasePlugin {
public CustomPlugin(Context context, ...) {
super(context);
...
}
@Override
public void start() {
...
}
...
}#import <EMASMiniAppService/EMASBasePlugin.h>
@interface EMASCustomPlugin : EMASBasePlugin
@property(nonatomic, strong) EMASPluginContext *plugContext;
@implementation EMASCustomPlugin
- (void)setPluginContext:(EMASPluginContext *)pluginContext {
self.plugContext = pluginContext;
}
- (void)start {
[super start];
//需要註冊觀察者對象 register Observer Object
}
import UIKit
import EMASMiniAppService
@objc class EMASCustomPlugin: EMASBasePlugin, EMASIMiniAppEventObserver, EMASIMiniAppPageEventObserver {
var plugContext:EMASPluginContext?
//Note: need to call the Swift setPluginContext method, remember to add @objc
@objc func setPluginContext(_ pluginContext: EMASPluginContext) {
self.plugContext = pluginContext
}
override func start() {
super.start()
///需要註冊觀察者對象 register Observer Object
}
}3. 外掛程式註冊.
CustomPlugin customPlugin = new CustomPlugin(context, ...);
miniAppService.registerPlugin("PluginName", customPlugin);//初始化容器時
EMASCustomPlugin *plugin = [[EMASCustomPlugin alloc] init];
[miniAppService registerPlugin:@"PluginName" plugin:plugin];///初始化容器時
let plugin = EMASCustomPlugin()
miniAppService.registerPlugin("PluginName", plugin: plugin)4. 外掛程式擷取.
import com.alibaba.module.android.mini.app.service.plugin.PluginService;
BasePlugin plugin = PluginService.getInstance().getPlugin("PluginName");EMASBasePlugin *plugin = [miniAppService getPlugin:@"PluginName"];let plugin = miniAppService.getPlugin("PluginName")5. 外掛程式啟動.
import com.alibaba.module.android.mini.app.service.plugin.PluginService;
// 方式1
CustomPlugin customPlugin = new CustomPlugin(context, ...);
customPlugin.start();
// 方式2
BasePlugin plugin = PluginService.getInstance().getPlugin("PluginName");
plugin.start();
// 方式1
EMASCustomPlugin *plugin = [[EMASCustomPlugin alloc] init];
[miniAppService registerPlugin:@"PluginName" plugin:plugin];
[plugin start];
// 方式2
EMASBasePlugin *plugin = [miniAppService getPlugin:@"PluginName"];
[plugin start];
// 方式1
let plugin = EMASCustomPlugin()
miniAppService.registerPlugin("PluginName", plugin: plugin)
plugin.start()
// 方式2
let plugin = miniAppService.getPlugin("PluginName")
plugin.start()6. 在外掛程式中擷取LifeCycleService.
import com.alibaba.emas.android.windvane.mini.app.pluginsdk.environment.PluginEnv;
import com.alibaba.emas.android.windvane.mini.app.pluginsdk.ILifeCycleService;
ILifeCycleService lifeCycleService = PluginEnv.getInstance().getContainerContext().getLifeCycleService()#import <EMASMiniAppService/EMASLifeCycleService.h>
#import <EMASMiniAppService/EMASIMiniAppEventObserver.h>
#import <EMASMiniAppService/EMASIMiniAppPageEventObserver.h>
@interface EMASCustomPlugin()<EMASIMiniAppEventObserver, EMASIMiniAppPageEventObserver>
@property(nonatomic, strong) EMASPluginContext *plugContext;
@end
@implementation EMASCustomPlugin
- (void)getlifeCycleService {
EMASLifeCycleService *lifeCycleService = self.plugContext.context.getLifeCycleService;
}@objc class EMASCustomPlugin: EMASBasePlugin, EMASIMiniAppEventObserver, EMASIMiniAppPageEventObserver {
var plugContext:EMASPluginContext?
func getlifeCycleService() {
let lifeCycleService = self.plugContext?.context.getLifeCycleService()
}
}三、自訂上報外掛程式開發

1. 實現 小程式生命週期事件 和 小程式頁面生命週期事件 觀察者對象
小程式參數說明如下:
user_id:目前使用者userId,在容器初始化註冊的EMASUserInfoService(iOS),IUserInfoService(Android )中的userId參數
mini_app_id:當前開啟的小程式的appId
mini_app_version: 當前開啟的小程式版本號碼
mini_app_type: 當前開啟的小程式類型,如windvane 或者 uniapp
app_code: 應用id, 容器初始化傳入的appCode
timestamp:頁面觸發目前時間戳
import com.alibaba.emas.android.windvane.mini.app.pluginsdk.observer.IMiniAppEventObserver;
import com.alibaba.emas.android.windvane.mini.app.pluginsdk.observer.IMiniAppPageEventObserver;
import com.alibaba.emas.android.windvane.mini.app.pluginsdk.plugin.BasePlugin;
public class CustomReportPlugin extends BasePlugin implements IMiniAppEventObserver, IMiniAppPageEventObserver {
// 實現 小程式生命週期事件 回調
@Override
void onMiniAppStart(Map<String, Object> params) {
String userId = (String) params.get("user_id");
String appId = (String) params.get("mini_app_id");
String version = (String) params.get("mini_app_version");
String appType = (String) params.get("mini_app_type");
String appCode = (String) params.get("app_code");
String timestamp = (String) params.get("timestamp");
...
}
@Override
void onMiniAppClose(Map<String, Object> params) {
String userId = (String) params.get("user_id");
String appId = (String) params.get("mini_app_id");
String version = (String) params.get("mini_app_version");
String appType = (String) params.get("mini_app_type");
String appCode = (String) params.get("app_code");
String timestamp = (String) params.get("timestamp");
...
}
@Override
void onMiniAppShow(Map<String, Object> params) {
String userId = (String) params.get("user_id");
String appId = (String) params.get("mini_app_id");
String version = (String) params.get("mini_app_version");
String appType = (String) params.get("mini_app_type");
String appCode = (String) params.get("app_code");
String timestamp = (String) params.get("timestamp");
...
}
@Override
void onMiniAppHide(Map<String, Object> params) {
String userId = (String) params.get("user_id");
String appId = (String) params.get("mini_app_id");
String version = (String) params.get("mini_app_version");
String appType = (String) params.get("mini_app_type");
String appCode = (String) params.get("app_code");
String timestamp = (String) params.get("timestamp");
...
}
// 實現 小程式頁面生命週期事件 回調
void onPageStart(Map<String, Object> params) {
String url = (String) params.get("url");
String fullUrl = (String) params.get("fullUrl");
String title = (String) params.get("title");
String referrer = (String) params.get("referrer");
String userAgent = (String) params.get("userAgent");
double viewportWidth = (double) params.get("viewportWidth");
double viewportHeight = (double) params.get("viewportHeight");
String userId = (String) params.get("user_id");
String appId = (String) params.get("mini_app_id");
String version = (String) params.get("mini_app_version");
String appType = (String) params.get("mini_app_type");
String appCode = (String) params.get("app_code");
String timestamp = (String) params.get("timestamp");
...
}
void onPageHide(Map<String, Object> params) {
String url = (String) params.get("url");
String fullUrl = (String) params.get("fullUrl");
String title = (String) params.get("title");
String referrer = (String) params.get("referrer");
String userAgent = (String) params.get("userAgent");
double viewportWidth = (double) params.get("viewportWidth");
double viewportHeight = (double) params.get("viewportHeight");
String userId = (String) params.get("user_id");
String appId = (String) params.get("mini_app_id");
String version = (String) params.get("mini_app_version");
String appType = (String) params.get("mini_app_type");
String appCode = (String) params.get("app_code");
String timestamp = (String) params.get("timestamp");
...
}
void onPageShow(Map<String, Object> params) {
String url = (String) params.get("url");
String fullUrl = (String) params.get("fullUrl");
String title = (String) params.get("title");
String referrer = (String) params.get("referrer");
String userAgent = (String) params.get("userAgent");
double viewportWidth = (double) params.get("viewportWidth");
double viewportHeight = (double) params.get("viewportHeight");
String userId = (String) params.get("user_id");
String appId = (String) params.get("mini_app_id");
String version = (String) params.get("mini_app_version");
String appType = (String) params.get("mini_app_type");
String appCode = (String) params.get("app_code");
String timestamp = (String) params.get("timestamp");
...
}
void onPageEnd(Map<String, Object> params) {
String url = (String) params.get("url");
String fullUrl = (String) params.get("fullUrl");
String title = (String) params.get("title");
String referrer = (String) params.get("referrer");
String userAgent = (String) params.get("userAgent");
double viewportWidth = (double) params.get("viewportWidth");
double viewportHeight = (double) params.get("viewportHeight");
String userId = (String) params.get("user_id");
String appId = (String) params.get("mini_app_id");
String version = (String) params.get("mini_app_version");
String appType = (String) params.get("mini_app_type");
String appCode = (String) params.get("app_code");
String timestamp = (String) params.get("timestamp");
...
}
}@interface EMASCustomPlugin()<EMASIMiniAppEventObserver, EMASIMiniAppPageEventObserver>
@property(nonatomic, strong) EMASPluginContext *plugContext;
@end
@implementation EMASCustomPlugin
#pragma mark -EMASIMiniAppEventObserver
- (void)onMiniAppStart:(NSDictionary *)params {
NSString *appId = [params objectForKey:@"mini_app_id"];
NSString *appType = [params objectForKey:@"mini_app_type"];
NSString *userId = [params objectForKey:@"user_id"];
NSString *version = [params objectForKey:@"mini_app_version"];
NSString *appCode = [params objectForKey:@"app_code"];
NSString *timestamp = [params objectForKey:@"timestamp"];
...
}
-(void)onMiniAppShow:(NSDictionary *)params {
NSString *appId = [params objectForKey:@"mini_app_id"];
NSString *appType = [params objectForKey:@"mini_app_type"];
NSString *userId = [params objectForKey:@"user_id"];
NSString *version = [params objectForKey:@"mini_app_version"];
NSString *appCode = [params objectForKey:@"app_code"];
NSString *timestamp = [params objectForKey:@"timestamp"];
...
}
- (void)onMiniAppHide:(NSDictionary *)params {
NSString *appId = [params objectForKey:@"mini_app_id"];
NSString *appType = [params objectForKey:@"mini_app_type"];
NSString *userId = [params objectForKey:@"user_id"];
NSString *version = [params objectForKey:@"mini_app_version"];
NSString *appCode = [params objectForKey:@"app_code"];
NSString *timestamp = [params objectForKey:@"timestamp"];
...
}
- (void)onMiniAppClose:(NSDictionary *)params {
NSString *appId = [params objectForKey:@"mini_app_id"];
NSString *appType = [params objectForKey:@"mini_app_type"];
NSString *userId = [params objectForKey:@"user_id"];
NSString *version = [params objectForKey:@"mini_app_version"];
NSString *appCode = [params objectForKey:@"app_code"];
NSString *timestamp = [params objectForKey:@"timestamp"];
...
}
#pragma mark -EMASIMiniAppPageEventObserver
- (void)onPageStart:(NSDictionary *)params {
NSString *url = [params objectForKey:@"url"];
NSString *fullUrl = [params objectForKey:@"fullUrl"];
NSString *title = [params objectForKey:@"title"];
NSString *referrer = [params objectForKey:@"referrer"];
NSString *userAgent = [params objectForKey:@"userAgent"];
double viewportWidth = [params objectForKey:@"viewportWidth"];
double viewportHeight = [params objectForKey:@"viewportHeight"];
NSString *appId = [params objectForKey:@"mini_app_id"];
NSString *appType = [params objectForKey:@"mini_app_type"];
NSString *userId = [params objectForKey:@"user_id"];
NSString *version = [params objectForKey:@"mini_app_version"];
NSString *appCode = [params objectForKey:@"app_code"];
NSString *timestamp = [params objectForKey:@"timestamp"];
...
}
- (void)onPageShow:(NSDictionary *)params {
NSString *url = [params objectForKey:@"url"];
NSString *fullUrl = [params objectForKey:@"fullUrl"];
NSString *title = [params objectForKey:@"title"];
NSString *referrer = [params objectForKey:@"referrer"];
NSString *userAgent = [params objectForKey:@"userAgent"];
double viewportWidth = [params objectForKey:@"viewportWidth"];
double viewportHeight = [params objectForKey:@"viewportHeight"];
NSString *appId = [params objectForKey:@"mini_app_id"];
NSString *appType = [params objectForKey:@"mini_app_type"];
NSString *userId = [params objectForKey:@"user_id"];
NSString *version = [params objectForKey:@"mini_app_version"];
NSString *appCode = [params objectForKey:@"app_code"];
NSString *timestamp = [params objectForKey:@"timestamp"];
...
}
- (void)onPageHide:(NSDictionary *)params {
NSString *url = [params objectForKey:@"url"];
NSString *fullUrl = [params objectForKey:@"fullUrl"];
NSString *title = [params objectForKey:@"title"];
NSString *referrer = [params objectForKey:@"referrer"];
NSString *userAgent = [params objectForKey:@"userAgent"];
double viewportWidth = [params objectForKey:@"viewportWidth"];
double viewportHeight = [params objectForKey:@"viewportHeight"];
NSString *appId = [params objectForKey:@"mini_app_id"];
NSString *appType = [params objectForKey:@"mini_app_type"];
NSString *userId = [params objectForKey:@"user_id"];
NSString *version = [params objectForKey:@"mini_app_version"];
NSString *appCode = [params objectForKey:@"app_code"];
NSString *timestamp = [params objectForKey:@"timestamp"];
...
}
- (void)onPageEnd:(NSDictionary *)params {
// iOS端次方法不調用
}import UIKit
import EMASMiniAppService
@objc class EMASCustomPlugin: EMASBasePlugin, EMASIMiniAppEventObserver, EMASIMiniAppPageEventObserver {
var plugContext:EMASPluginContext?
///EMASIMiniAppEventObserver
func onMiniAppStart(_ params: [AnyHashable : Any]) {
let appId = params["mini_app_id"] as? String
let appType = params["mini_app_type"] as? String
let userId = params["user_id"] as? String
let version = params["mini_app_version"] as? String
let appCode = params["app_code"] as? String
let timestamp = params["timestamp"] as? String
}
func onMiniAppShow(_ params: [AnyHashable : Any]) {
let appId = params["mini_app_id"] as? String
let appType = params["mini_app_type"] as? String
let userId = params["user_id"] as? String
let version = params["mini_app_version"] as? String
let appCode = params["app_code"] as? String
let timestamp = params["timestamp"] as? String
}
func onMiniAppHide(_ params: [AnyHashable : Any]) {
let appId = params["mini_app_id"] as? String
let appType = params["mini_app_type"] as? String
let userId = params["user_id"] as? String
let version = params["mini_app_version"] as? String
let appCode = params["app_code"] as? String
let timestamp = params["timestamp"] as? String
}
func onMiniAppClose(_ params: [AnyHashable : Any]) {
let appId = params["mini_app_id"] as? String
let appType = params["mini_app_type"] as? String
let userId = params["user_id"] as? String
let version = params["mini_app_version"] as? String
let appCode = params["app_code"] as? String
let timestamp = params["timestamp"] as? String
}
///EMASIMiniAppPageEventObserver
func onPageStart(_ params: [AnyHashable : Any]) {
let url = params["url"] as? String
let fullUrl = params["fullUrl"] as? String
let title = params["title"] as? String
let referrer = params["referrer"] as? String
let userAgent = params["userAgent"] as? String
let viewportWidth = params["viewportWidth"] as? Double
let viewportHeight = params["viewportHeight"] as? Double
let appId = params["mini_app_id"] as? String
let appType = params["mini_app_type"] as? String
let userId = params["user_id"] as? String
let version = params["mini_app_version"] as? String
let appCode = params["app_code"] as? String
let timestamp = params["timestamp"] as? String
}
func onPageShow(_ params: [AnyHashable : Any]) {
let url = params["url"] as? String
let fullUrl = params["fullUrl"] as? String
let title = params["title"] as? String
let referrer = params["referrer"] as? String
let userAgent = params["userAgent"] as? String
let viewportWidth = params["viewportWidth"] as? Double
let viewportHeight = params["viewportHeight"] as? Double
let appId = params["mini_app_id"] as? String
let appType = params["mini_app_type"] as? String
let userId = params["user_id"] as? String
let version = params["mini_app_version"] as? String
let appCode = params["app_code"] as? String
let timestamp = params["timestamp"] as? String
}
func onPageHide(_ params: [AnyHashable : Any]) {
let url = params["url"] as? String
let fullUrl = params["fullUrl"] as? String
let title = params["title"] as? String
let referrer = params["referrer"] as? String
let userAgent = params["userAgent"] as? String
let viewportWidth = params["viewportWidth"] as? Double
let viewportHeight = params["viewportHeight"] as? Double
let appId = params["mini_app_id"] as? String
let appType = params["mini_app_type"] as? String
let userId = params["user_id"] as? String
let version = params["mini_app_version"] as? String
let appCode = params["app_code"] as? String
let timestamp = params["timestamp"] as? String
}
func onPageEnd(_ params: [AnyHashable : Any]) {
///iOS端次方法不調用
}
}2. 註冊觀察者對象
import com.alibaba.emas.android.windvane.mini.app.pluginsdk.environment.PluginEnv;
public class CustomReportPlugin extends BasePlugin implements IMiniAppEventObserver, IMiniAppPageEventObserver {
private void registerObserver() {
PluginEnv.getInstance().getContainerContext().getLifeCycleService().registerMiniAppObserver(this);
PluginEnv.getInstance().getContainerContext().getLifeCycleService().registerMiniPageObserver(this);
}
}
#import <EMASMiniAppService/EMASIMiniAppEventObserver.h>
#import <EMASMiniAppService/EMASIMiniAppPageEventObserver.h>
@interface EMASCustomPlugin()<EMASIMiniAppEventObserver, EMASIMiniAppPageEventObserver>
@property(nonatomic, strong) EMASPluginContext *plugContext;
@end
@implementation EMASCustomPlugin
- (void)registerObserver {
[self.plugContext.context.getLifeCycleService registerMiniAppObserver:self];
[self.plugContext.context.getLifeCycleService registerMiniPageObserver:self];
}import UIKit
import EMASMiniAppService
@objc class EMASCustomPlugin: EMASBasePlugin, EMASIMiniAppEventObserver, EMASIMiniAppPageEventObserver {
var plugContext:EMASPluginContext?
func registerObserver() {
self.plugContext?.context.getLifeCycleService().registerMiniAppObserver(self)
self.plugContext?.context.getLifeCycleService().registerMiniPageObserver(self)
}
}3. 註冊、擷取、啟動外掛程式
詳見 2.3 ~ 2.5
4. 其餘小程式事件
自訂jsapi
四、注意事項
開啟小程式介面後onPageShow會調用兩次
iOS 小程式關閉不會調用onPageEnd事件(需要在關閉小程式的方法中調用關閉頁面的方法)