الحصول على موقع المستخدم
استقبل تحديثات الموقع باستخدام CLLocationManager.
الحصول على موقع المستخدم درس مجاني في Swift Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Swift Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Swift Academy 4 دروس في المجموع.
بدء تحديثات الموقع
بعد الحصول على التفويض، استدعِ startUpdatingLocation() لبدء استقبال تدفق مستمر من قراءات الموقع. يسلّم المدير هذه القراءات عبر المفوّض. استدعِ دائمًا stopUpdatingLocation() عندما لا تعود بحاجة إليها لتوفير طاقة البطارية.
manager.startUpdatingLocation()
// ... later
manager.stopUpdatingLocation()استقبال المواقع في المفوّض
تصل القراءات الجديدة في locationManager(_:didUpdateLocations:). وتكون المصفوفة مرتبة من الأقدم إلى الأحدث، لذا فإن العنصر الأخير هو الموقع الأحدث.
func locationManager(_ m: CLLocationManager,
didUpdateLocations locations: [CLLocation]) {
guard let latest = locations.last else { return }
print(latest.coordinate.latitude, latest.coordinate.longitude)
}كائن CLLocation
كل قراءة هي كائن CLLocation يحتوي على ما هو أكثر بكثير من الإحداثيات: coordinate وaltitude وspeed وcourse وtimestamp وقيم الدقة. افحص هذه القيم لتقرر ما إذا كانت القراءة دقيقة بما يكفي.
func describe(_ loc: CLLocation) {
print("lat:", loc.coordinate.latitude)
print("lon:", loc.coordinate.longitude)
print("alt:", loc.altitude)
print("when:", loc.timestamp)
}الدقة المطلوبة
عيّن desiredAccuracy لإخبار Core Location بمدى دقة قراءات الموقع المطلوبة. تستهلك الدقة الأعلى طاقة أكبر. وتشمل الثوابت kCLLocationAccuracyBest وkCLLocationAccuracyNearestTenMeters وkCLLocationAccuracyHundredMeters وkCLLocationAccuracyKilometer.
manager.desiredAccuracy = kCLLocationAccuracyNearestTenMetersمرشّح المسافة
استخدم distanceFilter لمنع التحديثات إلى أن يتحرك الجهاز مسافة دنيا محددة بالأمتار. يقلل ذلك الضوضاء ويوفر الطاقة في حالات الاستخدام التي لا تحتاج إلى تسجيل كل حركة صغيرة.
manager.distanceFilter = 50 // metersتقييم جودة القراءة
تمثل الخاصية horizontalAccuracy نصف قطر الثقة بالأمتار. وتشير القيمة السالبة إلى أن القراءة غير صالحة. ارفض أيضًا القراءات القديمة بالتحقق من مدى قِدم timestamp.
func isUsable(_ loc: CLLocation) -> Bool {
guard loc.horizontalAccuracy >= 0 else { return false }
let age = -loc.timestamp.timeIntervalSinceNow
return age < 15 && loc.horizontalAccuracy < 100
}طلب قراءة موقع واحدة
إذا كنت تحتاج إلى قراءة واحدة فقط، وليس تدفقًا مستمرًا، فاستدعِ requestLocation(). يسلّم المدير موقعًا واحدًا إلى المفوّض، ثم يتوقف تلقائيًا. وهذا أوفر للبطارية من بدء تحديثات مستمرة.
manager.requestLocation()التعامل مع أخطاء الموقع
تصل حالات الفشل في locationManager(_:didFailWithError:). ومن الحالات الشائعة CLError.locationUnknown، وهي غالبًا مؤقتة — لذا واصل الانتظار. أما CLError.denied فتعني سحب الإذن، وعندها يجب التوقف.
func locationManager(_ m: CLLocationManager,
didFailWithError error: Error) {
if let clErr = error as? CLError, clErr.code == .denied {
m.stopUpdatingLocation()
}
}مراقبة التغييرات الكبيرة
لإجراء تتبع تقريبي منخفض استهلاك الطاقة يمكنه إيقاظ تطبيقك في الخلفية، استخدم startMonitoringSignificantLocationChanges(). لا يُطلَق هذا التحديث إلا بعد تحرك الجهاز لمسافة تقارب 500 متر، وهو مثالي للميزات المعتمدة على المناطق.
manager.startMonitoringSignificantLocationChanges()الاتجاه والمسار
بالنسبة إلى ميزات البوصلة، يسلّم startUpdatingHeading() الاتجاه المغناطيسي أو الحقيقي عبر locationManager(_:didUpdateHeading:). لاحظ أن CLLocation.course، أي اتجاه الحركة، يختلف عن الاتجاه الذي يعبّر عن وضعية الجهاز.
func locationManager(_ m: CLLocationManager,
didUpdateHeading newHeading: CLHeading) {
print("Heading:", newHeading.trueHeading)
}حساب المسافة بين النقاط
يمكن لـ CLLocation قياس المسافة بخط مستقيم إلى موقع آخر باستخدام distance(from:)، مع إرجاع القيمة بالأمتار. وهذا مفيد لمنطق القرب من دون الحاجة إلى واجهة خريطة.
let a = CLLocation(latitude: 41.0, longitude: 28.9)
let b = CLLocation(latitude: 41.1, longitude: 29.0)
let meters = a.distance(from: b)
print("Distance:", meters)اختبار سريع: الحصول على الموقع
اختبر مدى إلمامك باستقبال قراءات الموقع.
مراجعة: الحصول على موقع المستخدم
أصبحت تعرف الآن كيفية الحصول على الإحداثيات:
- استخدم
startUpdatingLocation()للحصول على تدفق مستمر، وrequestLocation()للحصول على قراءة واحدة. - اقرأ أحدث قراءة من
locations.lastداخل المفوّض. - اضبط
desiredAccuracyوdistanceFilterلتحقيق التوازن بين استهلاك الطاقة والدقة. - تحقّق من
horizontalAccuracyوtimestampقبل استخدام القراءة.
الأسئلة الشائعة
هل درس «الحصول على موقع المستخدم» مجاني؟
نعم — نص درس «الحصول على موقع المستخدم» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Swift Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Swift Academy 4 دروس في المجموع.
ماذا ستتعلم في «الحصول على موقع المستخدم»؟
استقبل تحديثات الموقع باستخدام CLLocationManager. تتمرن على Swift Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Swift Academy؟
لا تُشترط خبرة سابقة. Swift Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «الحصول على موقع المستخدم»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Swift Academy هذا؟
نعم. كل درس في Swift Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- طلب إذن الموقع
- الحصول على موقع المستخدم
- عرض الخرائط في SwiftUI
- الترميز الجغرافي والمناطق