应用程序由 SLC 重新启动,无论它是如何被杀死的,至少有一个 CLLocationManager 调用了 startMonitoringSignificantLocationChanges。对此有一个警告 - 在 iOS7.0(.x) 版本中它被破坏了。它在 iOS7.1+ 中再次开始工作。
要使其正常工作,您需要完成几个步骤。
- 在您的项目功能中,您必须启用后台模式位置更新,因为您希望在后台被唤醒。
- 您需要将键NSLocationAlwaysUsageDescription添加到 info.plist 中,其中包含您希望始终能够在后台使用位置的说明。
- 在代码中,您必须请求用户授权才能始终使用位置
- 在代码中,您必须请求在后台继续传递位置更新
- 在代码中,您必须开始监视重大位置更改
这是一个例子:
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
第一次在设备上运行应用程序时,单击确定以允许应用程序在请求时在后台使用您的位置。然后双击主页按钮并将应用程序从任务切换器中滑出以将其终止。点击home,然后从屏幕底部向上滑动,打开控制中心,打开飞行模式,等待几秒钟,然后关闭飞行模式。观察应用程序上的徽章计数器增量。
它是由 iOS 在 SLC 上推出的。
我想补充一个问题。如果您创建两个CLLocationManager实例并在两个实例上调用startMonitoringSignificantLocationChanges,则在其中一个实例上调用stopMonitoringSignificantLocationChanges。即使应用程序继续运行时其他CLLocationManager将继续接收 SLC 事件,但当您的应用程序因任何原因退出时,它不会重新启动。
似乎退出之前的最后一次调用设置了重新启动行为。
开始、开始、停止、退出 - 应用程序不会在 SLC 上重新启动。
启动、启动、停止启动、退出 - 应用程序在 SLC 上重新启动。