जांचें कि क्या स्थान सेवाएँ सक्षम हैं


87

मैं CoreLocation के बारे में कुछ शोध कर रहा हूं। हाल ही में, मुझे एक समस्या का सामना करना पड़ा जो कहीं और पर कवर किया गया है, लेकिन ऑब्जेक्टिव सी और आईओएस 8 के लिए।

मुझे लगता है कि थोड़े मूर्खतापूर्ण तरीके से यह पूछ रहे हैं, लेकिन अगर आप iOS 9 पर लोकेशन सेवाओं को तेजी से उपयोग करने में सक्षम हैं, तो आप कैसे जांच सकते हैं?

IOS 7 (और शायद 8?) पर आप उपयोग कर सकते हैं locationServicesEnabled(), लेकिन यह iOS 9 के लिए संकलन करते समय काम नहीं करता है।

तो मैं इसे कैसे पूरा करूंगा?

धन्यवाद!

जवाबों:


243

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

स्विफ्ट 1.x - 2.x संस्करण:

if CLLocationManager.locationServicesEnabled() {
    switch CLLocationManager.authorizationStatus() {
    case .NotDetermined, .Restricted, .Denied:
        print("No access")
    case .AuthorizedAlways, .AuthorizedWhenInUse:
        print("Access")
    }
} else {
    print("Location services are not enabled")
}

स्विफ्ट 4.x संस्करण:

if CLLocationManager.locationServicesEnabled() {
     switch CLLocationManager.authorizationStatus() {
        case .notDetermined, .restricted, .denied:
            print("No access")
        case .authorizedAlways, .authorizedWhenInUse:
            print("Access")
        }
    } else {
        print("Location services are not enabled")
}

स्विफ्ट 5.1 संस्करण

if CLLocationManager.locationServicesEnabled() {
    switch CLLocationManager.authorizationStatus() {
        case .notDetermined, .restricted, .denied:
            print("No access")
        case .authorizedAlways, .authorizedWhenInUse:
            print("Access")
        @unknown default:
        break
    }
    } else {
        print("Location services are not enabled")
}

8
हाँ! धन्यवाद! मेरी समस्या यह थी कि मैं अपने मैनेजर पर लोकेटेड सर्विसेज को कॉल करने की कोशिश कर रहा था, यानी सॉल्वड के manager.locationServicesEnabled() बजाय CLLocationManager.loationServicesEnabled() !
ब्रेंडन चांग

2
मुझे लगता है कि आपका कोड सिर्फ एक उदाहरण है, लेकिन यह थोड़ा भ्रामक है ... मुझे लगता है कि यह बेहतर है जब authorizationStatusइसे सेट किया जाए notDeterminedतो केवल लॉग करने के बजाय उपयोगकर्ता को 'अनुमति दें / अनुमति न दें' को संकेत देना बेहतर होगा
हनी

@ हां, निश्चित रूप से आप इसका उपयोग कर सकते हैं जैसा कि आप पसंद करते हैं और जैसा कि आपने कहा कि कोड यह दिखाने के लिए सिर्फ उदाहरण है कि इसका उपयोग कैसे किया जा सकता है।
राशवन एल

13

उद्देश्य-सी में

आपको पहले से इनकार किए गए उपयोगकर्ता को ट्रैक करना चाहिए या निर्धारित नहीं करना चाहिए फिर सेटिंग एप्लिकेशन को अनुमति या भेजे गए उपयोगकर्ता के लिए पूछना चाहिए।

-(void)askEnableLocationService
{
   BOOL showAlertSetting = false;
   BOOL showInitLocation = false;

   if ([CLLocationManager locationServicesEnabled]) {

      switch ([CLLocationManager authorizationStatus]) {
        case kCLAuthorizationStatusDenied:
            showAlertSetting = true;
            NSLog(@"HH: kCLAuthorizationStatusDenied");
            break;
        case kCLAuthorizationStatusRestricted:
            showAlertSetting = true;
            NSLog(@"HH: kCLAuthorizationStatusRestricted");
            break;
        case kCLAuthorizationStatusAuthorizedAlways:
            showInitLocation = true;
            NSLog(@"HH: kCLAuthorizationStatusAuthorizedAlways");
            break;
        case kCLAuthorizationStatusAuthorizedWhenInUse:
            showInitLocation = true;
            NSLog(@"HH: kCLAuthorizationStatusAuthorizedWhenInUse");
            break;
        case kCLAuthorizationStatusNotDetermined:
            showInitLocation = true;
            NSLog(@"HH: kCLAuthorizationStatusNotDetermined");
            break;
        default:
            break;
      }
   } else {

      showAlertSetting = true;
      NSLog(@"HH: locationServicesDisabled");
  }

   if (showAlertSetting) {
       UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:nil message:@"Please enable location service for this app in ALLOW LOCATION ACCESS: Always, Go to Setting?" delegate:self cancelButtonTitle:@"No" otherButtonTitles:@"Open Setting", nil];
       alertView.tag = 199;
       [alertView show];
   }
   if (showInitLocation) {
       [self initLocationManager];
   }

}

पहले से ही उपयोगकर्ता द्वारा इनकार करने पर स्थान सेवा को सक्षम करने के लिए, फिर अलर्ट भेजें प्रतिनिधि लागू करें।

-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{

   if (alertView.tag == 199) {
       if (buttonIndex == 1) {
           [[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
       }
       return;
   }
}

Init स्थान प्रबंधक

-(void)initLocationManager{
   self.locationManager = [[CLLocationManager alloc] init];
   if([self.locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) {
       [self.locationManager requestAlwaysAuthorization];
   }
}

कृपया ध्यान दें kCLAuthorizationStatusAuthorizedAlways और kCLAuthorizationStatusAuthorizedWhenInUse अंतर है।


इस उद्देश्य-सी संस्करण के लिए धन्यवाद, हालांकि मूल प्रश्न स्विफ्ट के बारे में था। अतिरिक्त संकेत: कॉल रिक्वेस्ट व्हेनइन्सेअथोराईज़ेशन यदि स्थिति निर्धारित नहीं की जाती है, तो उपयोग विवरण (संभवतः स्थानीयकृत) के लिए प्रासंगिक प्लिस्ट प्रविष्टि सेट करें, और संभवत: didChangeAuthorizationStatus को लागू करें
जियोर्जियो बर्चेसिअर्ट

9

स्विफ्ट (24 जुलाई, 2018 तक)

if CLLocationManager.locationServicesEnabled() {

}

यह आपको बताएगा कि क्या उपयोगकर्ता ने ऐप के स्थान अनुमति अनुरोध के लिए पहले ही एक सेटिंग का चयन कर लिया है


8

यह स्विफ्ट 4 में सिर्फ 2 लाइन का फंक्शन है:

import CoreLocation

static func isLocationPermissionGranted() -> Bool
{
    guard CLLocationManager.locationServicesEnabled() else { return false }
    return [.authorizedAlways, .authorizedWhenInUse].contains(CLLocationManager.authorizationStatus())
}

6

यहाँ प्रारूप Apple की सिफारिश है।

  switch CLLocationManager.authorizationStatus() {
      case .notDetermined:
         // Request when-in-use authorization initially
         break
      case .restricted, .denied:
         // Disable location features
         break
      case .authorizedWhenInUse, .authorizedAlways:
         // Enable location features
         break
      }

यहाँ एक पूर्ण उदाहरण है।

इसमें AlertViewउपयोगकर्ता को Settingsस्क्रीन पर ले जाने के लिए एक बटन के साथ शामिल है यदि पहले उपयोग से इनकार किया गया है।

import CoreLocation
let locationManager = CLLocationManager()

class SettingsTableViewController:CLLocationManagerDelegate{

    func checkUsersLocationServicesAuthorization(){
        /// Check if user has authorized Total Plus to use Location Services
        if CLLocationManager.locationServicesEnabled() {
            switch CLLocationManager.authorizationStatus() {
            case .notDetermined:
                // Request when-in-use authorization initially
                // This is the first and the ONLY time you will be able to ask the user for permission
                self.locationManager.delegate = self
                locationManager.requestWhenInUseAuthorization()
                break

            case .restricted, .denied:
                // Disable location features
                switchAutoTaxDetection.isOn = false
                let alert = UIAlertController(title: "Allow Location Access", message: "MyApp needs access to your location. Turn on Location Services in your device settings.", preferredStyle: UIAlertController.Style.alert)

                // Button to Open Settings
                alert.addAction(UIAlertAction(title: "Settings", style: UIAlertAction.Style.default, handler: { action in
                    guard let settingsUrl = URL(string: UIApplication.openSettingsURLString) else {
                        return
                    }
                    if UIApplication.shared.canOpenURL(settingsUrl) {
                        UIApplication.shared.open(settingsUrl, completionHandler: { (success) in
                            print("Settings opened: \(success)") 
                        })
                    }
                }))
                alert.addAction(UIAlertAction(title: "Ok", style: UIAlertAction.Style.default, handler: nil))
                self.present(alert, animated: true, completion: nil)

                break

            case .authorizedWhenInUse, .authorizedAlways:
                // Enable features that require location services here.
                print("Full Access")
                break
            }
        }
    }
}

5

स्विफ्ट 3.0 और उससे अधिक के लिए, यदि स्थान सेवाओं की उपलब्धता के लिए लगातार जांच की जाती है, तो नीचे की तरह एक वर्ग बनाएं,

    import CoreLocation

    open class Reachability {
        class func isLocationServiceEnabled() -> Bool {
            if CLLocationManager.locationServicesEnabled() {
                switch(CLLocationManager.authorizationStatus()) {
                    case .notDetermined, .restricted, .denied:
                    return false
                    case .authorizedAlways, .authorizedWhenInUse:
                    return true
                    default:
                    print("Something wrong with Location services")
                    return false
                }
            } else {
                    print("Location services are not enabled")
                    return false
              }
            }
         }

और फिर इसे अपने वीसी में इस तरह से इस्तेमाल करें

    if Reachability.isLocationServiceEnabled() == true {
    // Do what you want to do.
    } else {
    //You could show an alert like this.
        let alertController = UIAlertController(title: "Location 
        Services Disabled", message: "Please enable location services 
        for this app.", preferredStyle: .alert)
        let OKAction = UIAlertAction(title: "OK", style: .default, 
        handler: nil)
        alertController.addAction(OKAction)
        OperationQueue.main.addOperation {
            self.present(alertController, animated: true, 
            completion:nil)
        }
    }

3

जब आप -startLocation को कॉल करते हैं, यदि उपयोगकर्ता द्वारा स्थान सेवाओं से इनकार किया गया था, तो स्थान प्रबंधक प्रतिनिधि को त्रुटि कोड के locationManager:didFailWithErrorसाथ - : पर कॉल आएगा kCLErrorDenied। यह iOS के सभी संस्करणों में काम करता है।


धन्यवाद। दुर्भाग्य से, जब मैंने कोशिश की कि, यह दिखाता है Use of unresolved identifier 'kCLErrorDenied':। विचार?
ब्रेंडन चांग

1

स्विफ्ट 3.0 में

if (CLLocationManager.locationServicesEnabled())
            {
                locationManager.delegate = self
                locationManager.desiredAccuracy = kCLLocationAccuracyBest
                if ((UIDevice.current.systemVersion as NSString).floatValue >= 8)
                {
                    locationManager.requestWhenInUseAuthorization()
                }

                locationManager.startUpdatingLocation()
            }
            else
            {
                #if debug
                    println("Location services are not enabled");
                #endif
            }

1

आपके द्वारा उपयोग की जाने वाली स्थान सेवाओं के लिए अनुमति माँगने के लिए:

yourSharedLocationManager.requestWhenInUseAuthorization()

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

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

  • यदि उपयोगकर्ता के पास सामान्य स्थान सेवाएं सक्षम हैं या नहीं

CLLocationManager.locationServicesEnabled()

  • यदि उपयोगकर्ता ने आपके ऐप के लिए सही अनुमति दी है ..

CLLocationManager.authorizationStatus() == .authorizedWhenInUse

आप एक एक्सटेंशन जोड़ सकते हैं एक आसान विकल्प है:

extension CLLocationManager {
static func authorizedToRequestLocation() -> Bool {
    return CLLocationManager.locationServicesEnabled() &&
        (CLLocationManager.authorizationStatus() == .authorizedAlways || CLLocationManager.authorizationStatus() == .authorizedWhenInUse)
}

}

जब उपयोगकर्ता ने पहली बार निर्देशों का अनुरोध किया है, तो इसे एक्सेस किया जा रहा है:

 private func requestUserLocation() {
    //when status is not determined this method runs to request location access
    locationManager.requestWhenInUseAuthorization()

    if CLLocationManager.authorizedToRequestLocation() {

        //have accuracy set to best for navigation - accuracy is not guaranteed it 'does it's best'
        locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation

        //find out current location, using this one time request location will start the location services and then stop once have the location within the desired accuracy -
        locationManager.requestLocation()
    } else {
        //show alert for no location permission
        showAlertNoLocation(locationError: .invalidPermissions)
    }
}

यहाँ प्रतिनिधि है:

 func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {

    if !CLLocationManager.authorizedToRequestLocation() {
        showAlertNoLocation(locationError: .invalidPermissions)
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.