【问题标题】:iOS background fetch not workingiOS后台获取不起作用
【发布时间】: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。如果应用程序终止或未运行,后台获取是否不起作用?

标签: ios objective-c background-fetch


【解决方案1】:

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

DispatchQueue.global(qos: .background).async

它成功了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-26
    • 1970-01-01
    • 1970-01-01
    • 2016-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多