我想创建一个应用程序,在每xx分钟内将用户位置更新到我的远程服务器,即使应用程序在后台也是如此 我试过以下代码
- (void)applicationDidEnterBackground:(UIApplication *)application
{
i=0;
UIApplication *app = [UIApplication sharedApplication];
bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
[app endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
}];
bgTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(backgroundTask:) userInfo:nil repeats:YES];
}
-(void)backgroundTask:(NSTimer*)timer{
i++;
NSLog(@"%s %d",__func__,i);
}
但是大约10分钟后计时器回调就会停止 如何创建一个不断更新当前位置的应用程序到我的服务器
答案 0 :(得分:3)
您可能错过了应用的Info.plist文件中的背景模式键:
<key>UIBackgroundModes</key>
<array>
<string>location</string>
</array>
这可让您的应用在后台访问位置服务。
但是,这种类型的事情已被多次询问,所以也可以稍微浏览other stack overflow questions以获取更多信息。
答案 1 :(得分:0)
您只能在后台更新3分钟。设置功能 - &gt; BackgroundFetch on多于或等于3个字段 使用以下代码
调用此didenterbackground或前景
var time = 120
func applicationDidEnterBackground(_ application: UIApplication)
{
time = 180
self.doBackgroundTask()
}
var timerBack = Timer()
func doBackgroundTask() {
DispatchQueue.global(qos: DispatchQoS.QoSClass.default).async {
self.beginBackgroundUpdateTask()
self.timerBack = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(AppDelegate.displayAlert), userInfo: nil, repeats: true)
RunLoop.current.add(self.timerBack, forMode: RunLoopMode.defaultRunLoopMode)
RunLoop.current.run()
self.endBackgroundUpdateTask()
}
}
var backgroundUpdateTask: UIBackgroundTaskIdentifier!
func beginBackgroundUpdateTask() {
self.backgroundUpdateTask = UIApplication.shared.beginBackgroundTask(expirationHandler: {
self.endBackgroundUpdateTask()
})
}
func endBackgroundUpdateTask() {
UIApplication.shared.endBackgroundTask(self.backgroundUpdateTask)
self.backgroundUpdateTask = UIBackgroundTaskInvalid
}
//做你想做的事
func displayAlert{
}