2015-05-22 22 views
5

öldürüldüğünde bir iOS uygulaması için konum alma Uygulamam etkinken ve etkin değilken ve öldürüldüğünde kullanıcının uygulamasının konumunu alması gerekir. Kullanıcının bulunduğu yer bir mağazaya yakın olduğunda, uygulama yerel bir bildirim göndermelidir.Arka planda olduğunda ve hatta

Tam olarak neler olup bittiğinden emin değilim, ancak uygulamamın arka planda konumu almasını ve öldüğünde onu uyandırmasını sağlayamıyorum.

- (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]; 

} 

: Yaptığım şey olduğunu

I (boths durumlarda whenInUse ve Always için kullanılan singleton) bir konum yöneticisi var ve ben NSLocationAlwaysUsageDescription ve NSLocationWhenInUseUsageDescription hem .plist

tanımladığınız Yanlış bir şey mi yapıyorum? Geofencing kullanmak için kesinlikle gerekli olup olmadığından emin değilim, ama startMonitoringSignificantLocationChanges ile okudum şeyler için yeterlidir.

cevap

8

Arka planda bir yer almak için aşağıdaki kodu kullanın. Arka plan görevini her zaman yeniden başlatarak uygulamanızı uzun bir süre arka planda çalışır duruma getirecektir.

bu kullanmak için, Arka Plan proje ayarlarında Getir ve Yer Güncellemeler açık Kabiliyetlerine Arka Plan Modu açmanız gerekir.

- (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

Teşekkürler Utsav !! ApplicationDidEnterBackground öğesinin locationmanager kodunu nereye eklemek zorundayım? – Stacky

+0

@Stacky didEnterBackground kodunuz gerekli olmayacaktır. Sürekli konum güncellemelerine ihtiyacınız olduğu için stopUpdatingLocation'ı aramanız gerekmez. Eğer UpdatingLocation'ı durdurmayı bırakırsanız, kullanıcı konum güncellemelerini almayı durduracaktır. Kullanıcı sadece uygulamadan çıkış yaptığında bunu yapmalısınız –

+0

Eğer aptal bir şey @utsav soruyorsam özür dilerim, ama stopUpdatingLocation (uygulama çalışırken kullanılır) çağırmak ve sonra startMonitoringSignificantLocationChanges çağrısı yapmak gerekli değil mi? – Stacky

İlgili konular