静默推送通知在 iOS7 后台模式下不起作用
Silent push notification doesn't work on iOS7 in background mode
我有这种奇怪的情况,我的应用程序支持 iOS7 及更高版本。它的功能是 Remote notifications
通过使用静默通知启用的。
我知道上面的 iOS7 和 iOS8 处理通知的逻辑不同。我这样做了:
if ([[UIApplication sharedApplication] respondsToSelector:@selector(isRegisteredForRemoteNotifications)])
{
[[UIApplication sharedApplication] registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge) categories:nil]];
[[UIApplication sharedApplication] registerForRemoteNotifications];
}
else {
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:
(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)];
}
这里收到通知
{
aps = {
"content-available" = 1;
};
}
所以它的作用是,app 收到静默通知,然后设置 localNotification,见下文:
UILocalNotification *notification = [[UILocalNotification alloc] init];
notification.fireDate = [NSDate dateWithTimeIntervalSinceNow:5];
notification.soundName = UILocalNotificationDefaultSoundName;
notification.alertBody = @"testing";
notification.timeZone = [NSTimeZone defaultTimeZone];
[[UIApplication sharedApplication] scheduleLocalNotification:notification];
它在 iOS8 和 iOS9 后台模式和前台模式下都有效。当应用程序在前台时,它会触发didReceiveLocalNotification
。
但是当我在 iOS7 中进行测试时,如果应用程序处于后台模式,它就不起作用。我试图弄清楚这是怎么发生的,而其他 OS 工作正常。我在应用程序打开时进行了测试,它确实收到了推送通知,并且 didReceiveLocalNotification
被触发。但是当进入后台时,什么也没有发生(没有本地推送通知)。
您没有提到启用后台提取。您是否在您的应用程序功能中启用了它?
并在您的 AppDelegate.m
中进行设置
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
[application setMinimumBackgroundFetchInterval:UIApplicationBackgroundFetchIntervalMinimum];
return YES;
}
并将此作为您的委托方法
-(void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler{
// do your thing here. maybe calling a view controller class or stuff
}
但如果您不喜欢后台获取,请试试这个:
{
aps = {
"content-available" : 1,
"sound" : ""
};
}
祝你好运!
我不太确定这个问题,但也许您可以尝试更改 respondsToSelector。参考以下内容:
if ([UIApplication instancesRespondToSelector:@selector(registerUserNotificationSettings:)])
正如本节中所指出的,aps 需要包含 priority
才能在 iOS7 中工作。
aps = {
badge = 7;
"content-available" = 1;
priority = 5;
};
检查这个:
我有这种奇怪的情况,我的应用程序支持 iOS7 及更高版本。它的功能是 Remote notifications
通过使用静默通知启用的。
我知道上面的 iOS7 和 iOS8 处理通知的逻辑不同。我这样做了:
if ([[UIApplication sharedApplication] respondsToSelector:@selector(isRegisteredForRemoteNotifications)])
{
[[UIApplication sharedApplication] registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge) categories:nil]];
[[UIApplication sharedApplication] registerForRemoteNotifications];
}
else {
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:
(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)];
}
这里收到通知
{
aps = {
"content-available" = 1;
};
}
所以它的作用是,app 收到静默通知,然后设置 localNotification,见下文:
UILocalNotification *notification = [[UILocalNotification alloc] init];
notification.fireDate = [NSDate dateWithTimeIntervalSinceNow:5];
notification.soundName = UILocalNotificationDefaultSoundName;
notification.alertBody = @"testing";
notification.timeZone = [NSTimeZone defaultTimeZone];
[[UIApplication sharedApplication] scheduleLocalNotification:notification];
它在 iOS8 和 iOS9 后台模式和前台模式下都有效。当应用程序在前台时,它会触发didReceiveLocalNotification
。
但是当我在 iOS7 中进行测试时,如果应用程序处于后台模式,它就不起作用。我试图弄清楚这是怎么发生的,而其他 OS 工作正常。我在应用程序打开时进行了测试,它确实收到了推送通知,并且 didReceiveLocalNotification
被触发。但是当进入后台时,什么也没有发生(没有本地推送通知)。
您没有提到启用后台提取。您是否在您的应用程序功能中启用了它?
并在您的 AppDelegate.m
中进行设置- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
[application setMinimumBackgroundFetchInterval:UIApplicationBackgroundFetchIntervalMinimum];
return YES;
}
并将此作为您的委托方法
-(void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler{
// do your thing here. maybe calling a view controller class or stuff
}
但如果您不喜欢后台获取,请试试这个:
{
aps = {
"content-available" : 1,
"sound" : ""
};
}
祝你好运!
我不太确定这个问题,但也许您可以尝试更改 respondsToSelector。参考以下内容:
if ([UIApplication instancesRespondToSelector:@selector(registerUserNotificationSettings:)])
正如本节中所指出的,aps 需要包含 priority
才能在 iOS7 中工作。
aps = {
badge = 7;
"content-available" = 1;
priority = 5;
};
检查这个: