2015-05-22 20 views
5

Ứng dụng của tôi cần nhận vị trí của người dùng khi ứng dụng đang hoạt động và khi ứng dụng không hoạt động và bị tiêu diệt. Khi vị trí của người dùng gần cửa hàng, ứng dụng phải gửi thông báo địa phương.Tìm vị trí cho ứng dụng iOS khi nó ở chế độ nền và thậm chí bị giết

Tôi không chắc chắn chính xác những gì đang xảy ra, nhưng tôi không thể làm cho ứng dụng của tôi có được vị trí trong nền và đánh thức nó khi bị giết.

Tôi có một người quản lý vị trí (singleton, sử dụng đối với trường hợp Bốt bằng cao whenInUse và Luôn), và tôi đã cả NSLocationAlwaysUsageDescription và NSLocationWhenInUseUsageDescription quy định tại plist

Những gì tôi đang làm là:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    //The app has been killed/terminated (not in background) by iOS or the user. 
    if ([launchOptions objectForKey:UIApplicationLaunchOptionsLocationKey]){ 

     _locationManager = [CoreLocationManager sharedInstance]; 
     _locationManager.isAppActive = NO; 
     _locationManager.locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation; 
     _locationManager.locationManager.activityType = CLActivityTypeOtherNavigation; 

     if ([_locationManager.locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) { 
      [_locationManager.locationManager requestAlwaysAuthorization]; 
     } 

     [_locationManager addLocationManagerDelegate:self]; 
    } 
} 


- (void)applicationDidBecomeActive:(UIApplication *)application 
{ 
    if (_locationManager.locationManager){ 
     _locationManager.isAppActive = YES; 
     [_locationManager.locationManager stopMonitoringSignificantLocationChanges]; 
    } 

    _locationManager = [CoreLocationManager sharedInstance]; 

    if ([_locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) { 
     [_locationManager.locationManager requestAlwaysAuthorization]; 
    } 

    if ([_locationManager.locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)]) { 
     [_locationManager.locationManager requestWhenInUseAuthorization]; 
    } 

    [_locationManager addLocationManagerDelegate:self]; 

    [_locationManager.locationManager startUpdatingLocation]; 

} 


- (void)applicationDidEnterBackground:(UIApplication *)application 
{ 
    _locationManager.isAppActive = NO; 

    if (_locationManager.locationManager){ 
     [_locationManager.locationManager stopUpdatingLocation]; 
     [_locationManager.locationManager stopMonitoringSignificantLocationChanges]; 
    } 

    if ([_locationManager.locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) { 
     [_locationManager.locationManager requestAlwaysAuthorization]; 
    } 

    [_locationManager.locationManager startMonitoringSignificantLocationChanges]; 

} 

Tôi có làm gì sai không? Tôi không chắc chắn nếu nó là cần thiết để sử dụng geofencing, nhưng đối với những điều tôi đã đọc với startMonitoringSignificantLocationChanges là đủ.

Trả lời

8

Để có vị trí ở chế độ nền, hãy sử dụng mã sau. Nó sẽ làm cho ứng dụng của bạn chạy trong nền trong một thời gian dài bằng cách khởi động lại tác vụ nền mỗi lần.

Để sử dụng, bạn cần phải bật Bối cảnh Chế độ trong Capabilities trong cài đặt dự án với nền FetchLocation cập nhật bật.

- (void)applicationDidEnterBackground:(UIApplication *)application { 

    if ([[UIDevice currentDevice] respondsToSelector:@selector(isMultitaskingSupported)]) { //Check if our iOS version supports multitasking I.E iOS 4 

     if ([[UIDevice currentDevice] isMultitaskingSupported]) { //Check if device supports mulitasking 
      UIApplication *application = [UIApplication sharedApplication]; //Get the shared application instance 

      __block UIBackgroundTaskIdentifier background_task; //Create a task object 

      background_task = [application beginBackgroundTaskWithExpirationHandler: ^{ 
       [application endBackgroundTask:background_task]; //Tell the system that we are done with the tasks 
       background_task = UIBackgroundTaskInvalid; //Set the task to be invalid 
       //System will be shutting down the app at any point in time now 
      }]; 
     } 
    } 
} 
+0

Cảm ơn Utsav !! Tôi phải chèn mã vị trí của applicationDidEnterBackground ở đâu? – Stacky

+0

@Stacky Mã của bạn trong didEnterBackground sẽ không cần thiết. Bạn không bao giờ cần phải gọi stopUpdatingLocation khi bạn cần cập nhật vị trí liên tục. Nếu bạn gọi dừng UpdatingLocation, người dùng sẽ ngừng nhận cập nhật vị trí. Bạn nên làm điều đó chỉ khi nào người dùng đăng xuất khỏi ứng dụng –

+0

Xin lỗi nếu tôi hỏi một điều ngu ngốc @utsav, nhưng không cần thiết phải gọi stopUpdatingLocation (vì được sử dụng khi ứng dụng đang chạy) và sau đó gọi startMonitoringSignificantLocationChanges? – Stacky

Các vấn đề liên quan