静默推送通知在 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;
    }; 

检查这个: