iOS推送通知

极光推送:

1.JPush当前版本是1.8.2,其SDK的开发除了正常的功能完善和扩展外也紧随苹果官方的步伐,SDK在iOS8刚推出的时候跟进更新。在一定程度上来讲,能够体现极光推送的技术力量是比较强大的;

2.应用内消息提高了推送服务的及时性和可靠性,在、紧随当下追求应用实时性的潮流,能够提供更好的推送服务的用户体验;

3.JPush除了有着完善的控制台外,还提供了服务端的接口,方便开发者的服务器调用,方便开发者对于应用管理、整合即通过应用服务器极光服务器推送服务器用户设备,简化了服务器端的开发强度,也方便运营期间发送推送消息的流程;

4.如果开发者同时需要用户统计和推送功能,那么这是一款不容错过的SDK因为JPush提供了全面直观的统计数据,在控制台中以图表的形式呈现,方便运营期间的数据分析;

5.当前版本的SDK仅有5M左右的体积,嵌入应用或者打包应用影响都是很小的,开发者大可不必担心。

6.对于高级用户还开放了富媒体推送和更多的API调用次数,当然这也需要开发者付出一定的费用,对于有需要的开发者可以自行了解。

综合评价:

笔者在测试极光推送之前也测试过其他的推送服务,在项目中使用的也是极光推送。对比这些推送服务来讲,极光是从文档、SDK简洁程度、集成难度、服务都较为满意的。在笔者的应用中有需要统计用户行为的需求,而极光也恰恰满足了这种需求,带来了极大的方便。总而言之,极光推送确实能给开发者带来不错的编程体验。

通过笔者的测试,极光SDK的集成难度不大,文档注释清晰易懂。而且有较为强大的技术支持(QQ群、论坛、博客)。所以对于有一定开发经验的需要使用推送服务、本地推送服务、推送统计的开发者是非常适用的,而即使是对推送要求不高的项目,极光SDK的开发成本也并不是很高,所以具有较为宽泛的适用范围。

极光推送是推送服务商中较大的一个,目前的用户量也相当庞大,其文档、注释、网站控制台都较为完善。极光SDK对推送服务进行高级封装,除了实现APNS推送以外还实现了基于TCP连接的应用内消息,在一定程度上提高了推送服务的可靠性。其SDK非常简洁,简化了集成过程,而通过阅读API的注释及相关文档,开发者可以很快的掌握SDK的使用。对于有一定开发经验的开发者是非常易于上手的

高送达率,时效保证:极光推送自主协议确认推送消息的送达。开发者可以灵活的自定义推送时间

服务集成SDK简单:简单复制便可直接编译运行

推送内容多样性服务:除了通知,还有消息、多媒体等

使你的应用程序保持高注意力:即使用户没有打开应用程序,极光推送也能够推送通知到达用户手机

自定义消息内容:JPushSDK把内容完全转给应用程序,由开发者应用程序去处理自定义消息

接入即可用功能:客户端集成SDK即可享受高效 专业的推送服务,操作简单的管理后台

多平台:同时支持 Android与iOS平台

高安全性:传输信道加密,推送数据自主加密

高稳定性,大容量,高并发:目前极光推送平台支持 十亿级用户,高达20万/秒的下行速度

省流量,低耗电功能强大:待机流量消耗20K/天,电 量消耗30mAh/天  毕竟国外网络服务在中国都颇为不完善,而且推送服务对网络和服务器端有较高的要求。因此,国内很快就兴起数家像极光推送云消息推送服务的公司,是国内做得较好的一家。

优势:

1)   开放注册,免费向所有的开发者开放使用

2)SDK流量电量消耗很少

3)集成简单,很快就能够集成跑起来

4)服务器端推送支持大并发量、延迟小

友盟推送:

1.推送形式多样:开发者可以在网页设置或者采用API接入方式进行消息推送,并可以选择文本消息、应用更新以及json式消息,满足开发者不同场景下的运营需求。

2.用户分组灵活:开发者可以使用多个预置条件或者自定义的用户标签把用户分组,对每个分组的用户推送更有针对性的消息,满足开发者定向推送的需求。

3.设备能耗极低:SDK中采用了先进的长链接多路复用以及其他优化方案,将用户设备的电量和流量消耗控制在最低水平,确保用户体验最优。

4.建立与用户直接沟通的通道:不论是新品上架还是精彩活动举行,都可以实时的推送到用户设备,让用户第一时间获取到相关信息。适时而准确的消息推送,可以大幅度提升用户的活跃度和忠诚度。

功能特色

用户分群推送

开发者可以使用多个预置条件或者自定义的用户标签把用户分群,对每个用户群的用户推送更有针对性的消息,满足开发者定向推送的需求。

接入方式灵活

开发者可以通过网站WEB界面或者API接入方式进行消息推送,且支持开发者提交已分群的用户ID到友盟服务器进行消息推送,满足开发者不同场景下的运营需求。

服务质量高

实现了同一设备多应用共享一个长连接、智能心跳等优化方案。消息发送速度快,长连接稳定,设备能耗低。

优点:

友盟推送的SDK包很小,集成的时候不需要导入其它库,集成后对应用影响很小,使用方便;

在网站的应用信息中,可以看到推送的历史记录:包括发送总数、用户打开数、打开率等等,方便统计

友盟推送集成是最简单,使用也最方便,推送的渠道也是多样的。

缺点:

但是在同网络环境下,友盟的推送速度却是比不上极光推送的。而服务器端的api使用不太方便,需要设置一个服务器IP地址才能使用。自定义的字数最多只有1500字

百度推送:

1.Push 服务

Push 服务初始化及绑定

Push 服务解除绑定

2.Tag 管理

创建 tag

删除 tag

列出 tag

3.通知推送

4.推送效果反馈

百度有延迟,推送不稳定,不人性化,很多也只是为了服务百度系的公司来用。到达率存在问题。开发者网站不是非常用户友好。

百度推送,推送Android还行,在推送ios时推送内容有限制,官方说是不能大于4k,但是实际推送的内容80个汉字以上就不行,推送不了。

优点:

1.1、 推送及时,支持推送通知、穿透消息推送、富媒体消息推送。

1.2、 提供常见问题解答。

1.3、 提供客服支持。

缺点:

1.1、 与其他推送平台相比官网没有详细的开发文档,不方便开发者查阅。

1.2、 与其他推送平台相比,集成困难。

建议:在官网放一份详细的开发文档,方便开发者查阅和集成。

iOS推送简介:

在移动应用中,推送已经成为不可缺少的重要功能。本文档主要介绍有关 iOS 推送的基础知识,并从几个典型问题出发,分析如何解决在实现推送中出现的一些问题。

1.1 本地通知和远程通知简介

在 iOS 设备上(模拟器无法使用推送),系统收到通知后这样处理:

在屏幕上弹出一些选项,或者在屏幕顶部显示横幅(banner)如下图左

App 的角标数值发生变化,具体表现为 App icon 右上角的小红点及数字,如邮件中的红点

伴随推送消息的提示声音

当应用处于前台运行时,系统是不会在屏幕上显示通知,但是仍会调用相应的 API。

只有真机可以使用推送功能。

用户可以设置每一个 App 的通知权限,如下图最后一个:


用户可以选择关闭某个应用的推送功能。还可以设置通知是否在通知中心显示、通知到达时是否发出声音、通知能否改变 App 角标以及锁屏时是否显示该 App 的通知,还可以设置通知到达时的提醒样式。当然,这些都可以分别对每一个应用进行单独设置。

1.1.1 本地通知

本地通知是一种基于时间的提醒方式。

本地通知最多向系统注册 64 个,当超过这个数量后,最早注册的本地通知会被丢弃。

本地通知在 iOS 设备上的显示与远程推送通知一样。

1.1.2 远程通知

iOS App 运行在后台时,无法主动进行网络连接。

远程通知可以用来提醒用户。发送远程通知时,服务器首先需要使用推送证书与 APNs(Apple Push Notification service)建立安全连接,然后将消息传递给它。当 APNs 收到消息后,会通过与手机之间的长连接下发到对应的手机上,然后 iOS 弹出这条消息来提醒用户。

用户看通过点击或滑动通知来运行 App。可通过程序中相应的方法可以获取通知信息,然后做相应的逻辑处理。

如果不是通过通知启动 App,那么无法在程序中获取通知信息。例如通过点击应用图标启动 App。

推送通知都包含 Payload:一个 Apple 已经定义好的属性列表,操作系统根据它决定使用哪一种方式来提醒用户。还可以在 Payload 中加入一些自定义数据。

通知并不能一定到达。如果在用户无法收到推送通知时(关机或网络不可用),这种情况下 APNs 收到了多条发往这台设备的通知,那么只会保留最后一条,最早的会被丢弃。

APNs 首先通过移动蜂窝网络发送通知,只有当移动蜂窝网络不可用时才使用 Wi-Fi。

1.2 通知的两种推送环境

在使用 iOS 远程推送功能时,有两种不同的环境。开发环境(Development)以及生产环境(Production)。

App 当前使用的推送环境与 Xcode - Build Settings - Code Signing - Provisioning Profile 文件的模式一致。

1.2.1 证书与证书校验

与 APNs 之间是加密的连接,因此需要使用证书来加密连接。每个的推送环境有自己单独的推送证书,即开发证书和生产证书。

在将证书最终转为 pem 格式后,可通过与 APNs 连接来测试证书是否有效。

开发环境:

openssl s_client -connectgateway.sandbox.push.apple.com:2195-cert MyApnsDev.pem

生产环境:

openssl s_client -connectgateway.push.apple.com:2195-cert MyApnsPro.pem

当输入完命令回车后,终端首先会输出很多相关信息。

当连接建立失败时,会直接 close 掉。

当连接建立成功时,终端会停止输出,并等待你输入,你可以随便输入一些字符后摁回车,然后连接才会关闭。

以上命令在 Mac 下没有问题,在其他操作系统下需要指定服务器当前的 CA 根证书,具体可以从网站上下载:

entrust_2048_ca.cer 下载

下载完成之后,在以上命令后面加上 -CAfile entrust2048ca.cer 即可

1.2.2 DeviceToken

通知需推送到具体某一台设备,而 DeviceToken 就是这台设备的标识符。在向 APNs 发送推送通知时,需要使用 DeviceToken 来指定这条通知将要到达的设备 。

每一台设备,不同的推送环境下分别有一个 DeviceToken。即 DeviceToken 也分开发环境和生产环境。

应用在向 APNs 注册推送通知时,会根据当前 Xcode 工程中 target 对应的 Provisioning Profile 决定请求对应环境的 DeviceToken。即系统返回的 DeviceToken 其环境与 Provisioning Profile 的环境对应。

一般在使用 Xcode 开发时,Provisioning Profile 为 Development ,因此获取的 DeviceToken 也是开发模式。

在 App 需要打包为 ipa 文件或者需要上传到 AppStore 时,会将 Provisioning Profile 文件修改为 Distribution,这时获取到的 DeviceToken 是生产模式。

1.3 在应用程序中注册远程推送功能

App 必须要向 APNs 请求注册以实现推送功能,在请求成功后,APNs 会返回一个设备的标识符即 DeviceToken 给 App,服务器在推送通知的时候需要指定推送通知目的设备的 DeviceToken。在 iOS 8 以及之后,注册推送服务主要分为四个步骤:

使用registerUserNotificationSettings:注册应用程序想要支持的推送类型

通过调用registerForRemoteNotifications方法向 APNs 注册推送功能

请求成功时,系统会在应用程序委托方法中返回 DeviceToken,请求失败时,也会在对应的委托方法中给出请求失败的原因。

将 DeviceToken 上传到服务器,服务器在推送时使用。

上述第一个步骤注册的 API 是 iOS 8 新增的,因此在 iOS 7,前两个步骤需更改为 iOS 7 中的 API。

DeviceToken 有可能会更改,因此需要在程序每次启动时都去注册并且上传到你的服务器端。

注意:iOS 设备与 APNs 需要建立一条长连接,之后的推送注册以及推送获取都需要通过这条长连接。

当 iOS 设备无网络可用时,在向 APNs 请求注册后,既不会有注册成功的回调,也不会有注册失败的回调。如果发生这种情况,需要检查设备的网络连接。

开发环境和生产环境建立不同的长连接,且设备上要至少有一个开发环境的 App 并且注册推送,才会建立开发环境下的长连接。

当已经注册过推送服务后,以后系统会立刻返回给你 DeviceToken。还有一点是,返回 DeviceToken 的回调方法并不一定是只有在你注册或者再次注册时才被系统调用,当DeviceToken 改变时也会被系统直接调用。

1.4 在程序中处理通知

我们来看一下当系统传递本地或远程通知的时候都有哪些情况。

通知到达时,应用不在前台

这种情况下,操作系统将呈现通知,弹出一个选项或者在屏幕上部显示 banner 提醒,给 App 角标设置对应的数字,可能播放提示音,当用户稍微往下滑动通知时显示更多的 action 按钮(如果有设置)。

通知到达时,应用在前台运行

这种情况下,不会弹出 banner。系统会根据当前的通知是本地通知还是远程通知,调用不同的方法,并且在方法中传递通知的 Payload 数据。

在 iOS8 的通知中,用户点击通知上的自定义 action 按钮进入应用。

这种情况下,系统会调用 iOS8 中对 action 按钮新增的处理方法。

用户点击通知进入应用。

系统会根据当前的通知是本地通知还是远程通知,调用不同的方法,并且在方法中传递通知的 Payload 数据。

注意:只有当通过通知进入到 App 时,才可以获取到通知信息。

1.4.1 自定义通知提示音

你可以在 App 的 Bundle 中加入一段自定义提示音文件。然后当通知到达时可以指定播放这个文件。必须为以下几种数据格式:

Linear PCM

MA4(IMA/ADPCM)

μLaw

aLaw

你可以将它们打包为aiff、wav或caf文件。自定义的声音文件时间必须小于 30 秒,如果超过了这个时间,将被系统声音代替。

1.4.2 Payload

Payload 是通知的一部分,每一条推送通知都包含一个 Payload。它包含了系统提醒用户通知到达的方式,还可以添加自定义的数据。即通知主要传递的数据为 Payload。

Payload 本身为 JSON 格式的字符串,它内部必须要包含一个键为aps的字典。aps 中可以包含以下字段中的一个或多个:

alert:其内容可以为字符串或者字典,如果是字符串,那么将会在通知中显示这条内容

badge:其值为数字,表示当通知到达设备时,应用的角标变为多少。如果没有使用这个字段,那么应用的角标将不会改变。设置为 0 时,会清除应用的角标。

sound:指定通知展现时伴随的提醒音文件名。如果找不到指定的文件或者值为 default,那么默认的系统音将会被使用。如果为空,那么将没有声音。

content-available:此字段为 iOS 7 silent remote notification 使用。不使用此功能时无需包含此字段。

推送通知跟NSNotification有所区别:

1> NSNotification是抽象的,不可见的

2> 推送通知是可见的(能用肉眼看到)

iOS中提供了2种推送通知: 本地推送通知, 远程推送通知

1> 本地推送通知(Local Notification)

2> 远程推送通知(Remote Notification)

推送通知可以不让在前台运行的app,告知app内部发生了什么变化,比如:有新的内容,新消息等.

推送通知的使用:

发出推送通知时,如果当前程序正运行在前台,那么推送通知就不会被呈现出来

点击推送通知后,默认会自动打开发出推送通知的app

不管app打开还是关闭,推送通知都能如期发出

推送通知有5种呈现效果:

1. 在屏幕顶部显示一块横幅(显示具体内容)

2. 在屏幕中间弹出一个UIAlertView(显示具体内容,使用较少)

3. 在锁屏界面显示一块横幅(锁屏状态下,显示具体内容)

4. 播放音效(提醒作用)

5. 更新app图标的数字(说明新内容的数量)

推送通知分为本地推送通知和远程推送通知,下面一一介绍.

本地推送通知

本地推送通知不需要服务器的支持,不需要联网就可以发送通知.通常本地推送通知用于定时提醒用户,比如清理垃圾,淘宝购物,纪念日提醒等任务.

在苹果官方给出了本地推送通知的一些属性,以及使用.

属性介绍:

@property(nonatomic,copy)NSDate *fireDate;// 设置本地推送的时间@property(nonatomic,copy) NSTimeZone *timeZone;// 时区(一般设置为[NSTimeZone defaultTimeZone] ,跟随手机的时区)@property(nonatomic) NSCalendarUnit repeatInterval;// 没隔多久重复发出一次@property(nonatomic,copy)NSCalendar *repeatCalendar;// 设置日期@property(nonatomic,copy) CLRegion *region NS_AVAILABLE_IOS(8_0);// 比如某一个区域的时候发出通知@property(nonatomic,assign)BOOL regionTriggersOnce NS_AVAILABLE_IOS(8_0);// 进入区域是否重复@property(nonatomic,copy)NSDictionary *userInfo;// 附加的额外信息@property(nonatomic,copy)NSString *alertBody;// 消息的内容@property(nonatomic)BOOL hasAction;// 是否显示alertAction的文字(默认是YES)@property(nonatomic,copy)NSString *alertAction;// 设置锁屏状态下,显示的一个文字@property(nonatomic,copy)NSString *alertLaunchImage;// 启动图片@property(nonatomic,copy)NSString *soundName;//  UILocalNotificationDefaultSoundName@property(nonatomic)NSInteger applicationIconBadgeNumber;// 应用图标右上角的提醒数字@property(nonatomic,copy)NSArray *scheduledLocalNotifications;// 获得被调度(定制)的所有本地推送通知(已经发出且过期的推送通知就算调度结束,会自动从这个数组中移除)

使用方法:

创建本地通知

UILocalNotification *localNoti = [[UILocalNotification alloc] init];

调度本地推送通知(调度完毕后,推送通知会在特地时间fireDate发出)

[[UIApplication sharedApplication]scheduleLocalNotification:localNoti];取消调度本地推送通知

-(void)cancelLocalNotification:(UILocalNotification *)notification;-(void)cancelAllLocalNotifications;

立即发出本地推送通知

-(void)presentLocalNotificationNow:(UILocalNotification *)notification;

注意:

iOS8.0以后在本地推送通知上新加了一些新功能,为了用户体验,以及更加人性化,如果要使用本地通知,需要得到用户的许可.

需要在AppDelegate中添加如下代码

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {/*    UIUserNotificationTypeNone    = 0,      没有,没有本地通知    UIUserNotificationTypeBadge  = 1 << 0, 接受图标右上角提醒数字    UIUserNotificationTypeSound  = 1 << 1, 接受通知时候,可以发出音效    UIUserNotificationTypeAlert  = 1 << 2, 接受提醒(横幅/弹窗)    */// iOS8需要添加请求用户的授权if ([UIDevice currentDevice].systemVersion.floatValue >=8.0) {        UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge | UIUserNotificationTypeAlert | UIUserNotificationTypeSound categories:nil];

[application registerUserNotificationSettings:settings];

}

}

点击本地推送通知

当用户点击本地推送通知,会自动打开app,这里有2种情况

1> app并没有关闭,一直隐藏在后台(运行在后台)

让app进入前台,并会调用AppDelegate的下面方法(并非重新启动app)

-(void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification;

1

1

2> app已经被关闭(进程已死)

启动app,启动完毕会调用AppDelegate的下面方法

-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;

launchOptions参数通过UIApplicationLaunchOptionsLocalNotificationKey取出本地推送通知对象

若要实现界面的跳转,需要分清当前应用程序的所处状态,进行判断:

1> 若是当前应用在后台运行,接收到通知时,要想进行界面的跳转,可以在didReceiveLocalNotification:方法中实现跳转界面的方法

2> 若是当前的应用程序已经关闭,我们在前面说到,当应用关闭,推送通知也会如期发送.但此时,是不会走didReceiveLocalNotification:方法的,那我们只有didFinishLaunchingWithOptions:方法利用,launchOptions参数通过UIApplicationLaunchOptionsLocalNotificationKey取出本地推送通知对象,实现跳转的功能.

下面是演示代码:

#import"AppDelegate.h"@interfaceAppDelegate ()@end@implementationAppDelegate- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {/*    UIUserNotificationTypeNone    = 0,      没有,没有本地通知    UIUserNotificationTypeBadge  = 1 << 0, 接受图标右上角提醒数字    UIUserNotificationTypeSound  = 1 << 1, 接受通知时候,可以发出音效    UIUserNotificationTypeAlert  = 1 << 2, 接受提醒(横幅/弹窗)    */// iOS8需要添加请求用户的授权if ([UIDevice currentDevice].systemVersion.floatValue >=8.0) {        UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge | UIUserNotificationTypeAlert | UIUserNotificationTypeSound categories:nil];        [application registerUserNotificationSettings:settings];    }if (launchOptions[UIApplicationLaunchOptionsLocalNotificationKey]) {// 跳转界面    }returnYES;}/** *  如果应用在后台,通过点击通知的时候打开应用会来到该代理方法 *  如果应用在前台,接受到本地通知就会调用该方法 * *  @param notification 通过哪一个通知来这里 */- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification{if (application.applicationState == UIApplicationStateActive)return;if (application.applicationState == UIApplicationStateInactive) {// 实现跳转    }}- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation{returnYES;}#import"ViewController.h"

@interfaceViewController ()// 点击按钮之后添加通知- (IBAction)addLocalNote;@end@implementationViewController- (void)viewDidLoad {    [super viewDidLoad];    [[UIApplication sharedApplication] setApplicationIconBadgeNumber:0];}- (IBAction)addLocalNote {// 1.创建本地通知UILocalNotification *localNote = [[UILocalNotification alloc] init];// 设置什么时间弹出    localNote.fireDate = [NSDate dateWithTimeIntervalSinceNow:5];// 设置弹出的内容    localNote.alertBody = @"您有新消息";// 设置锁屏状态下,显示的一个文字    localNote.alertAction = @"快点打开";// 是否显示alertAction的文字(默认是YES)    localNote.hasAction =YES;// 设置音效    localNote.soundName = UILocalNotificationDefaultSoundName;// 应用图标右上角的提醒数字    localNote.applicationIconBadgeNumber =1;// 设置UserInfo来传递信息    localNote.userInfo = @{@"alertBody" : localNote.alertBody, @"applicationIconBadgeNumber" : @(localNote.applicationIconBadgeNumber)};// 2.调度通知    [[UIApplication sharedApplication] scheduleLocalNotification:localNote];

}

远程推送通知

远程推送通知:就是通过网络从远程服务器推送给客户端的通知.

为什么需要远程推送通知?

传统获取数据的局限性

只要用户关闭了app,就无法跟app的服务器沟通,无法从服务器上获得最新的数据内容

远程推送通知可以解决以上问题

不管用户打开还是关闭app,只要联网了,都能接收到服务器推送的远程通知

远程推送通知的使用

所有的苹果设备,在联网状态下,都会与苹果的服务器建立长连接

长连接: 只要联网了,就一直建立连接

长连接的作用: 时间校准, 系统升级, 查找我的iPhone

长连接的好处 : 数据传输速度快 , 数据保持最新状态

远程推送功能机制

苹果给iOS和Mac添加了消息推送的功能,使得我们可以通过后台服务器给应用程序(APP)发送消息,不管APP是否正在使用,比如邮箱的来件提示功能。这项服务被称为Apple Push Notification service(APNs)。里面一共涉及到四个角色:APP、设备、APNs和应用后台服务器(Provider),其中APP、后台服务器和APNs之间使用deviceToken唯一的标识一个用户。


推送服务的工作流程:

APP向系统注册推送服务。

设备从APNs请求deviceToken。

通过代理方法将deviceToken返回给APP。

APP将deviceToken发送给应用后台服务器(Provider)。

应用后台服务器保存deviceToken,然后在需要推送通知的时候,给APNs发送信息,使用deviceToken标识所要送达的客户端。

APNs将后台服务器发过来的数据推送到设备。

设备将消息分发给应用程序。

在使用推送功能的时候,需要在开发者中心创建支持Push Notification的证书,并且将证书和私钥用于应用后台服务器与APNs之间通信。

我也写了一个比较易懂的远程推送流程图!http://blog.csdn.net/ismilesky/article/details/48324723

远程推送近年来,都是通过第三方进行实现,因为第三方推送的功能比较强大.

推送平台: 百度推送 , 极光推送, 腾讯信鸽推送, 个推

远程推送我们这里以极光推送(第三方)为例,进行测试.

极光远程推送的使用

如要使用极光第三方远程推送,我们需要集成iOS SDK,需要进行应用的配置,和环境配置.在开发者中心有

developer.apple.com开发者账号 , iOS真机(iPhone、iPad、iPod)等。

远程推送应用配置过程:

创建支持远程推送功能的App ID

申请开发者证书,并选中刚刚创建的App ID

下载CER文件,并导入钥匙串管理

申请发布证书,并选中刚刚创建的App ID

下载CER文件,并导入钥匙串管理

检查App ID,确认证书已经指定

这些相关配置极光推送已经给了非常详细的文档资料, iOS SDK集成指南 :http://docs.jpush.io/guideline/ios_guide/, iOS SDK调试指南 :http://docs.jpush.io/client/ios_tutorials/#ios-sdk, 只需要按照流程进行就可以.

实现代码:

#define kDeviceVersion  ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0)#import"AppDelegate.h"#import"APService.h"@interfaceAppDelegate ()@end@implementationAppDelegate- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {// Override point for customization after application launch.#if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_7_1if (kDeviceVersion) {//可以添加自定义categories        [APService registerForRemoteNotificationTypes:(UIUserNotificationTypeBadge | UIUserNotificationTypeSound |UIUserNotificationTypeAlert) categories:nil];    }else {//categories 必须为nil        [APService registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound |UIRemoteNotificationTypeAlert) categories:nil];    }#else//categories 必须为nil    [APService registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound |UIRemoteNotificationTypeAlert) categories:nil];#endif    [APService setupWithOption:launchOptions];returnYES;}#pragma mark - 获取device token (必须实现)// 当得到苹果的APNs服务器返回的DeviceToken就会被调用- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken{NSLog(@"%@",deviceToken);// Required    [APService registerDeviceToken:deviceToken];}#pragma mark - 获取device token失败- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error{NSLog(@"function == %s  line == %d  error == %@",__FUNCTION__,__LINE__,error);}// 接收到远程通知,触发方法和本地通知一致 (必须实现)- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {// Required    [APService handleRemoteNotification:userInfo];}#pragma mark - 使用后台的远程消息推送 (必须实现)/** 1> 在Capabilities中打开远程推送通知 2> 实现该代理方法远程消息数据格式: {"aps" : {"content-available" : 1},"content-id" : 42} 执行completionHandler有两个目的 1> 系统会估量App消耗的电量,并根据传递的UIBackgroundFetchResult 参数记录新数据是否可用 2> 调用完成的处理代码时,应用的界面缩略图会自动更新 注意:接收到远程通知到执行完网络请求之间的时间不能超过30秒 if (userInfo) { int contentId = [userInfo[@"content-id"] intValue]; ViewController *vc = (ViewController *)application.keyWindow.rootViewController; [vc loadDataWithContentID:contentId completion:^(NSArray *dataList) { vc.dataList = dataList; NSLog(@"刷新数据结束"); completionHandler(UIBackgroundFetchResultNewData); }]; } else { completionHandler(UIBackgroundFetchResultNoData); }*/- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {// IOS 7 Support Required    [APService handleRemoteNotification:userInfo];    [[UIApplication sharedApplication]setApplicationIconBadgeNumber:0];// 判断应用程序在前台还是后台if (application.applicationState == UIApplicationStateActive) {// 活跃状态// 实现方法    }elseif (application.applicationState == UIApplicationStateInactive) {// 不活跃状态// 实现方法    }else {// application.applicationState == UIApplicationStateBackground// 后台// 实现方法    }/** 必须回调 */    completionHandler(UIBackgroundFetchResultNewData);}测试时,运行完应用程序,要发送通知,进行推送的测试,真机收到通知才算成功.

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

推荐阅读更多精彩内容

  • 作品链接:http://www.jianshu.com/users/1e0f5e6f73f6/top_articl...
    打电话记错号码的人阅读 637评论 0 4
  • 推送通知注意:这里说的推送通知跟NSNotification有所区别NSNotification是抽象的,不可见的...
    醉叶惜秋阅读 1,466评论 0 3
  • 推送通知 注意:这里说的推送通知跟NSNotification有所区别 NSNotification是抽象的,不可...
    iOS开发攻城狮阅读 4,081评论 1 13
  • 今早莫名的醒的很早,明明昨天累的腰酸背痛。正好今天也和玲狗约了出门游荡。 虽然作为女生真的好嫌弃女生出门要磨很久这...
    仙贝还是雪饼阅读 175评论 0 1
  • 说来奇怪 渐渐的我发现我从一个典型的射手座变成了一个 不会射箭的射手。 想起以前总是几个女生堆在一起叽叽喳喳的讨论...
    未愈Q阅读 405评论 0 1