iOS9 startMonitoringSignificantLocationChanges终止后无法启动应用程序?

时间:2015-10-27 12:57:24

标签: background ios9 cllocationmanager relaunch

我正在开发一款需要将当前位置发送到服务器的iPhone应用,以便知道要发送的推送通知。它不一定非常精确,startMonitoringSignificantLocationChanges非常适合我的需求。

只要应用程序在屏幕上或后台运行,这一切都很有效。但是,如果我杀死/终止应用程序,它将不再起作用。根据我的理解,该应用程序应该使用特殊的UIApplicationLaunchOptionsLocationKey作为启动选项自动重新启动。但是应用程序不会重新启动(至少不会在模拟器中)。

我也在这里读过一些东西: Behaviour for significant change location API when terminated/suspended?

自动重新启动是否仅在系统将应用程序从挂起状态终止而不是手动终止应用程序时才起作用?我还尝试了特殊的info.plist UIApplicationExitsOnSuspend,当它进入后台时也会终止应用程序。它也没有重新启动。

有没有办法在模拟器中模拟系统终止的应用程序?

手机重启后iOS更新后会发生什么?有没有办法确保应用程序重新启动?

2 个答案:

答案 0 :(得分:3)

一个应用程序由SLC重新启动,无论它被杀死时如何被杀死,至少有一个CLLocationManager已经调用了startMonitoringSignificantLocationChanges。有一点需要注意 - 在版本iOS7.0(.x)中,它被破坏了。它开始在iOS7.1 +中再次运行。

要实现这一目标,您需要完成几个步骤。

  1. 在项目功能中,您必须启用后台模式位置更新,因为您希望在后台唤醒。
  2. 您需要将密钥 NSLocationAlwaysUsageDescription 添加到info.plist,其中包含您希望始终能够在后台使用位置的原因说明。
  3. 在代码中,您必须要求用户授权始终使用位置
  4. 在代码中,您必须要求在后台继续提供位置更新
  5. 在代码中,您必须开始监控重要的位置更改
  6. 以下是一个例子:

    的AppDelegate,H

    #import <UIKit/UIKit.h>
    #import <CoreLocation/CoreLocation.h>
    
    @interface AppDelegate : UIResponder <UIApplicationDelegate, CLLocationManagerDelegate>
    
    @property (strong, nonatomic) UIWindow *window;
    @property CLLocationManager* locationMgr;
    
    @end
    

    AppDelegate.m

    #import "AppDelegate.h"
    
    @implementation AppDelegate
    
    @synthesize locationMgr;
    
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    
        NSLog(@"app launching");
    
        locationMgr = [[CLLocationManager alloc] init];
        [locationMgr setDelegate:self];
        // Added in iOS8
        if([locationMgr respondsToSelector:@selector(requestAlwaysAuthorization)])
            [locationMgr requestAlwaysAuthorization];
        // Added in iOS9
        if([locationMgr respondsToSelector:@selector(setAllowsBackgroundLocationUpdates:)])
            [locationMgr setAllowsBackgroundLocationUpdates:YES];
        [locationMgr startMonitoringSignificantLocationChanges];
    
        return YES;
    }
    
    -(void) locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
    {
        NSLog(@"app delegate received significant location change");
        [[UIApplication sharedApplication] setApplicationIconBadgeNumber:[[UIApplication sharedApplication] applicationIconBadgeNumber]+1];
    }
    
    @end
    

    首次在设备上运行应用时,点击“确定”以允许应用在请求时在后台使用您的位置。然后双击主页按钮并从任务切换器上滑动应用程序以将其终止。单击主页,然后从屏幕底部向上滑动以打开控制中心并打开飞行模式,等待几秒钟,然后关闭飞行模式。在您的应用上观看徽章计数器增量。

    它是由iOS在SLC上发布的。

    我想补充一点。如果您创建两个 CLLocationManager 实例并在两者上调用 startMonitoringSignificantLocationChanges ,则在其中一个上调用 stopMonitoringSignificantLocationChanges 。即使其他 CLLocationManager 会在应用程序继续运行时继续接收SLC事件,但当您因任何原因退出应用程序时,它将不会重新启动。

    似乎退出前的最后一次调用设置了重新启动行为。

    开始,开始,停止,退出 - 应用不会在SLC上重新启动。

    开始,开始,停止开始,退出 - 应用程序会重新启动SLC。

答案 1 :(得分:0)

我回答了这样的问题。 您可以在下面的链接中查看我的答案。

https://stackoverflow.com/a/35722254/3368791