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后台获取不起作用的主要内容,如果未能解决你的问题,请参考以下文章
后台获取 performFetchWithCompletionHandler 不起作用?