mPaaS iOS框架笔记2->微应用和服务(以MPH5Demo_plugin为例)

由打断点调试,我们可以看到这些模块的加载顺序(如图所示):

我们分析一下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 类图如下:

参考:https://tech.antfin.com/products/MPAAS

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值