微应用

在App开发过程中,我们通常把带有UI界面,功能相对独立的业务注册成微应用管理(如转账服务),这样可以与其他的业务进行解耦和隔离,也更方便在App内进行调用。

继承协议

在您的实现微应用的类中引入TMFRouter.h头文件

#import "TMFRouter.h"

实现协议TMFMicroAppContextProtocol

@interface TMFMicroAppTestA ()<TMFMicroAppContextProtocol>

@property (weak,nonatomic) UIViewController * rootVC;

@end

@implementation TMFMicroAppTestA

+ (void)registerMicroApp {

}

- (NSArray<NSString *> *)viewControllerURLsInMicroApp {
    return @[@"tmf://router/microApp/1",@"tmf://router/test/2/push"];
}

- (UIViewController *)rootVCInMicroApp {
    return self.rootVC;
}
@end

微应用注册方法

在+(void)registerMicroApp中,提供了注册服务的方法:

+ (void)registerMicroAppURL:(NSString * _Nonnull)appURL instanceHandler:(TMFMicroAppContextInstanceHandler _Nonnull)instanceHandler toHandler:(TMFMicroAppContextResultHandler _Nonnull)handler;

服务注册时,instanceHandler要传入您的微应用类的实例并返回,handler会传一个字典,包含了注册的 URL 中对应的变量,无返回值。具体使用方式如下:

[TMFMicroAppContext registerMicroAppURL:@"app://test/a" instanceHandler:^id{
    return [[TMFMicroAppTestA alloc] init];
} toHandler:^(id  _Nonnull instance, NSDictionary * _Nonnull microAppParameters) {
    TMFMicroAppTestA *testA = (TMFMicroAppTestA *)instance;
    NSString *param = microAppParameters[@"app"];
    testA.rootVC = [TMFURLRouter objectForURL:[@"tmf://router/microApp/1" appendingParams:@{@"titleStr":param}]];
}];

注意:microAppParameters里包含了传递各种参数,如果是基本类型参数,可以直接在microAppParameters中取到(这主要取决于您调用时把基本类型参数放到了哪里,请参阅调用方式),如果是block,则需要microAppParameters.routerUserInfo中提取。 toHandler 中必须返回微应用首页的VC实例,所以一个VC如果作为微应用的首页,则它注册页面路由时必须要用 + (void)registerURLPattern:(NSString *_Nonnull)urlPattern toObjectHandler:(TMFURLRouterObjectHandler _Nonnull)handler; 方法注册。

调用注册函数

TMFMicroAppContext并不推荐在+(void)load;中注册路由,因为这会拖慢App启动速度,所以您需要在微应用类中实现TMFMicroAppContextProtocol协议,并在合适的时机去注册微应用,推荐在AppDelegate的didFinishLaunchingWithOptions中注册,注册方式如下:

NSArray<NSString *> *array = @[@"TMFMicroAppTestA"];
    NSBundle *bundle = [NSBundle bundleForClass:self.class];
    NSString *bundleName = [bundle.bundlePath.lastPathComponent componentsSeparatedByString:@"."].firstObject;
    for (NSString *aClassName in array) {
        Class aClass = NSClassFromString(aClassName);
        if (!aClass) {
            aClass = NSClassFromString([NSString stringWithFormat:@"%@.%@", bundleName, aClassName]);
        }
        if (aClass) {
            id<TMFMicroAppContextProtocol> p = (id<TMFMicroAppContextProtocol>)aClass;
            [p registerMicroApp];
        }
    }

如果您的工程采用分模块的开发方式,推荐每个模块的头文件也继承TMFMicroAppContextProtocol协议,并实现+ (void)registerMicroApp;方法,将上述代码放到此方法实现中,再在AppDelegate的didFinishLaunchingWithOptions中调用模块的registerMicroApp方法注册。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    NSArray<NSString *> *array = @[@"TMFAppModule1", @"TMFAppModule2"];
    for (NSString *aClassName in array) {
        Class aClass = NSClassFromString(aClassName);
        if (aClass) {
            id<TMFMicroAppContextProtocol> p = (id<TMFMicroAppContextProtocol>)aClass;
            [p registerMicroApp];
        }
    }
}

调用方式

[TMFMicroAppContext openMicroAppWithURL:@"app://test/a?app=测试App"];

参数可以拼接到URL中进行传递。

Copyright © 2013-2023 Tencent Cloud. all right reserved,powered by GitbookUpdate Time 2023-08-31 14:46:07

results matching ""

    No results matching ""