远程推送时 , 应用可能处于下列三种状态:
(1) . 应用开启时 , 应用在前台
(2) . 应用开启时 , 应用在后台
(3) . 应用未启动(应用被杀死)
从苹果APNS服务器远程推送时:
1 . 如果应用处于 (1) 状态 , 则不会发出声音 , 会直接调用appDelegate的代理方法didReceiveRemoteNotification,此时如果想收到类似系统的弹窗提示,则需要自定义弹窗,提示音,振动(弹窗可以参考 : ForeNotification )
1
2
|
AudioServicesPlaySystemSound(1007); //系统提示音
AudioServicesPlaySystemSound(kSystemSoundID_Vibrate); //震动
|
2 . 如果应用处于 (2) 状态 , 则会发出提示音, 点击推送消息 , 则会调用appDelegate的代理方法didReceiveRemoteNotification
3 . 如果应用处于 (3) 状态,则会发出提示音 , 点击推送消息 , 则会开启应用 , 在下面这个方法中会带上launchOptions这个参数,如果实现了application:didReceiveRemoteNotification:fetchCompletionHandler:
这个方法,则会调用这个方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
- ( BOOL )application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
NSDictionary *remoteNotification = [launchOptions objectForKey: UIApplicationLaunchOptionsRemoteNotificationKey];
if (remoteNotification) {
//自定义的BOOL值,用来标记是从通知启动的应用
self.isLaunchedByNotification = YES;
} else {
}
[self checkIsLaunchedByNotification];
return YES;
}
|
收到远程推送后 , 可以跳转到消息界面 :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
|
- ( void )application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
NSDictionary *aps = [userInfo valueForKey:@ "aps" ];
NSDictionary *alert = [aps valueForKey:@ "alert" ];
NSString * body = alert[@ "body" ];
if ([UIApplication sharedApplication].applicationState == UIApplicationStateActive) {
//处于前台时
[EBForeNotification handleRemoteNotification:@{@ "aps" :@{@ "alert" :[NSString stringWithFormat:@ "%@" ,body]}} soundID:1312];
} else {
//处于后台时
[self gotoMessageVC];
}
}
#pragma mark - 检测是否从通知栏启动得应用
- ( void )checkIsLaunchedByNotification{
if (self.isLaunchedByNotification) {
[self gotoMessageVC];
}
}
#pragma mark - 点击了通知菜单(当应用在前台时,收到推送,点击了自定义的弹窗,调用的方法)
- ( void )clickBannerView:(NSNotification *)notification{
NSDictionary * dict = notification.object;
[self gotoMessageVC];
}
#pragma mark - 跳转到消息界面(点击通知菜单/点击通知栏启动应用时)
- ( void )gotoMessageVC{
if ([self.window.rootViewController isEqual:self.tabBarController]){
if ([self.tabBarController.selectedViewController isKindOfClass:[UINavigationController class ]]){
UINavigationController * nav = self.tabBarController.selectedViewController;
if (![nav.topViewController isKindOfClass:[MessagesViewController class ]]) {
MessagesViewController *messageVC = [[MessagesViewController alloc] init];
messageVC.hidesBottomBarWhenPushed = YES;
[nav.visibleViewController.navigationController pushViewController:messageVC animated:YES];
}
}
}
}
|
静默推送
应用想收到静默推送需要满足的条件:
1.应用在前台/后台 (应用被杀死就收不到了)
2.应用实现了
application:didReceiveRemoteNotification:fetchCompletionHandler:
3.如果仅仅实现了application:didReceiveRemoteNotification:,
没有实现application:didReceiveRemoteNotification:fetchCompletionHandler:,
应用只有在前台时才能收到静默推送 , 应用在后台时,收不到静默推送
自定义消息推送
介绍: 极光推送提供了自定义消息推送 , 这种推送只有当应用在 前台 时才能收到 ; 当应用在 后台/被杀死 时,这时候的自定义消息被保存下来,直到应用处于前台时,应用才会收到.
使用场景: 当需要在前台处理大量数据的时候,可以使用自定义消息,例如应用某个模块需要更新了,这时候后台发送个自定义消息,等到应用启动了就可以自动去下载
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
// 使用自定义消息,需要在通知中心注册
// 注册通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receiveJPushCustomMessage:) name:kJPFNetworkDidReceiveMessageNotification object:nil];
// 接收到JPush的自定义消息推送
- ( void )receiveJPushCustomMessage:(NSNotification *)notification {
NSDictionary *userInfo = [notification userInfo];
NSString *title = [userInfo valueForKey:@ "title" ];
NSString *content = [userInfo valueForKey:@ "content" ];
NSDictionary *extra = [userInfo valueForKey:@ "extras" ];
}
|
总结:
1.应用在后台/前台/被杀死,都可以收到普通的远程推送
2.应用被杀死时,可以通过Background Fetch短时间唤醒应用
3.应用在后台/前台时,可以通过静默推送,修改一些数据
4.自定义消息应用在
好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对服务器之家的支持。
原文链接:https://www.jianshu.com/p/ed4c01b571bd