小编vil*_*ovi的帖子

应用在后台时启动CLLocationManager位置更新

我正在构建一个使用CoreLocation的应用程序有两个目的:

  1. 首先,监控信标区域.大多数情况下,我们使用充当信标的特定硬件设备,并使用CoreLocation跟踪该信标连接的状态.

  2. 其次,当应用程序检测到与信标设备断开连接时,我们希望启动GPS进程以找到断开连接的位置.

在大多数情况下,当应用程序处于后台时,会发生信标设备的断开连接回调.因此,应用程序必须通过-startUpdatingLocation在后台进行呼叫来启动GPS跟踪.

这就是问题所在.如果-startUpdatingLocation在应用程序处于后台时调用发生,iOS似乎无法启用位置后台更新.

显然,我已经正确配置了背景模式,NSLocationAlwaysUsageDescription将属性设置_locationManager.allowsBackgroundLocationUpdatesYES.

令人惊奇的事情:如果我-startUpdatingLocation在前台呼叫然后切换到后台,位置更新会在后台正确发送.但是,当-startUpdatingLocation在后台进行调用时,应用程序会收到2或3个位置更新,然后永久暂停..直到我手动将应用程序恢复到前台,当位置更新恢复时,即使我将应用程序切换到再次背景.

有人知道或理解我该怎么做才能解决这个问题?或者它是iOS的主要约束?由于我的应用程序的要求,我真的需要在应用程序处于后台时开始定位更新(在信标的回调内部确实退出区域).

顺便说一句,如果你想重现这个问题很容易.只需在Xcode中创建一个空白项目,然后将此代码添加到默认视图控制器中.请记住启用后台模式为info.plist键"NSLocationAlwaysUsageDescription"添加说明.

- (void)viewDidLoad 
{
    [super viewDidLoad];

    _locationManager = [[CLLocationManager alloc] init];

    if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_8_3)
        _locationManager.allowsBackgroundLocationUpdates = YES;

    _locationManager.delegate = self;
    _locationManager.activityType = CLActivityTypeOther;
    _locationManager.desiredAccuracy = kCLLocationAccuracyBest;
    _locationManager.distanceFilter = kCLDistanceFilterNone;

    [_locationManager requestAlwaysAuthorization];

    // Creating a background task to delay the start of the startUpdatingLocation
    __block UIBackgroundTaskIdentifier taskIdentifier = UIBackgroundTaskInvalid;
    taskIdentifier = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
        [[UIApplication sharedApplication] endBackgroundTask:taskIdentifier];
    }]; …
Run Code Online (Sandbox Code Playgroud)

gps location background core-location ios

11
推荐指数
1
解决办法
1456
查看次数

在运行循环的开始/结束时执行选择器

iOS中的所有事件和方法都使用NSRunLoop以下方式处理:用户事件,方法调用,旋转,计时器,连接等.

我的问题是:

如何在运行循环的精确时刻执行选择器作为开始和结束?

cocoa objective-c selector nsrunloop ios

8
推荐指数
1
解决办法
2429
查看次数

以编程方式调用iOS App Extensions

在阅读Apple文档并检查stackoverflow之后,我无法完全理解是否可以以编程方式调用"Action"或"Share"类型的特定应用程序扩展.

主要是,我已经构建了一个类型为"Action"的应用程序扩展,我想从第二个应用程序以编程方式调用它(所以我可以发送一些输入属性并从扩展中获取输出),而无需打开UIActivityViewController.

有什么办法吗?

action ios ios-app-extension

7
推荐指数
1
解决办法
1511
查看次数

如何避免iOS应用程序在后台经常被系统终止

我正在为iOS 8和9构建一个iOS应用程序,我面临的问题是,当应用程序进入后台时,系统会在2或3分钟后终止它.

我的测试很简单:

  1. 我从iPhone上删除所有正在运行的应用程序.
  2. 我重启我的iPhone(以确保没有其他应用程序占用内存).
  3. 我启动了我的应用.
  4. 我在我的应用程序中什么都不做
  5. 我按下"主页"按钮,将我的应用程序移动到后台.
  6. 我等不了2分钟或3分钟.
  7. 我再次打开我的应用程序并惊讶,系统已终止它,现在它正在重新启动作为新的启动.

一些评论:

  • 该应用程序不在后台使用CoreLocation,也不使用任何其他服务.
  • 我已经分析了应用程序,试图了解它是否消耗了太多内存.移动到后台时,它消耗大约25Mb的RAM内存.我在下面附上截图.
  • 此行为已在iPhone 5,5s,6,6 +上进行了测试.
  • 在iPhone 6s和6s +似乎需要更多时间才能发生,但仍然会发生.

应用分配配置文件

我的问题是:你知道为什么会这样吗?我可能不会考虑或忘记的任何事情?

我不想通过使用CoreLocation或类似的东西强制我的应用程序在后台运行.如果系统最终杀死我的应用程序,我很好.我不想要的是每次我将我的应用程序移动到后台时系统都会终止它.

任何提示或帮助将不胜感激.

谢谢,

memory iphone objective-c ios

6
推荐指数
1
解决办法
1395
查看次数