后台任务或在iPhone中更新位置

时间:2012-06-05 09:42:44

标签: ios location cllocationmanager background-process

我想创建一个应用程序,在每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分钟后计时器回调就会停止 如何创建一个不断更新当前位置的应用程序到我的服务器

2 个答案:

答案 0 :(得分:3)

您可能错过了应用的Info.plist文件中的背景模式键:

<key>UIBackgroundModes</key>
    <array>
            <string>location</string>
    </array>

这可让您的应用在后台访问位置服务。

但是,这种类型的事情已被多次询问,所以也可以稍微浏览other stack overflow questions以获取更多信息。

Here's another one阅读。

答案 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{


}