获取 iOS 应用在后台甚至被杀死时的位置 [英] Getting location for an iOS app when it is in the background and even killed

查看:36
本文介绍了获取 iOS 应用在后台甚至被杀死时的位置的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的应用程序需要在应用程序处于活动状态以及处于非活动状态并被杀死时获取用户的位置.当用户的位置靠近商店时,应用必须发送本地通知.

My app needs to get the user's location when app is active and when it's inactive and killed. When the user's location is near to a store the app has to send a local notification.

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

I'm not sure what exactly is happening, but I'm not able to make my app get the location in the background and wakes it up when is killed.

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

I have a location manager (singleton, used for boths cases whenInUse and Always), and I have both NSLocationAlwaysUsageDescription and NSLocationWhenInUseUsageDescription defined in .plist

我正在做的是:

- (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 阅读的内容就足够了.

Do I make something wrong? I'm not sure if it's strictly necessary to use geofencing, but for the things I've read with startMonitoringSignificantLocationChanges is enough.

推荐答案

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

To get a location in the background, use the following code. It will make your app run in the background for a long time by restarting the background task everytime.

要使用此功能,您需要使用背景获取位置更新<在项目设置中的功能中打开背景模式/strong> 已开启.

To use this, you need to turn on Background Mode in Capabilities in project settings with Background Fetch and Location Updates turned on.

- (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
            }];
        }
    }
}

这篇关于获取 iOS 应用在后台甚至被杀死时的位置的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆