具有后台刷新功能的 APN。当 APN 被传递和通知被点击时,刷新调用了两次? [复制]

Posted

技术标签:

【中文标题】具有后台刷新功能的 APN。当 APN 被传递和通知被点击时,刷新调用了两次? [复制]【英文标题】:APNs with background refresh. Refresh called twice, when the APN is delivered and when the notification is tapped on? [duplicate] 【发布时间】:2015-06-17 07:44:40 【问题描述】:

我正在尝试使用 content-available 键在我的应用中实现 APN,以便触发后台刷新。这是我的代码:

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))handler


    if([userInfo[@"aps"][@"content-available"] intValue]== 1)

        //This stops a refresh happening is a push is delivered with the app in the foreground
        if(application.applicationState!=UIApplicationStateActive)

            NSLog(@“Background push refresh called");
            [self backgroundRefreshWithPushUpdate:NO andHandler:^(BOOL successful, BOOL newMessages) 

                if(successful)


                    if(newMessages) handler(UIBackgroundFetchResultNewData);
                    else handler(UIBackgroundFetchResultNoData);


                

                else

                    handler(UIBackgroundFetchResultFailed);

                


            ];



        

        else handler(UIBackgroundFetchResultNoData);

    



我有这个附加条件:if(application.applicationState!=UIApplicationStateActive) 用于在后台刷新,因为如果应用程序在前台,我不希望它被触发。但是,如果我收到推送,然后点击通知以打开应用程序,则再次调用 - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))handler 中的所有代码。这意味着当通知第一次进入时调用我的后台获取,然后在点击通知时再次调用它。我不希望这种情况发生。有什么想法可以解决这个问题吗?

【问题讨论】:

您好,您的问题有解决方案吗?我也面临同样的问题。 【参考方案1】:

以下是收到推送通知时application:didReceiveRemoteNotification:fetchCompletionHandler:方法中需要注意的事项:1.当应用未启动时(即应用既不在后台也不在前台时),该方法被调用一次,applicationState 将变为 UIApplicationStateInactive。2 .当应用程序处于前台时,该方法被调用一次,applicationState 将变为 UIApplicationStateActive。3.当应用程序处于后台时,该方法会被调用两次,一次是在您收到推送通知时,另一次是在您点击该通知时。当您收到推送通知时,applicationState 将为 UIApplicationStateBackground,当您点击该通知时,applicationState 将为 UIApplicationStateInactive.当 applicationStateUIApplicationStateBackground 时我们可以忽略它,因此对于所有三种情况,我们只能处理一次推送通知。 p>

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler

    if (application.applicationState == UIApplicationStateBackground) 
        completionHandler(UIBackgroundFetchResultNoData);
        return;
    

    // Do whatever you need here and call completionHandler with appropriate UIBackgroundFetchResult

【讨论】:

最后明白了。现在是前一阵子了。应该添加一个答案。不过谢谢你。将对其他人有用。 :) 欢迎凯克斯。感谢您接受我的回答。即使我最近也遇到了同样的问题。我在这里找不到正确的答案,因此想到在方法内的不同情况下打印出 applicationState 。这就是我得出这个解决方案的方式。添加了此答案,以便对其他人有所帮助。 :)

以上是关于具有后台刷新功能的 APN。当 APN 被传递和通知被点击时,刷新调用了两次? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

APN 没有传递我的某些通知

Firebase 云消息传递 - 如何向 APN 添加声音

APN 自定义通知声音问题

当应用程序终止时,APN 在委托中接收通知数据

Apple 开发者推送通知 APN 证书因过度使用而被吊销(被 Apple 禁止)?

前台收到远程APN推送时如何播放默认声音? [重复]