随着各种第三方库和各种推送、跳转代理方法的加入,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<UIApplicationOpenURLOptionsKey,id> *)options {
// 做你想做的支付宝微信等事
}
@end
有人说这么做有什么好处?
就是AppDelegate.m文件化简啊!
你看,就这样!其他的代理方法都不这里了!!!
// AppDelegate.m
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// 使用工具类
[ZZThirdPartyTool configWithLaunchOptions:launchOptions];
return YES;
}
@end
打完收工。