由打断点调试,我们可以看到这些模块的加载顺序(如图所示):
我们分析一下No.1的MPaaSInterface+MPH5Demo_plugin.h,看一下源代码:
//
// MPaaSInterface+MPH5Demo_plugin.h
// MPH5Demo_plugin
//
// Created by vivi.yw on 2019/03/28.
// Copyright © 2019 Alibaba. All rights reserved.
//
#import <mPaas/MPaaSInterface.h>
@interface MPaaSInterface (MPH5Demo_plugin)
@end
原来又是MPaaSInterface的范畴(分类),那我们看一下 MPaaSInterface的头文件
//
// MPaaSInterface.h
// mPaas
//
// Created by shenmo on 6/3/16.
// Copyright © 2016 Alibaba. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface MPaaSInterface : NSObject
+ (instancetype)sharedInstance;
#pragma mark - 配置方法,通过Category覆盖以下方法实现应用的自定义配置
/**
* 是否允许使用MPaaS默认带的设置服务,这个设置服务比较轻量,只支持设置RPC、日志的网关地址与应用ID。
* 如果使用设置服务,需要将配置写在GatewayConfig.plist文件中。
* 默认返回NO。
*
* <!!!> 对RPC与日志模块来说,如果接入应用覆盖了DTRpcInterface与APLogAdditions的相关方法,那么SettingService的设置会失效。
*
* 接入方可以自己定义Settings.bundle来修改配置,不过选择的环境名称写入到NSUserDefaults后key必须为“kMPSelectedEnvironment”。
* 如果使用了设置服务,初始化时读取不到kMPSelectedEnvironment的值,会默认去GatewayConfig.plist文件中读取key为“Release”的配置字典。
* 默认的GatewayConfig.plist结构为:
* Root
* |- Debug (子项与Release相同)
* |- Sit (子项与Release相同)
* |- Release
* |- MPaaSLogGateway 日志服务器地址(类似“http://10.218.157.65”)
* |- MPaaSLogProductId 日志应用Id,通常为带平台的APPKEY加workspaceId(类似“APPKEY_IOS-0000017768”),对内部应用类似为“IPHONE_1ND”这种。
* |- MPaaSRpcGateway RPC网关地址(类似“http://42.120.224.143/mgw.htm”),开发阶段可以使用http,线上应该使用https。
* |- MPaaSRpcProductId RPC应用Id,对内部应用来说一般同mPaasLogProductId。
*/
- (BOOL)enableSettingService;
/**
* 升级组件、Hotpatch等拉取Rpc,或埋点日志上报时的userId。接入应用有自己的账户系统,需要实现这个方法,返回相应的userId值。如果是未登录态,可以返回nil。
* 默认返回 nil
* @return 当前的userId
*/
- (NSString*)userId;
/**
* 当前应用的schema,类似"alipay:"等。接入应用有自己的schema,需要实现这个方法,返回相应的schema值
* 默认返回 nil
* @return 当前应用的schema
*/
- (NSString *)appSchema;
@end
我们看一下源文件MPaaSInterface+MPH5Demo_plugin.m
#import "MPaaSInterface+MPH5Demo_plugin.h"
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wobjc-protocol-method-implementation"
@implementation MPaaSInterface (MPH5Demo_plugin)
- (BOOL)enableSettingService
{
return NO;
}
- (NSString *)userId
{
return nil;
}
@end
#pragma clang diagnostic pop
在No2,我们将group展开:
我们会发现,这块跟一个应用一样,居然也有App的委托对象;
这跟mPaaS的模块划分有关系,我们看一下官方文档:“mPaaS 框架内定义了微应用和服务的概念来进行模块间的划分。其中,以是否有 UI 界面作为标准,Framework 将不同的模块划分为 微应用 和 服务,通过 框架上下文 进行微应用与服务的生命周期管理。”
微应用:
官方文档的描述,“在基于 mPaaS iOS 框架开发应用的过程中,一般会将带有 UI 界面的独立业务设置为一个微应用(如支付宝中
的转账、手机充值等),与其他的业务隔离开,实现各个微应用之间高度独立,不相互依赖。
微应用也有自己的生命周期,整个过程如下”:
微应用整个生命周期的回调方法,具体内容参考 DTMicroApplicationDelegate.h 文件。
我们看一下DTMicroApplicationDelegate.h:
我们可以看到,与DTFrameworkInterface不同,DTMicroApplicationDelegate是一个协议,而不是类;
//
// DTMicroApplication.h
// Alipay Mobile Runtime Framework
//
// Created by WenBi on 13-3-30.
// Copyright (c) 2013年 Alipay. All rights reserved.
//
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
@class DTMicroApplication;
@protocol DTMicroApplicationDelegate <NSObject>
@required
/**
* 请求应用对象的代理返回根视图控制器。
*
* @param application 应用对象。
*
* @return 应用的根视图控制器。
*/
- (UIViewController *)rootControllerInApplication:(DTMicroApplication *)application;
@optional
/**
* 通知应用代理,应用对象已经对经被实例化。
*
* @param application 应用对象。
*/
- (void)applicationDidCreate:(DTMicroApplication *)application;
/**
* 通知应用代理,应用将要启动。
*
* @param application 启动的应用对象。
* @param options 应用运行参数。
*/
- (void)application:(DTMicroApplication *)application willStartLaunchingWithOptions:(NSDictionary *)options;
/**
* 通知应用代理,应用已启动。
*
* @param application 启动的应用对象。
*/
- (void)applicationDidFinishLaunching:(DTMicroApplication *)application;
/**
* 通知应用代理,应用即将暂停进入后台运行。
*
* @param application 启动的应用对象。
*/
- (void)applicationWillPause:(DTMicroApplication *)application;
/**
通知应用代理,应用即将暂停进入后台运行,并且从app栈中移除,并加入到缓存中
@param application application description
*/
- (void)applicationWillHide:(DTMicroApplication *)application;
/**
通知应用代理,应用即将暂停进入前台运行
@param application <#application description#>
*/
- (void)applicationWillShow:(DTMicroApplication *)application options:(NSDictionary *)options;
/**
通知应用代理,应用已经进入前台运行
@param application application description
*/
- (void)applicationDidShow:(DTMicroApplication *)application;
/**
* 通知应用代理,应用将被重新激活。
* 激活时机:1、显示调用startApp接口;2、它上面App退出,它将变成当前App;
* 注意:willResumeWithOptions 代理方法只实现一个,否则两个方法都会回调的。
*
* @param application 要激活的应用对象。
*/
- (void)application:(DTMicroApplication *)application willResumeWithOptions:(NSDictionary *)options;
/**
* 通知应用代理,应用将被重新激活。
* 激活时机:1、显示调用startApp接口;2、它上面App退出,它将变成当前App;
* 注意:willResumeWithOptions 代理方法只实现一个,否则两个方法都会回调的。
*
* @param application 要激活的应用对象。
* @param isStartApp 是否通过startApp方式触发的;
*/
- (void)application:(DTMicroApplication *)application willResumeWithOptions:(NSDictionary *)options isStartApp:(BOOL)isStartApp;
/**
* 通知应用代理,应用已经被激活。
*
* @param application 要激活的应用对象。
*/
- (void)applicationDidResume:(DTMicroApplication *)application;
/**
* 通知应用代理,应用已经被激活。
*
* @param application 要激活的应用对象,带上参数的版本。
*/
- (void)application:(DTMicroApplication *)application didResumeWithOptions:(NSDictionary *)options;
/**
* 通知应用的代理,应用将要退出。
*
* @param application 应用对象。
*/
- (void)applicationWillTerminate:(DTMicroApplication *)application;
/**
* 通知应用的代理,应用将要退出。
*
* @param application 应用对象。
* @param animated 是否以动画方式退出。
*/
- (void)applicationWillTerminate:(DTMicroApplication *)application animated:(BOOL)animated;
/**
* 询问应用的代理,应用是否可以启动。
* 注意:只用特殊情况返回:NO,要保证默认是YES才可以启动的。
*
* @param application 应用对象。
* @param params 启动参数。
* @param launchMode 启动方式。
*
* @return 是否可以启动
*/
- (BOOL)applicationShouldStart:(DTMicroApplication *)application params:(NSDictionary *)params aunchMode:(DTMicroApplicationLaunchMode) launchMode;
/**
* 询问应用的代理,应用是否在真正启动时中断启动。
* 注意:只用特殊情况返回:YES,要保证默认是NO才可以启动的。
*
* @param application 应用对象。
* @param params 启动参数。
* @param launchMode 启动方式。
*
* @return 是否终止启动
*/
- (BOOL)applicationInterruptStart:(DTMicroApplication *)application params:(NSDictionary *)params aunchMode:(DTMicroApplicationLaunchMode) launchMode;
/**
* 询问应用的代理是否要启动多个应用对象。
* 注意:默认是NO标识不支持;业务可以通过参数params,sourceId,栈顶App等来决定是否返回YES;
*
* @param params 启动参数。
* @param launchMode 启动方式。
* @param sourceId 启动来源。
*
* @return 返回YES创建一个新的App对象,否则不创建新app对象。
*/
- (BOOL)applicationShouldStartMultapplication:(NSDictionary *)params launchMode:(DTMicroApplicationLaunchMode) launchMode sourceId:(NSString *)sourceId;
/**
* 询问应用的代理是否要启动多个应用对象。
* 注意:1、默认是NO标识不支持;业务可以通过参数params,sourceId,栈顶App等来决定是否返回YES;
* 2、针对appDelegate处理多个app的情况;
*
* @param appId appId。
* @param params 启动参数。
* @param launchMode 启动方式。
* @param sourceId 启动来源。
*
* @return 返回YES创建一个新的App对象,否则不创建新app对象。
*/
- (BOOL)applicationShouldStartMultapplication:(NSString *)appId params:(NSDictionary *)params launchMode:(DTMicroApplicationLaunchMode) launchMode sourceId:(NSString *)sourceId;
/**
* 询问应用的代理,应用是否可以退出
* 注意:只用特殊情况返回:NO,要保证默认是YES才可以退出的。
*
* @param application 应用对象。
*
* @return 是否可以退出
*/
- (BOOL)applicationShouldTerminate:(DTMicroApplication *)application;
/**
* 询问应用的代理,是否以无动画启动rootViewController
* 注意:如果返回YES,则屏蔽startApplication的动画设置
*
* @param application 应用对象。
*
* @return YES:无动画启动;NO:默认处理方式
*/
- (BOOL)applicationStartRootControllerWithNoAnimation:(DTMicroApplication *)application;
/**
* 通知应用代理,收到通知消息。
*
* @param application 应用对象。
* @param userInfo 封装消息信息。
* @param completion 执行完成的block回调。
*/
- (void)application:(DTMicroApplication *)application didReceviceMessage:(NSDictionary *)userInfo completion:(void(^)(NSDictionary *result))completion;
/**
* 通知应用的代理,应用将以Present方式启动viewController
*
* @param application 应用对象。
* @param params 启动参数。
* @param navigationController 导航控制器。
*
* @return 无
*/
- (void)applicationShouldPresent:(DTMicroApplication *)application params:(NSDictionary *)params navigationController:(UINavigationController *)navigationController;
/**
* 通知应用的代理,应用已经Present方式启动viewController完成。
*
* @param application 应用对象。
* @param params 启动参数。
*
* @return 无
*/
- (void)applicationDidPresent:(DTMicroApplication *)application params:(NSDictionary *)params;
/**
* 返回应用的启动方式,通过该方法可以动态的修改app的启动方式。
*
* @param application 应用对象。
* @param params 启动参数。
*
* @return 返回应用的启动方式。
*/
- (DTMicroApplicationLaunchMode)applicationLaunchMode:(DTMicroApplication *)application params:(NSDictionary *)params;
/**
返回应用是否需要延时释放
@param application application description
@return YES or NO
*/
- (BOOL)applicationShouldDelayRelease:(DTMicroApplication *)application;
/**
返回本次应用能否需要保活,如果调用到此函数,说明保活数组中有此app,
@param application application description
@return YES or NO
*/
- (BOOL)applicationShouldUseCache:(DTMicroApplication *)application params:(NSDictionary *)params;
/**
返回缓存此app的最长时间
@param application application description
@return 缓存此app的最长时间,单位s
*/
- (NSTimeInterval )survivalTimeIntervalOfApplication:(DTMicroApplication *)application;
/**
内存警告的时候,是否需要释放缓存中的app
@param application application description
@return YES or NO
*/
- (BOOL)applicationShouldReleaseWhenReceivedMemoryWarning:(DTMicroApplication *)application;
@end
而 DTMicroApplication是一个类
//
// DTMicroApplication.h
// Alipay Mobile Runtime Framework
//
// Created by WenBi on 13-3-31.
// Copyright (c) 2013年 Alipay. All rights reserved.
//
#import "DTMicroApplicationLaunchMode.h"
#import "DTMicroApplicationDescriptor.h"
extern NSString * const kDTMicroApplicationDidCreateNotification; // 应用创建完成通知。
extern NSString * const kDTMicroApplicationWillTerminateNotification; // 应用将要退出通知。
extern NSString * const kDTMicroApplicationDidHideNotification; // 需要保活的应用,在点击返回进入后台的时候的通知。
extern NSString * const kDTMicroApplicationDoesNotFoundNotification; // 应用找不到通知,对本地app是app代理类找不到所致。
extern NSString * const kDTMicroApplicationWillStartNotification; // 应用将要启动通知。
extern NSString * const kAPSceneID;
@protocol DTMicroApplicationDelegate;
@class DTViewController;
@interface DTMicroApplication : NSObject
/**
* 应用的描述信息,如:AppId对应descriptor.name。
*/
@property(nonatomic, strong) DTMicroApplicationDescriptor *descriptor;
/**
* 当前 app 的代理。
*/
@property(nonatomic, strong) id <DTMicroApplicationDelegate> delegate;
/**
* 当前 app 所属的所有 view controller。
*/
@property(nonatomic, strong) NSMutableArray *viewControllers;
/**
* 当前 app 是延迟释放时,需要将关联VC备份一下,确保viewControllers可以正常解绑定,保持已有的处理逻辑。
*/
@property(nonatomic, strong) NSMutableArray *cachedViewControllers;
/**
* 应用类型。
*/
@property(nonatomic, strong) NSString *type;
/**
* 启动 app 来源。
* 注意:启动app时,可以由启动方指定,如果不指定,那么默认为启动时当前的appId;
* outerUrl:表示是外部通过scheme启动,应用内UIWebView里链接跳转也是这个标识;
* innerUrl:表示是内部通过scheme启动;
* push:表示点击push消息启动;
*/
@property(nonatomic, strong) NSString *sourceId;
/**
* 外部应用通过通过scheme启动时,外部应用的bundle ID。
*/
@property(nonatomic, strong) NSString *sourceAppBundleId;
/**
* 启动 app 场景,和sourceId含义相似。
* 不同:通过scheme启动app时,如果scheme里可以用ap_sceneId来指定启动场景。用如下scheme启动时,
* alipays://platformapi/startApp?appId=20000235&ap_sceneId=scan
* sourceId 的值为outerUrl或innerUrl,而ap_sceneId 的值为scan
* 注意:启动app时,可以由启动方指定,如果不指定,那么默认为启动时当前的appId;
* outerUrl:表示是外部通过scheme启动,应用内UIWebView里链接跳转也是这个标识;
* innerUrl:表示是内部通过scheme启动;
* push:表示点击push消息启动;
*/
@property(nonatomic, strong) NSString *ap_sceneId;
/**
* 这个 app 的运行模式。
*/
@property(nonatomic, assign) DTMicroApplicationLaunchMode launchMode;
/**
app 是否是延时释放
*/
@property(nonatomic, assign) BOOL shouldDelayRelease;
/**
延时多长时间释放
*/
@property(nonatomic, assign) NSTimeInterval appSurvivalTimeInterval;
/**
当接收到内存不足的时候,是否释放
*/
@property(nonatomic, assign) BOOL shouldReleaseWhenMemoryWarning;
/**
延时释放timer
*/
@property(nonatomic, strong) NSTimer *delayReleaseTimer;
/**
本次启动是否是从缓存中读取
*/
@property(nonatomic, assign) BOOL createFromCache;
/**
* 如果当前的app栈是:A,B 那么当B在启动A时:
* YES:默认值,会退出A上的所有App,结果:A;
* NO: 不退出A上的App,而是退出自己,然后重新启动A,结果:B,A(注意:前后两个A不是同一个对象);
*/
@property(nonatomic, assign) BOOL appClearTop;
/**
* 核心业务处理完成回调,暂时用框架全链路监控使用。
* @param bizId 业务标识。
* @param endTime 处理完成时间,为nil时,把调用时间作为处理完成时间。
* @param userInfo 扩展参数。
*/
typedef void(^ueoAppBizCompletionBlock)(NSString *bizId, NSDate *endTime, NSDictionary *userInfo);
@property(nonatomic, copy) ueoAppBizCompletionBlock bizCompetionBlock;
/**
* 获取当前应用的根控制器。
*
* @return 当前应用的根控制器对象,这个控制器<b>必须</b>是<code>DTViewController</code>的一个子类。
*/
- (UIViewController *)rootController;
/**
* 退出本应用,应该不在栈顶,则无法退出。
*
* @param animated 指定退出应用时,是否需要动画。
*/
- (void)exitAnimated:(BOOL)animated;
/**
* 退出本应用,无论应用是否在栈顶。
* 注意:测试接口请勿直接使用。
*/
- (void)forceExit;
/**
* 处理push消息。
*
* @param params push数据。
*
* @return 处理成功返回YES,否则NO。
*/
- (BOOL)handleRemoteNotifications:(NSDictionary *)params;
@end
#ifdef __cplusplus
extern "C" {
#endif // __cplusplus
/**
* 返回当前栈顶应用。
*
* @return 返回当前栈顶应用。
*/
DTMicroApplication * DTMicroApplicationGetCurrent();
#ifdef __cplusplus
}
#endif // __cplusplus
服务:
mPaaS iOS 框架将没有 UI 界面的 Framework 称为服务,其与微应用的区别如下:
1.微应用是独立的业务流程,服务则用来提供通用服务。
2.服务有状态,一旦启动后,其在整个客户端的生命周期中一直存在,任何时候都可以被获取;微应用在退出后即被销毁。
服务管理相关的接口,具体内容参考 DTService.h 文件,看一下源码:
//
// DTService.h
// MobileCore
//
// Created by WenBi on 13-4-3.
// Copyright (c) 2013年 Alipay. All rights reserved.
//
/**
* \code DTService 代表一个服务。
*/
@protocol DTService <NSObject>
@required
/**
* 启动一个服务。框架在完成初始化操作后,会调用该方法。
*
* 如果一个服务要启动一个应用,必须在该法被调用之后,才能启动其它的应用。
*/
- (void)start;
@optional
/**
* 服务已经完成创建。
*/
- (void)didCreate;
/**
* 服务即将释放。
*/
- (void)willDestroy;
@end
typedef id<DTService> IDTService;
/**
* 根据指定的key获取scheme
*
* @param key 标识scheme的key,可以是以下任意一个值:
* - alipay
* - alipays
* - alipayqr
* - alipass
* - alpauto
* - aw
* - alipaywifi
*
* @return 如果当前版本是rc版本,以上的key值会追回 _rc 后返回,否则原样返回。
*
* 比如:
* <pre>NSString *scheme = DTSchemeGetName(@"alipays")</pre>
* 在rc版本中,scheme变量的值为:alipays_rc,在非rc的版本中,scheme变量的值为:alipays。
*/
NSString * DTSchemeGetName(NSString *key);
/**
* 对传入的URL字符串按照scheme的规则进行规范处理。
*
* @param URLString 表示URL的字符串
*
* @return 对指定的URL按照rc的规则进行处理后的URL字符串。
*/
NSString * DTSchemeNormalizeURLString(NSString *URLString);
/**
* 对指定的URL对象按照scheme的规则进行规范处理。
*
* @param aURL 需要处理的URL对象。
*
* @return 对指定的URL对象按照rc的规则进行处理后的URL对象。
*/
NSURL * DTSchemeNormalizeURL(NSURL *aURL);
框架上下文:
框架上下文(Context)是整个客户端框架的控制中心,统一管理各个微应用和服务之间的交互与跳转,主要
负责:
1.提供启动微应用的接口,可通过名字快速查找、关闭、管理微应用的跳转等。
2.提供启动服务的接口,管理服务的注册、发现和反注册。
看一下头文件:
//
// DTContext.h
// Alipay Mobile Common
//
// Created by WenBi on 13-3-31.
// Copyright (c) 2013年 Alipay. All rights reserved.
//
#import "DTMicroApplicationLaunchMode.h"
@class DTMicroApplication, DFLoadingPageManager;
@protocol DTStartApplicationHandler;
@interface DTContext : NSObject
/** Key window of application. */
@property(nonatomic, strong) UIWindow *window;
/** A navigation controller, which is the root view controller of the key window. */
@property(nonatomic, strong) UINavigationController *navigationController;
/** 中间页管理模块 */
@property(nonatomic, strong) DFLoadingPageManager *loadingManager;
/**
* 根据指定的名称启动一个应用。
*
* @param name 要启动的应用名。
* @param params 应动应用时,需要转递给另一个应用的参数。
* @param animated 指定启动应用时,是否显示动画。
*
* @return 应用启动成功返回YES,否则返回NO。
*/
- (BOOL)startApplication:(NSString *)name params:(NSDictionary *)params animated:(BOOL)animated;
/**
* 根据指定的名称启动一个应用。
*
* @param name 要启动的应用名。
* @param params 应动应用时,需要转递给另一个应用的参数。
* @param launchMode 指定 app 启动的方式。
*
* @return 应用启动成功返回YES,否则返回NO。
*/
- (BOOL)startApplication:(NSString *)name params:(NSDictionary *)params launchMode:(DTMicroApplicationLaunchMode)launchMode;
/**
* 同步启动登录应用。
*
* @param name 要启动的应用名。
* @param params 应动应用时,需要转递给另一个应用的参数。
* @param launchMode 指定 app 启动的方式。
*
* @return 应用启动成功返回YES,否则返回NO。
*/
- (BOOL)startLogonApplicationForSync:(NSString *)name params:(NSDictionary *)params launchMode:(DTMicroApplicationLaunchMode)launchMode;
/**
* 根据指定的名称启动一个应用。
*
* @param name 要启动的应用名。
* @param params 应动应用时,需要转递给另一个应用的参数。
* @param launchMode 指定 app 启动的方式。
* @param sourceId 启动 app 的调用者。
*
* @return 应用启动成功返回YES,否则返回NO。
*/
- (BOOL)startApplication:(NSString *)name params:(NSDictionary *)params launchMode:(DTMicroApplicationLaunchMode)launchMode sourceId:(NSString *)sourceId;
/**
* 根据指定的名称启动一个应用。
*
* @param name 要启动的应用名。
* @param params 应动应用时,需要转递给另一个应用的参数。
* @param launchMode 指定 app 启动的方式。
* @param appClearTop NO:需要退出已有的,再重新启动一个应用;默认是YES,原来逻辑。
* @param sourceId 启动 app 的调用者。
*
* @return 应用启动成功返回YES,否则返回NO。
*/
- (BOOL)startApplication:(NSString *)name
params:(NSDictionary *)params
appClearTop:(BOOL)appClearTop
launchMode:(DTMicroApplicationLaunchMode)launchMode
sourceId:(NSString *)sourceId;
/**
* 逆向遍历App栈,返回最新的应用对象。
*
* @param name 要查找的应用名。
*
* @return 如果指定的应用已在应用栈中,则返回最新的应用对象。否则返回nil。
*/
- (DTMicroApplication *)findApplicationByName:(NSString *)name;
/**
* 查找应用名对应所有的App对象。
*
* @param name 要查找的应用名。
*
* @return 如果指定的应用已在应用栈中,则返回对应的数组。否则返回nil。
*/
- (NSArray *)findApplicationsByName:(NSString *)name;
/**
* 退出所有的application
*/
- (BOOL)exitAllApplications;
/**
* 返回当前在栈顶的应用,即对用户可见的应用。
*
* @return 当前可见的应用。
*/
- (DTMicroApplication *)currentApplication;
/**
* 返回当前主程序window上显示的VC,不包括childController。
* 注意:要保证在主线程里调用。
*
* @return 当前可见的VC。
*/
- (UIViewController *)currentVisibleViewController;
/**
* 根据指定的名称查到一个服务。
*
* @param name 服务名
*
* @return 如果找到指定名称的服务,则返回一个服务对象,否则返回空。
*/
- (id)findServiceByName:(NSString *)name;
/**
* 注册一个服务。
*
* @param name 服务名
*/
- (BOOL)registerService:(id)service forName:(NSString *)name;
/**
* 反注册一个已存在的服务。
*
* @param name 服务名。
*/
- (void)unregisterServiceForName:(NSString *)name;
/**
* 注册一个App启动处理。注意:如果不用后要注销掉。
*
* @param handler 启动处理。
*/
- (BOOL)registerStartApplicationHandler:(id<DTStartApplicationHandler>)handler;
/**
* 在指定位置注册一个App启动处理。注意:如果不用后要注销掉。
*
* @param handler 启动处理。
* @param atIndex 指定启动处理的位置。
*/
- (BOOL)registerStartApplicationHandler:(id<DTStartApplicationHandler>)handler atIndex:(NSUInteger)index;
/**
* 反注册一个已存在App启动处理。
*
* @param handler 启动处理。
*/
- (void)unregisterStartApplicationHandler:(id<DTStartApplicationHandler>)handler;
/**
* 开始事务处理。
*
* @return 如果正在事务处理返回NO,否则返回YES。
*/
- (BOOL)beginAppTransaction;
/**
* 提交事务处理。
*/
- (void)commitAppTransaction;
/**
* 逆向遍历App栈,找到最新的应用对象关联的所有ViewController。
*
* @param name 指定Application的名字。
*
* @return 如果最新的应用对象有关联的ViewController,则全部返回,否则返回nil。
*/
- (NSArray *)viewControllersOfApplication:(NSString *)name;
/**
* 返回指定的应用对象关联的所有ViewController。
*
* @param app 指定的应用对象。
*
* @return 如果指定的应用有关联的ViewController,则全部返回,否则返回nil。
*/
- (NSArray *)viewControllersOfApplicationObject:(DTMicroApplication *)app;
/**
* 逆向遍历App栈,找到最新的应用对象,并设置它关联的所有ViewController。
*
* @param viewControllers 关联的所有ViewController。
* @param name 要查找的应用名。
* @param animated 是否带动画。
*
*/
- (void)setViewControllers:(NSArray *)viewControllers forApplication:(NSString *)name animated:(BOOL)animated;
/**
* 设置指定的应用对象关联的所有ViewController。
*
* @param viewControllers 关联的所有ViewController。
* @param app 指定的应用对象。
* @param animated 是否带动画。
*/
- (void)setViewControllers:(NSArray *)viewControllers forApplicationObject:(DTMicroApplication *)app animated:(BOOL)animated;
/**
* 根据指定的名称判断是否可以启动一个应用。
*
* @param name 要启动的应用名。
* @param params 应动应用时,需要转递给另一个应用的参数。
*
* @return 可以启动返回YES,否则返回NO。
*/
- (BOOL)canHandleStartApplication:(NSString *)name params:(NSDictionary *)params;
@end
#ifdef __cplusplus
extern "C" {
#endif // __cplusplus
/**
* 获取框架接口对象。
*
* @return 返回当前框架接口对象。
*/
DTContext * DTContextGet();
#ifdef __cplusplus
}
#endif // __cplusplus
微应用启动流程图:
服务启动流程图:
框架上下文管理微应用与服务的 UML 类图如下: