【发布时间】: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