【问题标题】:iOS9 startMonitoringSignificantLocationChanges doesn't launch app when terminated?iOS9 startMonitoringSignificantLocationChanges 终止时不启动应用程序?
【发布时间】:2016-01-26 21:38:24
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 你找到解决这个问题的方法了吗?

标签: background ios9 cllocationmanager relaunch


【解决方案1】:

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

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

【讨论】:

  • 如果您认为该问题是重复的,请不要只在此处放置链接,标记/投票该问题是否重复。
【解决方案2】:

应用程序被 SLC 重新启动,无论它是如何被杀死的,只要它被杀死时至少有一个 CLLocationManager 调用了 startMonitoringSignificantLocationChanges。对此有一个警告 - 在 iOS7.0(.x) 版本中它被破坏了。它在 iOS7.1+ 中再次开始工作。

要完成这项工作,您需要完成几个步骤。

  1. 在您的项目功能中,您必须启用后台模式位置更新,因为您希望在后台被唤醒。
  2. 您需要将键 NSLocationAlwaysUsageDescription 添加到 info.plist 中,其中包含您希望始终能够在后台使用位置信息的说明。
  3. 在代码中,您必须请求用户授权才能始终使用位置
  4. 在代码中,您必须请求在后台继续传送位置更新
  5. 在代码中,您必须开始监控重大位置变化

这是一个例子:

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 上重新启动。

【讨论】:

  • 嘿。我复制粘贴了您的代码,将位置添加到功能中,添加了 NSLocationAlwaysUsageDescription 键。当我将手机置于飞行模式时,它不会收到更新。我还开了 10 公里的车程,但没有得到任何更新。这些问题在 swift 项目中也存在。我目前对此主题有一个未解决的问题,但很少受到关注。你看起来像是一个熟悉核心位置的人。如果您有时间,请看这里:stackoverflow.com/questions/35467603/…
  • 今天晚些时候我可以看看。
猜你喜欢
  • 1970-01-01
  • 2017-03-05
  • 1970-01-01
  • 2018-04-23
  • 1970-01-01
  • 1970-01-01
  • 2011-09-18
  • 1970-01-01
相关资源
最近更新 更多