全部產品
Search
文件中心

SuperApp:【外掛程式開發】小程式資料上報外掛程式開發

更新時間:Jun 24, 2025

本文介紹小程式資料上報外掛程式及自訂方法

一、外掛程式架構及QuickTracking上報外掛程式整體介紹

data_analysis_diagram

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,並上報如圖的頁面參數

image.png

1.2.2 頁面跳轉

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

image.png

1.2.3 前台切後台

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

image.png

1.2.4 後台切前台

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

image.png

1.2.5 關閉小程式

如圖會調用JSAPI, WVMiniPageEvent上報onPageHideonPageEnd並上報如圖的頁面參數

image.png

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.0
pod '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()
    }
}

三、自訂上報外掛程式開發

image.jpeg

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

四、注意事項

  1. 開啟小程式介面後onPageShow會調用兩次

  2. iOS 小程式關閉不會調用onPageEnd事件(需要在關閉小程式的方法中調用關閉頁面的方法)