ios - 在didreceiveremotenotification期间StartUpdateLocation :fetch

标签 ios objective-c background ios7 fetch

大家晚上好!

我有一个简单的问题:当我在 iOS 7 上使用 didReceiveRemoteNotification:fetch 收到正确的推送通知时,如何启用 [CLLocationManager startUpdateLocation]?

现在,我有:

- (void) application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
    if ([userInfo objectForKey:@"aps"] && [[userInfo objectForKey:@"aps"] objectForKey:@"content-available"])
    {
        if ([userInfo objectForKey:@"update-location"])
        {
            [self performSelectorInBackground:@selector(handleLocationNotificationPush:) withObject:completionHandler];
        }
        if ([userInfo objectForKey:@"update-sensors"])
        {

        }
    }
}

-(void)handleLocationNotificationPush:(void (^)(UIBackgroundFetchResult))completionHandler
{
    [CLController.locMgr startUpdatingLocation];
    ++nbPushReceive;

    [self.pushLockForLocation lock];
    if ([self.pushLockForLocation waitUntilDate:[NSDate dateWithTimeIntervalSinceNow:25]] == TRUE && self.lastKnownLocation != nil)
    {
        [self.pushLockForLocation unlock];
        // Send my new location to server using HTTP request
        [self sendLocationForPushUpdates:self.lastKnownLocation fetchCompletionHandler:completionHandler];

        if (![UIApplication sharedApplication].applicationState == UIApplicationStateActive)
            // it stops location updates
            [self stopAllLocationUpdates];
        return;
    }
    // In case we didn't receive any new position during 25 secondes
    [self.pushLockForLocation unlock];
    if (![UIApplication sharedApplication].applicationState == UIApplicationStateActive)
    {
        [self stopAllLocationUpdates];
    }
    completionHandler(UIBackgroundFetchResultNoData);
}


- (void)locationUpdate:(CLLocation *)location
{
    NSLog(@" *** LocationContrller - LocationUpdate location");

    self.lastKnownLocation = location;
    if (location.horizontalAccuracy < 500)
    {
        [self.pushLockForLocation signal];
    }
}

当然,我的 CLController 委托(delegate)是同一个类(当应用程序位于前台时位置更新有效)。在我的 plist.file 中,我选中了“远程通知”。

我错过了什么?

感谢您的帮助! :D

最佳答案

这可能与以下事实有关:在 iOS7 中,在后台启用位置服务不会像以前的 iOS 版本那样为您提供无限的后台处理时间。请观看 WWDC 2013 Core Location 的新增功能视频,大约 5 分钟 30。因此,您的应用程序在收到推送通知后大约 30 秒再次暂停。

我也遇到了类似的问题,目前还没有找到解决办法。但是,如果您想到达同一个地方,我会尝试以下操作 -

首先将 NSLog 放入 didReceiveRemoteNotification 中,在设备上运行您的应用程序,将其置于后台并向其发送推送通知。如果您看到 NSLog,您就会知道推送中的内容可用标志设置正确。

接下来在 -(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations 中添加 NSLog。如果得到提示,那么您就知道您确实正在启用位置服务。

如果您到目前为止,您可能遇到了与我相同的问题。 30 秒并不总是足以让位置达到我想要的精度。

顺便说一句,如果您使用的是 iPhone 5 或更高版本,您可以使用延迟定位并保持定位服务持续运行。遗憾的是,我需要它才能在 iPhone 4s 上运行。

更新 - 我现在发现这与后台推送通知和 didReceiveRemoteNotification 特别相关。从标准后台任务启用位置管理器将像 iOS7 之前一样工作。因此,您仍然可以将后台任务与位置管理器一起使用,以每 x 分钟获取您的位置,只是无法使用后台推送来开始整个操作。

关于ios - 在didreceiveremotenotification期间StartUpdateLocation :fetch,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19408962/

相关文章:

android - 在用户 sleep 时处理我的 BLE 监控应用程序上的 Android-Doze 模式

javascript - 动态全屏背景视频

css - 设置多个背景(页面底部的图片和其余部分的颜色)

ios - 在不继承 UINavigationController 的情况下以编程方式更改 ViewController 的方向

ios - 开发应用程序仅用于应用程序内购买?

Objective-C 网络 - 最佳实践?

objective-c - 初始化模型对象时返回错误的最佳方法?

ios - 如何使用新的 Itunes Connect self 拒绝应用程序?

ios - 将 UiPickerView 添加到 AlertController

objective-c - 在 setter 中哪里释放副本?