美文网首页ios 进阶iOS Development疑惑
iOS 集成极光推送,绕过一些坑

iOS 集成极光推送,绕过一些坑

作者: Tate_code | 来源:发表于2016-02-02 16:36 被阅读17403次

前言

最近公司要求把维护期的项目都集成极光推送,集成期间遇到一些小坑,特此在这总结!

极光推送能干嘛?

1.为 JPush Server 上报 Device Token,免除开发者管理 Device Token 的麻烦
2.支持iOS APNs推送
3.前台运行时,可接收由JPush下发的(透传的)自定义消息
4.灵活管理接收用户:Tag(标签分组)、Alias(用户别名)、RegistrationID(设备注册ID)

知道能干嘛了那就开始动手集成👌

配push证书:

此步骤直接看极光的 文档即可,写得很详细😄

导入必要的框架

CFNetwork.framework
CoreFoundation.framework
CoreTelephony.framework
SystemConfiguration.framework
CoreGraphics.framework
Foundation.framework
UIKit.framework
Security.framework
Xcode7需要的是libz.tbd;Xcode7以下版本是libz.dylib

创建并配置PushConfig.plist文件

在你的工程中创建一个新的Property List文件,并将其命名为PushConfig.plist,文件所含字段如下:
CHANNEL
指明应用程序包的下载渠道,为方便分渠道统计,具体值由你自行定义,如:App Store。
APP_KEY
填写管理Portal上创建应用后自动生成的AppKey值。请确保应用内配置的 AppKey 与第1步在 Portal 上创建应用后生成的 AppKey 一致。
APS_FOR_PRODUCTION
1.3.1版本新增,用于标识当前应用所使用的APNs证书环境。
0 (默认值)表示采用的是开发证书,1 表示采用生产证书发布应用。
注:此字段的值要与Build Settings的Code Signing配置的证书环境一致。
在1.2.2或之前版本的配置文件中,有 TEST_MODE 这个键,新版的SDK不再使用,可以将它删除。

PushConfig.png

核心代码

首先在AppDelegate.m 导入#import "JPUSHService.h"
~didFinishLaunchingWithOptions方法贴上核心代码:

  //极光推送
    if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) {
        //可以添加自定义categories
        [JPUSHService registerForRemoteNotificationTypes:(UIUserNotificationTypeBadge |
                                                          UIUserNotificationTypeSound |
                                                          UIUserNotificationTypeAlert)
                                              categories:nil];
    } else {
        //categories 必须为nil
        [JPUSHService registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge |
                                                          UIRemoteNotificationTypeSound |
                                                          UIRemoteNotificationTypeAlert)
                                              categories:nil];
    }
    //JAppKey : 是你在极光推送申请下来的appKey Jchannel : 可以直接设置默认值即可 Publish channel
    [JPUSHService setupWithOption:launchOptions appKey:JAppKey
                          channel:Jchannel apsForProduction:NO]; //如果是生产环境应该设置为YES
    ```
之后还需要加入以下方法:
  • (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
    // Required
    [JPUSHService registerDeviceToken:deviceToken];
    }

-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo{

NSString *alert = [[userInfo objectForKey:@"aps"] objectForKey:@"alert"];

if (application.applicationState == UIApplicationStateActive) {

    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"推送消息"
                                                        message:alert
                                                       delegate:self
                                              cancelButtonTitle:@"OK"
                                              otherButtonTitles:nil];
    [alertView show];
}
[application setApplicationIconBadgeNumber:0];

[JPUSHService handleRemoteNotification:userInfo];

}

我们还能监听极光推送生命周期通知:

API里面提供了下面 5 种类型的通知:

extern NSString * const kJPFNetworkDidSetupNotification; // 建立连接

extern NSString * const kJPFNetworkDidCloseNotification; // 关闭连接

extern NSString * const kJPFNetworkDidRegisterNotification; // 注册成功

extern NSString * const kJPFNetworkDidLoginNotification; // 登录成功

温馨提示:
Registration id 需要在执行到kJPFNetworkDidLoginNotification的方法里获取

extern NSString * const kJPFNetworkDidReceiveMessageNotification; // 收到自定义消息(非APNS)

其中,kJPFNetworkDidReceiveMessageNotification传递的数据可以通过NSNotification中的userInfo方法获取,包括标题、内容、extras信息等

  
#### 使用方法
###### Tag(标签分组)& Alias(用户别名)

//用于绑定Tag的 根据自己想要的Tag加入,值得注意的是这里Tag需要用到NSSet
[JPUSHService setTags:[NSSet set]callbackSelector:nil object:self];
//用于绑定Alias的 使用NSString 即可
[JPUSHService setAlias:@"" callbackSelector:nil object:self];

如果想要即要绑定Alias也要绑定Tag,必须使用以下方法,已被坑

//用于同时绑定Tag与Alias的
[JPUSHService setTags:[NSSet set] alias:@"" callbackSelector:nil target:self];

###### 一般在项目哪里绑定呢?
我主要是在项目的登录成功或者自动登录后,使用用户的唯一标示进行绑定,或者根据需求添加一些前缀

###### 去除绑定
用户进行退出登录的方法里添加去除绑定即可,值得注意的是用到即时通讯的话,被挤下线也要去除绑定,已被坑,贴代码:

//没有值就代表去除
[JPUSHService setTags:[NSSet set]callbackSelector:nil object:self];
[JPUSHService setAlias:@"" callbackSelector:nil object:self];
[JPUSHService setTags:[NSSet set] alias:@"" callbackSelector:nil target:self];


#### 测试是否集成成功
到极光[平台](https://www.jpush.cn/push/apps/c8d9798cc63b93bf2c1ed834/push/notification/)测试推送:

![测试推送.jpg](http:https://img.haomeiwen.com/i313852/ffaf1b475c5debb7.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
只要推送成功,剩下的由后台根据Alias或者Tag来推送就可以了😄


#### 补充
关于推送来的小红点角标,简称badge。默认是极光推送过来一次角标+1,这个值badge是由后台推送过来的消息传的值,但是当用户看了,角标会默认被清除,如果你没有去告诉后台的话,后台下次推送过来,你的badge显示的值还是你上一次的值加一,那如何解决这个问题呢?
细心的开发者会去查看极光推送的API文档,但是我觉得看文档就有点麻烦了,所以我直接去看``JPUSHService.h``文件,所以我发现极光为这个问题提供了解决的方法

/*!

  • @abstract 设置角标(到服务器)
  • @param value 新的值. 会覆盖服务器上保存的值(这个用户)
  • @discussion 本接口不会改变应用本地的角标值.
  • 本地仍须调用 UIApplication:setApplicationIconBadgeNumber 函数来设置脚标.
  • 本接口用于配合 JPush 提供的服务器端角标功能.
  • 该功能解决的问题是, 服务器端推送 APNs 时, 并不知道客户端原来已经存在的角标是多少, 指定一个固定的数字不太合理.
  • JPush 服务器端脚标功能提供:
    • 通过本 API 把当前客户端(当前这个用户的) 的实际 badge 设置到服务器端保存起来;
    • 调用服务器端 API 发 APNs 时(通常这个调用是批量针对大量用户),
  • 使用 "+1" 的语义, 来表达需要基于目标用户实际的 badge 值(保存的) +1 来下发通知时带上新的 badge 值;
    */
  • (BOOL)setBadge:(NSInteger)value;
而且我还发现极光推送也能收集Crash日志,之前只知道友盟与听云

/*!

  • @abstract 开启Crash日志收集
  • @discussion 默认是关闭状态.
    */
  • (void)crashLogON;

如何改变推送过来的提示音呢?
只需要让服务端设置sound字段就可以了。
>iOS 通知声音 (sound)
APNs通知,通过这个字段指定声音。默认为default,即系统默认声音。 
如果设置为空值,则为静音。
如果设置为特殊的名称,则需要你的App里配置了该声音才可以正常。

#### [JPushSDK资源下载](http://docs.jpush.io/resources/)

相关文章

网友评论

  • Arthur澪:请问,开发环境下,极光后台发的推送能够收到;自己的后台发的收不到,什么原因
  • 5116166f07aa:你好,请问自定义消息接收到的字典,与上传的不一样,怎么处理
  • manajay:用户进行退出登录的方法里添加去除绑定即可,值得注意的是用到即时通讯的话,被挤下线也要去除绑定,
    为什么被挤下线就要去除绑定呢. 不同设备是不同的注册ID, 我只要使用最新的别名推送,之前的别名也就没有用了啊
  • f170d29955a5:我设置角标的时候角标不自动+1,后台传badge的时候传的也是+1,我在- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(NSInteger))completionHandler 方法里面设置[JPUSHService setBadge:5];下次接收到通知的时候badge还是没有后台传过来的1,并没有+5,能不能详细说下收到推送后在哪个方法里面做什么事情?在哪儿执行[JPUSHService setBadge:5];?
  • 曹小宇丶:请问一下,我现在需要用一个UISwitch去控制声音和震动 但是当Switch关闭的时候怎么才能让声音和震动都关闭呢?怎么去获取sound?
  • Joe_lisa:大神,请教下,如果两个tag 值,如果在极光的web上手机端能收到tag推送消息,但是调用他的api时,始终收不到推送提醒
  • 1fb67cc4c504:大神 按照你的方法控制台成功推送通知了 但是手机端收不到通知...
    清风明月伴我行:@韩宜林 我qq 1017616858 能问你关于极光推送的证书问题吗
    1fb67cc4c504:@Tate_zwt 是我的开发证书出问题了 换下证书就好了:grin:
    Tate_code:@韩宜林 注意生产与开发环境
  • Joe_lisa:真机调试该项目,如果控制台输出以下日志则代表您已经集成成功。
    2016-08-19 17:12:12.745823 219b28[1443:286814] | JPUSH | I - [JPUSHLogin]
    ----- login result -----
    uid:5460310207
    registrationID:171976fa8a8620a14a4 按这种算集成成功,但是我的在发送通知的时候,就是发送不了通知的
    assassinate:不走 代理方法 是 什么鬼
  • 29b31617c222:我创建证书绑定的bundle Id (之前没使用过的)真机测试的时候设置这个bundle ID 没法运行的, 叫我换一个不同的bundle ID ,这是什么原因造成的,博主之前遇到过这问题吗??
    Tate_code:@ISO_iOS_OSI 你试试重新弄,可能可以解决你的问题
    29b31617c222:@Tate_zwt 不会,你配置证书时不是要添加APP ID
    的嘛,然后我把添加的ID复制下来放到项目的bundle ID那里去,把生成的证书放到极光官网那里,然后我真机调试就有问题了,这个ID不能用了
    Tate_code:@ISO_iOS_OSI 可能你的bundle ID搞错了,我没遇到过
  • 冰三尺:我把手机连接xcode运行,可以收到推送,也能获取推送的内容,但是杀掉进程之后,能收到推送通知,就是手机会弹出通知栏,但是我却无法获取推送的内容,didFinishedLanuchWithOptions
    和didReceivedRomoteNotification
    这两个方法都不走?
    cc9e79cf7b4c:@里脊糖醋 请问你是怎么解决的呢,我也遇到了,求解
    冰三尺:@Tate_zwt 问题我已经解决了,谢谢你的回答。
    Tate_code:@影阑珊 是这样的,只有在程序前台运行才会走
  • 吴德馨:[JPUSHService setupWithOption:launchOptions appKey:JAppKey
    channel:Jchannel apsForProduction:NO];
    如果我打包的话就需要把 apsForProduction设置为YES了吗?真机测试呢?
    Tate_code:@请问一个月 要的
  • 我把今生当成了来世:你好,请教下,如何获取原tag集合呢?
    Tate_code:@Crazy__ 我没试过
  • whereandhere:您好,我想问下 ,使用 tag设置的时候,发送多条,显示的 角标一直是1,您知道为什么吗
    whereandhere:@Tate_zwt 恩 谢谢你
    Tate_code:@whereandhere 我后面有解释呀,badge,你再看下文章
  • 极小光:这里有极光官方推出的教学视频「JPush iOS SDK 的集成」http://community.jiguang.cn/t/jpush-ios-sdk/4247
  • bf54965496d9:你好,请教一下,可以收到推送通知,有横幅和振动,但是没有声音是为什么。(设置-通知中声音已打开,设置-声音中也打开了)。而且ios7.2系统有声音,8或9系统没有声音,求教。
    清河湾:@_我就喜欢 应该是证书错了,真机调试你用的时开发证书吧,打包的时候要用生产证书才会正常,而且注册的时候

    [JPUSHService setupWithOption:launchOptions
    appKey:(NSString *)JPushAppKey
    channel:(NSString *)JPushChannel
    apsForProduction:(BOOL)NO]; //yes是生产环境

    要改成YES 吧
    bf54965496d9:@Tate_zwt 这个问题解决了,但是还有个问题,楼主有没有遇到过真机调试可以推送,打包后安装却推不过来的情况呢?连接真机的时候device token正常上传了,但是打包的我怀疑没有正常上传所以推不过来,求解
    Tate_code:@_我就喜欢 这个问题我在后期也出现了,没有声音。也纠结了一阵,最后问题是因为后台发送的推送消息里sound字段设置为空值,则为静音了。后台跟我说原因是极光改了后台的API,后台更新了极光的最新API就好了,希望对你有帮助。
  • 9a2e3c097760:你好,我想问下,为什么按照您的方法,集成上去后,群推可以收到,单推就提示@"此别名或者标签还没有在任何客户端SDK提交设置成功。?这个跟证书有关吗?为什么群推可以,单推不可以

    "
    Tate_code:@倔强的少山 如果是系统的话,都是由服务器那边设置的,本地自己推送的话就是本地设置。
    9a2e3c097760:@Tate_zwt 搞定了,绑定别名的代码,写的位置不对,应该和注册的代码写在一起就好了,还有个问题,接收到通知时候,通知的应用名称该怎么设置啊?
    Tate_code:@倔强的少山 能群推代表你已经集成了,只是你绑定别名或者tag的方式应该不对。
  • Fs_purple:您好。我设置alias之后
    [JPUSHService setAlias:user_alias callbackSelector:nil object:self];
    怎么看是否设置成功了了。因为貌似单推的时候说没有注册。
    Tate_code:@zhao1zhihui 一般是用户的唯一标识
    zhao1zhihui:@Tate_zwt tag 和 alias用什么 设置比较好
    Tate_code:@Fs_purple 你可以到极光推送开放的平台测试推送,如果成功了就代表绑定注册了,不过需要注意生产与开发环境。
  • d7390703128d:你好,我最近也在弄极光推送,但是遇到了问题,就是在设置别名setAlias的时候,我把所有的方法都用了,但是都设置失败,去极光的后台发送,会告诉我没有注册,不知道你遇到过这个问题么
    Tate_code:@辟邪 注意下生产与开发环境,可能你搞反了
  • javenfang:我是 [极光推送](http://jpush.cn) 官方的人员。

    如果你想用 JPush 来实现类似于聊天的功能的话,应选择使用 [JMessage](http://docs.jpush.io/guideline/jmessage_guide/)
    清风明月伴我行:极光推送 打包ipa进行生产环境推送测试,打的包codesigning 怎么选择证书?看极光教学视频开发环境测试codesigning 选择的都是ios develop,然后生产环境测试就直接archive ipa包了。
    zhao1zhihui:怎么实现呢
    Tate_code:@老码农 好的,我会留意的:smile:

本文标题:iOS 集成极光推送,绕过一些坑

本文链接:https://www.haomeiwen.com/subject/hpaskttx.html