写在前面的废话:搞了一天,明白了极光推送的部分原理和使用方法。在此分享给大家。
JPush 是日常开发中比较常用的推送方式。实现简单,功能全面。
下面将简单的介绍一下我在接入JPush的方法。
-
JPush 集成
JPush 快速集成指南
JPush 配置证书指南
开发文档写的都比较详细,请先仔细阅读。 -
AppDelegate 里需要添加的方法
在 AppDelegate 中会用到的方法 ,我们将 JPush 的代码写入其中,就完成了 JPush 的集成。
** 更新**:程序加载完毕或启动时 或者 当App在未运行状态下通过点击推送通知启动时
在这里完成JPush的注册,因为我的程序只兼容到iOS8.0,而且是首次嵌入JPush所以并没有做过多的判断
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[JPUSHService registerForRemoteNotificationTypes:(UIUserNotificationTypeBadge | UIUserNotificationTypeSound |UIUserNotificationTypeAlert) categories:nil];
[JPUSHService setupWithOption:options appKey:@"xxxx" channel:@"AppStore" apsForProduction:NO];
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.window.rootViewController = [[ViewController alloc]init];
return YES;}
当应用第一次运行时调用,iOS获取到devicetoken后调用,用于注册设备到apns上之后的操作
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
//向JPush 注册 DeviceToken
[JPUSHService registerDeviceToken:deviceToken];}
如果注册的时候失败,ios会调用这个方法,可以打印一些报错日志或者提醒用户通知不可用
- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {
NSLog(@"did Fail To Register For Remote Notifications With Error: %@", error); }
程序在前台或者后台的时候接收到消息,点击消息或消息图标时调用
Required,For systems with less than or equal to iOS6
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
//
[JPUSHService handleRemoteNotification:userInfo];
return;}
借用CocoaChina一位的一句话:
这货是ios7中引入的,如果实现了这货,那原先的版本application:didReceiveRemoteNotification:就不会被调用。
这货被调用后,你唯一可做的就是执行你的后台代码,然后调用completionHandler(your_result);
在iOS7中引入,是对application:didReceiveRemoteNotification:的补充,所以在这里进行判断,App现在是否是在前台,并进行处理</br>
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
[JPUSHService handleRemoteNotification:userInfo];
//必须要写的方法,不然会报错:warning:Appliction delegate received call to -application:didReceiveRemoteNotification:fetchCompletionHandler: but the completion handler was never called.
completionHandler(UIBackgroundFetchResultNewData);}
if (application.applicationState == UIApplicationStateActive) {
//在前台,要进行自己的处理
}
else {
}
在程序启动时会调用该方法
- (void)applicationDidBecomeActive:(UIApplication *)application {
[application setApplicationIconBadgeNumber:0];
return;}
JPush 也可以根据 Tag、Alias、Registration ID 进行分类型的推送,调用对应的Set 方法即可完成。
其中设置 Tag 和 Alias 时,请注意监听 kJPFNetworkDidLoginNotification,在 JPush 注册完成时再进行 Tag或者 Alias 的Set 否则将报错,在发推送时也找不到该 Tag 下的设备。
5月25日更新 在App未运行的状态时,点击推送消息启动App时会调用didFinishLaunchingWithOptions: 可以不进行特殊处理。但有一点千万千万注意,因为通过推送消息启动基本都会进行对应的页面跳转,有时会出现这样的error
<code>Finishing up a navigation transition in an unexpected state. Navigation Bar subview tree might get corrupted.
Unbalanced calls to begin/end appearance transitions for <XXX> </code>
是因为在上一个 Push 动画还未结束的时候 进行了下一次的 Push 操作。
如果是多层级的跳转请一定要将动画设置为NO 这是我被苦苦坑一了整天的总结,因为这种Bug 是很难被发现的。共勉,引以为戒。
到此基本完成了JPush的集成,日后再遇到各种问题,也将继续与大家讨论分享。谢谢
网友评论