• AppDelegate减负之常用三方封装


    之前分享过集成友盟推送的方法, 需要的朋友可以查看一下链接:

    http://www.cnblogs.com/zhouxihi/p/6533058.html

    一般开发中我们比较多使用的三方有友盟推送, 友盟分享, 友盟登录, 微信支付, 支付宝支付, 融云等等...等等...

    光集成一个友盟推送就要好几十行代码, 如果多集成几个AppDelegate就会变得臃肿不堪, 也降低了可读性

    为了解决这个问题, 目前想到以Category的方式给AppDelegate添加新的类别去完成这些三方集成

    先以友盟推送为例

    具体方法为先创建一个类别AppDelegate+UMengPush.h

    给类别添加一个userInfo属性用来临时存放接收到的推送消息, 

    @property (nonatomic, strong) NSDictionary *userInfo;

    以及一个配置友盟的方法

    /**
     配置友盟推送
    
     @param appKey 友盟appkey
     @param launchOptions App launchOptions
     */
    - (void)configureUMessageWithAppKey:(NSString *)appKey launchOptions:(NSDictionary *)launchOptions;

    因为类别增加的属性不能直接赋值和取值, 还要再专门增加getter / setter方法

    /**
     给类别属性赋值
    
     @param userInfo 推送消息字典
     */
    - (void)zx_setUserInfo:(NSDictionary *)userInfo;
    
    /**
     获取类别属性值
    
     @return 暂存的推送消息
     */
    - (NSDictionary *)zx_getUserInfo;

    实现文件直接给大家看吧, 注释的很清楚

    //
    //  AppDelegate+UMengPush.m
    //  UMengPushDemo
    //
    //  Created by Jackey on 2017/7/3.
    //  Copyright © 2017年 com.zhouxi. All rights reserved.
    //
    
    #import "AppDelegate+UMengPush.h"
    #import "UMessage.h"
    
    #import <objc/runtime.h>
    
    static char UserInfoKey;
    
    @implementation AppDelegate (UMengPush)
    
    #pragma mark - Configure UMessage SDK
    
    - (void)configureUMessageWithAppKey:(NSString *)appKey launchOptions:(NSDictionary *)launchOptions {
        
        // 设置AppKey & LaunchOptions
        [UMessage startWithAppkey:appKey launchOptions:launchOptions];
        
        // 注册
        [UMessage registerForRemoteNotifications];
        
        // 开启Log
        [UMessage setLogEnabled:YES];
        
        // 检查是否为iOS 10以上版本
        if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 10.0) {
            
            // 如果检查到时iOS 10以上版本则必须执行以下操作
            UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
            center.delegate                  = self;
            UNAuthorizationOptions types10   = 
            UNAuthorizationOptionBadge | UNAuthorizationOptionAlert | UNAuthorizationOptionSound;
            
            [center requestAuthorizationWithOptions:types10 completionHandler:^(BOOL granted, NSError * _Nullable error) {
                
                if (granted) {
                    
                    // 点击允许
                    // 这里可以添加一些自己的逻辑
                } else {
                    
                    // 点击不允许
                    // 这里可以添加一些自己的逻辑
                }
            }];
            
        }
    }
    
    #pragma mark - UMessage Delegate Methods
    
    - (void)application:(UIApplication *)application
                didReceiveRemoteNotification:(nonnull NSDictionary *)userInfo {
        
        // 关闭友盟自带的弹出框
        [UMessage setAutoAlert:NO];
        
        [UMessage didReceiveRemoteNotification:userInfo];
        
        [self zx_setUserInfo:userInfo];
        
        // 定制自己的弹出框
        if ([UIApplication sharedApplication].applicationState == UIApplicationStateActive) {
            
            UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"提示"
                                                                message:userInfo[@"aps"][@"alert"]
                                                               delegate:self
                                                      cancelButtonTitle:@"确定"
                                                      otherButtonTitles:nil];
            [alertView show];
        }
    }
    
    // iOS 10新增: 处理前台收到通知的代理方法
    - (void)userNotificationCenter:(UNUserNotificationCenter *)center
           willPresentNotification:(UNNotification *)notification
             withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler{
        
        NSDictionary * userInfo = notification.request.content.userInfo;
        if([notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
            
            //应用处于前台时的远程推送接受
            //关闭友盟自带的弹出框
            [UMessage setAutoAlert:NO];
            //必须加这句代码
            [UMessage didReceiveRemoteNotification:userInfo];
            
        }else{
            
            //应用处于前台时的本地推送接受
        }
        
        //当应用处于前台时提示设置,需要哪个可以设置哪一个
        completionHandler(UNNotificationPresentationOptionSound |
                          UNNotificationPresentationOptionBadge |
                          UNNotificationPresentationOptionAlert);
    }
    
    //iOS10新增:处理后台点击通知的代理方法
    -(void)userNotificationCenter:(UNUserNotificationCenter *)center
                didReceiveNotificationResponse:(UNNotificationResponse *)response
                    withCompletionHandler:(void (^)())completionHandler{
        
        NSDictionary * userInfo = response.notification.request.content.userInfo;
        if([response.notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
            
            //应用处于后台时的远程推送接受
            //必须加这句代码
            [UMessage didReceiveRemoteNotification:userInfo];
            
        }else{
            
            //应用处于后台时的本地推送接受
        }
    }
    
    
    - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
        
        [UMessage sendClickReportForRemoteNotification:[self zx_getUserInfo]];
    }
    
    - (void)zx_setUserInfo:(NSDictionary *)userInfo {
        
        objc_setAssociatedObject(self, &UserInfoKey, userInfo, OBJC_ASSOCIATION_COPY_NONATOMIC);
    }
    
    - (NSDictionary *)zx_getUserInfo {
        
        if (objc_getAssociatedObject(self, &UserInfoKey)) {
            
            return objc_getAssociatedObject(self, &UserInfoKey);
        } else {
            
            return nil;
        }
    }
    
    @end

    这样当们有项目需要继承友盟推送的时候, 只要配置好key, 在AppDelegate中只要简单一句话就完成了

    #import "AppDelegate.h"
    #import "AppDelegate+UMengPush.h"
    
    @interface AppDelegate ()
    
    @end
    
    @implementation AppDelegate
    
    
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
        // Override point for customization after application launch.
        
        // 配置UMessage
        [self configureUMessageWithAppKey:UMessageAppKey launchOptions:launchOptions];
        
        return YES;
    }

    附上Demo: https://github.com/zhouxihi/ThirdPartDemo

    后面会再陆续完成友盟分享, 友盟登录, 支付宝/微信支付等的内容, 欢迎大家指出不足

    如果对大家有帮助, 还请不吝帮忙star 

  • 相关阅读:
    fatal: unable to auto-detect email address (got 'tim@newton.(none)')的解决方法
    使用git命令提示“不是内部或外部命令
    Windows系统下安装 CMake
    php与mysql的连接
    array_merge和加号的区别
    可重入锁的实现
    redis scan
    redis主丛,哨兵和集群的区别
    高并发架构系列:Redis并发竞争key的解决方案详解
    laravel上传图片
  • 原文地址:https://www.cnblogs.com/zhouxihi/p/7113511.html
Copyright © 2020-2023  润新知