iOS 给AppDelegate瘦身

项目中经常要用到第三方的SDK每次都要在AppDelegate中注册APPKEY 接受回调等 这样就使本来很简洁的AppDelegate中的代码越来越多 那么问题来了 怎样把这些第三方的代码提到其他的地方使用啊?

runtime是一个好东西 给AppDelegate写个分类(AppDelegate+TimingChat) 在分类中替换原来的方法。

本人项目中是这样写的 如下:

#import "AppDelegate+TimingChat.h"

#import <objc/runtime.h>

#import "TimingCustomAttachmentDecoder.h"

#import "TimingCellLayoutConfig.h"

#define APPKEY          @""

#define APNSCERNAME    @""

//这个暂时不需要

#define PKCERNAME      @""

@implementation AppDelegate (TimingChat)

+(void)load {

    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{

        Class class = [self class];

        swizzleMethod(class, @selector(application:didFinishLaunchingWithOptions:), @selector(aop_application:didFinishLaunchingWithOptions:));

        swizzleMethod(class, @selector(applicationDidEnterBackground:), @selector(aop_applicationDidEnterBackground:));

        swizzleMethod(class, @selector(applicationWillEnterForeground:), @selector(aop_applicationWillEnterForeground:));

  swizzleMethod(class, @selector(applicationDidBecomeActive:), @selector(aop_applicationDidBecomeActive:));

swizzleMethod(class, @selector(applicationWillTerminate:), @selector(aop_applicationWillTerminate:));

        swizzleMethod(class, @selector(application:didRegisterForRemoteNotificationsWithDeviceToken:), @selector(aop_application:didRegisterForRemoteNotificationsWithDeviceToken:));

        swizzleMethod(class, @selector(handleNotification:), @selector(aop_handleNotification:));

    });

}

static inline void swizzleMethod(Class class, SEL originalSelector, SEL swizzledSelector) {

    Method originalMethod = class_getInstanceMethod(class, originalSelector);

    Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector);

    BOOL didAddMethod = class_addMethod(class, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod));

    if (didAddMethod) {

        class_replaceMethod(class, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod));

    } else {

        method_exchangeImplementations(originalMethod, swizzledMethod);

    }

}

- (BOOL)aop_application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    NSLog(@"分类launchOptions");

    [self aop_application:application didFinishLaunchingWithOptions:launchOptions];

    NIMServerSetting *setting  = [[NIMServerSetting alloc] init];

//#ifdef DEBUG

//    setting.httpsEnabled = NO;

//#endif

    setting.httpsEnabled = NO;

 [[NIMSDK sharedSDK] setServerSetting:setting];   

[[NIMSDK sharedSDK] registerWithAppID:APPKEY cerName:APNSCERNAME];

   [[TNIMNotificationCenter sharedCenter] start];

    //自定义消息布局

    [[NIMKit sharedKit] registerLayoutConfig:[TimingCellLayoutConfig new]];

    //自定义消息对象序列化

    [NIMCustomObject registerCustomDecoder:[[TimingCustomAttachmentDecoder alloc]init]];

    //存云端历史

    NIMMessageSetting *messageSetting = [[NIMMessageSetting alloc] init];

    messageSetting.historyEnabled = YES;

    [[NIMSDK sharedSDK].loginManager addDelegate:self];

    [self registerAPNs];

    return YES;

}

#pragma mark - 退出登陆

-(void)setupLogout{

    [[[NIMSDK sharedSDK] loginManager] logout:^(NSError *error) {

        if (error == nil){

            NSLog(@"云信退出登陆");

        }

    }];

}

#pragma mark -多端登陆问题 踢下线

-(void)onKick:(NIMKickReason)code clientType:(NIMLoginClientType)clientType{

    [self setupLogout];

    [self postNotification:KL_NOTIFICATION_ACCOUNT_LOGIN_OTHER];

}

#pragma mark -自动登陆的回调

-(void)onLogin:(NIMLoginStep)step{

    switch (step) {

        case NIMLoginStepLinking:{//链接服务器

          NSLog(@"链接服务器");

        }

            break;

        case NIMLoginStepLinkOK:{//连接服务器成功

            NSLog(@"连接服务器成功");

        }

            break;

        case NIMLoginStepLinkFailed:{//连接服务器失败

            NSLog(@"连接服务器失败");

        }

            break;

        case NIMLoginStepLogining:{//登陆中

            NSLog(@"登陆中");

        }

            break;

        case NIMLoginStepLoginOK:{//登陆成功

            NSLog(@"登陆成功");

        }

            break;

        case NIMLoginStepLoginFailed:{//登陆失败

            NSLog(@"登陆失败");

            [[[TAlertView alloc] initWithErrorMsg:@"自动--登陆失败"] showStatusWithDuration:1.5];

            }

            break;

        case NIMLoginStepLoseConnection:{//链接断开

                NSLog(@"链接断开");

            }

            break;

        default:

            break;

    }

}

#pragma mark -手动登陆

-(void)loginManual{

    NSLog(@"手动登陆");

    [SharedApiClient neteaseimCreateUserGetTokenWithUserID:^(NSURLSessionDataTask *task, KLApiResponse *aResponse, NSError *anError) {

     NSLog(@"createUserGetToken=====:%@",aResponse.data);

        if (aResponse.success) {

            NSString *token = aResponse.data[@"token"];

            NSString *account = aResponse.data[@"accid"];

            SharedData.user.token = token;

            SharedData.user.account = account;

            [[[NIMSDK sharedSDK] loginManager] login:account

                                              token:token

                                          completion:^(NSError *error) {

                            if (!error){

                                NSLog(@"手动登陆----云信登陆成功。。。。。。。。。。");


                                //覆盖更新的用户要调用云信的修改用户资料

                                [[NIMSDK sharedSDK].userManager updateMyUserInfo:@{@(NIMUserInfoUpdateTagNick):SharedData.user.nickname,@(NIMUserInfoUpdateTagAvatar):SharedData.user.avatar,@(NIMUserInfoUpdateTagExt):SharedData.user.categoryAlias} completion:nil];

                                //将群的通知关闭

                                NSArray *array = [SharedCache allTeamInfo];

                                for (TTeamChannelInfoModel *teamInfo in array) {

                                    [[NIMSDK sharedSDK].teamManager updateNotifyState:NIMTeamNotifyStateNone inTeam:teamInfo.teamID completion:nil];

                                }

                                }else{

                                NSString *toast = [NSString stringWithFormat:@"登录失败 code:%ld",error.code];

                                NSLog(@"toast====%@",toast);

                                [[[TAlertView alloc] initWithErrorMsg:toast] showStatusWithDuration:1.5];

                    }

            }];

        }

    }];

}

#pragma mark - 登陆

- (void)setupLogin

{

    if (!SharedData.user.token) {

        [self loginManual];

    }else{

        NSLog(@"开始自动登陆");

        NIMAutoLoginData *loginData = [[NIMAutoLoginData alloc] init];

        loginData.account = SharedData.user.account;

        loginData.token = SharedData.user.token;

        NSLog(@"SharedData.user.account====%@",SharedData.user.account);

        NSLog(@"SharedData.user.token====%@",SharedData.user.token);

        [[[NIMSDK sharedSDK] loginManager] autoLogin:loginData];

    }

}

#pragma mark - 客户端注册 APNS,并在获取到 APNS Token 时将值传给 SDK

- (void)registerAPNs

{

    if ([[UIApplication sharedApplication] respondsToSelector:@selector(registerForRemoteNotifications)]){

        UIUserNotificationType types = UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert;

        UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:types categories:nil];

        [[UIApplication sharedApplication] registerUserNotificationSettings:settings];

        [[UIApplication sharedApplication] registerForRemoteNotifications];


    }else{

        UIRemoteNotificationType types = UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeBadge;

        [[UIApplication sharedApplication] registerForRemoteNotificationTypes:types];

//        UNAuthorizationOptions typeax = UNAuthorizationOptionBadge | UNAuthorizationOptionSound |UNAuthorizationOptionAlert;

//

//        [[UIApplication sharedApplication] registerForRemoteNotifications];

    }

}

-(void)aop_applicationDidEnterBackground:(UIApplication *)application{

    [self aop_applicationDidEnterBackground:application];

    NSLog(@"分类 applicationDidEnterBackground");

}

-(void)aop_applicationWillEnterForeground:(UIApplication *)application{

    [self aop_applicationWillEnterForeground:application];

    NSLog(@"分类 applicationWillEnterForeground");

}

-(void)aop_applicationDidBecomeActive:(UIApplication *)application{

    [self aop_applicationDidBecomeActive:application];

    NSLog(@"分类 applicationDidBecomeActive");

}

-(void)aop_applicationWillTerminate:(UIApplication *)application{

    [self aop_applicationWillTerminate:application];

    NSLog(@"分类 applicationWillTerminate");

}

#pragma mark - 获取到 APNS Token 时将值传给 SDK

-(void)aop_application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken{

    [self aop_application:app didRegisterForRemoteNotificationsWithDeviceToken:deviceToken];

//    NSLog(@"分类----deviceToken======%@",deviceToken);

[[NIMSDK sharedSDK] updateApnsToken:deviceToken];

}

@end

runtime的方法交换是个好东西(也是魔鬼)

细心的读者应该注意到了下面的方法中调用了 [self aop_applicationDidEnterBackground:application]; 会产生死循环调用的问题吗?其实没有死循环 他会调用原来的方法applicationDidEnterBackground: 在调用aop_applicationDidEnterBackground:替换的方法 这样就不会影响原来的applicationDidEnterBackground:方法里面的调用内容

-(void)aop_applicationDidEnterBackground:(UIApplication *)application{

    [self aop_applicationDidEnterBackground:application];

    NSLog(@"分类 applicationDidEnterBackground");

}

这样就可以给AppDelegate瘦身了  其他的第三方可以这样写


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容