سؤال

لقد كنت أحاول الحصول على هذا العمل لحظة الآن, ولقد جئت إلى هنا أن نسأل-كيف أذهب مع استخدام أساليب كلوكاتيونماناجيرديليغات في سويفت?لقد وضعت هذا في الجزء العلوي من صفي:

var locationManager = CLLocationManager()

لقد وضعت ما يلي في بلدي viewDidLoad الطريقة:

locationManager.delegate = self
locationManager.distanceFilter = kCLDistanceFilterNone
locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.startUpdatingLocation()

ولقد حاولت استخدام هذه الأساليب مندوب دون جدوى:

func locationManager(manager: CLLocationManager!, didUpdateLocations locations: AnyObject[]!) {
    locationReceived = true
}

func locationManager(manager: CLLocationManager!, didFailWithError error: NSError!) {
    locationReceived = false
}

لقد حاولت أيضا استخدام @اختياري أمام وظائف ، ولكن كسكودي ثم يلقي خطأ مترجم.أي أفكار?

هل كانت مفيدة؟

المحلول

تحتاج إلى إضافة NSLocationAlwaysUsageDescription أو NSLocationWhenInUseUsageDescription مفتاح بليست الخاص بك إذا لم تكن قد قمت بذلك بالفعل ، فهي الآن إلزامية,


يتطلب إوس 8+ واحدة من هاتين السلسلتين ليتم تعيينها لاستخدام المواقع.أي واحد تستخدمه يعتمد على الطريقة التي تنوي بها طلب الموقع.

  • استخدام NSLocationAlwaysUsageDescription للتطبيقات التي تريد استخدام موقع الجهاز حتى عندما لا يكون التطبيق مفتوحا ويتم استخدامه.

  • استخدام NSLocationWhenInUseUsageDescription للتطبيقات التي تريد استخدام موقع الجهاز فقط عندما يكون التطبيق مفتوحا ومستخدما.

ملاحظة: عند إضافة السلاسل ، قبل بناء وتشغيل ، حذف التطبيق من جهازك والسماح لها القيام تثبيت جديد.يبدو أنه إذا تم تفويض التطبيق لاستخدام المواقع قبل الترقية إلى إوس 8 فإنه لا يطلب إذنك مرة أخرى ولا يرى أنك قمت بتعيين هذه السلاسل.القيام بحذف وتثبيت نظيف يحل هذا.

يؤدي تعيين أي من السلاسل إلى ظهور نافذة منبثقة عند التثبيت / الاستخدام الأول على غرار:"السماح" لهذا التطبيق "بالوصول إلى موقعك حتى عندما لا تستخدم التطبيق"

وهنا لقطة شاشة من بليست ملف.

enter image description here

نصائح أخرى

أولا إضافة هذا الخط اثنين في ملف بليست

1) نسلوكاتيونوينيوسوساجيدسكريبتيون

2) نسلوكاتيونالوايسوساجيدسكريبتيون

import CoreLocation

class ViewController: UIViewController, CLLocationManagerDelegate

var seenError : Bool = false
var locationFixAchieved : Bool = false
var locationStatus : NSString = "Not Started"

var locationManager: CLLocationManager!

override func viewDidLoad() {
    super.viewDidLoad()
}

  func initLocationManager() {
   seenError = false
   locationFixAchieved = false
    locationManager = CLLocationManager()
   locationManager.delegate = self
   locationManager.locationServicesEnabled
   locationManager.desiredAccuracy = kCLLocationAccuracyBest
    locationManager.requestAlwaysAuthorization()
}

  func locationManager(manager: CLLocationManager!, didFailWithError error: NSError!) {
    locationManager.stopUpdatingLocation()
    if (error) {
        if (seenError == false) {
            seenError = true
           print(error)
        }
    }
}

func locationManager(manager: CLLocationManager!, didUpdateLocations locations: AnyObject[]!) {
    if (locationFixAchieved == false) {
        locationFixAchieved = true
        var locationArray = locations as NSArray
        var locationObj = locationArray.lastObject as CLLocation
        var coord = locationObj.coordinate

        println(coord.latitude)
        println(coord.longitude)
    }
}

 func locationManager(manager: CLLocationManager!,
    didChangeAuthorizationStatus status: CLAuthorizationStatus) {
        var shouldIAllow = false

        switch status {
        case CLAuthorizationStatus.Restricted:
            locationStatus = "Restricted Access to location"
        case CLAuthorizationStatus.Denied:
            locationStatus = "User denied access to location"
        case CLAuthorizationStatus.NotDetermined:
            locationStatus = "Status not determined"
        default:
            locationStatus = "Allowed to location Access"
            shouldIAllow = true
        }
        NSNotificationCenter.defaultCenter().postNotificationName("LabelHasbeenUpdated", object: nil)
        if (shouldIAllow == true) {
            NSLog("Location to Allowed")
            // Start location services
            locationManager.startUpdatingLocation()
        } else {
            NSLog("Denied access: \(locationStatus)")
        }
}

للحصول على الموقع الحالي للمستخدم :-

الخطوة 1: let locationManager = CLLocationManager() // make object of CLLocationManager class.

الخطوة 2: In viewDidLoad instantiate the CLLocationManager class like,

// للاستخدام في الخلفية

self.locationManager.requestAlwaysAuthorization()

// For use in foreground

self.locationManager.requestWhenInUseAuthorization()

if (CLLocationManager.locationServicesEnabled())
{
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters
locationManager.startUpdatingLocation()
}

الخطوة 3: الآن تنفيذ أساليب مندوب من CLLocationManager

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

    var locValue:CLLocationCoordinate2D = manager.location.coordinate

    println("locations = \(locValue.latitude) \(locValue.longitude)")

  }

الخطوة 4: لا تنس أن تضيف NSLocationAlwaysUsageDescription في المعلومات.بليست كما هو الحال في دائرة الرقابة الداخلية 8 هو إلزامي لإضافة هذا.سيطلب هذا الإذن لاستخدام موقع المستخدم.

كان لدي نفس المشكلة.ديدوبداتيلوكاتيونس - لم يكن يعمل.تشغيل التطبيق الخاص بك.انتقل إلى صفحة الإعدادات -> الخصوصية -> الموقع وقم بإيقاف تشغيل خدمات الموقع.ديدفيلويثرور سوف قبض على الخطأ حول خدمات الموقع غائبة.ثم قم بتشغيله.منذ تلك اللحظة ديدوبداتيلوكاتيونس سوف قبض المواقع.

هذا هو قليلا من موضوع القديم ، ولكن أيا من أعلاه عملت بالنسبة لي على سويفت 2.2 كسكودي 7.3.1.

المشكلة هي أنني كنت أستخدم:

func locationManager(manager: CLLocationManager!, didUpdateLocation locations: [AnyObject]!) {
    print("Got location")
    locationManager.stopUpdatingLocation()
}

وهذا لم يحصل دعا.عندما تغيرت إلى:

func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    print("Got location")
    locationManager.stopUpdatingLocation()
}

عملت كل شيء.يبدو أن المندوب لا يسمى عند استخدام [أنيوبجيكت]

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top