【问题标题】:Can we Relaunch the application in the background on location change? after force quit it from background我们可以在位置更改时在后台重新启动应用程序吗?强制从后台退出后
【发布时间】:2013-07-08 00:38:49
【问题描述】:

我的要求是,如果我的应用程序从后台模式终止,之后如果发生任何重大的位置更改,它应该以后台模式启动。这正是startMonitoringSignificantLocationChanges的文件中所说的

如果您启动此服务并且您的应用程序随后 终止,系统自动重新启动应用程序到 新事件到达时的背景。在这种情况下,选项 传递给应用程序的字典:didFinishLaunchingWithOptions: 您的应用程序委托的方法包含密钥 UIApplicationLaunchOptionsLocationKey 来表明你的 由于位置事件而启动了应用程序。重启后, 您仍然必须配置一个位置管理器对象并调用它 方法继续接收位置事件。当你重新启动 位置服务,当前事件被传递给您的代表 立即地。此外,您所在位置的 location 属性 manager 对象甚至填充了最新的位置对象 在您开始定位服务之前。

所以我把这段代码

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{

 if ([CLLocationManager significantLocationChangeMonitoringAvailable]) {
        // Stop normal location updates and start significant location change updates for battery efficiency.
        [viewController.locationManager stopUpdatingLocation];
        [viewController.locationManager startMonitoringSignificantLocationChanges];

        //NSLog(@"significantLocationChangeMonitoringAvailable.");
    }
    else {
        //NSLog(@"Significant location change monitoring is not available.");
    }
}

之后它也不会在后台模式下重新启动,尽管我在到处漫游后尝试更改我的位置。

我在这里遗漏或误导了什么?该应用程序没有在后台重新启动

有什么建议吗?

2013 年 7 月 12 日编辑

经过多次试验,我发现应用程序在后台重新启动后立即崩溃并显示崩溃日志

Thread 0 name:  Dispatch queue: com.apple.main-thread
Thread 0:
0   libsystem_kernel.dylib          0x3ba3feb4 mach_msg_trap + 20
1   libsystem_kernel.dylib          0x3ba40048 mach_msg + 36
2   CoreFoundation                  0x337ff040 __CFRunLoopServiceMachPort + 124
3   CoreFoundation                  0x337fdd9e __CFRunLoopRun + 878
4   CoreFoundation                  0x33770eb8 CFRunLoopRunSpecific + 352
5   CoreFoundation                  0x33770d44 CFRunLoopRunInMode + 100
6   Foundation                      0x34093f92 -[NSRunLoop(NSRunLoop) runMode:beforeDate:] + 250
7  AppNm                        0x0010a6a4 0xe4000 + 157348
8   AppNm                       0x000efc2a 0xe4000 + 48170
9   AppNm                       0x000e9796 0xe4000 + 22422
10  CoreLocation                    0x33cd1064 -[CLLocationManager onClientEventLocation:] + 2244
11  CoreLocation                    0x33cc8eaa __CLClientInvokeCallback_block_invoke_0 + 62
12  CoreFoundation                  0x337ff6ae __CFRUNLOOP_IS_CALLING_OUT_TO_A_BLOCK__ + 10
13  CoreFoundation                  0x337fed80 __CFRunLoopDoBlocks + 156
14  CoreFoundation                  0x337fdca8 __CFRunLoopRun + 632
15  CoreFoundation                  0x33770eb8 CFRunLoopRunSpecific + 352
16  CoreFoundation                  0x33770d44 CFRunLoopRunInMode + 100
17  GraphicsServices                0x373492e6 GSEventRunModal + 70
18  UIKit                           0x356862fc UIApplicationMain + 1116
19  AppNm                       0x000e5854 0xe4000 + 6228
20  AppNm                       0x000e57a4 0xe4000 + 6052

Thread 1 name:  Dispatch queue: com.apple.libdispatch-manager
Thread 1:
0   libsystem_kernel.dylib          0x3ba40648 kevent64 + 24
1   libdispatch.dylib               0x3b970974 _dispatch_mgr_invoke + 792
2   libdispatch.dylib               0x3b970654 _dispatch_mgr_thread$VARIANT$mp + 32

Thread 2:
0   libsystem_kernel.dylib          0x3ba50d98 __workq_kernreturn + 8
1   libsystem_c.dylib               0x3b99ecf6 _pthread_workq_return + 14
2   libsystem_c.dylib               0x3b99ea12 _pthread_wqthread + 362
3   libsystem_c.dylib               0x3b99e8a0 start_wqthread + 4

Thread 3 name:  WebThread
Thread 3:
0   libsystem_kernel.dylib          0x3ba500fc __psynch_mutexwait + 24
1   libsystem_c.dylib               0x3b999124 pthread_mutex_lock + 388
2   WebCore                         0x39786418 _WebTryThreadLock(bool) + 184
3   WebCore                         0x3978634a WebRunLoopLock(__CFRunLoopObserver*, unsigned long, void*) + 42
4   CoreFoundation                  0x337ff6ca __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 18
5   CoreFoundation                  0x337fd9bc __CFRunLoopDoObservers + 272
6   CoreFoundation                  0x337fdde8 __CFRunLoopRun + 952
7   CoreFoundation                  0x33770eb8 CFRunLoopRunSpecific + 352
8   CoreFoundation                  0x33770d44 CFRunLoopRunInMode + 100
9   WebCore                         0x39784500 RunWebThread(void*) + 440
10  libsystem_c.dylib               0x3b9a930e _pthread_start + 306
11  libsystem_c.dylib               0x3b9a91d4 thread_start + 4

Thread 4 name:  com.apple.NSURLConnectionLoader
Thread 4:
0   libsystem_kernel.dylib          0x3ba3feb4 mach_msg_trap + 20
1   libsystem_kernel.dylib          0x3ba40048 mach_msg + 36
2   CoreFoundation                  0x337ff040 __CFRunLoopServiceMachPort + 124
3   CoreFoundation                  0x337fdd9e __CFRunLoopRun + 878
4   CoreFoundation                  0x33770eb8 CFRunLoopRunSpecific + 352
5   CoreFoundation                  0x33770d44 CFRunLoopRunInMode + 100
6   Foundation                      0x340bd3d0 +[NSURLConnection(Loader) _resourceLoadLoop:] + 304
7   Foundation                      0x34140e80 __NSThread__main__ + 968
8   libsystem_c.dylib               0x3b9a930e _pthread_start + 306
9   libsystem_c.dylib               0x3b9a91d4 thread_start + 4

Thread 5 name:  com.apple.CFSocket.private
Thread 5:
0   libsystem_kernel.dylib          0x3ba50594 __select + 20
1   CoreFoundation                  0x338031f2 __CFSocketManager + 674
2   libsystem_c.dylib               0x3b9a930e _pthread_start + 306
3   libsystem_c.dylib               0x3b9a91d4 thread_start + 4

Thread 6:
0   libsystem_kernel.dylib          0x3ba50d98 __workq_kernreturn + 8
1   libsystem_c.dylib               0x3b99ecf6 _pthread_workq_return + 14
2   libsystem_c.dylib               0x3b99ea12 _pthread_wqthread + 362
3   libsystem_c.dylib               0x3b99e8a0 start_wqthread + 4

Thread 7:
0   libsystem_kernel.dylib          0x3ba50d98 __workq_kernreturn + 8
1   libsystem_c.dylib               0x3b99ecf6 _pthread_workq_return + 14
2   libsystem_c.dylib               0x3b99ea12 _pthread_wqthread + 362
3   libsystem_c.dylib               0x3b99e8a0 start_wqthread + 4

Thread 8:
0   libsystem_kernel.dylib          0x3ba50d98 __workq_kernreturn + 8
1   libsystem_c.dylib               0x3b99ecf6 _pthread_workq_return + 14
2   libsystem_c.dylib               0x3b99ea12 _pthread_wqthread + 362
3   libsystem_c.dylib               0x3b99e8a0 start_wqthread + 4

Thread 9:
0   libsystem_kernel.dylib          0x3ba50d98 __workq_kernreturn + 8
1   libsystem_c.dylib               0x3b99ecf6 _pthread_workq_return + 14
2   libsystem_c.dylib               0x3b99ea12 _pthread_wqthread + 362
3   libsystem_c.dylib               0x3b99e8a0 start_wqthread + 4

Thread 10:
0   libsystem_kernel.dylib          0x3ba50d98 __workq_kernreturn + 8
1   libsystem_c.dylib               0x3b99ecf6 _pthread_workq_return + 14
2   libsystem_c.dylib               0x3b99ea12 _pthread_wqthread + 362
3   libsystem_c.dylib               0x3b99e8a0 start_wqthread + 4

Unknown thread crashed with unknown flavor: 5, state_count: 1

通过谷歌搜索我找到了它,因为我正在将更新位置发送到已发布的对象。 为此,我更改了 AppDelegate DidFinishlaunchingWithOptions

的代码
if ([CLLocationManager significantLocationChangeMonitoringAvailable]) {

//        if(!viewController.locationManager){
//            viewController.locationManager = [[CLLocationManager alloc] init];
//            viewController.locationManager.delegate = viewController;
//            viewController.locationManager.distanceFilter = 200.0f;
//            viewController.locationManager.desiredAccuracy = 200.0f;
//        }

        // Stop normal location updates and start significant location change updates for battery efficiency.
        viewController.locationManager.delegate = nil;
        [viewController.locationManager stopUpdatingLocation];
        viewController.locationManager.delegate = viewController;
        [viewController.locationManager startMonitoringSignificantLocationChanges];

        NSLog(@"significantLocationChangeMonitoringAvailable.");
    }
    else {

        NSLog(@"Significant location change monitoring is not available.");
    }

这是我要走的正确方式吗?还是崩溃日志指示其他内容?

【问题讨论】:

  • 配置了您的 info.plist?在模拟器或设备中测试?
  • 我已经用密钥Required Background Modes配置了info.plist -> App registers for location updates
  • 使用设备进行测试。我已经从后台删除了应用程序,然后在我四处漫游以获取位置更新之后。但没有让我的应用程序在后台重新启动

标签: iphone objective-c core-location cllocationmanager cllocation


【解决方案1】:

目前,您应用的定位行为取决于您的viewController 是否可用。您已经组合了 MVC 的“V”和“C”部分。我会考虑将CLLocationManager 从您的视图控制器中拉出并将其设置为您的 AppDelegate 上的属性。这样你就不必实例化视图控制器来响应位置变化,它建立了一个模式来访问你应用程序中其他地方的位置。首先配置您的locationMananger,然后将其传递给您的viewController

【讨论】:

    【解决方案2】:

    应用代理

    (void)applicationDidBecomeActive:(UIApplication *)application
    {
    
        if ([CLLocationManager significantLocationChangeMonitoringAvailable]) {
    
            [viewController.locationManager stopMonitoringSignificantLocationChanges];
        }
    
        if ([CLLocationManager locationServicesEnabled])
        {
    
            [viewController.locationManager startUpdatingLocation];
        }
    
    }
    
    (void)applicationDidEnterBackground:(UIApplication *)application
    {
    
        [viewController.locationManager stopUpdatingLocation];
        [viewController.locationManager startMonitoringSignificantLocationChanges];
    
    
    
    }
    

    ViewController.m

    locationManager = [[CLLocationManager alloc] init];
    locationManager.delegate = self;
    locationManager.pausesLocationUpdatesAutomatically = NO;
    locationManager.distanceFilter = 300;
    locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters;
    [locationManager startUpdatingLocation];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-30
      • 2014-09-14
      • 1970-01-01
      • 1970-01-01
      • 2015-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多