博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS-集成极光推送
阅读量:6839 次
发布时间:2019-06-26

本文共 7687 字,大约阅读时间需要 25 分钟。

当然做推送钱需要做一些准备工作了,就是推送必须的p12推送证书:开发环境(开发时测试需要的推送证书)、生产环境(发布到AppStore时需要的推送证书),因为xcode已经升级到了7.0以上,所以一些真机测试的配置文件证书就不需要自己手动去创建了,只要有Apple ID,真机测试时,就能自动生成,免费测试:

制作证书的过程就不啰嗦了,详细看官方文档或者如下推荐:

创建完证书,就是去极光官网注册账号,创建应用,截图如下:

将创建的证书上传到应用上了,上传成功后的截图如下:

证书上传成功后,生成APP Key,截图如下:

好了,这下工作做完了,剩下的就是代码实现了:

第一步:下载SDK,将需要的两个文件导入项目中:

集成压缩包内容

包名为JPush-iOS-SDK-{版本号}

  • lib文件夹:包含头文件 JPUSHService.h,静态库文件jpush-ios-x.x.x.a ,支持的iOS版本为 5.0 及以上版本。(请注意:模拟器不支持APNs)
  • pdf文件:集成指南
  • demo文件夹:示例

第二步:导入需要依赖的库文件:

必要的框架

  • CFNetwork.framework
  • CoreFoundation.framework
  • CoreTelephony.framework
  • SystemConfiguration.framework
  • CoreGraphics.framework
  • Foundation.framework
  • UIKit.framework
  • Security.framework
  • Xcode7需要的是libz.tbd;Xcode7以下版本是libz.dylib
  • Adsupport.framework (获取IDFA需要;如果不使用IDFA,请不要添加)

第三步:创建一个工具类,名称为KJJPushHelper,封装注册时的各种方法

.h

////  KJJPushHelper.h////  Created by xiayuanquan on 16/5/5.//  Copyright © 2016年 mac. All rights reserved.//#import 
@interface KJJPushHelper : NSObject// 在应用启动的时候调用+ (void)setupWithOption:(NSDictionary *)launchingOption appKey:(NSString *)appKey channel:(NSString *)channel apsForProduction:(BOOL)isProduction advertisingIdentifier:(NSString *)advertisingId;// 在appdelegate注册设备处调用+ (void)registerDeviceToken:(NSData *)deviceToken;// ios7以后,才有completion,否则传nil+ (void)handleRemoteNotification:(NSDictionary *)userInfo completion:(void (^)(UIBackgroundFetchResult))completion;// 显示本地通知在最前面+ (void)showLocalNotificationAtFront:(UILocalNotification *)notification;@end

.m

////  KJJPushHelper.m//  Created by xiayuanquan on 16/5/5.//  Copyright © 2016年 mac. All rights reserved.//#import "KJJPushHelper.h"#import "JPUSHService.h"@implementation KJJPushHelper+ (void)setupWithOption:(NSDictionary *)launchingOption                 appKey:(NSString *)appKey                channel:(NSString *)channel       apsForProduction:(BOOL)isProduction  advertisingIdentifier:(NSString *)advertisingId{    // Required#if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_7_1    // ios8之后可以自定义category    if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) {        // 可以添加自定义categories        [JPUSHService registerForRemoteNotificationTypes:(UIUserNotificationTypeBadge |                                                          UIUserNotificationTypeSound |                                                          UIUserNotificationTypeAlert)                                           categories:nil];    } else {#if __IPHONE_OS_VERSION_MAX_ALLOWED < __IPHONE_8_0        // ios8之前 categories 必须为nil        [JPUSHService registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge |                                                          UIRemoteNotificationTypeSound |                                                          UIRemoteNotificationTypeAlert)                                           categories:nil];#endif    }#else    // categories 必须为nil    [JPUSHService registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge |                                                      UIRemoteNotificationTypeSound |                                                      UIRemoteNotificationTypeAlert)                                          categories:nil];#endif        // Required    [JPUSHService setupWithOption:launchingOption appKey:appKey channel:channel apsForProduction:isProduction advertisingIdentifier:advertisingId];    return;}+ (void)registerDeviceToken:(NSData *)deviceToken {    [JPUSHService registerDeviceToken:deviceToken];    return;}+ (void)handleRemoteNotification:(NSDictionary *)userInfo completion:(void (^)(UIBackgroundFetchResult))completion {    [JPUSHService handleRemoteNotification:userInfo];        if (completion) {        completion(UIBackgroundFetchResultNewData);    }    return;}+ (void)showLocalNotificationAtFront:(UILocalNotification *)notification {    [JPUSHService showLocalNotificationAtFront:notification identifierKey:nil];    return;}@end

第四步:创建一个APPDelegate的分类,在该类中调用KJJPushHelper中的类方法

//  AppDelegate+KJJPushSDK.h////  Created by xiayuanquan on 16/5/5.//  Copyright © 2016年 mac. All rights reserved.//#import "AppDelegate.h"@interface AppDelegate (KJJPushSDK)-(void)JPushApplication:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;@end//  AppDelegate+KJJPushSDK.m////  Created by xiayuanquan on 16/5/5.//  Copyright © 2016年 mac. All rights reserved.//#import "AppDelegate+KJJPushSDK.h"#import "KJJPushHelper.h"#define JPushSDK_AppKey  @"31e01f6a2f6dxxxxxxxxxec"#define isProduction     NO@implementation AppDelegate (KJJPushSDK)-(void)JPushApplication:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{      [KJJPushHelper setupWithOption:launchOptions appKey:JPushSDK_AppKey channel:nil apsForProduction:isProduction advertisingIdentifier:nil];}- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {    // Required - 注册 DeviceToken    [KJJPushHelper registerDeviceToken:deviceToken];}- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {        // Required,For systems with less than or equal to iOS6    [KJJPushHelper handleRemoteNotification:userInfo completion:nil];}- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {        // IOS 7 Support Required    [KJJPushHelper handleRemoteNotification:userInfo completion:completionHandler];        // 应用正处理前台状态下,不会收到推送消息,因此在此处需要额外处理一下    if (application.applicationState == UIApplicationStateActive) {        UIAlertView *alert = [[UIAlertView alloc]                              initWithTitle:@"收到推送消息"                              message:userInfo[@"aps"][@"alert"]                              delegate:nil                              cancelButtonTitle:@"取消"                              otherButtonTitles:@"确定",nil];        [alert show];    }}- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {    //Optional    NSLog(@"did Fail To Register For Remote Notifications With Error: %@", error);}- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification {    [KJJPushHelper showLocalNotificationAtFront:notification];    return;}- (void)applicationDidBecomeActive:(UIApplication *)application {    [application setApplicationIconBadgeNumber:0];    return;}@end

第五步:在AppDelegate中注册即可

//注册极光推送[self JPushApplication:application didFinishLaunchingWithOptions:launchOptions];

好了,大功告成,插上真机运行:打印结果如下

去官网测试一下:

真机收到消息截图:

集成过程中遇到的问题,困扰了好久,后来找出来了,分享一下:

当时证书一切都没有问题,但是总是出现这个打印:

错误信息JPUSH | W - [JPUSHClientController] Not get deviceToken yet. Maybe: your certificate not configured APNs? or current network is not so good so APNs registration failed? or there is no APNs register code? Please refer to JPush docs.

推送消息时,出现的提示:

 

我的原因是:

由于项目之前用到了环信SDK,环信得已经注册了通知,在AppDelegate中注册通知,didRegisterForRemoteNotificationsWithDeviceToken与didFailToRegisterForRemoteNotificationsWithError方法,均不执行。。。需到环信注册通知的地方,再次注册极光通知。方可以获取到Token执行。

 

扩展:极光推送中的定向推送

极光推送中,不使用广播推送,那么怎样做到定向推送,是开发者和需求一定会出现的问题,极光推送中可以有两个唯一值:

(1)注册Jpush成功后生成的registrationID,这个registrationID是标记设备唯一性的,你发现,当你在启动多次,注册Jpush时,这个值是不变的;在同一个设备上,更换用户登录,这个值仍然不变;最后,你删除应用程序,再下载时启动注册Jpush,这个值还是不变。这就可以定向向某台设备做推送,如果你能给自己的服务器上传这个值,并且给这个值绑定一些东西,是不是可以做更多事情呢。

(2)alias:只要了解极光推送的都知道这是设置别名的,官方文档上说明了这个值不是唯一的,但是建议开发者把它作为用户的唯一标记。我觉得这个作为唯一值是最好的,当你想定向向某个用户做推送,或者召唤他回归我们的应用程序,这个值就太好了。你可以将它设置为userId,这个时候推送就能知道向哪个用户发了。

 

本人原创,转载须注明出处,谢谢!

转载于:https://www.cnblogs.com/mkai/p/6340750.html

你可能感兴趣的文章
大數據下的決策思考
查看>>
hadoop作业分片处理以及任务本地性分析(源码分析第一篇)
查看>>
又睡不着了。。
查看>>
RHEL在VLAN Trunk模式下的IP地址配置
查看>>
RHCE 学习笔记(38 ) - Shell
查看>>
WEB服务器-Nginx之虚拟主机、日志、认证及优化
查看>>
常用的两种数据分区方法(以Teradata为例)
查看>>
Nginx Rewrite正则表达式案例
查看>>
一个新兴的日志管理产品
查看>>
WindowsServer2012史记-安装和配置HyperV
查看>>
Delphi开发的IOCP测试Demo以及使用说明。
查看>>
10分钟学会 Python 函数基础知识
查看>>
应届毕业生求职之我见
查看>>
FAQ:configuration manager未找到站点来管理此客户端
查看>>
微博商城开启社会化电商之路
查看>>
通过脚本案例学习shell(三) --- 通过交互式脚本自动创建Apache虚拟主机
查看>>
在大二,我是怎么月收入5000
查看>>
校验顺序和短路
查看>>
Buffer cache和page cache的区别
查看>>
京东家电&格力:跨界合作如何迎来行业效应?
查看>>