تنفيذ طرق كلوكاتيونماناجيرديليغات في سويفت
-
21-12-2019 - |
سؤال
لقد كنت أحاول الحصول على هذا العمل لحظة الآن, ولقد جئت إلى هنا أن نسأل-كيف أذهب مع استخدام أساليب كلوكاتيونماناجيرديليغات في سويفت?لقد وضعت هذا في الجزء العلوي من صفي:
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 فإنه لا يطلب إذنك مرة أخرى ولا يرى أنك قمت بتعيين هذه السلاسل.القيام بحذف وتثبيت نظيف يحل هذا.
يؤدي تعيين أي من السلاسل إلى ظهور نافذة منبثقة عند التثبيت / الاستخدام الأول على غرار:"السماح" لهذا التطبيق "بالوصول إلى موقعك حتى عندما لا تستخدم التطبيق"
وهنا لقطة شاشة من بليست ملف.
نصائح أخرى
أولا إضافة هذا الخط اثنين في ملف بليست
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()
}
عملت كل شيء.يبدو أن المندوب لا يسمى عند استخدام [أنيوبجيكت]