AppDelegate.m文件化简

随着各种第三方库和各种推送、跳转代理方法的加入,AppDelegate.m的内容越来越庞大,看着让人心烦,因此要让它变得干干净净。

那么看最重要的一个入口:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
相信大多数人都会把全部第三方库都放在这里初始化,一不小心就几百上千行代码堆起来了。有人肯定会使用一个工具类来管理。

// AppDelegate.m
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application 
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // 使用工具类
    [ZZThirdPartyTool configWithLaunchOptions:launchOptions];
    return YES;
}
@end

然后下面是这个工具类

// ZZThirdPartyTool.m
@implementation ZZThirdPartyTool
+ (void)configWithLaunchOptions:(NSDictionary *)launchOptions {
    id delegate = [[UIApplication sharedApplication] delegate];
    // 这个delegate就是原来的AppDelegate的实例对象,下面需要设置代理就设为它,设置通知观察者也设为它。
#pragma mark - qq
#pragma mark - 微信
#pragma mark - 支付宝
#pragma mark - 音频混响
#pragma mark - 高德地图
#pragma mark - 极光推送
#pragma mark - 版本更新
#pragma mark - 八个梨
#pragma mark - 其他花里花俏的
}
@end

上面的道理都懂,那么AppDelegate里面还有其他的代理方法要实现啊,就剩这么一点空间有什么用?其他代理方法也可以有几百上千行啊!
我承认,是的,没什么用。

OK,下面重点来啦。

我打算使用强大的“分类”思想来对待这个问题。
分类(就是那个category)是个好东西,可以让一个类的不同用途的代码拆分归类,方便管理。(这里并不是“使用分类给原来编译好的类添加原来没有的方法”的意思)

例如我要完成接入极光推送的相关代码,那么我可以新建一个m文件,里面写一个AppDelegate (RemoteNotification),这个名字是随便写的。

@implementation AppDelegate (RemoteNotification)

#pragma mark - RemoteNotification
- (void)application:(UIApplication *)application
didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
    //blablabla
}

- (void)application:(UIApplication *)application
didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {
    //blablabla
}

- (void)application:(UIApplication *)application 
didReceiveRemoteNotification:(NSDictionary *)userInfo 
fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
    //blablabla
}

- (void)jpushReceiveMessageNotification:(NSNotification *)notification {
    //blablabla
}

#pragma mark - JPUSHRegisterDelegate
- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center 
didReceiveNotificationResponse:(UNNotificationResponse *)response 
withCompletionHandler:(void (^)(void))completionHandler API_AVAILABLE(ios(10.0)){
    //blablabla
}

- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center 
willPresentNotification:(UNNotification *)notification 
withCompletionHandler:(void (^)(NSInteger))completionHandler API_AVAILABLE(ios(10.0)){
    //blablabla
}
@end

那么类似的handleOpenUrl相关也这样

@implementation AppDelegate (OpenUrl)
- (BOOL)application:(UIApplication *)app 
openURL:(nonnull NSURL *)url 
options:(nonnull NSDictionary *)options {
    // 做你想做的支付宝微信等事
}
@end

有人说这么做有什么好处?
就是AppDelegate.m文件化简啊!
你看,就这样!其他的代理方法都不这里了!!!

// AppDelegate.m
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application 
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // 使用工具类
    [ZZThirdPartyTool configWithLaunchOptions:launchOptions];
    return YES;
}
@end

打完收工。

你可能感兴趣的:(AppDelegate.m文件化简)