iOS-AppDelegate瘦身
AppDeleagate瘦身真的是一个大家都会面临到的问题,我也是调研了两周,才选定了一个相对简单、容易理解的一个创建分类的方案,我也在我们APP里边进行了实践,接下来给大家介绍一下我的瘦身过程。
一、分析AppDeleagate的结构
要对AppDeleagate进行瘦身,首先要对这个文件的结构有一个清晰的认知,明确知道这个类当前有什么功能,并且要考虑扩展性、健壮性,下边是我们项目AppDeleagate的结构
二、创建分类
从上图可知,AppDeleagate中大概分为5个模块,所以我们创建了五个分类分别对应思维导图中的五个模块,如下:
三、设计思路
现在我们以AppDelegate+TYTPush为例,对分类的设计思路进行介绍,
NS_ASSUME_NONNULL_BEGIN
/**
* 处理app推送相关代码
*/
@interface AppDelegate (TYTPush)<JPUSHRegisterDelegate, GeTuiSdkDelegate>
///初始化推送配置
- (void)push_application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;
///调用过用户注册通知方法之后执行(也就是调用完registerUserNotificationSettings:方法之后执行)
- (void)push_application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings;
///接收推送令牌deviceToken
- (void)push_application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken;
///接收推送令牌deviceToken失败
- (void)push_application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error;
///app后台获取干的事情就是在用户打开应用之前就有机会(只是有机会)执行代码来获取数据,刷新UI
- (void)push_application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler;
///APP已经接收到远程通知 app处于前台调用此方法
- (void)push_application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo;
///APP已经接收到远程通知 app处于后台或者被杀死状态,收到远程通知后,当你进入程序时,调用此方法
- (void)push_application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler;
///当应用程序在前台接收到本地通知时调用
- (void)push_application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification;从上边可以看出我们起的方法名字跟系统的名字一样,但是我们给方法名字加上前缀push_,这样即美观又防止了方法冲突,这里建议大家创建分类的时候都给分类加上前缀,一旦跟系统类或者其它分类方法名冲突,就会导致同名方法只执行一个,具体的大家可以自己测试,
由于实现文件设计到公司业务代码,所以.m文件只贴出来几个方法
///初始化推送配置
- (void)push_application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
//极光
JPUSHRegisterEntity * entity = [[JPUSHRegisterEntity alloc] init];
entity.types = JPAuthorizationOptionAlert|JPAuthorizationOptionBadge|JPAuthorizationOptionSound;
[JPUSHService registerForRemoteNotificationConfig:entity delegate:self];
[JPUSHService setupWithOption:launchOptions appKey:JpushKey channel:@"appStore" apsForProduction:NO advertisingIdentifier:nil];
[JPUSHService registrationIDCompletionHandler:^(int resCode, NSString *registrationID) {
NSLog(@"registrationID = %@",registrationID);
[TYTDefault setObject:registrationID forKey:@"registrationID"];
[TYTDefault synchronize];
}];
NSNotificationCenter *defaultCenter = [NSNotificationCenter defaultCenter];
[defaultCenter addObserver:self selector:@selector(push_networkDidReceiveMessage:) name:kJPFNetworkDidReceiveMessageNotification object:nil];
//个推
// 通过个推平台分配的 appId、 appKey 、appSecret 启动 SDK,注: 该方法需要在主线程中调用
[GeTuiSdk startSdkWithAppId:kGtAppId appKey:kGtAppKey appSecret:kGtAppSecret delegate:self];
// 注册 APNS
[self push_registerUserNotification];
// 处理远程通知启动 APP
[self push_receiveNotificationByLaunchingOptions:launchOptions application:application];
}
///调用过用户注册通知方法之后执行(也就是调用完registerUserNotificationSettings:方法之后执行)
- (void)push_application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings {
// 注册远程通知(推送)
[application registerForRemoteNotifications];
}
///接收推送令牌deviceToken
- (void)push_application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
[GeTuiSdk registerDeviceTokenData:deviceToken];
[JPUSHService registerDeviceToken:deviceToken];
}
///接收推送令牌deviceToken失败
- (void)push_application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {
//如果APNS注册失败,通知个推服务器
[GeTuiSdk registerDeviceToken:@""];
}接下来就参照此分类依次创建剩下的四个分类
四、功能整合
分类创建完成之后,就回到系统类里边,把五个分类的功能进行整合,这次不涉及丝毫的业务代码,可以把全部代码都放出来
#import "AppDelegate.h"
#import "AppDelegate+TYTNet.h"
#import "AppDelegate+TYTPush.h"
#import "AppDelegate+TYTInit.h"
#import "AppDelegate+TYTPay.h"
#import "AppDelegate+TYTOpenWithLink.h"
@interface AppDelegate () <CLLocationManagerDelegate>
@end
@implementation AppDelegate
#pragma mark - UIApplicationDelegate
///app入口
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//初始化window 以及三方库
[self init_application:application didFinishLaunchingWithOptions:launchOptions];
///初始化链接打开app配置
[self link_application:application didFinishLaunchingWithOptions:launchOptions];
//网络请求资源
[self net_application:application didFinishLaunchingWithOptions:launchOptions];
//极光个推初始化
[self push_application:application didFinishLaunchingWithOptions:launchOptions];
//支付配置初始化
[self pay_application:application didFinishLaunchingWithOptions:launchOptions];
return YES;
}
///调用过用户注册通知方法之后执行(也就是调用完registerUserNotificationSettings:方法之后执行)
- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings {
[self push_application:application didRegisterUserNotificationSettings:notificationSettings];
}
///app即将进入前台
- (void)applicationWillEnterForeground:(UIApplication *)application{
[self init_applicationWillEnterForeground:application];
}
///app已经进入后台
- (void)applicationDidEnterBackground:(UIApplication *)application{
[self init_applicationDidEnterBackground:application];
}
///当应用程序接收到内存警告的时候就会调用
- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application{
[self init_applicationDidReceiveMemoryWarning:application];
}
///app被杀死调用
- (void)applicationWillTerminate:(UIApplication *)application{
[self init_applicationWillTerminate:application];
}
#pragma mark - UIApplicationDelegate - APP通知
///接收推送令牌deviceToken
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
[self push_application:application didRegisterForRemoteNotificationsWithDeviceToken:deviceToken];
}
///接收推送令牌deviceToken失败
- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {
[self push_application:application didFailToRegisterForRemoteNotificationsWithError:error];
}
///app后台获取干的事情就是在用户打开应用之前就有机会(只是有机会)执行代码来获取数据,刷新UI
- (void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
[self push_application:application performFetchWithCompletionHandler:completionHandler];
}
///APP已经接收到远程通知 app处于前台调用此方法
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
[self push_application:application didReceiveRemoteNotification:userInfo];
}
///APP已经接收到远程通知 app处于后台或者被杀死状态,收到远程通知后,当你进入程序时,调用此方法
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler {
[self push_application:application didReceiveRemoteNotification:userInfo fetchCompletionHandler:completionHandler];
}
//当应用程序在前台接收到本地通知时调用
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification{
[self push_application:application didReceiveLocalNotification:notification];
}
#pragma mark - UIApplicationDelegate - 其它应用进入app
///iOS9以前 其它app通过url进入到自己app的时候调用
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation{
[self init_application:application openURL:url sourceApplication:sourceApplication annotation:annotation];
[self link_application:application openURL:url sourceApplication:sourceApplication annotation:annotation];
[self pay_application:application openURL:url sourceApplication:sourceApplication annotation:annotation];
return YES;
}
///iOS9以后 其它app通过url进入到自己app的时候调用
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString *,id> *)options{
[self init_application:app openURL:url options:options];
[self link_application:app openURL:url options:options];
[self pay_application:app openURL:url options:options];
return YES;
}
@end
整个瘦身过程大概消耗两周时间,涉及到现有业务梳理、功能推翻重构、项目自测,最终版本AppDelegate只有区区一百行代码,美滋滋。
转载请注明来源,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 1226169349@qq.com
文章标题:iOS-AppDelegate瘦身
文章字数:1.5k
本文作者:王立志
发布时间:2019-10-18, 14:16:58
最后更新:2019-11-19, 16:13:20
原始链接:http://yoursite.com/2019/10/18/iOS-AppDelegate瘦身/版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。