1.创建个推开发者帐号
创建个推开发者帐号,请访问个推开发者平台(dev.getui.com),点击注册进行开发者账号注册。
2.登记新应用
创建好账号进入个推开发者平台,首页展示的是如下界面,点击左上角“登记应用”。

注意:应用平台选择IOS,应用标识与工程的Bundle ID相同,应用证书是推送证书的P12文件(分为开发环境和产品环境),证书密码是导出P12文件的时候设置的,个推平台上密码不能为空,所以必须设置密码。

3.推送证书的制作
(1).登录苹果开发者官网进入certificate中心创建App IDs(标记应用的唯一性,区别于其他应用),创建App IDs 之前必须先有Development或者Production的根证书(一个开发者账号只能各自创建两个根证书,如果需要新的根证书则需要删除之前已创建的)

为App开启Push Notification功能。如果是已经创建的App ID也可以通过设置开启Push Notification功能。

根据实际情况完善App ID信息并提交,注意此处需要指定具体的Bundle ID,不要使用通配符如星号(*)和问号(?)等。(因为推送是具体某个应用的功能,不能将某个应用的消息推送到其他应用上)

如果你之前没有创建过Push证书或者是要重新创建一个新的,请在证书列表下面新建。

新建证书需要注意选择证书种类(开发证书用于开发和调试使用,生产证书用于App Store发布)

点击Continue后选择证书对应的应用ID,然后继续会出现“About Creating a Certificate Signing Request (CSR)”。

根据它的说明创建Certificate Signing Request。

然后点击Continue ,上传刚刚生成的 .certSigningRequest文件 点”generate”生成APNs Push Certificate

继续返回Apple developer 网站点击 Continue ,上传刚刚生成的 .certSigningRequest 文件生成 APNs Push Certificate。
下载并双击打开证书,证书打开时会启动“钥匙串访问”工具。

在“钥匙串访问”中你的证书会显示在“我的证书”中,注意选择“My Certificates” 和”login”
3、导出 .p12证书文件
在“钥匙串访问”中,选择刚刚加进来的证书,选择右键菜单中的“导出“…””。

将文件保存为Personal Information Exchange (.p12)格式。保存p12文件时,需为其设置密码,因平台上传证书时需要密码。

注意:务必选择证书然后再导出。

4.导入个推SDK(具体进入个推官网了解)
5.集成个推
(1)App运行时启动个推SDK并注册APNS
在AppDelegate didFinishLaunchingWithOptions 方法中:通过平台分配的AppId、AppKey、AppSecret启动个推SDK,并完成注册APNS通知和处理启动时拿到的APNS透传数据。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {// 通过个推平台分配的appId、 appKey 、appSecret 启动SDK,注:该方法需要在主线程中调用[GeTuiSdk startSdkWithAppId:kGtAppId appKey:kGtAppKey appSecret:kGtAppSecret delegate:self];// 注册APNS[self registerRemoteNotification];// 处理远程通知启动APP,实现相应逻辑跳转[self receiveNotificationByLaunchingOptions:launchOptions];return YES;
}//注册苹果通知
- (void)registerRemoteNotification {if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0) {UIUserNotificationSettings *uns = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeAlert|UIUserNotificationTypeBadge|UIUserNotificationTypeSound) categories:nil];[[UIApplication sharedApplication] registerUserNotificationSettings:uns];[[UIApplication sharedApplication] registerForRemoteNotifications];}else {UIRemoteNotificationType apn_type = (UIRemoteNotificationType)(UIRemoteNotificationTypeAlert|UIRemoteNotificationTypeSound|UIRemoteNotificationTypeBadge);[[UIApplication sharedApplication] registerForRemoteNotificationTypes:apn_type];}
}

(2)向个推服务器注册DeviceToken

/** 远程通知注册成功委托 */
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {//处理苹果返回的deviceToken,去除空格和括号NSString *myToken = [[deviceToken description] stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"<>"]];myToken = [myToken stringByReplacingOccurrencesOfString:@" " withString:@""];/// 向个推服务器注册deviceToken[GeTuiSdk registerDeviceToken:myToken];    NSLog(@"\n>>>[DeviceToken Success]:%@\n\n",myToken);
}如果获取DeviceToken获取失败,也需要通知个推服务器/** 远程通知注册失败委托 */
- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {[GeTuiSdk registerDeviceToken:@""];     /// 如果APNS注册失败,通知个推服务器NSLog(@"\n>>>[DeviceToken Error]:%@\n\n",error.description);
}/** SDK启动成功返回cid */
- (void)GeTuiSdkDidRegisterClient:(NSString *)clientId {// [4-EXT-1]: 个推SDK已注册,返回clientId,通常需要将clientId发送给App服务器NSLog(@"\n>>>[GeTuiSdk RegisterClient]:%@\n\n", clientId);
}/** SDK遇到错误回调 */
- (void)GeTuiSdkDidOccurError:(NSError *)error {// [EXT]:个推错误报告,集成步骤发生的任何错误都在这里通知,如果集成后,无法正常收到消息,查看这里的通知。NSLog(@"\n>>>[GexinSdk error]:%@\n\n", [error localizedDescription]);
}

(3)Background Fetch 接口回调,iOS7.0 以后支持APP后台刷新数据,会回调performFetchWithCompletionHandler接口,此处为保证个推数据刷新需调用 [GeTuiSdk resume] 接口恢复个推SDK 运行刷新数据


- (void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {/// Background Fetch 恢复SDK 运行[GeTuiSdk resume];completionHandler(UIBackgroundFetchResultNewData);
}

(4)使用个推SDK透传消息, 由个推通道下发 (非APNS)
SDK 在线状态时(App在前台运行),个推服务器会直接给您的App发送透传消息,不发送苹果APNS消息,可以更快的把消息发送到手机端;SDK离线状态时 (停止SDK 或 App后台运行 或 App停止),个推服务器会给App发送苹果APNS消息,同时保存个推的离线消息,当SDK在线后,SDK会获取所有的个推透传消息,offLine字 段就是表明该条消息是否为离线消息。

/** SDK收到透传消息回调 */
- (void)GeTuiSdkDidReceivePayload:(NSString *)payloadId andTaskId:(NSString *)taskId andMessageId:(NSString *)aMsgId andOffLine:(BOOL)offLine fromApplication:(NSString *)appId {// [4]: 收到个推消息NSData *payload = [GeTuiSdk retrivePayloadById:payloadId];NSString *payloadMsg = nil;if (payload) {payloadMsg = [[NSString alloc] initWithBytes:payload.bytes length:payload.length encoding:NSUTF8StringEncoding];}NSString *msg = [NSString stringWithFormat:@" payloadId=%@,taskId=%@,messageId:%@,payloadMsg:%@%@",payloadId,taskId,aMsgId,payloadMsg,offLine ? @"<离线消息>" : @""];
NSLog(@"\n>>>[GexinSdk ReceivePayload]:%@\n\n", msg); /**
*汇报个推自定义事件
*actionId:用户自定义的actionid,int类型,取值90001-90999。
*taskId:下发任务的任务ID。
*msgId: 下发任务的消息ID。
*返回值:BOOL,YES表示该命令已经提交,NO表示该命令未提交成功。注:该结果不代表服务器收到该条命令
**/
[GeTuiSdk sendFeedbackMessage:90001 taskId:taskId msgId:aMsgId];
}

(5)苹果官方静默推送

/**IOS7之后 APP已经接收到“远程”通知(推送) - 透传推送消息  */
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler {// 处理APNs代码,通过userInfo可以取到推送的信息(包括内容,角标,自定义参数等)。如果需要弹窗等其他操作,则需要自行编码。app在前台时该方法不会执行,优先走个推透传。NSLog(@"\n>>>[Receive RemoteNotification - Background Fetch]:%@\n\n",userInfo);completionHandler(UIBackgroundFetchResultNewData);
}/**IOS7之前 APP已经接收到“远程”通知(推送) - 透传推送消息  */
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {// 处理APNs代码,通过userInfo可以取到推送的信息(包括内容,角标,自定义参数等)。如果需要弹窗等其他操作,则需要自行编码。app在前台时该方法不会执行,优先走个推透传。NSLog(@"\n>>>[Receive RemoteNotification - Background Fetch]:%@\n\n",userInfo);completionHandler(UIBackgroundFetchResultNewData);}

(6)自定义方法处理从通知栏点进来处理信息

- (void)handlePushMessage:(NSDictionary *)dict notification:(UILocalNotification *)localNotification {//开始处理从通知栏点击进来的推送消息if ([UIApplication sharedApplication].applicationIconBadgeNumber != 0) {if (localNotification) {//删除相应信息栏[[UIApplication sharedApplication] cancelLocalNotification:localNotification];}//应用的数字角标减1[UIApplication sharedApplication].applicationIconBadgeNumber -= 1;}else {[[UIApplication sharedApplication] cancelAllLocalNotifications];[UIApplication sharedApplication].applicationIconBadgeNumber = 0;}
}

总结:
a. app在前台运行时:收到推送信息,优先走个推透传,触发方法:
- (void)GeTuiSdkDidReceivePayload:(NSString )payloadId andTaskId:(NSString )taskId andMessageId:(NSString )aMsgId andOffLine:(BOOL)offLine fromApplication:(NSString )appId ;
只有在个推失效情况下,才会触发以下方法(可能性低)
- (void)application:(UIApplication )application didReceiveRemoteNotification:(NSDictionary )userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler;
- (void)application:(UIApplication )application didReceiveRemoteNotification:(NSDictionary )userInfo;

b. app在后台运行,收到推送信息则走苹果APNS推送,在消息栏里有新消息提醒。此时有两种进入app方法:点击消息栏和app图标。此时两种方法app delegate方法都一样。
- (void)applicationDidBecomeActive:(UIApplication *)application {
// Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
}
和- (void)application:(UIApplication )application didReceiveRemoteNotification:(NSDictionary )userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler;
- (void)application:(UIApplication )application didReceiveRemoteNotification:(NSDictionary )userInfo;
如果个推有设置离线消息,并且此时还在离线消息的有效期内,也会触发
- (void)GeTuiSdkDidReceivePayload:(NSString )payloadId andTaskId:(NSString )taskId andMessageId:(NSString )aMsgId andOffLine:(BOOL)offLine fromApplication:(NSString )appId ;
所以如果要在上面几个方法里面做逻辑跳转的时候,要注意判断优先级,防止多次操作同一消息。

c.App进程已被杀死,此时收到推送消息,走的是苹果APNS推送。这个时候从消息栏进入app和点击图标进入app的触发方法是:
- (BOOL)application:(UIApplication )application didFinishLaunchingWithOptions:(NSDictionary )launchOptions;

//打印lanchOptions自动如下:
{"UIApplicationLaunchOptionsRemoteNotificationKey":{"aps":{"badge":1,"sound":"default","alert":{"body":"消息内容"}}"payload":"自定义内容"}
}

和- (void)application:(UIApplication )application didReceiveRemoteNotification:(NSDictionary )userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler;
- (void)application:(UIApplication )application didReceiveRemoteNotification:(NSDictionary )userInfo;
如果个推有设置离线消息,并且此时还在离线消息的有效期内,也会触发
- (void)GeTuiSdkDidReceivePayload:(NSString )payloadId andTaskId:(NSString )taskId andMessageId:(NSString )aMsgId andOffLine:(BOOL)offLine fromApplication:(NSString )appId ;
所以如果要在上面几个方法里面做逻辑跳转的时候,要注意判断优先级,防止多次操作同一消息。

d.最后总结逻辑跳转位置:
如果是外部点击进入app则逻辑在下面方法处理
- (void)application:(UIApplication )application didReceiveRemoteNotification:(NSDictionary )userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler;
- (void)application:(UIApplication )application didReceiveRemoteNotification:(NSDictionary )userInfo;

如果是在app内部则在个推透传方法中处理
- (void)GeTuiSdkDidReceivePayload:(NSString )payloadId andTaskId:(NSString )taskId andMessageId:(NSString )aMsgId andOffLine:(BOOL)offLine fromApplication:(NSString )appId ;

注意点:
1.处理逻辑的时候一定要防止重复操作,目前个人解决方法建立一个配置表,处理过的数据在表中标注,在处理前查询是否处理过。

2.开发的时候需要上传开发证书,开发测试OK后,发布到appstore之前,需要把证书更换成生产证书,证书更换后10分钟左右生效

3.自定义字段时,payload中的值有大小限制,最大为256字节,实际没有那么准确

4.个推平台上做apns推送测试

如果数据格式要payload = {"target_page":"{\"customer_id\":1}","notify_type":10};则在payload中输入{"notify_type":1,"target_page":"\"customer_id\":10"}

5.做个推透传推送输入格式如下

{"aps":{"sound":"","alert":"contentBody","badge":1,"text":"contentBody"},"notify_type":0,"target_page":"{\"end_date\":\"1447047559745\",\"start_date\":\"1447047259745\",\"customer_id\":\"11111\"}"}

IOS 个推推送总结相关推荐

  1. 个推推送,APP接收到推送后的操作(前台与非前台的处理不同)

    图1 个推推送服务框架图 原创作者http://www.jianshu.com/p/a9acc30e9ba6 首先,按照个推SDK集成指南配置好一个完整的工程.或者直接下载现有工程(需要修改bundl ...

  2. java集成个推推送V2 uni-push1.0

    java springboot集成个推推送V2 前端使用的为uni-push1.0 UniPush 是 DCloud 联合个推公司推出的集成型统一推送服务,内建了苹果.华为.小米.OPPO.VIVO. ...

  3. iOS消息推送机制的实现

    iOS消息推送的工作机制可以简单的用下图来概括: Provider是指某个iPhone软件的Push服务器,APNS是Apple Push Notification Service的缩写,是苹果的服务 ...

  4. ios消息推送机制原理与实现(转)

    今天给无线事业部的同事开发苹果客户端的推送接口.无线事业部就是我们公司专门开发各种终端的app的部门啦! 无线事业部的同事做事还是很体贴的,同时发给了我参考文档地址和需要的开发需要的pl2文件. 提供 ...

  5. iOS原生推送(APNS)进阶iOS10推送图片、视频、音乐

    代码地址如下: http://www.demodashi.com/demo/13208.html 前言 我们首先要在AppDelegate里面进行iOS的适配,可以参考这篇文章 iOS原生推送(APN ...

  6. django 集成个推_个推推送SDK集成过程及开发建议

    服务简介 个推是由国内个信互动网络科技有限公司所推出的平台,帮助企业的应用通过低成本互联网通道进行消息推送,提供完善.高效.稳定的服务体系,解决了互联网云端到手机端的消息互通问题,依托于已有成熟的推送 ...

  7. php推送手机,PHP_解析php做推送服务端实现ios消息推送,准备工作1.获取手机注册应用 - phpStudy...

    解析php做推送服务端实现ios消息推送 准备工作1.获取手机注册应用的deviceToken(iphone手机注册应用时返回唯一值deviceToken) 2.获取ck.pem文件(做手机端的给) ...

  8. iOS 直播间送礼物逻辑(礼物连击)

    iOS 直播间送礼物 先贴demo地址:GitHub demo基本实现了主流直播间礼物的逻辑 按照队列顺序显示用户所送礼物,累加当前礼物,支持同时显示两人的 礼物 先来最终效果图 一句代码调用送礼物 ...

  9. apns 苹果服务器压力,[iOS]APNs推送机制

    目录 一.简介 二.APNs推送流程 三.什么是deviceToken 四.消息体 五.APNs推送中的问题 APNs 简介 Apple Push Notification service (APNs ...

最新文章

  1. SQLServer出现 '其他会话正在使用事务的上下文' 的问题原因,什么是环回链接服务器?(转载)...
  2. 数据库mysql表怎么设置外键_如何设置数据库中的外键
  3. CCNA-网络常用工具介绍篇
  4. Numpy实现酒鬼漫步问题【以及randint()、where()、cumsum()、argmax()的用法详解】
  5. oracle9i 随机端口_修改 Oracle9i 8080端口问题
  6. A*算法(一)算法导言
  7. c语言只能最大值不能最小值,用c语言编写输入10个无序的整数,去掉一个最大值和最小值,然后求其平均值...
  8. 买得起修不起?华为Mate X 5G维修价格公布:被吓到了
  9. java事件处理机制(自定义事件)
  10. 前端学习资料网址收集整理
  11. mysql建表常用sql语句
  12. KiCad下载及安装教程
  13. 中国裁判文书网爬虫思路分享
  14. 9个动作让网站3天被百度收录!
  15. Centos 7.4 防火墙关闭命令
  16. 【Sprint3冲刺之前】敏捷团队绩效考核(刘铸辉)
  17. 不同试验设计遗传力的计算方法
  18. java的三种技术架构
  19. java nul 字符_Java字符串替换和NUL(NULL,ASCII 0)字符?
  20. windows录屏html文件,windows怎么录屏带声音,简单高效的两种录制法

热门文章

  1. win10一键优化禁用缓存,禁用组件,
  2. php用Imagick扩展合并多张图片为PDF
  3. Windows Server 2016 Datacenter中安装URL Rewrite 2.0 URL模块报错
  4. Linux操作系统Linux20+常用入门操作
  5. 中台技术:十二年架构演进之路
  6. Excel用于数据统计分析
  7. 宁职-继续教育学院成功举办国家级高级研修班
  8. 泡泡机器人视频连接讲解-很好
  9. 第九届“图灵杯”NEUQ-ACM程序设计竞赛个人赛前十题(能力有限)
  10. Freeswitch 开发日记