AppDelegate减负之常用三方封装 - 友盟推送篇

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

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

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

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

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

先以友盟推送为例

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

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

@property (nonatomic, strong) NSDictionary *userInfo;

以及一个配置友盟的方法

/**
 配置友盟推送SDK

 @param launchOptions App launchOptions
 */
- (void)configureUMessageWithLaunchOptions:(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)configureUMessageWithLaunchOptions:(NSDictionary *)launchOptions {

    // 设置AppKey & LaunchOptions
    [UMessage startWithAppkey:UMessageAppKey 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

注意需要在PCH中设置UMessage AppKey

#define UMessageAppKey  @"xxxxxxxxxxxxxxxxxxxxx"

这样当们有项目需要继承友盟推送的时候, 只有配置好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 configureUMessageWithLaunchOptions:launchOptions];

    return YES;
}

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

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

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

时间: 2024-12-19 18:14:43

AppDelegate减负之常用三方封装 - 友盟推送篇的相关文章

AppDelegate减负之常用三方封装 - 友盟分享 / 三方登录篇

之前完成了 AppDelegate减负之常用三方封装 - 友盟推送篇: http://www.cnblogs.com/zhouxihi/p/7113511.html 今天接着来完成 - 友盟分享和三方登录篇 首先去友盟上面下载SDK, 一般就新浪/微信/QQ  我们都选择精简版 把下载好的SDK添加到项目, 按照开发文档添加libsqlite3.0.tbd到Linked Frameworks, 在Build Settings -> Linking -> Other Linker Flags 添

iOS集成友盟推送

之前有写过利用Python自己写一个推送服务器, 今天说下如果集成友盟的推送服务 在这之前我们需要做一些准备动作 #1. 注册一个App ID #2. Enable Push NotificationSerivice, 并创建和下载开发/发布推送证书 #3. 安装推送证书, 然后把推送证书到处为p12文件 #4. 注意友盟账号 #5. 创建一个推送应用, 并上传推送证书的p12文件和填写密码 #6. 下载SDK, 添加到项目中 在AppDelegatez #import "UMessage.h&

友盟推送

一.感受 下面讲下我对推送这个功能在IOS下的感受,这个算是我做了服务端的功能和手机端的功能后的一个体会吧, 这功能在IOS上是多少给我带来了点鸡肋的感觉,首先很多时候收到推送有延时现象,还有如果连续推送两条消息给一个Iphone手机,如果遇到延时这个问题,那么第一条推送就会被覆盖.(这里我用的是友盟的推送,这个推送暂时感觉还不错,大多数推送能及时收到,至少我暂时测试是如此,所以我这里也选择了它,以前遇到过两小时后才到的第三方推送.....甚至根本就收不到.),再一个,即使延迟这个问题解决了,关

友盟推送(二)

上一篇友盟推送一,我们获取到了Device_Token,可以在友盟的后台推送消息到指定的手机.下面就介绍添加标签,删除标签 iOS 消息推送 (Message) SDK使用指南 本文档包括: 介绍 基本功能集成指南 高级功能集成指南 测试与调试 技术支持 1. 介绍 友盟消息推送组件帮助您实时的推送消息给用户. 下载的压缩包中将包括以下内容: 文件名称 介绍 UMessage_Sdk_Introductions.html 该文件介绍如何使用友盟消息推送SDK UMessage_Sdk_Relea

《友盟推送调到指定界面》

给大家讲一点常识,友盟推送分生产环境和开发环境.用手机刷上去的就是开发环境, 发布到苹果商店就是生产环境,没发布前怎么模拟呢, 用普通账号打的ad hoc 包, 用企业账号打的ad hoc 包或者enterprise包都可以测试生产环境. 开发环境下, 你把APP删掉,重新调试上来,就会生成一个新的device_token了! 收到通知的时候APP的状态可能是未启动.前台活跃(任何界面).后台等三种. 未启动时,点击通知栏启动App, 会在didFinishLaunchingWithOption

友盟推送 .NET (C#) 服务端 SDK rest api 调用库

友盟推送 .NET SDK rest api 介绍 该版本是基于友盟推送2.3版本封装的,网上查询了下发现没有.NET版本的调用库,官方也没有封装.NET的版本,只有python.java.php版本,您这又让.NET情何以堪啊,故分享一个简单易调用的版本分享给大家,本次封装的代码相比我封装的[信鸽推送] 简单很多,而且自由度很高,参数基本都是直接转json的实体,,需要根据友盟REST API   http://dev.umeng.com/push/android/api-doc 去具体赋值,

友盟推送的集成过程及开发建议

一.服务简介 友盟以移动应用统计分析为产品起点,发展成为综合性的移动开发者服务平台.友盟推送是一款帮你将应用的内容更新或活动通知主动推送给终端用户,让用户第一时间获取到相关信息,有效提升用户活跃度和留存率的一种服务. 二.集成过程 1. 导入SDK所需jar包 2. 配置AndroidManifest.xml 2.1 添加权限 2.2 添加组件 2.3 添加AppKey 和 Umeng Message Secret 3. 添加代码,编译测试 3.1 在应用的主Activity onCreate(

使用极光/友盟推送,APP进程杀死后为什么收不到推送(转)

为什么会存在这样的 问题,刚开始的时候我也搞不清楚,之前用极光的时候杀死程序后也会收到推送,但最近重新再去集成时就完全不好使了,这我就纳闷了,虽然Google在高版本上的android上面不建议线程守护,所以将进程有关的Service都杀掉了,但旧版本还是有这个功能的啊 !真尼玛,后来猜测估计是因为要适配6.0所以低版本的一些代码就删除了,造成低版本的也不行了,接下来分析一下这个问题. 首先我们把Android分为两类机型,一种是原生态的Android系统,比如Nexus,三星等机型,一种是深度

友盟推送里面的Alias怎么用?可以理解成账号吗?

友盟推送里面的Alias怎么用?可以理解成账号吗? 我们的App有自己的账号体系的,想在每次用户登陆的时候,给用户发一个欢迎消息. 看了一下友盟推送,里面有一个概念叫做Alias(别名),但是官方文档写着Alias是和设备绑定的,感觉Alias算不上是严格意义的账号.不知道其它集成过友盟推送的兄弟们是否有类似的需求,是否可以通过友盟推送提供的Alias功能来满足我们的需求? 作者:沙漠链接:http://www.zhihu.com/question/31882775/answer/5425406