应用处于非活动状态时无法接收静默通知 iOS

Unable to receive silent notification when app is inactive iOS

我正在开发一个应用程序,我正在使用静默推送通知来发送一些数据。当应用程序处于活动状态时,推送工作正常,但如果我刷出应用程序或它处于非活动状态,我的应用程序将不会收到推送通知。我在功能下启用了后台模式推送通知,还在 info.plist

中添加了所需的后台模式密钥

这是我随推送一起发送的样本数据

  {
   "aps": {
      "content-available": 1
    },
    "yourdatakey":{data}
}

我应该怎么做才能解决这个问题??.. iOS 应用程序可以在非活动模式下接收静默推送通知吗?

    -(void) application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void(^)(UIBackgroundFetchResult))completionHandler
{    
    if( SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO( @"10.0" ) )
    {
        NSLog( @"iOS version >= 10. Let NotificationCenter handle this one." );
        return;
    }
    NSLog( @"HANDLE PUSH, didReceiveRemoteNotification: %@", userInfo );

    if( [UIApplication sharedApplication].applicationState == UIApplicationStateInactive )
    {
        NSLog( @"INACTIVE" );
        completionHandler( UIBackgroundFetchResultNewData );
    }
    else if( [UIApplication sharedApplication].applicationState == UIApplicationStateBackground )
    {
        NSLog( @"BACKGROUND" );
        completionHandler( UIBackgroundFetchResultNewData );
    }  
    else  
    {  
        NSLog( @"FOREGROUND" );  
        completionHandler( UIBackgroundFetchResultNewData );  
    }  
}

- (void)userNotificationCenter:(UNUserNotificationCenter *)center
       willPresentNotification:(UNNotification *)notification
         withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler
{
    NSLog( @"Handle push from foreground" );
}

- (void)userNotificationCenter:(UNUserNotificationCenter *)center
didReceiveNotificationResponse:(UNNotificationResponse *)response
         withCompletionHandler:(void (^)())completionHandler
{
    NSLog( @"Handle push from background or closed" );
}

推送在我的应用程序中起着至关重要的作用,不希望有任何延迟。我应该怎么做才能立即收到推送??...

据我所知,静默推送通知应该如下所示:

{ 
      "to" : "<DEVICE_ID>",
      "priority" : "high",
      "content_available" : true,
      "data" : { "custom_key":"custom value", "custom_key_2":"custom value 2" }
}

对我来说,当应用程序处于前台或后台时,这几乎会立即发送。但是,当应用程序处于非活动状态时,它根本不会通过(它不会启动应用程序来处理消息)。

如果我在消息中添加以下内容:

  "notification" : { "body" : "Notification Text", "sound" : "chime.aiff" }

当应用程序处于非活动状态时,它会播放提示音并在通知区域显示"Notification Text",但仍然不会启动应用程序来处理消息的数据部分。我知道这可能是设计使然,但我使用它来确认我在应用程序处于非活动状态时得到了一些东西。

因此,这可能会帮助您解决一半的问题(立即收到推送通知),但恐怕我仍在尝试在应用程序处于非活动状态时让它正常工作。

编辑:如果用户强制关闭应用程序(从任务管理器向上滑动),Apple 会在推送通知进入时禁用启动应用程序。有你无能为力。 Apple 的文档指出,如果您再次手动启动该应用程序或重新启动设备,它将重新启用从静默推送通知启动该应用程序,但我没有发现这种情况。我认为简短的回答是:"silent push notifications on iOS work when Apple decides to let them work." 我想如果您需要一个以预期方式工作的移动操作系统,请将您的用户引导至 Android。