2015-02-03 16 views
6

मैं आईओएस स्विफ्ट में एक नौसिखिया हूं और आईओएस स्विफ्ट कोड लिख रहा हूं और अपना वेब पेज लोड करने के लिए UIWebView का उपयोग कर रहा हूं।आईओएस स्विफ्ट: उपयोगकर्ता का स्थान अनुरोध करें

और मेरा वेब पेज उपयोगकर्ता को उपयोगकर्ता स्थान सक्षम करने के लिए कहता है।

मैं आईओएस स्विफ्ट कोड में समान व्यवहार करना चाहते हैं (एक संवाद पॉपअप और कहते हैं कि कुछ की तरह "TestApp आपके स्थान पर पहुंच चाहते हैं। आप इस बात से सहमत हैं?")

मैं सिम्युलेटर और पर चल रहा हूँ मैं CLLocationManager

निम्नलिखित मेरी स्विफ्ट कोड

import UIKit 
import CoreLocation 

class ViewController: UIViewController, CLLocationManagerDelegate { 
@IBOutlet weak var customWebView: UIWebView! 


override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 
    if let url = NSURL(string: "http://ctrlq.org/maps/where/") { 
     let request = NSURLRequest(URL: url) 
     customWebView.loadRequest(request) 

     let locationManager = CLLocationManager() 
     locationManager.delegate = self 
     locationManager.desiredAccuracy = kCLLocationAccuracyBest 
     locationManager.requestAlwaysAuthorization() 
     locationManager.startUpdatingLocation() 

    } 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

} 

किसी को भी जानता है कि कैसे स्थान का अनुरोध करने के लिए है का उपयोग करते समय विफल रहा है?

अग्रिम धन्यवाद।

एरिक

+0

चेक NSHipster बाहर एक अच्छा सारांश के लिए करते हैं। उनका आलेख info.plist में कुंजी सेट करने की आवश्यकता के बारे में बात करता है: [NSHipster - i OS 8 में कोर स्थान] (http://nshipster.com/core-location-in-ios-8/) इसके अलावा, _The उपयोगकर्ता प्रॉम्प्ट में आपके ऐप की Info.plist फ़ाइल में NSLocationWhenInUseUsageDescription कुंजी से टेक्स्ट शामिल है, और इस विधि को कॉल करते समय उस कुंजी की उपस्थिति आवश्यक है। [CLLocationManager क्लास रेफरेंस] से (https://developer.apple.com/library/ आईओएस/दस्तावेज़ीकरण/कोरलोकेशन/संदर्भ/CLLocationManager_Class /) – leanne

उत्तर

5

विचारों के एक जोड़े:

  1. आप परिभाषित किया है अपने CLLocationManager एक स्थानीय चर, जो जब यह क्षेत्र से बाहर हो जाता है जारी किया जाएगा के रूप में।

    इसे एक कक्षा संपत्ति बनाएं।

  2. यदि आपको वास्तव में requestAlwaysAuthorization की आवश्यकता है, तो दस्तावेज़ में उल्लिखित अनुसार plist में NSLocationAlwaysUsageDescription सेट करना न भूलें।

    (और अगर आप हमेशा प्राधिकरण की जरूरत नहीं है, लेकिन "उपयोग में" प्राधिकरण के साथ ठीक कर रहे हैं, requestWhenInUseAuthorization फोन और NSLocationWhenInUseUsageDescription मान सेट करें।) अनुरोध करने के लिए सही तरीका और उपयोगकर्ता अद्यतन स्थान

6

(एस) CLLocationManagerDelegate के माध्यम से है।

जबकि आपका व्यू कंट्रोलर CLLocationManagerDelegate प्राप्त करता है, यह आवश्यक प्रतिनिधि कार्यों को लागू नहीं करता है। जैसा कि @Rob द्वारा उल्लिखित है, आपको स्थान प्रबंधक को क्लास प्रॉपर्टी के रूप में घोषित करना चाहिए, स्थानीय चर के रूप में नहीं।

इस प्रतिनिधि समारोह आप तर्क लागू करने के लिए अनुमति देता है/उपयोगकर्ता प्राधिकरण स्थिति बदल जाता है जब:

func locationManager(manager: CLLocationManager!, didUpdateLocations locations: [AnyObject]!) { 
    if let location = locations.first as? CLLocation { 
     // implement logic upon location change and stop updating location until it is subsequently updated 
     locationManager.stopUpdatingLocation() 
    } 
} 

:

func locationManager(manager: CLLocationManager!, didChangeAuthorizationStatus status: CLAuthorizationStatus) { 
    if status == .AuthorizedWhenInUse { 
     // authorized location status when app is in use; update current location 
     locationManager.startUpdatingLocation() 
     // implement additional logic if needed... 
    } 
    // implement logic for other status values if needed... 
} 

इस प्रतिनिधि समारोह आप तर्क लागू करने के लिए करता है, तो/जब उपयोगकर्ता स्थान बदल गया है की अनुमति देता है इसके अलावा, locationServicesEnabled() यह निर्धारित करता है कि उपयोगकर्ता की स्थान सेवाएं सक्षम हैं या नहीं।

1

आपको अपनी info.plist फ़ाइल में एक महत्वपूर्ण NSLocationWhenInUseUsageDescription जोड़ने की आवश्यकता है और उस मान में आप कुछ लिखते हैं जिसे आप पॉपअप संवाद में उपयोगकर्ता दिखाना चाहते हैं। आपको इसे वास्तविक डिवाइस पर परीक्षण करने की आवश्यकता है क्योंकि सिम्युलेटर केवल कस्टम स्थानों को स्वीकार करता है। सिम्युलेटर का चयन करें -> डीबग -> स्थान -> कस्टम स्थान ...

+1

जबकि अन्य उत्तर स्थान प्रबंधक के साथ काम करने के लिए अच्छी युक्तियां देते हैं, यह उत्तर एक "कुंजी" टुकड़ा प्रदान करता है जो ओपी शायद गायब था। Info.plist फ़ाइल में उपयुक्त कुंजी मान प्रदान करना आवश्यक है। जहां तक ​​सिम्युलेटर चला जाता है, यद्यपि - कस्टम स्थान सेटिंग के बावजूद ओपी सिम्युलेटर का उपयोग करना चाहता था, संदेश के लिए परीक्षण करना संभव है। – leanne

-1

(मान्य iOS 8 के लिए, लेकिन अभी भी) की कोशिश इस

import UIKit 
import CoreLocation 

class ViewController: UIViewController, CLLocationManagerDelegate { 


let locationManager = CLLocationManager() 

@IBOutlet weak var webview: UIWebView! 


override func viewDidLoad() { 
    super.viewDidLoad() 

    self.locationManager.delegate = self 
    self.locationManager.desiredAccuracy = kCLLocationAccuracyBest 
    self.locationManager.requestWhenInUseAuthorization() 
    self.locationManager.startUpdatingLocation() 


    let url = NSURL (string: "http://www.your-url.com"); 
    let requestObj = NSURLRequest(URL: url!); 
    webview.loadRequest(requestObj); 


} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { 

    CLGeocoder().reverseGeocodeLocation(manager.location!, completionHandler: {(placemarks, error)->Void in 

     if (error != nil) { 
      print("Error: " + error!.localizedDescription) 
      return 
     } 

     if placemarks!.count > 0 { 
      let pm = placemarks![0] as CLPlacemark 
      self.displayLocationInfo(pm) 
     } else { 
      print("Error with the data.") 
     } 
    }) 
} 

func displayLocationInfo(placemark: CLPlacemark) { 

    self.locationManager.stopUpdatingLocation() 
    print(placemark.locality) 
    print(placemark.postalCode) 
    print(placemark.administrativeArea) 
    print(placemark.country) 

} 

func locationManager(manager: CLLocationManager, didFailWithError error: NSError) { 
    print("Error: " + error.localizedDescription) 
} 
} 
1
import UIKit 
import CoreLocation 

class ViewController: UIViewController, CLLocationManagerDelegate { 


    let locationManager = CLLocationManager() 

    @IBOutlet weak var webview: UIWebView! 


    override func viewDidLoad() { 
     super.viewDidLoad() 

     self.locationManager.delegate = self 
     self.locationManager.desiredAccuracy = kCLLocationAccuracyBest 
     self.locationManager.requestWhenInUseAuthorization() 
     self.locationManager.startUpdatingLocation() 


     let url = NSURL (string: "http://www.your-url.com"); 
     let requestObj = NSURLRequest(URL: url!); 
     webview.loadRequest(requestObj); 


    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { 

     CLGeocoder().reverseGeocodeLocation(manager.location!, completionHandler: {(placemarks, error)->Void in 

      if (error != nil) { 
       print("Error: " + error!.localizedDescription) 
       return 
      } 

      if placemarks!.count > 0 { 
       let pm = placemarks![0] as CLPlacemark 
       self.displayLocationInfo(pm) 
      } else { 
       print("Error with the data.") 
      } 
     }) 
    } 

    func displayLocationInfo(placemark: CLPlacemark) { 

     self.locationManager.stopUpdatingLocation() 
     print(placemark.locality) 
     print(placemark.postalCode) 
     print(placemark.administrativeArea) 
     print(placemark.country) 

    } 

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


} 
5

आप कॉल दिखाने के कुछ इस तरह didFinishLaunchingWithOptions में

let status = CLLocationManager.authorizationStatus() 
    if status == .NotDetermined || status == .Denied || status == .AuthorizedWhenInUse { 

     // present an alert indicating location authorization required 
     // and offer to take the user to Settings for the app via 
     // UIApplication -openUrl: and UIApplicationOpenSettingsURLString 
     dispatch_async(dispatch_get_main_queue(), { 
      let alert = UIAlertController(title: "Error!", message: "GPS access is restricted. In order to use tracking, please enable GPS in the Settigs app under Privacy, Location Services.", preferredStyle: UIAlertControllerStyle.Alert) 
      alert.addAction(UIAlertAction(title: "Go to Settings now", style: UIAlertActionStyle.Default, handler: { (alert: UIAlertAction!) in 
       print("") 
       UIApplication.sharedApplication().openURL(NSURL(string:UIApplicationOpenSettingsURLString)!) 
      })) 
      // self.presentViewController(alert, animated: true, completion: nil) 
      self.window?.rootViewController?.presentViewController(alert, animated: true, completion: nil) 
     }) 

     locationManager.requestAlwaysAuthorization() 
     locationManager.requestWhenInUseAuthorization() 
    } 
संबंधित मुद्दे