iOS开发:制作远程推送证书以及用极光进行远程推送教程

298 阅读6分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

昨天公司项目要加入远程推送功能,自己做显然会很麻烦,所以用了极光的远程推送,下面我会讲如何制作推送证书并使用极光推送进行远程推送.

\

远程推送

先讲讲怎么下载推送证书吧(前面的很简单要是知道的可以直接往下滑,简书竟然不能页内跳转…)

网上下载推送证书的教程一般都是几年前的,现在下载推送证书很简单

  • 首先进入苹果开发者中心

  • 点击Member Center

    \

    Member Center

  • 登录后点击Certificates,Identifiers & Profiles

    Certificates,Identifiers & Profiles

  • 任意点击一个

  • 创建App ID

    创建App ID

  • App ID的名字可以随便取,Bundle ID一定要注意,要推送的App项目中的Bundle ID一定要是这个Bundle ID

App ID的名字可以随便取,Bundle ID一定要注意,要推送的App项目中的Bundle ID一定要是这个Bundle ID

App Services可以现在勾上Push Notifications,也可以后面再改,然后点继续

App Services可以现在勾上Push Notifications,也可以后面再改

  • 提交(我之前勾选了Push Notifications,所有它现在是橙色的,不然应该是灰色)

提交(我之前勾选了Push Notifications,所有它现在是橙色的,不然应该是灰色)

  • 出来后点击你刚创建的App ID,然后点Edit

点击你刚创建的App ID

点Edit

  • 创建开发环境和生产环境的证书

创建开发环境和生产环境的证书

这里讲一下什么是开发环境和生产环境:
你用Xcode编译安装的就是开发环境,用二维码或者App Store下载的就是生产环境.

  • 这里点继续后会发现需要你上传一个证书

    需要你上传一个证书

  • 现在我们来制作这个证书

    • 打开MAC自带的钥匙串访问(Launchpad->其他->钥匙串访问)

    • 点开后左上角打开证书助手,从证书颁发机构请求证书

      左上角打开证书助手,从证书颁发机构请求证书

    • 注意一定要存储到磁盘

    注意一定要存储到磁盘

    • 然后存储就行了,存在哪都可以
  • 把刚才存储的证书上传了

把刚才存储的证书上传了

  • 下载下来,点击Done,又回跳回到开始的界面,然后还是选择你创建的App ID然后Edit,开发环境和生产环境推送证书的创建流程是一样的,自己按着步骤就能把证书全部创建并下载成功.

    • 下载下来

    • 这时候Push Notifications应该是绿的了

      这时候Push Notifications应该是绿的了

  • 打开钥匙串访问,你会发现你多了这两个证书

打开钥匙串访问,你会发现你多了这两个证书

  • 右键分别导出它们

    • 右键分别导出它们

    • 设置密码

      设置密码

    • 导出成功后,你就能看到它们了,记得命好名(最好用英文)

推送证书的制作到这就结束了,下面讲怎么使用极光推送进行远程推送


怎么使用极光推送进行远程推送
  • 极光官网注册极光推送

  • 创建一个应用

  • 在应用配置中导入两个证书(我这是已经验证了的,不然就是让你上传证书的按钮)
    Bundle ID是导入证书后自动出现的,证书最好一个一个上传不然可能会出现验证失败的问题.

    导入两个证书

  • 然后下载SDK

  • 把SDK中的Lib文件夹导入你的项目中,记得勾选Copy

    记得勾选Copy

  • 在Build Phases中导入以下库

在Build Phases中导入以下库

  • 修改Capabilities

    • 打开远程推送

      打开远程推送

    • 打开Background Modes

      打开Background Modes

  • 修改Bundle ID 以及选择Team

修改Bundle ID 以及选择Team

  • 下面便是代码部分

    • Appdelegate.m中导入头文件
      #import "JPUSHService.h"

    • didFinishLaunchingWithOptions方法中写入以下代码,有的地方要按你自己的信息填\

      // Required 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]; }

      [JPUSHService setupWithOption:launchOptions appKey:你的appKey(字符串),在极光的应用详情中可以看到" channel:@""(这个不填就行) apsForProduction:这个值生产环境为YES,开发环境为NO(BOOL值)];

      12345678910// Requiredif ( [ [ UIDevice currentDevice ] . systemVersion floatValue ] >= 8.0 ) {     //可以添加自定义categories     [ JPUSHService registerForRemoteNotificationTypes : ( UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert ) categories : nil ] ;} else {     //categories 必须为nil     [ JPUSHService registerForRemoteNotificationTypes : ( UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert ) categories : nil ] ;} [ JPUSHService setupWithOption : launchOptions appKey :你的 appKey (字符串 ),在极光的应用详情中可以看到 " channel:@"" (这个不填就行 ) apsForProduction :这个值生产环境为 YES,开发环境为 NO ( BOOL值 ) ] ;
    • 创建-(void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken方法中注册设备\

      (去掉这个)- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { //这个方法是设置别名和tag 可省 // [JPUSHService setTags:nil alias:@"WzxJiang" fetchCompletionHandle:^(int iResCode, NSSet *iTags, NSString *iAlias) { // NSLog(@"rescode: %d, ntags: %<a href="www.jobbole.com/members/uz4…> nalias: %@n", iResCode, iTags , iAlias); // }]; // Required [JPUSHService registerDeviceToken:deviceToken]; }

      12345678(去掉这个 ) - ( void ) application : ( UIApplication * ) application didRegisterForRemoteNotificationsWithDeviceToken : ( NSData * ) deviceToken {//这个方法是设置别名和tag 可省// [JPUSHService setTags:nil alias:@"WzxJiang" fetchCompletionHandle:^(int iResCode, NSSet *iTags, NSString *iAlias) {//        NSLog(@"rescode: %d, ntags: %<a href="www.jobbole.com/members/uz4…> nalias: %@n", iResCode, iTags , iAlias);//   }];// Required[ JPUSHService registerDeviceToken : deviceToken ] ;}
    • 创建- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler:App在后台时收到推送时的处理\

      (去掉这个)- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler { //iOS 7及之后才能用,现在没人适配iOS6了吧... // IOS 7 Support Required [JPUSHService handleRemoteNotification:userInfo]; completionHandler(UIBackgroundFetchResultNewData); }

      123456(去掉这个 ) - ( void ) application : ( UIApplication * ) application didReceiveRemoteNotification : ( NSDictionary * ) userInfo fetchCompletionHandler : ( void ( ^ ) ( UIBackgroundFetchResult ) ) completionHandler {//iOS 7及之后才能用,现在没人适配iOS6了吧...// IOS 7 Support Required[ JPUSHService handleRemoteNotification : userInfo ] ;completionHandler ( UIBackgroundFetchResultNewData ) ;}
    • applicationWillEnterForeground方法(App即将进入前台)中将小红点清除\

      (去掉这个)- (void)applicationWillEnterForeground:(UIApplication *)application { NSLog(@"进入前台"); [UIApplication sharedApplication].applicationIconBadgeNumber = 0; }

      1234(去掉这个 ) - ( void ) applicationWillEnterForeground : ( UIApplication * ) application {NSLog ( @ "进入前台" ) ;[ UIApplication sharedApplication ] . applicationIconBadgeNumber = 0 ;}
    • 创建didFailToRegisterForRemoteNotificationsWithError方法,处理接收推送错误的情况(一般不会…)\

      (去掉这个)- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error { //Optional NSLog(@"did Fail To Register For Remote Notifications With Error: %@", error); }

      1234(去掉这个 ) - ( void ) application : ( UIApplication * ) application didFailToRegisterForRemoteNotificationsWithError : ( NSError * ) error {//OptionalNSLog ( @ "did Fail To Register For Remote Notifications With Error: %@" , error ) ;}
  • 代码都已经弄好了,现在推送以下,(注意只能是真机调试)

    • 在极光上点击发送通知,注意是开发环境

      点击发送通知,注意是开发环境

    • 然后你就能收到推送了