【问题标题】:Getting location for an iOS app when it is in the background and even killed获取 iOS 应用程序在后台甚至被杀死时的位置
【发布时间】:2015-08-04 10:58:00
【问题描述】:

我的应用需要在应用处于活动状态以及处于非活动状态和被终止时获取用户的位置。当用户的位置靠近商店时,应用必须发送本地通知。

我不确定到底发生了什么,但我无法让我的应用在后台获取位置并在被杀死时唤醒它。

我有一个位置管理器(单例,用于 whenInUse 和 Always 这两种情况),并且我在 .plist 中定义了 NSLocationAlwaysUsageDescription 和 NSLocationWhenInUseUsageDescription

我正在做的是:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    //The app has been killed/terminated (not in background) by iOS or the user.
    if ([launchOptions objectForKey:UIApplicationLaunchOptionsLocationKey]){

        _locationManager = [CoreLocationManager sharedInstance];
        _locationManager.isAppActive = NO;
        _locationManager.locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation;
        _locationManager.locationManager.activityType = CLActivityTypeOtherNavigation;

        if ([_locationManager.locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) {
            [_locationManager.locationManager requestAlwaysAuthorization];
        }

        [_locationManager addLocationManagerDelegate:self];
    }
}


- (void)applicationDidBecomeActive:(UIApplication *)application
{
    if (_locationManager.locationManager){
        _locationManager.isAppActive = YES;
        [_locationManager.locationManager stopMonitoringSignificantLocationChanges];
    }

    _locationManager = [CoreLocationManager sharedInstance];

    if ([_locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) {
        [_locationManager.locationManager requestAlwaysAuthorization];
    }

    if ([_locationManager.locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)]) {
        [_locationManager.locationManager requestWhenInUseAuthorization];
    }

    [_locationManager addLocationManagerDelegate:self];

    [_locationManager.locationManager startUpdatingLocation];

}


- (void)applicationDidEnterBackground:(UIApplication *)application
{
    _locationManager.isAppActive = NO;

    if (_locationManager.locationManager){
        [_locationManager.locationManager stopUpdatingLocation];
        [_locationManager.locationManager stopMonitoringSignificantLocationChanges];
    }

    if ([_locationManager.locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) {
        [_locationManager.locationManager requestAlwaysAuthorization];
    }

    [_locationManager.locationManager startMonitoringSignificantLocationChanges];

}

我做错了吗?我不确定是否有必要使用地理围栏,但对于我使用 startMonitoringSignificantLocationChanges 阅读的内容来说就足够了。

【问题讨论】:

    标签: ios objective-c core-location appdelegate


    【解决方案1】:

    要在后台获取位置,请使用以下代码。每次重启后台任务,会让你的应用在后台运行很长时间。

    要使用它,您需要在Background FetchLocation UpdatesCapabilities中打开Background Mode /strong> 开启。

    - (void)applicationDidEnterBackground:(UIApplication *)application {
    
        if ([[UIDevice currentDevice] respondsToSelector:@selector(isMultitaskingSupported)]) { //Check if our iOS version supports multitasking I.E iOS 4
    
            if ([[UIDevice currentDevice] isMultitaskingSupported]) { //Check if device supports mulitasking
                UIApplication *application = [UIApplication sharedApplication]; //Get the shared application instance
    
                __block UIBackgroundTaskIdentifier background_task; //Create a task object
    
                background_task = [application beginBackgroundTaskWithExpirationHandler: ^{
                    [application endBackgroundTask:background_task]; //Tell the system that we are done with the tasks
                    background_task = UIBackgroundTaskInvalid; //Set the task to be invalid
                    //System will be shutting down the app at any point in time now
                }];
            }
        }
    }
    

    【讨论】:

    • 感谢 Utsav!我必须在哪里插入 applicationDidEnterBackground 的 locationmanager 代码?
    • @Stacky 不需要您在 didEnterBackground 中的代码。您永远不需要调用 stopUpdatingLocation,因为您需要持续的位置更新。如果您调用 stop UpdatingLocation,用户将停止获取位置更新。只有当用户退出应用程序时,您才应该这样做
    • 对不起,如果我问了一个愚蠢的事情@utsav,但是没有必要调用stopUpdatingLocation(因为在应用程序运行时使用)然后调用startMonitoringSignificantLocationChanges?
    • @Stacky startUpdatingLocation 和 startMonitoringSignificantLocationChanges 不能同时使用。它是或者因为它们都将标题和位置更改传递给相同的委托方法。 locationManager:didUpdateToLocation:fromLocation
    • 这真的有效吗? “每次都重启后台任务”这是怎么回事?
    猜你喜欢
    • 1970-01-01
    • 2015-05-15
    • 2016-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-22
    • 2021-03-02
    相关资源
    最近更新 更多