mPaaS iOS框架笔记1->mPaaS APMobileFramework (以MPH5Demo_plugin为例)

我们来分析一下 MPaaS这个 group里面重要的文件:

参考官方文档:

mpaas_sdk.config:当前工程添加的模块信息,包括版本、添加时间、资源文件等,由 mPaaS 插件自

动维护,不得手动修改

mPaaSDemo-mPaaS-Headers.h:当前工程依赖的 mPaaS 模块的头文件,由 mPaaS 插件自动维护

不得手动修改

mPaaSDemo-Prefix.pch:当前工程 pch 文件的引用,会自动将 mPaaSdemo-mPaaS-Headers.h 加入

mPaaS 模块的头文件。

APMobileFramework:mpaas 框架的生命周期管理的 category 文件

mPaas:MPaaSInterface 的 category 文件

meta.config:从 mPaaS 控制台下载的云端元数据。

1.APMobileFramework解析

APMobileFramework是mpaas 框架的生命周期管理的 category 文件,那么APMobileFramework即负责生命周期的管理,我们看看它的源码:

//
//  DTFrameworkInterface.h
//  APMobileFramework
//
//  Created by shenmo on 5/3/16.
//  Copyright © 2016 Alipay. All rights reserved.
//

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

@class DTBootLoader;

@interface DTFrameworkInterface : NSObject

+ (instancetype)sharedInstance;

#pragma mark - BootLoader

/**
 *  用于启动时控制bootLoader行为的bootOptions,可以修改字典内容。
 *  这个字典放在DTFrameworkInterface里,可以用来在启动过程中全局修改。
 *  默认,由框架调用的bootLoader start方法时,bootOptions里会有@"default"字段。
 *  当框架已经完成了bootLoader的调用,会向bootOptions里设置@"done"字段。
 */
@property (nonatomic, strong) NSMutableDictionary* bootOptions;

/**
 *  取得BootLoader对象。
 *  使用框架内部的默认实现即可,通常不需要覆盖。
 *  如果需要使用自己的bootLoader,需要实现DTBootLoader的子类。
 *
 *  @return DTBootLoader或其子类
 */
- (DTBootLoader*)bootLoader;

#pragma mark - 应用配置,微应用配置、服务配置、Scheme处理器配置,可用Category覆盖

/**
 *  应用是否是RC版本。对于一些应用,开发中的RC版本在Scheme跳转处理上可能与正式版本不同。
 *  如果应用不区分RC版本,不需要覆盖此方法。
 *  默认返回为NO。
 */
- (BOOL)isRCVersion;

/**
 *  读取预置的微应用列表配置
 *  默认读取MainBundle中的MobileRuntime.plist文件。
 *
 *  @return 列表配置字典,字典结构应该为:
        @{  @"Launcher": @"app1",
            @"Applications": @[
                                @{@"delegate": @"delegate1", @"name": @"app1"},
                                @{@"delegate": @"delegate2", @"name": @"app2"},
                                ...
                                ]
        }
        其中,Launcher记录哪个微应用作为启动应用(一般为UITabBarController)
 */
- (NSDictionary*)applicationsConfiguration;

/**
 *  读取预置的Services列表
 *  默认读取MainBundle中MobileRuntime.plist文件字典内容的@"Services"字段
 *
 *  @return 列表配置数组,数组结构应该为:
 *      @[  
            @{@"class": @"class1", @"lazyLoading": @(YES), @"name": @"service1"},
            @{@"class": @"class2", @"lazyLoading": @(YES), @"name": @"service2"},
            ...
        ]
 */
- (NSArray*)servicesConfiguration;

/**
 *  如果除了lazyLoading,对服务有更详细的配置要求,可以使用servicesMap功能管理服务。
 *  默认读取MainBundler中MobileRuntime.plist文件字典内容的@"ServicesMap"字段
 *
 *  @return 列表配置字典,字典结构应该为:
        @{
            @"[AUTOSTART]": @[
                            @{@"name": @"group1", @"asynchronous": @(NO)},
                            @{@"name": @"group2", @"asynchronous": @(YES)},
                            ...],
            @"group1": @[
                        @{@"class": @"class1", @"name": @"service1"},
                        @{@"class": @"class2", @"name": @"service2"},
                        ...],
            @"group2": @[
                        @{@"class": @"class3", @"name": @"service3"},
                        ...],
            ...
        }
        
        1)"[AUTOSTART]"数组记录随应用启动自动启动的服务分组,如果asynchronous为YES,表示这个分组内所有服务在启动时异步启动。
            框架会将异步与同步的服务区分开,分成两组,分别启动。但同步服务之间或异步服务之间按照[AUTOSTART]描述的顺序启动。
        2)分组名可以任意取,每个分组是个数组,数组里每一项是个字典,字典配置service的实现类与名称,不需要配置lazyLoading属性。
        3)为了兼容性,ServicesMap里可以配置一个叫@"RunOnceServices"的分组。这个分组中的服务会先于所有服务启动,并且只运行一次。
            "RunOnceServices"这个分组不需要配置到"[AUTOSTART]"中。
 */
- (NSDictionary*)servicesMapConfiguration;

/**
 *  对于服务的配置,可以配置在@"Services"数组中,也可以放在@"ServicesMap"字典里。
 *
 *      1)配置在@"Services"中的服务需要配置是否是lazyLoading,对于非lazyLoading的服务,
 *          可以通过DTBootPhase的startNonlazyloadServicesg事件提前启动。
 *      2)配置在@"ServicesMap"中的服务,如果在"[AUTOSTART]"数组中进行了描述,会随应用自动启动。
 *          具体的处理方法是DTBootPhase的startAutostartServicesMapGroups。
 *
 *  该方法拿到所有服务的配置,默认实现为将servicesConfiguration与servicesMapConfiguration取到的服务信息进行合并。
 */
- (NSArray*)servicesAllConfiguration;

/**
 *  返回向DTSchemeService注册的DTSchemeHandler列表,处理scheme启动,该方法默认返回空数组。
 *
 *  @return @[DTSchemeHandler子类的类名NSString*]
 */
- (NSArray*)schemeHandlerClasses;

/**
 *  返回向DTSchemeService注册的DTSchemeHandler列表,处理domain启动,该方法默认返回空数组。
 *
 *  @return @[DTSchemeHandler子类的类名NSString*]
 */
- (NSArray*)domainHandlerClasses;

#pragma mark - 框架默认能力开关,可以用Category覆盖返回NO关闭

/**
 * 是否需要调用[window makeVisable],默认实现为 YES
 */
- (BOOL)shouldWindowMakeVisable;

/**
 * 是否需要显示Launcher
 */
- (BOOL)shouldShowLauncher;

/**
 *  是否使用日志记录默认的报活数据。报活分两种方式,一种是使用APRemoteLogging(日志报活),一种是使用RPC。
 *  默认在mPaaS中是使用日志报活,需要找mpaasweb同学开通。
 *  该方法默认实现为YES。
 */
- (BOOL)shouldLogReportActive;

/**
 *  当使用日志报活功能时,可以配置从后台切回前台的报活最小间隔时间。
 *  从后台切回前台时,距离上次报活时间少于多少秒时,不再报活。如果传0,每次后台切回前台都会报活。
 *  这个不影响冷启动,如果冷启动,每次都会报活。
 *  该方法默认返回0。
 */
- (NSTimeInterval)logReportActiveMinInterval;

/**
 *  是否使用日志记录启动时间消耗。在mPaaS中默认开启。
 *  该方法默认实现为YES。
 */
- (BOOL)shouldLogStartupConsumption;

/**
 *  当接入了Hotpatch后,是否自动执行Hotpatch的逻辑。包括脚本运行,同步,下载等。
 *  该方法默认返回YES。
 */
- (BOOL)shouldAutoactivateBandageKit;

/**
 *  启动过程是否挂起配置为lazyload的脚本,如果返回YES,启动时只执行非lazyload的patch脚本。
 *  对于lazyload的脚本,需要手动启动:
 *      [[DynamicRelease sharedInstance] executeLocalBandage:DRLocalBandageExecutionLazyload] 或
 *      [[DynamicRelease sharedInstance] executeLocalBandage:DRLocalBandageExecutionAll]
 *  该方法默认返回NO
 */
- (BOOL)suspendLazyloadBandages;

/**
 *  当接入了分享组件后,是否在框架里自动安装分享组件,并处理openURL事件。
 *  该方法默认返回YES。
 */
- (BOOL)shouldAutoactivateShareKit;

/**
 *  当应用为RC版本时,是否将应用要处理的URL里的scheme转成带@"rc"结尾的版本。
 *  pattern为scheme的模式,当scheme以pattern字符串为开头时才进行处理。
 *  默认返回NO。
 */
- (BOOL)shouldAutoconvertSchemesForRCVersion:(NSString**)pattern;

/**
 *  是否在ViewDidAppear事件里检查窗口栈,排除乱栈情况。
 *  默认返回NO。
 */
- (BOOL)shouldInspectStackOnViewDidAppear;

/**
 * 框架是否能处理此schema
 */
- (BOOL)shouldHandleUrl:(NSURL *)url;

#pragma mark - 用Category覆盖下列方法实现自定义效果

/**
 *  每个继承自DTViewController的子VC,都会被默认设置为一个背景色,如果实现这个方法,框架会回调并取到应用指定的颜色。
 *  同时这个颜色也是应用默认UIWindow的颜色。
 *  默认值为:[UIColor whiteColor]
 */
- (UIColor*)defaultBackgroundColor;

// VC的返回按钮样式
typedef NS_ENUM (NSInteger, DTNavigationBarBackTextStyle)
{
    DTNavigationBarBackTextStyleNone,           // 完全不显示返回按钮的文本(present的窗口还是会显示“取消”)
    DTNavigationBarBackTextStyleUniformBack,    // 统一显示为“返回”
    DTNavigationBarBackTextStyleAlipay,         // 支付宝风格,Tab的下一级窗口,返回按钮显示Tab的名称,其它级别的窗口统一显示返回
};

/**
 *  使用框架时,DTViewController自动添加的返回按钮的文本样式。
 *  默认返回支付宝样式。
 */
- (DTNavigationBarBackTextStyle)navigationBarBackTextStyle;

/**
 *  使用框架时,DTViewController自动添加的返回按钮默认的图片。
 *  框架获取返回按钮图片的调用顺序如下:
 *      1)如果使用了APCommonUI,会优先使用APCommonUI的主题管理功能。“APNavigationBar.Button.BackImage”路径指定的图片。
 *      2)navigationBarBackButtonImage方法
 *      3)如果仍然找不到,会使用框架自带的默认图片。
 *  本方法默认返回nil。
 */
- (UIImage*)navigationBarBackButtonImage;

/**
 *  使用框架时,DTViewController自动添加的返回按钮默认字体。
 *  框架获取返回按钮图片的调用顺序如下:
 *      1)如果使用了APCommonUI,会优先使用APCommonUI的主题管理功能。“APNavigationBar.Button.Font”路径指定的字体。
 *      2)navigationBarBackButtonTextFont方法
 *  本方法默认返回[UIFont systemFontOfSize:16.0f]。
 */
- (UIFont*)navigationBarBackButtonTextFont;

/**
 *  使用框架时,DTViewController自动添加的返回按钮默认字体颜色。
 *  框架获取返回按钮图片的调用顺序如下:
 *      1)如果使用了APCommonUI,会优先使用APCommonUI的主题管理功能。“APNavigationBar.Button.TextColor”路径指定的颜色。
 *      2)navigationBarBackButtonTextColor方法
 *  本方法默认返回[UIColor whiteColor]。
 */
- (UIColor*)navigationBarBackButtonTextColor;

/**
 *  使用框架的DTBaseViewController时,可以调用startTitleLoading方法在上面转菊花。
 *  现在可以通过这个方法定制菊花view的类型。只需要返回类名的字符串即可。
 *  该方法的默认实现为UIActivityIndicatorView。
 *  传进来的类至少要实现下面三个方法,如果不实现可能会crash。
 *      - (void)startAnimating;
 *      - (void)stopAnimating;
 *      - (BOOL)isAnimating;
 */
- (NSString*)navigationBarLoadingViewClass;

/**
 *  使用框架的DTBaseViewController时,导航栏上加载菊花的默认颜色。如果实现这个方法,框架会回调并取到应用指定的颜色
 *  本方法默认返回的颜色值如下:
 *  第一个颜色:圆环的颜色:#cccccc
 *  第二个颜色:旋转进度条的颜色:#108ee9
 *  如果使用APCommonUI中的APActivityIndicatorView,支持这两个颜色的设置。
 *  如果使用系统的UIActivityIndicatorView或其他自定义的菊花控件,框架只会向其发送setColor:消息,并传递数组中的第一个颜色。
 */
- (NSArray *)navigationBarLoadingViewColors;

#pragma mark - UIApplication生命期回调,可以用Category覆盖

typedef NS_ENUM(NSInteger, DTFrameworkCallbackResult)
{
    DTFrameworkCallbackResultContinue                       = 0,        // 继续执行
    DTFrameworkCallbackResultReturn                         = 1,        // 中断执行
    DTFrameworkCallbackResultReturnYES                      = 2,        // 中断之后的逻辑,并返回YES
    DTFrameworkCallbackResultReturnNO                       = 3,        // 中断之后的逻辑,并返回NO
};

// 关于didFinishLaunching中各回调事件的调用顺序
//      [DTFrameworkInterface shouldAutoactivateBandageKit]
//      [DTFrameworkInterface beforeDidFinishLaunchingWithOptions]
//      [DTFrameworkInterface shouldLogReportActive]
//      [DTFrameworkInterface checkInstallationStatus]
//      [DTFrameworkInterface handleDidFinishLaunchingWithOptions]
//      [DTBootLoader willStartBootLoader]
//      [DTBootLoader startWithOptions]
//      [DTBootLoader didStartBootLoader]
//      [DTFrameworkInterface shouldLogStartupConsumption]
//      [DTFrameworkInterface afterDidFinishLaunchingWithOptions]

/**
 *  框架有一些自己的初始化逻辑在didFinishLaunching里需要实现,但会在执行之前回调该方法。
 */
- (void)application:(UIApplication *)application beforeDidFinishLaunchingWithOptions:(NSDictionary *)launchOptions;

/**
 *  框架回调该方法,让接入应用可以接管自己的didFinishLaunching逻辑。
 *  并且当返回DTFrameworkCallbackResultReturnYES或DTFrameworkCallbackResultReturnNO时,直接给系统返回,不再执行接下来的逻辑。
 *  这个方法在框架启动BootLoader前回调,应用可以通过返回DTFrameworkCallbackResultReturnYES或DTFrameworkCallbackResultReturnNO让框架提前退出,不运行默认的BootLoader。
 *  使用框架内部的默认实现即可,通常不需要覆盖。
 *
 *  @return 是继续让框架执行,还是直接给系统返回YES或NO
 */
- (DTFrameworkCallbackResult)application:(UIApplication *)application handleDidFinishLaunchingWithOptions:(NSDictionary *)launchOptions;

/**
 *  框架有一些自己的初始化逻辑在didFinishLaunching里需要实现,但会在所有逻辑完成后回调该方法。
 */
- (void)application:(UIApplication *)application afterDidFinishLaunchingWithOptions:(NSDictionary *)launchOptions;

/**
 *  框架会率先回调该方法,让接入应用可以预先处理通知消息。
 *  当返回DTFrameworkCallbackResultContinue时,框架会把通知消息通过UIApplicationDidReceiveRemoteNotification广播给全局监听者。并调用completionHandler(UIBackgroundFetchResultNoData)。
 *  当返回DTFrameworkCallbackResultReturn时,表示接入应用已经完全处理完通知消息,框架中止执行之后的逻辑。
 */
- (DTFrameworkCallbackResult)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler;

/**
 *  框架会率先回调该方法,让接入应用可以预先处理通知消息。
 *  当返回DTFrameworkCallbackResultContinue时,框架会把通知消息通过UIApplicationDidReceiveLocalNotification广播给全局监听者。
 *  当返回DTFrameworkCallbackResultReturn时,表示接入应用已经完全处理完通知消息,框架中止执行之后的逻辑。
 */
- (DTFrameworkCallbackResult)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification;

/**
 *  框架会率先回调该方法,让接入应用可以预先处理通知消息。
 *  当返回DTFrameworkCallbackResultContinue时,框架会把通知消息通过UIApplicationDidReceiveLocalNotification广播给全局监听者。并调用completionHandler()。
 *  当返回DTFrameworkCallbackResultReturn时,表示接入应用已经完全处理完通知消息,框架中止执行之后的逻辑。
 */
- (DTFrameworkCallbackResult)application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forLocalNotification:(UILocalNotification *)notification completionHandler:(void (^)())completionHandler;

/**
 *  框架会率先回调该方法,让接入应用可以拿到deviceToken。
 *  当返回DTFrameworkCallbackResultContinue时,框架会把deviceToken通过UIApplicationDidRegisterForRemoteNotifications广播给全局监听者。
 *  当返回DTFrameworkCallbackResultReturn时,表示接入应用已经完全处理完,框架中止执行之后的逻辑。
 */
- (DTFrameworkCallbackResult)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken;

/**
 *  当取deviceToken失败时,框架率先回调该方法。
 *  当返回DTFrameworkCallbackResultContinue时,框架继续执行,目前无其它逻辑。
 *  当返回DTFrameworkCallbackResultReturn时,框架中止之后的逻辑,目前无其它逻辑。
 */
- (DTFrameworkCallbackResult)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error;

/**
 *  框架会先给分享组件(如果有,并且shouldAutoactivateShareKit返回YES)通知,如果分享组件处理不了,再回调该方法,由接入应用处理openURL。
 *  当返回DTFrameworkCallbackResultReturnYES或DTFrameworkCallbackResultReturnNO时,框架直接给系统返回,不再执行接下来的逻辑。
 *  当返回DTFrameworkCallbackResultContinue时,继续由框架处理URL,并分发给SchemeHandler等类来处理。
 *
 *  这个方法相比系统方法,多了一个newURL参数,允许应用在处理后,返回一个不同的url。如果函数整体返回DTFrameworkCallbackResultContinue,并且给newURL赋值,框架会使用新的URL来做后续处理。
 */
- (DTFrameworkCallbackResult)application:(UIApplication *)application openURL:(NSURL *)url newURL:(NSURL **)newURL sourceApplication:(NSString *)sourceApplication annotation:(id)annotation;

/**
 *  框架率先回调该方法。
 *  当返回DTFrameworkCallbackResultContinue时,框架继续执行,目前无其它逻辑。
 *  当返回DTFrameworkCallbackResultReturn时,框架中止之后的逻辑,目前无其它逻辑。
 */
- (DTFrameworkCallbackResult)applicationWillResignActive:(UIApplication *)application;

/**
 *  框架率先回调该方法。
 *  当返回DTFrameworkCallbackResultContinue时,框架继续执行,目前无其它逻辑。
 *  当返回DTFrameworkCallbackResultReturn时,框架中止之后的逻辑,目前无其它逻辑。
 */
- (DTFrameworkCallbackResult)applicationDidEnterBackground:(UIApplication *)application;

/**
 *  框架率先回调该方法。
 *  当返回DTFrameworkCallbackResultContinue时,框架继续执行,目前无其它逻辑。
 *  当返回DTFrameworkCallbackResultReturn时,框架中止之后的逻辑,目前无其它逻辑。
 */
- (DTFrameworkCallbackResult)applicationWillEnterForeground:(UIApplication *)application;

/**
 *  框架先回调该方法。
 *  当返回DTFrameworkCallbackResultContinue时,框架继续执行,给分享组件事件(如果有,并且shouldAutoactivateShareKit返回YES)。并且当整个应用没被加载时,调用BootLoader
 *  当返回DTFrameworkCallbackResultReturn时,框架中止之后的逻辑,目前无其它逻辑。
 */
- (DTFrameworkCallbackResult)applicationDidBecomeActive:(UIApplication *)application;

/**
 *  框架率先回调该方法。
 *  当返回DTFrameworkCallbackResultContinue时,框架继续执行,目前无其它逻辑。
 *  当返回DTFrameworkCallbackResultReturn时,框架中止之后的逻辑,目前无其它逻辑。
 */
- (DTFrameworkCallbackResult)applicationWillTerminate:(UIApplication *)application;

/**
 *  框架率先回调该方法。
 *  当返回DTFrameworkCallbackResultContinue时,框架继续执行,目前无其它逻辑。
 *  当返回DTFrameworkCallbackResultReturn时,框架中止之后的逻辑,目前无其它逻辑。
 */
- (DTFrameworkCallbackResult)applicationDidReceiveMemoryWarning:(UIApplication *)application;

/**
 *  框架率先回调该方法,接入应用可以先行处理Watch的消息。
 *  当返回DTFrameworkCallbackResultContinue时,框架会把Watch消息通过UIApplicationWatchKitExtensionRequestNotifications广播给全局监听者。
 *  当返回DTFrameworkCallbackResultReturn时,表示接入应用已经完全处理完通知消息,框架中止执行之后的逻辑。
 */
- (DTFrameworkCallbackResult)application:(UIApplication *)application handleWatchKitExtensionRequest:(NSDictionary *)userInfo reply:(void(^)(NSDictionary *replyInfo))reply;

/**
 *  框架率先回调该方法,接入应用可以先行处理消息。
 *  当返回DTFrameworkCallbackResultContinue时,框架会把消息通过UIApplicationUserActivityNotifications广播给全局监听者,并最后给系统返回NO。
 *  当返回DTFrameworkCallbackResultReturnYES或DTFrameworkCallbackResultReturnNO时,框架直接给系统返回,不再执行接下来的逻辑。
 */
- (DTFrameworkCallbackResult)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void(^)(NSArray *restorableObjects))restorationHandler;

/**
 *  框架率先回调该方法,接入应用可以先行处理3D Touch快捷入口的消息。
 *  当返回DTFrameworkCallbackResultContinue时,框架会处理shortcutItem带过来的URL,并最后调用completionHandler()返回是否已经处理。
 *  当返回DTFrameworkCallbackResultReturn时,框架直接给系统返回,不再执行接下来的逻辑。
 */
- (DTFrameworkCallbackResult)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void (^)(BOOL))completionHandler;

/**
 *  Background Fetch 机制回调
 *  必须在30s内回调completionHandler,否则进程将被terminate
 *  若要启用此机制,需要先配置Background Modes的fetch选项。其次在didFinishLaunching中调用下面的方法。更多信息参考文档。
 *  [application setMinimumBackgroundFetchInterval:UIApplicationBackgroundFetchIntervalMinimum];
 *  默认实现为空,需要接入方自己处理。
 */
- (void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler;

#pragma mark - 功能方法,可以用Category覆盖

/**
 *  在启动时需要根据版本号判断是否是第一次安装,或者是覆盖安装。
 *  默认实现为将应用的CFBundleShortVersionString与CFBundleVersion合并为%@.%@组成完整的版本号V。如果NSUserDefaults里不存在老的版本号,认为是全新安装。如果V与NSUserDefaults里的值不相等,认为是覆盖安装。
 *  获取全新安装或覆盖安装,使用[UIApplication sharedApplication].bFirstInstalled和[UIApplication sharedApplication].bCoverInstallation属性。
 */
- (void)checkInstallationStatus;

/**
 *  框架在调用内置的DTSchemeService处理url前,会回调该方法。接入应用可以在回调方法种提前处理handleOpenURL。
 *
 *  @param url          传入的url
 *  @param newURL       如果需要对url进行修改,可以用这个指针返回新的url
 *  @param convertForRC 接下来的处理是否要自动将url进行RC包的转换,默认为YES。如果返回YES,会回调isRCVersion和shouldAutoconvertSchemesForRCVersion方法最终决定如何对url进行转换。
 *
 *  @return 如果返回DTFrameworkCallbackResultContinue,框架会继续处理,交给DTSchemeService,依次调用各Scheme Handler;
 *          如果返回DTFrameworkCallbackResultReturnYES或DTFrameworkCallbackResultReturnNO,框架退出执行。
 *
 *  该方法默认返回DTFrameworkCallbackResultContinue。
 */
- (DTFrameworkCallbackResult)handleOpenURL:(NSURL *)url newURL:(NSURL **)newURL convertForRC:(BOOL*)convertForRC;

#pragma mark - DFNavigationController代理回调

// 框架使用DFNavigationController类作为导航类,重写了其中一些方法。这里公开一些回调方法,供接入应用使用。

/**
 *  框架使用的是DFNavigationController的内部类,重写了navigationController:didShowViewController:animated:方法。
 *  如果接入应用想在这个方法里做一些事情,可以实现这个回调。DFNavigationController每次触发该方法,会回调两次,分别在方法开始,和方法结束。用begin字段区分。
 *
 *  @param navigationController navigationController,应该是DFNavigationController类
 *  @param viewController       viewController
 *  @param animated             animated
 *  @param begin                是否是DFNavigationController的开始回调的。
 */
- (void)navigationController:(UINavigationController*)navigationController didShowViewController:(UIViewController*)viewController animated:(BOOL)animated begin:(BOOL)begin;

/**
 *  框架使用通用配置,用于容错和异常屏蔽。
 *
 *  @param key 开关键
 *
 *  @return    配置返回开关,否则返回nil。
 */
- (NSString *)configForKey:(NSString *)key;

@end

根据官方文档的描述:

mPaaS 框架接入之后,完全替代了 AppDelegate 的角色,整个应用的生命周期由框架进行管理,但是用户依

然可以实现应用生命周期各个阶段对应的代理方法,UIApplicationDelegate 中的所有代理方法,框架都提供

了等价的接入方式,只需要在 Category 中覆盖对应的方法即可

根据源码,我们可以这样理解:

1.DTFrameworkInterface 替代了AppDelegate;

2.UIApplicationDelegate 中的所有代理方法,框架都提供了等价的接入方式

3.对这些代理方法的重写,通过Category进行;例如:

在 Category MPH5Demo_plugin中,重写了 :

- (void)application:(UIApplication *)application afterDidFinishLaunchingWithOptions:(NSDictionary *)launchOptions 

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

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值