iOS后台获取不起作用

Posted

技术标签:

【中文标题】iOS后台获取不起作用【英文标题】:iOS background fetch not working 【发布时间】:2018-02-21 19:08:24 【问题描述】:

我想每隔 30 分钟从服务器中提取一些数据并设置本地通知以提醒用户,我实现了下面的代码来执行此操作。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 


    [application setMinimumBackgroundFetchInterval:UIApplicationBackgroundFetchIntervalMinimum];
    return YES;


-(void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
    NSString *value = [[NSUserDefaults standardUserDefaults]objectForKey:@"bgFetch"];

    if ([Utilities isInternetConnectionAvailable]) 
        if ([self.window.rootViewController isKindOfClass:[HomeViewController class]])

            HomeViewController *homeController = (HomeViewController*)self.window.rootViewController;
            [homeController fetchDatawithCompletionHandler:^(UserData *userData, NSString *errorResponse) 
                if (userData) 
                    if (![homeController isNotificationAvailvableForTheData:userData]) 
                        [homeController scheduleLocalNotificationForUserData:userData];
                        completionHandler(UIBackgroundFetchResultNewData);
                    
                else
                    completionHandler(UIBackgroundFetchResultFailed);
                
            ];
        else
            completionHandler(UIBackgroundFetchResultNoData);
        

    else
        completionHandler(UIBackgroundFetchResultFailed);
    

我还启用了后台获取功能,并在 plist 中添加了“必需的后台模式”键。当我在几个小时后检查时,没有设置本地通知。我哪里做错了?

【问题讨论】:

也许你的isInternetConnectionAvailable 是假的,也许你的根视图控制器不是HomeViewController,也许你的通知代码是错误的,也许......也许......也许...... :- ) 您是否尝试过调试问题?提示:使用 Xcode,您可以使用 Debug > Simulate Background Fetch 模拟后台提取 您可以使用 Xcode 中的调试菜单强制触发后台刷新来测试您的代码。 ios 开始触发后台刷新调用可能需要一天甚至更长的时间。如果可能的话,使用推送通知比依赖频繁的后台刷新轮询要高效得多。最后,正如@Krumelur 所说,如果您的应用在后台启动,您无法确定您的主视图控制器是否存在 是的。当我使用 xcode 模拟器模拟后台获取时,它可以工作。但不在物理设备上。设备已连接到 Internet,并且 homeviewcontroller 设置为根视图。我单独测试了通知代码sn-p。 在你的应用中加入一些调试输出,看看你能走多远。通过按下设备的主页按钮,确保您的应用程序正在运行并进入后台。不要终止应用程序,否则后台提取将不起作用。此外,如果您的应用崩溃,它将不会再次被安排。 谢谢@Krumelur。如果应用程序终止或未运行,后台获取是否不起作用? 【参考方案1】:

我遇到了同样的问题。每当我通过 XCode 模拟后台获取时,无论是使用模拟器还是真实设备,它都可以正常工作。如果我拔掉电话并像往常一样使用它。我从来没有收到通知,分别是我的代码没有被执行。解决方案非常简单,我认为“模拟后台获取”的区别在于您的应用程序处于与您的日常生活不同的阶段。要使其工作,只需在后台线程上分派您的代码。我只是将我的代码包装在里面:

DispatchQueue.global(qos: .background).async

它成功了。

【讨论】:

以上是关于iOS后台获取不起作用的主要内容,如果未能解决你的问题,请参考以下文章

IOS 13中的iOS后台任务不起作用

后台获取 performFetchWithCompletionHandler 不起作用?

为啥在 iOS 9.3 中杀死/终止应用程序后后台位置不起作用

IOS 远程通知在 IOS 8 的后台不起作用

FCM 后台通知在 iOS 中不起作用

IOS GCM 推送通知在后台不起作用