অবস্থান পরিষেবাদি সক্ষম করা আছে কিনা তা পরীক্ষা করুন


88

আমি কোরলোকেশন সম্পর্কে কিছু গবেষণা করে চলেছি। সাম্প্রতিককালে, আমি এমন একটি সমস্যার মুখোমুখি হয়েছি যা অন্যত্র hasাকা পড়েছে তবে উদ্দেশ্য সিতে এবং আইওএস 8 এর জন্য।

আমি নির্দ্বিধায় এই জিজ্ঞাসা করছে মনে হচ্ছে, তবে আপনি কীভাবে চেক করতে পারেন যে অবস্থানের পরিষেবাগুলি আইওএস 9-এ সুইফট ব্যবহার করে সক্ষম করা হয়েছে কিনা?

আইওএস 7 (এবং সম্ভবত 8?) এ আপনি ব্যবহার করতে পারেন locationServicesEnabled()তবে আইওএস 9 এর জন্য সংকলন করার সময় এটি কাজ করছে বলে মনে হয় না।

তাহলে আমি কীভাবে এটি সম্পাদন করব?

ধন্যবাদ!

উত্তর:


247

যোগ 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()!
ব্রেন্ডন চাং

4
আমি এটা যে আপনার কোড শুধু একটি উদাহরণ পেতে, কিন্তু এটা সামান্য বিভ্রান্তিকর এর ... আমার মনে হয় এটা ভাল যখন authorizationStatusহয় সেট করতে notDeterminedশুধু এটা অনুরোধ জানানো ব্যবহারকারী 'অনুমতি দিন / অনুমতি নয় "ভাল হবে লগ-ইন পরিবর্তে তারপর
মধু

@ মধু, নিশ্চিত যে আপনি অবশ্যই এটি আপনার পছন্দ হিসাবে ব্যবহার করতে পারেন এবং যেমন আপনি বলেছিলেন যে কোডটি এটি কীভাবে ব্যবহার করা যেতে পারে তা প্রদর্শন করার এক উদাহরণ example
রাশওয়ান এল

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;
   }
}

উদ্যোগ অবস্থান পরিচালক

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

দয়া করে নোট করুন কেসিএলরাইজাইজেশন স্ট্যাটাসঅর্টিভাইজডলওয়েজ এবং কেসিএলএররাইজেশন স্ট্যাটাসঅরুমারাইজডভেনইন ইউজ পার্থক্য।


এই উদ্দেশ্য-সি সংস্করণের জন্য ধন্যবাদ, যদিও আসল প্রশ্নটি দ্রুত ছিল। অতিরিক্ত ইঙ্গিতগুলি: কল অনুরোধহানসইউস অনুমোদন যদি স্থিতি নির্ধারিত না হয় তবে ব্যবহারের বর্ণনার জন্য প্রাসঙ্গিক plist এন্ট্রি সেট করুন (সম্ভবত স্থানীয়করণ করা), এবং সম্ভবত চ্যাঞ্জআরোটাইজেশন স্ট্যাটাসটি বাস্তবায়িত করুন
জর্জিও

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

অ্যাপল প্রস্তাবিত ফর্ম্যাটটি এখানে ।

  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

সুইফট ৩.০ এবং তারপরের জন্য, যদি লোকেশন পরিষেবাদির প্রাপ্যতার জন্য ঘন ঘন চেক করা হয় তবে নীচের মতো শ্রেণি তৈরি করুন,

    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

আপনি যখন স্টার্ট লোকেশন কল করবেন, লোকেশন পরিষেবাদি যদি ব্যবহারকারী দ্বারা প্রত্যাখ্যাত হয়, লোকেশন ম্যানেজার ডেলিগেট ত্রুটি কোড locationManager:didFailWithErrorসহ - - এ কল পাবেন kCLErrorDenied। এটি iOS এর সমস্ত সংস্করণে উভয়ই কাজ করে।


ধন্যবাদ দুর্ভাগ্যবশত, যখন আমি যে চেষ্টা করেছি, এটা দেখায়: Use of unresolved identifier 'kCLErrorDenied'। ভাবনা?
ব্রেন্ডন চ্যাং

1

সুইফট ৩.০ এ

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)
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.