5

私は、私のアプリがバックグラウンドモードから終了し、その後に重要な場所の変更が発生した場合、バックグラウンドモードで起動する必要があるという要件があります。あなたはこのサービスを開始し、アプリケーションがその後 が終了した場合は、新しいイベントが到着した場合それはまさにstartMonitoringSignificantLocationChangesロケーションの変更をバックグラウンドでアプリケーションを再起動できますか?バックグラウンドから強制終了した後

の文書に記載されているものであることは、システムが自動的に 背景にアプリケーションをrelaunches。そのような場合、 ディクショナリがアプリケーションに渡されました:didFinishLaunchingWithOptions: アプリケーション代理人のメソッドには、 UIApplicationLaunchOptionsLocationKeyというキーが含まれており、場所イベントのためにアプリケーションが起動したことを示します。再起動すると、 はまだロケーションマネージャオブジェクトを設定し、この メソッドを呼び出してロケーションイベントの受信を継続する必要があります。 位置情報サービスを再起動すると、現在のイベントはすぐにデリゲート に配信されます。さらに、ロケーションサービスの開始前に、 マネージャオブジェクトのロケーションプロパティに最新のロケーションオブジェクト( )が設定されています。

は、だから、私はここにあるローミング後に私の場所を変更しようとしたものの、バックグラウンドモードともそのされていない再出発した後、このコード

- (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."); 
    } 
} 

を置きます。

私はここで行方不明または誤解をしていますか?そのアプリはバックグラウンドで再起動されていません

何か提案がありますか?

EDIT 12July 2013

私は私がするので、アプリケーションがクラッシュされてすぐにグーグルからクラッシュログ

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."); 
    } 

のコードを変更したことについては は、これは私がつもり正しい方法ですか?またはクラッシュログは何か他のことを示していますか?

+0

info.plistを設定しましたか?シミュレータまたはデバイスでのテストですか? – Wain

+0

私はinfo.plistを '必須バックグラウンドモード'キーで設定しました - '位置登録のためのアプリケーション登録' – Heena

+0

device.Iでテストしてもバックグラウンドからアプリを削除しましたが、私のアプリをバックグラウンドで再起動する – Heena

答えて

0

現在、アプリの位置情報の動作は、ご利用のviewControllerに依存しています。あなたはMVCの "V"と "C"の部分を組み合わせました。あなたのView ControllerからCLLocationManagerを取り出してAppDelegateのプロパティとして設定することを検討します。そうすることで、場所の変更に反応するView Controllerをインスタンス化する必要がなくなり、アプリ内の他の場所にアクセスするためのパターンが確立されます。最初にlocationManangerを設定してからviewControllerに渡してください。

0

Appdelegate

(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]; 
関連する問題