远程推送通知

什么是远程推送通知

顾名思义,就是从远程服务器推送给客户端的通知(需要联网)远程推送服务,又称为APNs(Apple Push Notification Services)

为什么需要远程推送通知

  • 传统获取数据的局限性 只要用户关闭了app,就无法跟app的服务器沟通,无法从服务器上获得最新的数据内容
  • 远程推送通知可以解决以上问题 不管用户打开还是关闭app,只要联网了,都能接收到服务器推送的远程通知

远程推送通知使用须知

  • 所有的苹果设备,在联网状态下,都会与苹果的服务器建立长连接 什么是长连接 只要联网了,就一直建立连接
  • 长连接的作用 时间校准 系统升级 查找我的iPhone .. ...
  • 长连接的好处 数据传输速度快 数据保持最新状态

推送原理


ios 推送证书p8转cer ios 推送证书配置_ios 推送证书p8转cer

Provider就是我们公司的服务器,经过苹果的APNs服务器找到我们的设备,给我们设备上的客户端应用推送消息。那 APNs服务器是如何找到我们的设备和设备上的应用呢,答案就是DeviceToken,DeviceToken需要配置推送证书才可以获得,推送证书需 要知道我们的APP ID(应用的BundleID,应用唯一标识)和UDID(设备唯一标识),还有自己服务器的UDID,我们先来打一个推送证书,登录开发者中心,点击证 书模块


ios 推送证书p8转cer ios 推送证书配置_服务器_02

点击iOS Apps的证书


ios 推送证书p8转cer ios 推送证书配置_推送_03

进入这样的界面


ios 推送证书p8转cer ios 推送证书配置_App_04

点击App IDs,然后点右上角的加号


ios 推送证书p8转cer ios 推送证书配置_推送_05

箭头所指为应用ID描述,我们假设写了一个很牛逼的应用,ExcitedApp,接下来我们填入App ID,注意这里的App ID是固定的,不能有星号


ios 推送证书p8转cer ios 推送证书配置_服务器_06

接下来我们添加App所需要的服务,然后点击Continue


ios 推送证书p8转cer ios 推送证书配置_ios 推送证书p8转cer_07

一直点击下一步,完成,在App IDs 列表里面找到我们的ExcitedApp,我们看到


ios 推送证书p8转cer ios 推送证书配置_推送_08

发现Push服务是黄色警告,这时点击Edit,找到推送模块,我们需要配置推送证书了,点击红色箭头所指的位置


ios 推送证书p8转cer ios 推送证书配置_推送_09

我们需要一个CSR文件,CSR是一个签名请求文件,意思就是让我们的MAC具有调试推送的权限,点击继续


ios 推送证书p8转cer ios 推送证书配置_ios 推送证书p8转cer_10

点击了继续我们看到


ios 推送证书p8转cer ios 推送证书配置_ios 推送证书p8转cer_11

然后我们打开Mac上的钥匙串,从证书颁发机构请求证书


ios 推送证书p8转cer ios 推送证书配置_服务器_12

前两个随便写,最后选择存到磁盘


ios 推送证书p8转cer ios 推送证书配置_推送_13

完成之后,接下来我们就可以添加CSR文件了


ios 推送证书p8转cer ios 推送证书配置_App_14

添加完,选择生成


ios 推送证书p8转cer ios 推送证书配置_推送_15

证书配好了,下载下来

配好了!

顺带着我们把发布的证书也给配了,步骤都一样

打开我们刚刚下载的证书,添加到钥匙串中


ios 推送证书p8转cer ios 推送证书配置_App_16

终于能开始整我们的项目了,快哭了都

ios 推送证书p8转cer ios 推送证书配置_服务器_17


不要忘记修改bundle id 这里还要搞一个真机调试的证书才可以

真机调试的东西这里不累述,搞了这么多东西,我们终于可以拿到DeviceToken了

在AppDelegate.m中注册推送




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


   


               if          (          [          [          [          UIDevice          currentDevice          ]          systemVersion          ]          floatValue          ]          >=          8.0          )          {


                 UIUserNotificationType          myTypes          =          UIRemoteNotificationTypeBadge          |          UIRemoteNotificationTypeAlert          |          UIRemoteNotificationTypeSound          ;


                 UIUserNotificationSettings          *settings          =          [          UIUserNotificationSettings          settingsForTypes          :myTypes          categories          :nil          ]          ;


                 [          [          UIApplication          sharedApplication          ]          registerUserNotificationSettings          :settings          ]          ;


             }          else


             {


                 UIRemoteNotificationType          myTypes          =          UIRemoteNotificationTypeBadge          |          UIRemoteNotificationTypeAlert          |          UIRemoteNotificationTypeSound          ;


                 [          [          UIApplication          sharedApplication          ]          registerForRemoteNotificationTypes          :myTypes          ]          ;


             }


   





             return          YES          ;


}
-          (          void          )          application          :          (          UIApplication          *          )          application          didRegisterForRemoteNotificationsWithDeviceToken          :          (          NSData          *          )          deviceToken


{


             NSLog          (          @"%@"          ,          deviceToken          )          ;


}







//ios8 另外增加以下方法


#ifdef __IPHONE_8_0


-          (         void         )         application         :         (         UIApplication         *         )         application         didRegisterUserNotificationSettings         :         (         UIUserNotificationSettings         *         )         notificationSettings


{


            [         application         registerForRemoteNotifications         ]         ;


}


#endif


DeviceToken处理流程

ios 推送证书p8转cer ios 推送证书配置_服务器_18


接下来我们用SmartPush来测试一下我们的推送:https://github.com/shaojiankui/SmartPush

ios 推送证书p8转cer ios 推送证书配置_App_19