首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我如何让应用程序在定时器用完后发送GPS定位,而应用程序在后台?

我如何让应用程序在定时器用完后发送GPS定位,而应用程序在后台?
EN

Stack Overflow用户
提问于 2013-08-06 01:05:49
回答 2查看 175关注 0票数 0

当应用程序在后台时,我想发送用户的位置。在应用程序中,用户可以设置计时器,从1分钟到24小时。我试着让这个应用程序在后台运行,它只工作了十分钟。如果我设置了一个超过10分钟的计时器,然后在后台运行应用程序,应用程序不会在后台运行超过10分钟。有没有可能让应用程序运行超过10分钟?至少两个小时?

以下是我尝试过的方法:

我将这个添加到我的plist:

我将以下代码添加到我的applicationDidEnterBackground:方法中:

代码语言:javascript
运行
复制
    __weak BADAppDelegate * weakSelf = self;
    self.backgroundTaskIdentifier =
    [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:nil];
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        int timeTilDone = timerSeconds;// two hours

        self.bgTimer =
        [NSTimer timerWithTimeInterval:timeTilDone
                                target:weakSelf
                              selector:@selector(startTrackLocation)
                              userInfo:nil
                               repeats:NO];

        [[NSRunLoop mainRunLoop] addTimer:self.bgTimer
                                  forMode:NSDefaultRunLoopMode];


        self.testTimer =
        [NSTimer timerWithTimeInterval:60
                                target:weakSelf
                              selector:@selector(playSilentSound)
                              userInfo:nil
                               repeats:YES];

        [[NSRunLoop mainRunLoop] addTimer:self.testTimer
                                  forMode:NSDefaultRunLoopMode];


    });

我试图通过每分钟播放一次声音来迫使它存活下来。

代码语言:javascript
运行
复制
-(void)playSilentSound
{
if(self.silentSnd == nil)
{
    NSString *soundFile;
    if ((soundFile = [[NSBundle mainBundle] pathForResource:@"halfsec" ofType:@"caf"]))
    {
        NSURL *url = [[NSURL alloc] initFileURLWithPath:soundFile];
        self.silentSnd = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:NULL];
        self.silentSnd.delegate = self;
        [self.silentSnd setNumberOfLoops:1];
    }
}

[self.silentSnd prepareToPlay];
[self.silentSnd play];
}

但这也没什么用。

谢谢!

更新:

下面是我的locationManager初始化代码:

代码语言:javascript
运行
复制
    NSLog(@"StartTrackLocation");
    if(self.locationManager == nil)
    {
        self.locationManager = [[CLLocationManager alloc] init];
    }
    self.locationManager.delegate = self;
    self.locationManager.distanceFilter = kCLDistanceFilterNone;
    self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
    self.locationManager.pausesLocationUpdatesAutomatically = NO;
    [self.locationManager startUpdatingLocation];
EN

回答 2

Stack Overflow用户

发布于 2013-08-06 03:40:32

在初始化时,将CLLocationManager属性pausesLocationUpdatesAutomatically设置为false。

如果设置为true,则Apple认为用户不需要GPS并关闭该服务。

强烈建议您在每次主要ios更新时读取CLLocationManager Class reference的每行(下一次将为7.0)

(尽管您的问题并未真正记录在案)

忘记你的方法beginBackgroundTaskWithExpirationHandler,这是不必要的。

票数 1
EN

Stack Overflow用户

发布于 2013-08-06 03:58:29

为了跟踪位置,你需要告诉系统你想要更新。您可以通过调用startUpdatingLocation (获取细粒度更新)和/或startMonitoringSignificantLocationChanges (获取低能耗,但频率较低的更新,大约500M次更改,通常是在用户更换基站时)来实现这一点。两者都使用是很常见的(因为如果你被终止,...SignificantChanges会启动你,而startUpdatingLocation不会)。您还可以使用startMonitoringForRegion:设置一个区域,当用户进入或离开该区域时,系统会提醒您。

除此之外,您还试图用计时器之类的工具来智胜系统。这只会给你带来麻烦。

也就是说,在最一般的情况下,您的特定请求是不可能的。你不能说“我想在某某时间醒来”。这在iOS 6中不是一个可以解决的问题,你可以说你是一个定位应用程序,可以不断更新定位信息。然后,你可以在每次更新位置时,检查是否是时候做点什么了。但如果用户静静地坐了几个小时,而你在后台(特别是如果你被终止了),那么就没有办法被唤醒。

这个问题在iOS的未发布版本中可能有解决方案,但您必须在开发人员论坛上讨论这个问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18063701

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档