0

我已经实现了静默推送通知。所以当应用程序在 ios 9 中处于非活动状态时调用“didReceiveRemoteNotification”方法。

在某些情况下,应用程序处于非活动状态。

1.当用户点击特定通知时。

2.收到来电或信息时。

3.当通知中心和控制中心打开时。

-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
 {
     if(application.applicationState == UIApplicationStateInactive)  //Inactive state
     {
         [self RedirectScreenBasedOnNotification:self.userInfoDic];//Screen Redirection code 
     }
 }

那么当应用程序处于非活动状态时,我该如何处理静默通知?

我面临的问题是,当通知中心打开时,如果有任何通知出现,那么重定向就可以了,但我想阻止它。

通知负载:-

aps =     {
    alert = "Test Dev 5 startd following you ";
    "content-available" = 1;
    "link_url" = "https://raywenderlich.com";
    message =         {
        friend =             {
            email = "abc@gmail.com";
            name = "Test Dev 5";
            photo = "";
            "user_id" = 27;
        };
        id = 3;
        "is_business_sent" = 0;
        message = "Test Dev 5 startd following you ";
    };
    sound = default;
}

提前致谢

4

2 回答 2

2

静默推送通知不会触发用户交互。当静默通知有效负载包含用于用户交互的键时,事情就会出错 - iOS 无法推断其意图是向用户呈现某些内容,还是保持通知静默并在没有用户交互的情况下进行处理。有时静默通知可能会起作用,有时它可能会像带有用户交互的普通通知一样呈现。它可以是一个或另一个,而不是两者。

如果静默按键content-available存在于aps有效负载中,则键alertsoundbadge不应该存在。

您可以使用我的推送通知有效负载验证工具来检查通知的内容。您在问题中发布的有效负载有几个问题 -aps密钥应该只包含在生成推送通知中定义的 Apple 密钥。您的所有自定义键和值都应该在aps对象之外。

application:didReceiveRemoteNotification:fetchCompletionHandler:只会调用静默推送通知。如果通知负载同时包含content-available ,或iOS中的一个或多个alert,则 iOS 将不知道调用哪个方法,您可能会看到不一致的行为。soundbadge

如果您只是想显示一个非静默通知,则不需要实施application:didReceiveRemoteNotification:fetchCompletionHandler:. 而是application:didReceiveRemoteNotification:为 iOS 9 和userNotificationCenter:willPresentNotification:withCompletionHandler:iOS 10 及更高版本实现。

至于静默通知和非活动应用程序状态,这里没有什么特别可做的。静默通知旨在“提示”应用程序应该刷新内容。当收到静默通知时,应用程序需要在 30 秒内处理内容更新,然后调用获取完成处理程序。当 iOS 执行获取完成处理程序时,它会拍摄更新后的 UI 的新恢复快照。即使应用程序处于非活动状态,也会发生这种情况。

于 2018-09-05T23:53:34.967 回答
0

您可以在此 If 条件中添加您的代码。

if (UIApplication.sharedApplication.applicationState != UIApplicationStateInactive) {
   //Write your code her, this will get executed when your app is not in Inactive state.
}
于 2018-09-07T11:36:12.670 回答