IOS 8 में लोकेशन सर्विसेज काम नहीं कर रही हैं


608

मेरा ऐप जो iOS 7 पर ठीक काम करता है वह iOS 8 SDK के साथ काम नहीं करता है।

CLLocationManagerकोई स्थान नहीं लौटाता, और मैं सेटिंग -> स्थान सेवाओं के तहत अपना ऐप नहीं देखता । मैंने इस मुद्दे पर एक Google खोज की, लेकिन कुछ भी सामने नहीं आया। क्या गलत हो सकता है?


तुम भी समाधान के लिए संदर्भ एप्लिकेशन के रूप में इसका उपयोग कर सकते github.com/jbanford/ConstantLocationUpdates
अशोक Vadivelu

19
मैंने iOS 8 में स्थान प्रबंधक में कुछ परिवर्तनों के बारे में यहां पोस्ट किया है: nevan.net/2014/09/core-location-manager-changes-in-ios-8
nevan king

2
आप इस लाइब्रेरी का उपयोग करने का प्रयास कर सकते हैं, जो कोर लोकेशन एपीआई को सरल बनाता है और एक अच्छा ब्लॉक आधारित इंटरफेस को उजागर करता है, और विभिन्न आईओएस संस्करणों (पूर्ण प्रकटीकरण: मैं लेखक हूं) के बीच सभी मतभेदों को सामान्य करता है: github.com/lmirosevic/GBLocation
lms

मुझे कुछ संदर्भ यहां मिला datacalacle.blogspot.in/2014/11/…
iOS टेस्ट

2
@nevanking You सर! एक मुकुट की जरूरत है! मैं बदलाव के बाद से इस समस्या से लड़ रहा हूँ और अभी तक इसे कैसे ठीक करना है, इसके बारे में एक "गाइड" ढूंढना था, जो कि अनुकूल नहीं था .. आपके गाइड ने मेरी तरह एक बेवकूफ बनाया, समस्या को स्वयं संभालें। उस लिंक के लिए बहुत बहुत धन्यवाद।
पैट्रिक आर

जवाबों:


1086

मैंने अपनी समस्या खुद ही हल कर ली।

जाहिरा तौर पर iOS 8 SDK में, requestAlwaysAuthorization(बैकग्राउंड लोकेशन के लिए) या requestWhenInUseAuthorization(लोकेशन केवल तभी फोरग्राउंड) कॉल ऑन CLLocationManagerलोकेशन अपडेट्स शुरू करने से पहले जरूरत होती है।

प्रांप्ट में प्रदर्शित होने वाले संदेश के साथ NSLocationAlwaysUsageDescriptionया NSLocationWhenInUseUsageDescriptionकुंजी होना भी आवश्यक है Info.plist। इनको जोड़ने से मेरी समस्या हल हो गई।

यहाँ छवि विवरण दर्ज करें

आशा है कि यह किसी और की मदद करता है।

EDIT: अधिक व्यापक जानकारी के लिए: कोर-लोकेशन-मैनेजर-चेंजेस-इन-आईओएस -8 पर एक नज़र डालें


6
क्या आप Info.plist में अपडेट किए गए सटीक वेलुर यू को साझा कर सकते हैं? Iam मेरी Info.plist में उस कुंजी को देखने में सक्षम नहीं है। मैंने इसे जोड़ा और अभी भी यह काम नहीं करता है। मैं स्विफ्ट, iOS8 और XCode 6 बीटा 4
विजय कुमार एबी

4
@ संजय - आपको एक संपादक में Info.plist फ़ाइल को संपादित करना है, उन कुंजी को Xcode (बीटा 6 के अनुसार) में सेट नहीं कर सकते।
केंडल हेल्मसटेटर गेलनर

11
बस एक अनुस्मारक, यदि आप उपयोगकर्ता को कस्टम स्पष्टीकरण नहीं दिखाना चाहते हैं, तो बस इस कुंजी को एक खाली स्ट्रिंग पर सेट करें।
गैर-

7
इसे काम करने के लिए आपको अपना स्थान प्रबंधक बनाए रखने की आवश्यकता है। इसलिए अपने CLLocationManager को एक मजबूत संपत्ति के रूप में बनाएँ
Vassily

273
मैं 'प्यार' करता हूं कि आपको कोई त्रुटि नहीं मिलती है, कोई चेतावनी नहीं है, कोई लॉग संदेश नहीं है। मूल रूप से Apple ने एक एपीआई कॉल बनाया है, जो आपके पास उपयुक्त प्लिस्ट प्रविष्टि नहीं होने पर भी कुछ नहीं करता है। यह पता लगाने के लिए @OrtwinGentz ​​को धन्यवाद।
MobileVet

314

मैं अपने बालों को उसी समस्या से बाहर निकाल रहा था। Xcode आपको त्रुटि देता है:

MapKitस्थान प्राधिकरण के लिए संकेत दिए बिना स्थान अपडेट शुरू करने की कोशिश कर रहा है । फोन करना चाहिए -[CLLocationManager requestWhenInUseAuthorization]या -[CLLocationManager requestAlwaysAuthorization]पहले।

लेकिन फिर भी अगर आप उपरोक्त तरीकों में से एक को लागू, यह उपयोगकर्ता जब तक कि वहाँ के लिए Info.plist में एक प्रविष्टि है संकेत नहीं देगा NSLocationAlwaysUsageDescriptionया NSLocationWhenInUseUsageDescription

अपनी जानकारी में निम्नलिखित पंक्तियाँ जोड़ें। जहां स्ट्रिंग मान उस कारण का प्रतिनिधित्व करते हैं जो आपको उपयोगकर्ताओं के स्थान तक पहुँचने की आवश्यकता है

<key>NSLocationWhenInUseUsageDescription</key>
<string>This application requires location services to work</string>

<key>NSLocationAlwaysUsageDescription</key>
<string>This application requires location services to work</string>

मुझे लगता है कि जब से मैंने Xcode 5 में इस प्रोजेक्ट को शुरू किया है, तब से ये प्रविष्टियाँ गायब हो सकती हैं। मुझे लगता है कि Xcode 6 इन कुंजियों के लिए डिफ़ॉल्ट प्रविष्टियाँ जोड़ सकता है, लेकिन इसकी पुष्टि नहीं हुई है।

आप इन दो सेटिंग्स पर अधिक जानकारी यहां पा सकते हैं


13
xcode 6 इन कुंजियों को डिफ़ॉल्ट रूप से नहीं जोड़ता है, यदि आप CLLocationManager को लागू करने का इरादा रखते हैं, तो आपको उन्हें स्वयं जोड़ना होगा
वेस्ले स्मिथ

1
मुझे भी इन्हें मैन्युअल रूप से जोड़ना था, Xcode6 में info.plist के रॉवेल्यूज़ व्यू के माध्यम से नहीं जोड़ सका!
केंडल हेल्मेस् ट्टर गेलनर

1
मैंने हमेशा के लिए इसे देखा। मेरा [CLLLocationManager authorizationStatus] संदेश केवल <n> का मान लौटा रहा था। उपरोक्त कुंजियों को जोड़ने के बाद यह संदेशों के आउटपुट के लिए संबंधित गणनाओं को वापस करने लगा। क्या ive पाया यह एक ज्ञात iOS 8 बग है, लेकिन उम्र के लिए मेरे संदर्भ में कुछ भी नहीं मिल सका। एक धन्यवाद!
MrOli3000

4
मुझे आपके द्वारा लगाई गई स्ट्रिंग वैल्यू पसंद है
क्रिस चेन

1
संदेश अलर्ट में उप-संदेश के रूप में दिखाई देगा जो पूछता है कि क्या उपयोगकर्ता अपना स्थान साझा करना चाहते हैं। जैसे, बस खाली (रिक्त) होने के नाते मेरे आवेदन में सबसे अधिक समझ में आता है। आप स्थान का उपयोग क्यों करना चाहते हैं इसका स्पष्टीकरण भी समझ में आएगा। हालाँकि, NSLocationWhenInUseUsageDescription ने मेरे लिए अपेक्षा के अनुरूप व्यवहार नहीं किया (यानी वापसी मूल्य सही होने के बावजूद अनुमति से वंचित रखा गया)। NSLocationAlwaysUsageDescription ने ठीक काम किया।
आर्कडी बोब

104

यह सुनिश्चित करने के लिए कि यह iOS 7 के साथ पीछे की ओर संगत है, आपको यह देखना चाहिए कि उपयोगकर्ता iOS 8 या iOS 7 चला रहा है या नहीं। उदाहरण के लिए:

#define IS_OS_8_OR_LATER ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0)

//In ViewDidLoad
if(IS_OS_8_OR_LATER) {
   [self.locationManager requestAlwaysAuthorization];
}

[self.locationManager startUpdatingLocation];

164
संस्करण की जाँच करने से बेहतर तरीका यह देखना है कि क्या वस्तु में चयनकर्ता है, उदाहरण के लिए: if ([self.locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) { ...
progrmr

1
मुझे Xcode 5 पर निर्माण करते समय @ progrmr के समाधान को लागू करने में परेशानी हुई, क्योंकि यह नहीं जानता कि यह requestAlwaysAuthorizationविधि क्या है। मेरा अतिरिक्त समाधान ifसामान्य विधि कॉल के बजाय बयान में इस लाइन का उपयोग करना था [self.locationManager performSelector:@selector(requestAlwaysAuthorization)];:। शायद यह अन्य लोगों के लिए स्पष्ट है, लेकिन मुझे यह पता लगाने में थोड़ा समय लगा। मुझे लगता है कि अंतिम Xcode 6 जारी होने तक यह सही समाधान है।
विंसफियर

2
सही समाधान Xcode 6 के साथ बनाना है। यदि आप Xcode 5 के साथ निर्माण कर रहे हैं, तो आपको प्राधिकरण से अनुरोध करने की आवश्यकता नहीं है, यह स्वचालित है।
प्रोगामर

आपके पास एक बिंदु हो सकता है। मेरी चिंता यह थी कि मैं चाहता था कि मेरा कोड Xcode 5 में संकलित हो (भले ही यह iOS 8 पर तब तक काम नहीं करेगा जब तक कि Xcode 6 में संकलित न हो), जबकि मेरी टीम Xcode 6 में संक्रमण करती है। लेकिन कोड को सामान्य रूप से लिखने के लिए शायद यह एक बेहतर वर्कफ़्लो है और जब तक हम Xcode 6 पर नहीं जाते हैं, तब तक इसे मर्ज नहीं करें .. धन्यवाद।
विंसफोर

@VinceFord की सिफारिश की गई दृष्टिकोण एसडीके परिभाषित मैक्रो __IPHONE_OS_VERSION_MAX_ALLOWED( #if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000) का उपयोग करके सशर्त रूप से संकलित करना है
स्टीवन क्रेमर

50
- (void)startLocationManager
{
    locationManager = [[CLLocationManager alloc] init];
    locationManager.delegate = self;
    locationManager.distanceFilter = kCLDistanceFilterNone; //whenever we move
    locationManager.desiredAccuracy = kCLLocationAccuracyBest;

    [locationManager startUpdatingLocation];
    [locationManager requestWhenInUseAuthorization]; // Add This Line


}

और अपनी info.plist फ़ाइल में यहाँ छवि विवरण दर्ज करें



2
@ हेमांग: ऐप्पल देव डॉक्यूमेंटेशन के अनुसार: आपके ऐप की प्राधिकरण स्थिति निर्धारित होने से पहले स्थान सेवाओं को शुरू करना सुरक्षित है। यद्यपि आप स्थान सेवाएँ प्रारंभ कर सकते हैं, उन सेवाओं तक कोई डेटा वितरित नहीं होता है जब तक कि प्राधिकरण स्थिति kCLAuthorizationStatusAuthorizedAlways या kCLAuthorizationStatusAuthorizedWhenInUse में परिवर्तित नहीं हो जाती।
एंड्रयू

थोड़ा देर से, लेकिन मैं आपको अपनी
मुट्ठी

धन्यवाद, लेकिन सिर्फ एक डमी नमूना :)
नव D1

यह भी महत्वपूर्ण है कि परियोजना सही जानकारी की ओर इशारा कर रही है। यह Info.plist फ़ाइल के अंतर्गत प्रोजेक्ट बिल्ड सेटिंग्स में निर्धारित होता है।
स्पष्ट करें

30

Apple डॉक्स के अनुसार:

IOS 8 के रूप में, आपके ऐप के Info.plist फ़ाइल में एक NSLocationWhenInUseUsageDescriptionया एक NSLocationAlwaysUsageDescriptionप्रमुख मूल्य की उपस्थिति की आवश्यकता है। इसके बाद स्थान अपडेट के लिए पंजीकरण करने से पहले उपयोगकर्ता से अनुमति लेना आवश्यक है, या तो कॉल करके [self.myLocationManager requestWhenInUseAuthorization]या [self.myLocationManager requestAlwaysAuthorization]अपनी आवश्यकता के आधार पर। Info.plist में आपके द्वारा दर्ज की गई स्ट्रिंग को आगामी डायलॉग में प्रदर्शित किया जाएगा।

यदि उपयोगकर्ता अनुमति देता है, तो यह हमेशा की तरह व्यवसाय है। यदि वे अनुमति से इनकार करते हैं, तो प्रतिनिधि को स्थान अपडेट के बारे में सूचित नहीं किया जाता है।



28
- (void)viewDidLoad
{

    [super viewDidLoad];
    self.locationManager = [[CLLocationManager alloc] init];

    self.locationManager.delegate = self;
    if([self.locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]){
        NSUInteger code = [CLLocationManager authorizationStatus];
        if (code == kCLAuthorizationStatusNotDetermined && ([self.locationManager respondsToSelector:@selector(requestAlwaysAuthorization)] || [self.locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)])) {
            // choose one request according to your business.
            if([[NSBundle mainBundle] objectForInfoDictionaryKey:@"NSLocationAlwaysUsageDescription"]){
                [self.locationManager requestAlwaysAuthorization];
            } else if([[NSBundle mainBundle] objectForInfoDictionaryKey:@"NSLocationWhenInUseUsageDescription"]) {
                [self.locationManager  requestWhenInUseAuthorization];
            } else {
                NSLog(@"Info.plist does not contain NSLocationAlwaysUsageDescription or NSLocationWhenInUseUsageDescription");
            }
        }
    }
    [self.locationManager startUpdatingLocation];
}

>  #pragma mark - CLLocationManagerDelegate

    - (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
    {
        NSLog(@"didFailWithError: %@", error);
        UIAlertView *errorAlert = [[UIAlertView alloc]
                                   initWithTitle:@"Error" message:@"Failed to Get Your Location" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
        [errorAlert show];
    }

    - (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
    {
        NSLog(@"didUpdateToLocation: %@", newLocation);
        CLLocation *currentLocation = newLocation;

        if (currentLocation != nil) {
            longitudeLabel.text = [NSString stringWithFormat:@"%.8f", currentLocation.coordinate.longitude];
            latitudeLabel.text = [NSString stringWithFormat:@"%.8f", currentLocation.coordinate.latitude];
        }
    }

IOS 8 में आपको लोकेशन काम करने के लिए दो अतिरिक्त चीजें करने की जरूरत है: अपनी Info.plist में एक कुंजी जोड़ें और स्थान प्रबंधक से प्राधिकरण शुरू करने का अनुरोध करें। नए स्थान प्राधिकरण के लिए दो Info.plist कुंजियाँ हैं। इनमें से एक या दोनों कीज़ की आवश्यकता होती है। यदि दोनों में से कोई भी कुंजी नहीं है, तो आप startUpdatingLocation को कॉल कर सकते हैं, लेकिन स्थान प्रबंधक वास्तव में प्रारंभ नहीं होगा। यह या तो प्रतिनिधि को विफलता संदेश नहीं भेजेगा (क्योंकि यह कभी शुरू नहीं हुआ, यह विफल नहीं हो सकता)। यदि आप एक या दोनों कुंजियाँ जोड़ते हैं तो भी यह विफल हो जाएगा लेकिन प्राधिकरण से स्पष्ट रूप से अनुरोध करना न भूलें। तो पहली चीज जो आपको करने की ज़रूरत है, वह है कि निम्नलिखित में से एक या दोनों कुंजी को अपनी Info.plist फ़ाइल में जोड़ें:

  • NSLocationWhenInUseUsageDescription
  • NSLocationAlwaysUsageDescription

ये दोनों कीज़ एक स्ट्रिंग लेते हैं

जो आपको स्थान सेवाओं की आवश्यकता का विवरण है। आप एक स्ट्रिंग दर्ज कर सकते हैं जैसे "स्थान यह जानने के लिए आवश्यक है कि आप कहाँ हैं", जो कि आईओएस 7 में, InfoPlist.strings फ़ाइल में स्थानीयकृत किया जा सकता है।

यहाँ छवि विवरण दर्ज करें


19

मेरा समाधान जो Xcode 5 में संकलित किया जा सकता है:

#ifdef __IPHONE_8_0
    NSUInteger code = [CLLocationManager authorizationStatus];
    if (code == kCLAuthorizationStatusNotDetermined && ([self.locationManager respondsToSelector:@selector(requestAlwaysAuthorization)] || [self.locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)])) {
        // choose one request according to your business.
        if([[NSBundle mainBundle] objectForInfoDictionaryKey:@"NSLocationAlwaysUsageDescription"]){
            [self.locationManager requestAlwaysAuthorization];
        } else if([[NSBundle mainBundle] objectForInfoDictionaryKey:@"NSLocationWhenInUseUsageDescription"]) {
            [self.locationManager  requestWhenInUseAuthorization];
        } else {
            NSLog(@"Info.plist does not contain NSLocationAlwaysUsageDescription or NSLocationWhenInUseUsageDescription");
        }
    }
#endif
    [self.locationManager startUpdatingLocation];

2
सभी एप्लिकेशन में उपयोग करने के लिए अच्छा गतिशील समाधान। हालांकि, मैं iPhone 8.0 के लिए जाँच करने के बजाय आदेश को बदल दूंगा, मैं यह जाँच करूँगा कि क्या स्थान प्रबंधक प्राधिकरण के प्रति प्रतिक्रिया करता है और फिर कोड प्राप्त करने के लिए प्राधिकरण का संचालन करता है। यह इसे और अधिक सार्वभौमिक बना देगा।
जिरिनिस्प

XCode 7.2 पर भी काम किया।
टोटरो

17

स्थान पूछने के लिए पुराना कोड iOS 8 में काम नहीं करेगा। आप स्थान प्राधिकरण के लिए यह तरीका आजमा सकते हैं:

- (void)requestAlwaysAuthorization
{
    CLAuthorizationStatus status = [CLLocationManager authorizationStatus];

    // If the status is denied or only granted for when in use, display an alert
    if (status == kCLAuthorizationStatusAuthorizedWhenInUse || status ==        kCLAuthorizationStatusDenied) {
        NSString *title;
        title = (status == kCLAuthorizationStatusDenied) ? @"Location services are off" :   @"Background location is not enabled";
        NSString *message = @"To use background location you must turn on 'Always' in the Location Services Settings";

        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:title
                                                            message:message
                                                           delegate:self
                                                  cancelButtonTitle:@"Cancel"
                                                  otherButtonTitles:@"Settings", nil];
        [alertView show];
    }
    // The user has not enabled any location services. Request background authorization.
    else if (status == kCLAuthorizationStatusNotDetermined) {
        [self.locationManager requestAlwaysAuthorization];
    }
}

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    if (buttonIndex == 1) {
        // Send the user to the Settings for this app
        NSURL *settingsURL = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
        [[UIApplication sharedApplication] openURL:settingsURL];
    }
}

UIAlertView को हटा दिया गया है। आपको इसके बजाय UIAlertController का उपयोग करना चाहिए।
पासन प्रेमरत्ने

हाँ, मुझे पता है कि इसकी कमी है लेकिन यह भी काम करेगा। लेकिन हाँ IOS8 के लिए UIAlertController का बेहतर उपयोग करें।
Nits007ak

12

IOS 8 में आपको स्थान प्राप्त करने के लिए दो अतिरिक्त चीजें करने की आवश्यकता है: अपने Info.plist में एक कुंजी जोड़ें और स्थान प्रबंधक से प्राधिकरण का अनुरोध करें इसे शुरू करने के लिए कहें।

Info.plist:

<key>NSLocationUsageDescription</key>
<string>I need location</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>I need location</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>I need location</string>

इसे अपने कोड में जोड़ें

if (IS_OS_8_OR_LATER)
{
    [locationmanager requestWhenInUseAuthorization];

    [locationmanager requestAlwaysAuthorization];
}

1
यह स्पष्ट नहीं है कि क्या आपका स्यूडोकोड एक प्रीप्रोसेसर कॉल या नियमित कॉल है
एल ड्यूड

1
इसे अपने constants.h या .pch फ़ाइल में जोड़ें: #define IS_OS_8_OR_LATER ([[UIDevice currentDevice] .systemVersion floatValue]> = 8.0)
OxenBoxen

आप दोनों का अनुरोध क्यों करेंगे, आपको अपने आवेदन की आवश्यकताओं के आधार पर केवल एक या दूसरे का उपयोग करने के लिए एक टिप्पणी का उल्लेख करना चाहिए
पावरज 1984

info.plist हिस्सा Unity3d में करना काफी आसान है, लेकिन अगर मैं unity3d का उपयोग कर रहा हूं तो मैं कोड भाग कैसे जोड़ूंगा? कहाँ पे ?
CthulhuJon

11

स्विफ्ट डेवलपर्स के लिए एक सामान्य त्रुटि:

पहले सुनिश्चित करें कि आप NSLocationWhenInUseUsageDescriptionया तो के लिए प्लिस्ट में एक मान जोड़ते हैं NSLocationAlwaysUsageDescription

यदि आप अभी भी प्राधिकरण के लिए एक विंडो पॉप अप नहीं देख रहे हैं , तो देखें कि क्या आप var locationManager = CLLocationManager()अपने व्यू कंट्रोलर की viewDidLoadविधि में लाइन लगा रहे हैं । यदि आप करते हैं, तो भले ही आप कॉल करें locationManager.requestWhenInUseAuthorization(), कुछ भी नहीं दिखाई देगा। ऐसा इसलिए है क्योंकि viewDidLoad निष्पादित होने के बाद, locationManager चर को हटा दिया जाता है (साफ़ कर दिया जाता है)।

समाधान var locationManager = CLLocationManager()वर्ग विधि के शीर्ष पर लाइन का पता लगाना है ।


9

इससे पहले [locationManager startUpdatingLocation];, एक iOS8 स्थान सेवा अनुरोध जोड़ें:

if([locationManager respondsToSelector:@selector(requestAlwaysAuthorization)])
    [locationManager requestAlwaysAuthorization];

अपने एप्लिकेशन को संपादित करें Info.plistऔर NSLocationAlwaysUsageDescriptionस्ट्रिंग मान के साथ कुंजी जोड़ें जो उपयोगकर्ता को प्रदर्शित किया जाएगा (उदाहरण के लिए,We do our best to preserve your battery life. )

यदि एप्लिकेशन खुला रहने पर आपके ऐप को केवल स्थान सेवाओं की आवश्यकता है, तो प्रतिस्थापित करें:

requestAlwaysAuthorizationके साथ requestWhenInUseAuthorizationऔर

NSLocationAlwaysUsageDescriptionके साथ NSLocationWhenInUseUsageDescription


9

मैं एक ऐसे ऐप पर काम कर रहा था जिसे iOS 8 में अपग्रेड किया गया था और स्थान सेवाओं ने काम करना बंद कर दिया था। संभवतः आपको डीबग क्षेत्र में त्रुटि मिलेगी और ऐसा होगा:

Trying to start MapKit location updates without prompting for location authorization. Must call -[CLLocationManager requestWhenInUseAuthorization] or -[CLLocationManager requestAlwaysAuthorization] first.

मैंने सबसे कम घुसपैठ प्रक्रिया की। पहले NSLocationAlwaysUsageDescriptionअपनी info.plist में प्रविष्टि जोड़ें :

यहां छवि विवरण दर्ज करें

ध्यान दें कि मैंने इस कुंजी के लिए मूल्य नहीं भरा था। यह अभी भी काम करता है, और मुझे चिंता नहीं है क्योंकि यह एक घर ऐप है। इसके अलावा, पहले से ही एक शीर्षक है जो स्थान सेवाओं का उपयोग करने के लिए कह रहा है, इसलिए मैं कुछ भी अनावश्यक नहीं करना चाहता था।

आगे मैंने iOS 8 के लिए एक सशर्त बनाया:

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

इसके बाद locationManager:didChangeAuthorizationStatus:विधि कॉल है:

- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:  (CLAuthorizationStatus)status
{
    [self gotoCurrenLocation];
}

और अब सब कुछ ठीक है। हमेशा की तरह, दस्तावेज़ीकरण देखें


7

पिछड़े संगतता के साथ समाधान:

SEL requestSelector = NSSelectorFromString(@"requestWhenInUseAuthorization");
if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusNotDetermined &&
    [self.locationManager respondsToSelector:requestSelector]) {
    [self.locationManager performSelector:requestSelector withObject:NULL];
} else {
    [self.locationManager startUpdatingLocation];
}

अपने Info.plist में NSLocationWhenInUseUsageDescription कुंजी सेट करें


2
यह सही नहीं है, मामले के बारे में क्या kCLAuthorizationStatusDenied? यह अन्य के लिए कूदता है और उस स्थान को अपडेट करना शुरू करता है जो सही नहीं है!
इलेक्ट्रॉनिक्स

@ बेंटमार्टन मुझे नहीं लगता कि यह बात होनी चाहिए। आपको अपने आप को संभालना चाहिए locationManager: (CLLocationManager *)manager didFailWithError: (NSError *)error। हालाँकि, यदि वह स्‍वीकार करता है कि स्‍वीकृति में स्‍पष्‍ट करना चाहे तो स्‍वीकार करे क्‍योंकि स्‍वीकार या स्‍वीकार नहीं करता है।
क्रिस

6

पिछड़े संगतता के साथ समाधान जो Xcode चेतावनियों का उत्पादन नहीं करता है:

SEL requestSelector = NSSelectorFromString(@"requestWhenInUseAuthorization");
if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusNotDetermined &&
  [self.locationManager respondsToSelector:requestSelector]) {
((void (*)(id, SEL))[self.locationManager methodForSelector:requestSelector])(self.locationManager, requestSelector);
  [self.locationManager startUpdatingLocation];
} else {
  [self.locationManager startUpdatingLocation];
}

NSLocationWhenInUseUsageDescriptionअपने में कुंजी सेट करें Info.plist

IOS संस्करण 11.0+ के लिए : NSLocationAlwaysAndWhenInUseUsageDescriptionअपने में सेटअप कुंजी Info.plist। अन्य 2 कुंजियों के साथ।


यह सही नहीं है, मामले के बारे में क्या kCLAuthorizationStatusDenied? यह अन्य के लिए कूदता है और उस स्थान को अपडेट करना शुरू करता है जो सही नहीं है!
इलेक्ट्रॉनिक्स

यह काफी अजीब है, यह मेरे लिए ठीक काम करता है ठीक है दोनों अनुमति के साथ पूरी तरह से ठीक नहीं है और अनुमति नहीं देता है। कोई भी जैकब समाधान सटीक नहीं दिखता है लेकिन मेरे लिए काम नहीं करता है। अजीब लेकिन काम किया !!!
जॉश

अनुरोध करने के बाद [self.locationManager startUpdatingLocation] को कॉल करना ठीक है। जब InUseAuthorization का कोई मतलब नहीं है
Kostia Kim

5

यह ios 8 के साथ समस्या है इसे अपने कोड में जोड़ें

if (IS_OS_8_OR_LATER)
{
    [locationmanager requestWhenInUseAuthorization];

    [locationmanager requestAlwaysAuthorization];
}

और info.plist:

 <key>NSLocationUsageDescription</key>
 <string>I need location</string>
 <key>NSLocationAlwaysUsageDescription</key>
 <string>I need location</string>
 <key>NSLocationWhenInUseUsageDescription</key>
 <string>I need location</string>

NSLocationUsageDescriptioniOS8 +
कार्लोस रिकार्डो

4

IOS 8 में यूजर लोकेशन एक्सेस करने के लिए आपको जोड़ना होगा,

NSLocationAlwaysUsageDescription in the Info.plist 

यह उपयोगकर्ता से अपना वर्तमान स्थान प्राप्त करने की अनुमति मांगेगा।


4

उद्देश्य-सी प्रक्रिया निम्नलिखित निर्देशों का पालन करें:

IOS-11 के लिए iOS 11 के लिए इस उत्तर पर एक नज़र डालें:iOS 11 स्थान का उपयोग

चित्र में दो कुंजी जोड़ने और छवि के अनुसार संदेश प्रदान करने की आवश्यकता है:

 1. NSLocationAlwaysAndWhenInUseUsageDescription 
 2. NSLocationWhenInUseUsageDescription
 3. NSLocationAlwaysUsageDescription

यहाँ छवि विवरण दर्ज करें IOS-10 और उससे नीचे के लिए:

NSLocationWhenInUseUsageDescription

यहाँ छवि विवरण दर्ज करें

locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self;
locationManager.desiredAccuracy = kCLLocationAccuracyThreeKilometers;
if([locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)]){
    [locationManager requestWhenInUseAuthorization];
}else{
    [locationManager startUpdatingLocation];
} 

डेलिगेट तरीके

#pragma mark - Lolcation Update 
- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
{
    NSLog(@"didFailWithError: %@", error);
    UIAlertView *errorAlert = [[UIAlertView alloc]
                               initWithTitle:@"Error" message:@"Failed to Get Your Location" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
    [errorAlert show];
}
-(void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status
{
    switch (status) {
        case kCLAuthorizationStatusNotDetermined:
        case kCLAuthorizationStatusRestricted:
        case kCLAuthorizationStatusDenied:
        {
            // do some error handling
        }
            break;
        default:{
            [locationManager startUpdatingLocation];
        }
            break;
    }
}
- (void)locationManager:(CLLocationManager *)manager
     didUpdateLocations:(NSArray *)locations
{
    CLLocation *location = [locations lastObject];
    userLatitude =  [NSString stringWithFormat:@"%f", location.coordinate.latitude] ;
    userLongitude =  [NSString stringWithFormat:@"%f",location.coordinate.longitude];
    [locationManager stopUpdatingLocation];
}

स्विफ्ट प्रक्रिया

नीचे दिए गए निर्देशों का पालन करें:

IOS-11 के लिए iOS 11 के लिए इस उत्तर पर एक नज़र है: iOS 11 स्थान का उपयोग

चित्र में दो कुंजी जोड़ने और छवि के अनुसार संदेश प्रदान करने की आवश्यकता है:

 1. NSLocationAlwaysAndWhenInUseUsageDescription 
 2. NSLocationWhenInUseUsageDescription
 3. NSLocationAlwaysUsageDescription

यहाँ छवि विवरण दर्ज करें IOS-10 और उससे नीचे के लिए:

यहाँ छवि विवरण दर्ज करें

import CoreLocation
class ViewController: UIViewController ,CLLocationManagerDelegate {
var locationManager = CLLocationManager()

//MARK- Update Location 
func updateMyLocation(){
    locationManager.delegate = self;
    locationManager.desiredAccuracy = kCLLocationAccuracyThreeKilometers;
    if locationManager.respondsToSelector(#selector(CLLocationManager.requestWhenInUseAuthorization)){
       locationManager.requestWhenInUseAuthorization()
    }
    else{
        locationManager.startUpdatingLocation()
    }
}

डेलिगेट तरीके

//MARK: Location Update
func locationManager(manager: CLLocationManager, didFailWithError error: NSError) {
    NSLog("Error to update location :%@",error)
}
func locationManager(manager: CLLocationManager, didChangeAuthorizationStatus status: CLAuthorizationStatus) {
    switch status {
    case .NotDetermined: break
    case .Restricted: break
    case .Denied:
            NSLog("do some error handling")
        break
    default:
        locationManager.startUpdatingLocation()
    }
}
func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
     let location = locations.last! as CLLocation
    var latitude = location.coordinate.latitude
    var longitude = location.coordinate.longitude

}

कृपया सुनिश्चित करें कि NSLocationAlwaysUsageDescription भी जोड़ा गया है अन्यथा आपको ऐप स्टोर पर अपलोड करते समय एक त्रुटि मिलेगी।
आलोक

आपका संदेश भी जानकारीपूर्ण होना चाहिए अन्यथा ऐप्प रिवीलिंग प्रक्रिया के दौरान ऐप को अस्वीकार कर देगा।
आलोक

3

Xamarin का उपयोग करने वालों के लिए , मुझे जानकारी में कुंजी को जोड़ना पड़ा। NSLocationWhenInUseUsageDescriptionमैन्युअल मैन्युअल रूप से क्योंकि यह या तो Xamarin 5.5.3 में ड्रॉपडाउन में उपलब्ध नहीं था। 6 या XCode 6.1 का निर्माण करें - केवल NSLocationUsageDescriptionसूची में था, और जिसके कारण इसे CLLocationManagerजारी रखना पड़ा चुपचाप असफल रहो।


2
        // ** Don't forget to add NSLocationWhenInUseUsageDescription in MyApp-Info.plist and give it a string

        self.locationManager = [[CLLocationManager alloc] init];
        self.locationManager.delegate = self;
        // Check for iOS 8. Without this guard the code will crash with "unknown selector" on iOS 7.
        if ([self.locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)]) {
            [self.locationManager requestWhenInUseAuthorization];
        }
        [self.locationManager startUpdatingLocation];


    // Location Manager Delegate Methods    
    - (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
    {
        NSLog(@"%@", [locations lastObject]);

}

2

आप सभी के लिए एक छोटा सा सहायक है जिसके पास एक से अधिक Info.plist फ़ाइल है ...

find . -name Info.plist | xargs -I {} /usr/libexec/PlistBuddy -c 'Add NSLocationWhenInUseUsageDescription string' {} 

यह मौजूदा निर्देशिका (और सबफ़ोल्डर्स) में Info.plist फ़ाइलों के सभी के लिए आवश्यक टैग जोड़ देगा।

एक और है:

find . -name Info.plist | xargs -I {} /usr/libexec/PlistBuddy -c 'Set NSLocationWhenInUseUsageDescription $YOURDESCRIPTION' {} 

यह आपके विवरण को सभी फाइलों में जोड़ देगा।



2

मुझे iOS9 (Xcode 7 और स्विफ्ट 2 के साथ काम करना) में एक समान त्रुटि मिलती है: स्थान प्राधिकरण के लिए संकेत दिए बिना MapKit स्थान अपडेट शुरू करने की कोशिश करना। कॉल अवश्य करें - [CLLocationManager requestWhenInUseAuthorization] या - [[CLLocationManager requestAlwaysAuthorization] पहले। मैं एक ट्यूटोरियल का अनुसरण कर रहा था लेकिन ट्यूटर iOS8 और स्विफ्ट 1.2 का उपयोग कर रहा था। Xcode 7 और Swift 2 में कुछ बदलाव हैं, मुझे यह कोड मिला और यह मेरे लिए ठीक काम करता है (अगर किसी को मदद की ज़रूरत है):

import UIKit
import MapKit
import CoreLocation

class MapViewController: UIViewController, MKMapViewDelegate, CLLocationManagerDelegate {

    // MARK: Properties
    @IBOutlet weak var mapView: MKMapView!

    let locationManager = CLLocationManager()

    override func viewDidLoad() {
        super.viewDidLoad()

        self.locationManager.delegate = self
        self.locationManager.desiredAccuracy = kCLLocationAccuracyBest
        self.locationManager.requestWhenInUseAuthorization()
        self.locationManager.startUpdatingLocation()
        self.mapView.showsUserLocation = true

    }

    // MARK: - Location Delegate Methods

    func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        let location = locations.last
        let center = CLLocationCoordinate2D(latitude: location!.coordinate.latitude, longitude: location!.coordinate.longitude)
        let region = MKCoordinateRegion(center: center, span: MKCoordinateSpan(latitudeDelta: 1, longitudeDelta: 1))
        self.mapView.setRegion(region, animated: true)
    }

    func locationManager(manager: CLLocationManager, didFailWithError error: NSError) {
        print("Errors: " + error.localizedDescription)
    }
}

अंत में, मैंने उसे जानकारी में डाल दिया। विशेषज्ञ: सूचना संपत्ति सूची: NSLocationWhenInUseUsageDescription मान: ऐप को कर्मचारियों के लिए स्थान सर्वर की आवश्यकता है


2

आईओएस में उपयोगकर्ताओं के स्थान का उपयोग करने के लिए। आपको दो कुंजी जोड़ने की आवश्यकता है

NSLocationWhenInUseUsageDescription

NSLocationAlwaysUsageDescription

Info.plist फ़ाइल में।

    <key>NSLocationWhenInUseUsageDescription</key>
    <string>Because I want to know where you are!</string>
    <key>NSLocationAlwaysUsageDescription</key>
    <string>Want to know where you are!</string>

नीचे इस छवि को देखें।

Info.plist छवि


1
  1. प्रत्येक लक्ष्य से प्रत्येक पर जीपीएस का उपयोग करने के लिए पूछते हुए स्ट्रिंग के साथ कुंजी NSLocationWhenInUseUsageDescriptionया NSLocationAlwaysUsageDescription(पृष्ठभूमि जीपीएस उपयोग) जोड़ें info.plist

  2. चलाने की अनुमति के लिए पूछें:

    [स्व initLocationManager: स्थान प्रबंधक];

कहाँ initLocationManagerहै:

// asks for GPS authorization on iOS 8
-(void) initLocationManager:(CLLocationManager *) locationManager{

    locationManager = [[CLLocationManager alloc]init];

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

याद रखें कि यदि कुंजी info.plistप्रत्येक लक्ष्य के लिए प्रत्येक पर नहीं है तो ऐप उपयोगकर्ता से नहीं पूछेगा। ifIOS 7 के साथ संगतता प्रदान करता है और respondsToSelector:विधि सिर्फ iOS 7 और 8 के लिए इस मुद्दे को सुलझाने के बजाय भविष्य अनुकूलता की गारंटी देता है।


0

मेरे लिए समस्या यह थी कि जो वर्ग CLLocationManagerDelegateनिजी था, जिसने सभी प्रतिनिधि विधियों को बुलाए जाने से रोका। लगता है कि यह एक बहुत ही सामान्य स्थिति नहीं है, लेकिन मैंने सोचा था कि मैं इसका उल्लेख करूंगा कि कोई भी मदद करता है।


0

मैं में उन कुंजी जोड़ने InfoPlist.stringsमें आईओएस 8.4, iPad मिनी 2. यह भी काम करता है। मैं किसी भी कुंजी को सेट नहीं करता, जैसे NSLocationWhenInUseUsageDescription, मेरे में Info.plist


InfoPlist.strings :

"NSLocationWhenInUseUsageDescription" = "I need GPS information....";

इस सूत्र के आधार पर , इसने कहा, as in iOS 7InfoPlist.strings में स्थानीयकरण किया जा सकता है। मेरे परीक्षण में, उन कुंजियों को सीधे फ़ाइल में कॉन्फ़िगर किया जा सकता है InfoPlist.strings

तो पहली चीज जो आपको करने की ज़रूरत है वह है अपनी जानकारी में से एक या दोनों को जोड़कर निम्नलिखित जानकारी।

  • NSLocationWhenInUseUsageDescription
  • NSLocationAlwaysUsageDescription

इन दोनों कुंजियों में एक स्ट्रिंग होती है जो इस बात का विवरण है कि आपको स्थान सेवाओं की आवश्यकता क्यों है। आप एक स्ट्रिंग दर्ज कर सकते हैं जैसे "स्थान यह जानने के लिए आवश्यक है कि आप कहाँ हैं", जो कि आईओएस 7 में, InfoPlist.strings फ़ाइल में स्थानीयकृत किया जा सकता है।


अपडेट करें:

मुझे लगता है कि @IOSविधि बेहतर है। Info.plistरिक्त मान के साथ कुंजी जोड़ें और स्थानीय स्ट्रिंग्स को जोड़ें InfoPlist.strings

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.