2015-05-22 9 views
5

मार डाला गया है जब ऐप सक्रिय है और जब यह निष्क्रिय और मारा जाता है तो मेरे ऐप को उपयोगकर्ता का स्थान प्राप्त करने की आवश्यकता होती है। जब उपयोगकर्ता का स्थान किसी स्टोर के नजदीक है तो ऐप को स्थानीय सूचना भेजनी होगी।पृष्ठभूमि में होने पर आईओएस ऐप के लिए स्थान प्राप्त करना और यहां तक ​​कि

मुझे यकीन नहीं है कि वास्तव में क्या हो रहा है, लेकिन मैं अपने ऐप को पृष्ठभूमि में स्थान प्राप्त करने में सक्षम नहीं हूं और इसे मारने पर इसे जगाता है।

मैं एक स्थान प्रबंधक (सिंगलटन, boths मामलों whenInUse और हमेशा के लिए प्रयोग किया जाता) है, और मैं दोनों NSLocationAlwaysUsageDescription और NSLocationWhenInUseUsageDescription .plist

में परिभाषित किया है क्या मैं कर रहा हूँ है:

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

} 

क्या मैं कुछ गलत करता हूँ? मुझे यकीन नहीं है कि भूगर्भीकरण का उपयोग करने के लिए यह सख्ती से जरूरी है, लेकिन जिन चीजों के लिए मैंने पढ़ा है, उनके लिए पढ़ना है मॉनिटरिंग सिग्निफिशेंट लोकेशन चेंज पर्याप्त है।

उत्तर

8

पृष्ठभूमि में कोई स्थान प्राप्त करने के लिए, निम्न कोड का उपयोग करें। यह हर बार पृष्ठभूमि कार्य को पुनरारंभ करके लंबे समय तक पृष्ठभूमि में आपके ऐप को चलाएगा।

इस का उपयोग करने के लिए आपको पृष्ठभूमि के साथ इस परियोजना सेटिंग्स में प्राप्त करें और स्थान अपडेट चालू क्षमताओं में पृष्ठभूमि मोड को चालू करने की जरूरत है।

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

धन्यवाद उत्सव !! जहां मुझे एप्लिकेशन DidEnterBackground के लोकेशन प्रबंधक कोड डालना है? – Stacky

+0

@Stacky didDterBackground में आपका कोड आवश्यक नहीं होगा। आपको निरंतर स्थान अपडेट की आवश्यकता के रूप में StopUpdatingLocation को कॉल करने की आवश्यकता नहीं है। यदि आप स्टॉप अपडेटिंग लोकेशन को कॉल करते हैं तो उपयोगकर्ता स्थान अपडेट प्राप्त करना बंद कर देगा। आपको ऐसा करना चाहिए जब भी उपयोगकर्ता ऐप से बाहर निकलता है –

+0

क्षमा करें अगर मैं एक बेवकूफ चीज़ @utsav पूछता हूं, लेकिन क्या StopUpdatingLocation को कॉल करना आवश्यक नहीं है (क्योंकि ऐप चलने पर उपयोग किया जाता है) और फिर कॉल मॉनिटरिंग सिग्निफिशेंट लोकेशन चेंज कॉल करें? – Stacky

संबंधित मुद्दे