微应用
在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中进行传递。