极光推送的集成:
在- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
方法中添加下面代码:
JPUSHRegisterEntity * entity = [[JPUSHRegisterEntity alloc] init];
entity.types = JPAuthorizationOptionAlert|JPAuthorizationOptionBadge|JPAuthorizationOptionSound;
[JPUSHService registerForRemoteNotificationConfig:entity delegate:self];
[JPUSHService setupWithOption:launchOptions appKey:<#JPUSHappKey#> channel:@"app store" apsForProduction:<#isDevelepDEV#>];
注册DeviceToken:
- (void)application:(UIApplication *)application
didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
/// Required
[JPUSHService registerDeviceToken:deviceToken];
}
注册DeviceToken失败:
- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {
//Optional
NSLog(@"did Fail To Register For Remote Notifications With Error: %@", error);
}
收到推送的通知消息之后,点击通知跳转到app指定页面
需求:收到通知之后,在后台或者应用完全杀死的情况下,收到通知,点击通知能够直接进入特定的页面。进入特定页面之后,点击返回的话,返回到应用的首页。
实现:在JPUSHRegisterDelegate代理方法中去实现跳转。
app在前台运行的时候,接收到通知之后会走下面方法:
#pragma mark- JPUSHRegisterDelegate
// iOS 10 Support
- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(NSInteger))completionHandler {
NSDictionary * userInfo = notification.request.content.userInfo;
if([notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
[JPUSHService handleRemoteNotification:userInfo];
}
//下面这行代码注掉之后,就不会显示通知栏弹窗了。
completionHandler(UNNotificationPresentationOptionAlert);
}
app在前台运行的时候,接收到通知之后会走下面方法:
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler;
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo ;
对上面两个方法进行解释:
上面这个是ios 7后新加入的方法,如果实现了上面那个方法,下面这个就会被覆盖掉,不再执行。
上面这个方法有几个特性:当程序在前台运行时,收到远程推送,会立刻调用此方法,但是如果程序在后台挂起,收到消息(未点击推送消息时)并不会执行方法,如果想在收到消息的时候有需求需要执行一些代码,那么可以让服务器发给APNS时在aps 字典中加入apn = {content-available = 1;}
这个字段
![](https://img.haomeiwen.com/i1892989/1a48a2103c3ad978.png)
当应用在后台挂起时接收到推送消息时就会立即执行上面这个方法,当然,当你再点击推送消息时,还会再执行一次(这两种情况可以根据applicationState这个属性区分),而下面这个方法只会在点击推送消息,或者应用在前台运行时接收到消息时才会调用。如果你有需求,当应用在前台运行时接收到推送消息也希望有类似远程推送那样,我想的方法是程序在前台运行,收到推送消息,那么给他转化成本地通知,但是本地通知并不会有横幅提示。如果你也想要这个提示可以自定义一个view来显示。
程序在后台的时候,AppDelegate中的方法都不会走的, 点击通知进入app,会走上面的方法。 跳转、进入指定的页面在这个方法中设置。
app在后台时, 通过点击通知打开进入app, 在上面方法中打断点,在控制台打印po [UIApplication sharedApplication].applicationState
输出UIApplicationStateInactive
这是从后台进入app的状态。
app在前台运行中的时候,只要不点击通知,就不会走上面的方法。点击通知才会走该方法。在前台运行的时候接收到通知,并点击通知在上面方法中打断点,打印[UIApplication sharedApplication].applicationState
输出UIApplicationStateActive
。
这是app在前台运行的情况的状态。
点击通知栏消息 打开app之后走的方法
- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler {
// 极光推送获取到的消息体
NSDictionary * userInfo = response.notification.request.content.userInfo;
//下面是根据收到的消息的消息体去做不同的处理。例如跳转到h5网页,或者app原生的页面。
if ([userInfo[@"url"] isUrlString]) {
//这是跳h5网页的情况
[self dealWithUrl:userInfo[@"url"]];
// if ([UIApplication sharedApplication].applicationState == UIApplicationStateActive) {
// }
} else {
//这是跳app原生页面的情况
//根据userInfo的内容,跳转不同的页面
self.window.rootViewController = <#设置根控制器#>;
}
if([response.notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
[JPUSHService handleRemoteNotification:userInfo];
}
completionHandler(); // 系统要求执行这个方法
}
跳h5网页的方法:
- (void)dealWithUrl:(NSString *)urlStr {
H5ShowPageViewController * h5 = [H5ShowPageViewController h5ShowPageViewController];
/*
根据url去判断跳到那种类型到h5页面, 再做导航条显隐和是否需要登录等特殊设置。
*/
self.window.rootViewController = [[LMNavigationViewController alloc]initWithRootViewController:h5];
}
在控制器基类中添加一个属性记录是否是从点击通知进入的该页面,并且实现导航条返回按钮的方法,返回的方法中判断 如果该页面是从点击通知进入的,则返回的时候直接返回到首页。否则的话就正常的使用导航控制器pop方法退出。
设置app的角标[[UIApplication sharedApplication] setApplicationIconBadgeNumber:0];
这句如果在AppDelegate中实现的话,那么打开app就会清空通知栏中的通知消息。
前台运行时收到推送消息 需要实现下面方法:
- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(NSInteger))completionHandler;
下面是引用的 对两个方法对说明:
#pragma mark iOS 10 前台收到通知(远程推送和本地通知)
- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(NSInteger))completionHandler {
NSDictionary * userInfo = notification.request.content.userInfo;
if([notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
/// iOS10处理远程推送
[JPUSHService handleRemoteNotification:userInfo];
/// 应用处于前台收到推送的时候转成本地通知 ===========================
UILocalNotification *notification = [[UILocalNotificationalloc] init];
notification.alertTitle =@"哈哈哈哈哈";
notification.alertBody =@"aaaaaa";
notification.userInfo = userInfo;
[[UIApplication sharedApplication] presentLocalNotificationNow:notification];
}else{
/// 应用处于前台收到本地通知不会出现在通知中心 借用极光推送的方法将本地通知添加到通知栏 ==============================
completionHandler(UNNotificationPresentationOptionBadge|UNNotificationPresentationOptionSound|UNNotificationPresentationOptionAlert);
}
// 需要执行这个方法,选择是否提醒用户,有Badge、Sound、Alert三种类型可以选择设置
}
###点击通知栏消息
/// 程序运行于前台,后台 或杀死 点击推送通知 都会走这个方法
- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler {
/*
在这里执行点击之后,进行的处理,例如跳转到不同页面。
*/
// Required
NSDictionary * userInfo = response.notification.request.content.userInfo;
if([response.notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
[JPUSHService handleRemoteNotification:userInfo];
/// 杀死,后台点击通知栏 处理远程推送的跳转
[selfreciveNotification:userInfo];
}else{
/// 前台运行时 转的本地通知 直接通知栏弹窗进行跳转处理
[selfreciveNotification:userInfo];
}
completionHandler(); // 系统要求执行这个方法
}
点击推送消息进入详情然后返回
分为两种情况:
1、 app在已经打开在前台运行
[UIApplication sharedApplication].keyWindow.rootViewController = ((AppDelegate *)[UIApplication sharedApplication].delegate).<#首页的根控制器#>;
获取推送过来的消息,根据消息内容去做操作。
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo;
点进去该方法,进入该方法的说明:
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo NS_DEPRECATED_IOS(3_0, 10_0, "Use UserNotifications Framework's -[UNUserNotificationCenterDelegate willPresentNotification:withCompletionHandler:] or -[UNUserNotificationCenterDelegate didReceiveNotificationResponse:withCompletionHandler:] for user visible notifications and -[UIApplicationDelegate application:didReceiveRemoteNotification:fetchCompletionHandler:] for silent remote notifications");
网友评论