2012-12-20 9 views
7

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

मुझे पता चला है कि मैं थोड़ी देर के बाद इन दीक्षा चरणों को रख सकता हूं जो उपयोगकर्ता को स्थान प्रबंधक की अनुमतियों को नीचे बदलने की प्रतीक्षा करता है लेकिन यह संभवतः सर्वोत्तम अभ्यास नहीं हो सकता है, इसका उल्लेख न करने के लिए यह कुछ अजीब व्यवहार की ओर जाता है स्प्लैश स्क्रीन और नक्शे के बीच संक्रमण में:

BOOL firstrun = TRUE; 
while ([[locationManager class] authorizationStatus] == kCLAuthorizationStatusDenied || [[locationManager class] authorizationStatus] == kCLAuthorizationStatusNotDetermined) { 
    NSLog(@"Waiting for location permission"); 
} 
...initiation code... 

एक "स्थान पहुंच की अनुमति दी" चेतावनी बॉक्स या स्थान प्रबंधक प्रतिनिधि के बारे में मैं नहीं जानता में एक समान कार्य के लिए श्रोता है? मुझे दस्तावेज़ों में ऐसी कोई विधि नहीं दिखाई देती है। किसी को पता है कि सबसे अच्छा अभ्यास यहाँ क्या है? बहुत बहुत धन्यवाद।

संपादित मैं अपने स्थान पर नज़र रखने के रूप में निम्नानुसार शुरू:

if (nil == locationManager) 
    locationManager = [[CLLocationManager alloc] init]; 

[locationManager startMonitoringSignificantLocationChanges]; 

self.musicmap.delegate = self; 
[self.mymap setShowsUserLocation:true]; 

धन्यवाद

+0

कृपया स्थान प्रबंधक के लिए अपना प्रारंभिक कोड प्रदर्शित करें। आप इसे कैसे शुरू कर रहे हैं? – dmoss18

+0

मैंने अपनी दीक्षा दिखाने के लिए अद्यतन किया है। यह ऐप्पल दस्तावेज़ों में "महत्वपूर्ण स्थान परिवर्तन" ट्यूटोरियल पर आधारित है। – Primus202

उत्तर

8

मैं अपनी कक्षा एक CLLocationManagerDelegate बनाने और उसके बाद इस पद्धति को लागू करने की सिफारिश करेंगे।

आशा है कि मदद करता है!

+0

मैं इसे करने के लिए समाप्त हो गया। मैं प्रतिनिधि के बजाय कक्षा में देख रहा था! डी 'ओह! – Primus202

0
//Start up motion manager, not sure if you need this for location manager 
    motionManager = [[CMMotionManager alloc] init]; 
    if (motionManager.accelerometerAvailable) { 
     motionManager.accelerometerUpdateInterval = 1.0/2.0; 
     [motionManager startAccelerometerUpdates]; 
    } 

    locationManager = [[CLLocationManager alloc] init]; 

    //We will be the location manager delegate 
    locationManager.delegate = self; 

    //Track position at the 100m accuracy 
    locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters; 

    //We want to see all location updates, regardless of distance change 
    locationManager.distanceFilter = 0.0; 

    [locationManager startUpdatingLocation]; 

अपने "viewDidLoad" या AppDelegate "didFinishLaunchingWithOption"

का इन कहीं ऊपर रखो निम्नलिखित अद्यतन और सामान संभालती है। सर्वश्रेष्ठ स्थान एक सीएलएलोकेशन है। आपको CLLocationManagerDelegate को लागू करने की आवश्यकता होगी। TWO_MINUTES = 120

- (BOOL)isBetterLocation:(CLLocation *)location { 
    if (bestLocation == nil){ 
     //best location not set yet, so it's a better location by default 
     return YES; 
    } 

    // Figure out how long it's been since we got a better location 
    NSTimeInterval timeDelta = [location.timestamp timeIntervalSinceDate:bestLocation.timestamp]; 

    BOOL isSignificantlyNewer = timeDelta > TWO_MINUTES; 

    BOOL isSignificantlyOlder = timeDelta < -TWO_MINUTES; 

    BOOL isNewer = timeDelta > 0; 

    if (isSignificantlyNewer) { 
     return YES; 
    }else if (isSignificantlyOlder) { 
     return NO; 
    } 

    CLLocationAccuracy accuracyDelta = location.horizontalAccuracy - bestLocation.horizontalAccuracy; 
    //You want accuracy to be low 
    BOOL isLessAccurate = accuracyDelta > 0; 
    BOOL isMoreAccurate = accuracyDelta < 0; 
    BOOL isDifferent = location.coordinate.latitude != bestLocation.coordinate.latitude || 
    location.coordinate.longitude != bestLocation.coordinate.longitude; 

    if (isMoreAccurate) { 
     return YES; 
    } else if (isNewer && !isLessAccurate && isDifferent) { 
     return YES; 
    } 

    return NO; 
} 






#pragma mark - Location manager delegate 
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation { 
    if ([self isBetterLocation:newLocation]){ 
     self.bestLocation = newLocation; 

    } else { 
     [locationManager stopUpdatingLocation]; 
     isLocating = NO; 
     NSLog(@"AppDelegate: Turning off location manager >>>>>>>>>>>>>>>>>>>>>"); 
    } 
} 

ध्यान दें: आप "isBetterLocation" विधि की जरूरत नहीं है। यह केवल 2 मिनट की तरह स्थान की जांच करेगा और स्थान प्रबंधक को बंद कर देगा ताकि आप उपयोगकर्ता की बैटरी को न पहनें। कभी-कभी आप प्रबंधक को बंद नहीं करना चाहते हैं, इसलिए यदि आप चाहें तो इसे छोड़ सकते हैं।

मुझे नहीं पता कि आपने पहले से कितना किया है। इस तरह मैंने किया।

+0

हाँ मैं पहले से ही यह सब कर रहा हूँ। जैसा कि मैंने कहा, ट्रैकिंग ठीक काम कर रही है। मेरी समस्या एक साफ इंस्टॉल के बाद है, पहली बार जब उपयोगकर्ता ऐप को बूट करता है तो मुझे स्थान अनुमति की अनुमति देने के बाद मुझे पता करने का एक तरीका चाहिए ताकि मैं अपना मानचित्र स्थान और अन्य आश्रित चर अपडेट कर सकूं। – Primus202

+0

हालांकि मैंने अपडडेट टोलोकेशन लागू नहीं किया है। शायद मैं इसका उपयोग कर सकता हूँ। और मैं प्रतिनिधि के बजाय प्रबंधक को देख रहा था। मुझे लगता है कि स्थान प्रबंधक: didChangeAuthorizationStatus मुझे करेगा। – Primus202

4

मुझे अपने आवेदन के साथ एक ही समस्या थी और उपयोगकर्ता को स्थान अनुमति संवाद को स्वीकार या अस्वीकार करने का समय होने से पहले चीजें कर रही थीं। यहां मैं क्या कर रहा हूं।

-(BOOL)locationAuthorizationStatus { 
    if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusDenied) { 
     // user has not authorized us to use location 
     UIAlertView *alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Location Denied", @"Location Denied") 
                 message:NSLocalizedString(@"This app does not have permission to access your location. Please enable location access in device settings.", @"Message stating this app does not have permission to access your location and to enable location permission in settings") 
                 delegate:self 
               cancelButtonTitle:NSLocalizedString(@"Ok", @"Ok") 
               otherButtonTitles: nil]; 
     [alert show]; 
     return NO; 
    } 

    // Check if region monitoring is available for this device 
    if (![CLLocationManager regionMonitoringAvailable]) { 
     UIAlertView *alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Geofencing Unavailable", @"Geofencing Unavailable") 
                 message:NSLocalizedString(@"This device is not able to monitor regions", @"Message stating this device is not able to monitor regions") 
                 delegate:nil 
               cancelButtonTitle:nil 
               otherButtonTitles:NSLocalizedString(@"Ok", @"Ok"), nil]; 
     [alert show]; 
     return NO; 
    } else { 
     if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusNotDetermined) { 
      // trigger a location check to prompt user for authorization 
      LocationManagerController *locationController = [LocationManagerController sharedManager]; 
      [locationController.locationManager startUpdatingLocation]; 
      // the dialogue box is triggered here 
      [locationController.locationManager stopUpdatingLocation]; 
      _waitingOnAuthorization = YES; 
      [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(checkForAuthorizationStatusChange) name:@"WaitingOnAuthorizationStatus" object:nil]; 
      return NO; 
     } 
    } 

    return YES; 
} 

-(void)checkForAuthorizationStatusChange { 
    if (_waitingOnAuthorization) { 
     // this should only catch location change on first time 
     if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusAuthorized) { 
      // user approved location services 

     } else { 
      // user declined authorization 

     } 
     // set flag back to NO 
     _waitingOnAuthorization = NO; 
    } 

    // remove our notification observer 
    [[NSNotificationCenter defaultCenter] removeObserver:self]; 
} 

आपको अपने उपयोग के मामले में लागू होने वाले चर जोड़ना होगा। लेकिन यहां इसका सारांश है।

  1. BOOL विधि (locationAuthorizationStatus)
  2. हैं, तो रिटर्न हाँ स्थान का उपयोग करने के ठीक के माध्यम से प्राधिकरण की स्थिति के लिए चेक जो कुछ भी आप
  3. चाहते हैं नहीं, नहीं और अलर्ट उपयोगकर्ता
  4. रिटर्न पहली बार तो करते हैं, करेंगे स्थान संवाद को ट्रिगर करने के लिए स्थान प्रबंधक को आग लगाना, फिर बैटरी को बचाने के लिए इसे रोकें, ध्वज सेट करें और अधिसूचना सेट करें ताकि आपको पता चले कि उपयोगकर्ता ने हाँ या नहीं मारा है।
  5. अधिसूचना विधि जांचता है प्राधिकरण चेंजस्टैटस और उपयोगकर्ता ने क्या किया है यह देखने के लिए अनुमतियां पुन: जांचें। वहां से, आप उपयोगकर्ताओं की पसंद के आधार पर किसी भी तरीके की आवश्यकता कर सकते हैं।

ऐप्पल के पास इस चयन को पकड़ने के लिए कोई प्रतिनिधि तरीका नहीं है, इसलिए इसके आसपास एकमात्र तरीका हैकी की तरह है। इस विधि ने मेरे लिए अच्छा काम किया है। थोड़ा हैकी, लेकिन काम करता है। उम्मीद है की यह मदद करेगा।

- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status { 
    //Your code goes here 
} 

अधिक CLLocationManagerDelegate के बारे में जानकारी पाया जा सकता है here: