iOS后台获取无法正常工作

时间:2018-02-21 19:08:24

标签: ios objective-c background-fetch

我想每隔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中添加了“必需的后台模式”键。几小时后我检查时,没有设置本地通知。我在哪里做错了?

1 个答案:

答案 0 :(得分:0)

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

DispatchQueue.global(qos: .background).async

它奏效了。