在我的应用程序中,我想使用iOS 7后台提取功能向服务器发送一些数据。我还在目标的功能部分中选择了背景提取复选框(当然还有一个自动添加到plist中的标记)。
在AppDelegate中我这样做了:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
[application setMinimumBackgroundFetchInterval:UIApplicationBackgroundFetchIntervalMinimum];
//[application setMinimumBackgroundFetchInterval:10]; also tried this
return YES;
}
然后在委托方法中我这样做了:
-(void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler{
LocationManager = [[CLLocationManager alloc] init];
LocationManager.delegate = self;
LocationManager.desiredAccuracy = kCLLocationAccuracyBest;
LocationManager.distanceFilter = 50.0;
[LocationManager startUpdatingLocation];
/** NEW DATA EXISTS AND WAS SUCCESSFULLY PROCESSED **/
if (YES) {
completionHandler(UIBackgroundFetchResultNewData);
}
else
completionHandler(UIBackgroundFetchResultFailed);
}
然后我将我的iPhone连接到XCode并运行应用程序并单击从调试菜单中模拟背景提取。调用了委托方法,并且在服务器上更新了位置,但它从未再次发生过,系统永远不会在后台唤醒应用程序。 我做错了什么?任何帮助将不胜感激。
编辑:是否可以使用后台提取功能在服务器上发送数据? 编辑-2 如果我使用远程通知代替后台提取以在服务器上发送数据,那么在这种情况下是否保证系统在收到远程通知后将唤醒我的应用程序?
答案 0 :(得分:1)
简单的回答是,对 performFetchWithCompletionHandler 方法的调用依赖于设备的iOS来调用它。长期以来我也遇到过同样的问题,发现可以在几分钟或几小时或一天或一周内调用它。另外** UIApplicationBackgroundFetchIntervalMinimum **并不意味着它会在最短的时间内调用它,它可能是永远或最小的,它最终将依赖于OS来调用preformFetch方法。所以最后你可以等待OS调用performFetchWithCompletionHandler方法。
答案 1 :(得分:0)
iOS非常智能,如果你的应用程序的后台操作消耗更多资源,它甚至会再次停止调用它。后台提取的时间间隔从不固定,操作系统在空闲时调用它。如果您的应用程序的后台操作消耗的资源较少,则更有可能再次调用它。您无法每20或30分钟更新一次位置。即使您提到间隔,如果操作系统不是免费的,它也不会执行您的获取操作。