طلب إذن الموقع
تعامل مع الأذونات والخصوصية بشكل صحيح.
طلب إذن الموقع درس مجاني في Swift Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Swift Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Swift Academy 4 دروس في المجموع.
لماذا يحتاج الموقع إلى إذن
على منصات Apple، يُعد الوصول إلى موقع المستخدم عملية حساسة من ناحية الخصوصية. يجب على تطبيقك طلب التفويض صراحةً قبل أن يزوّد Core Location التطبيق بأي إحداثيات. يعرض النظام مربع حوار لطلب الإذن في المرة الأولى التي تطلب فيها ذلك.
- يمنح المستخدم التفويض لكل تطبيق على حدة.
- لا يمكنك تجاوز ذلك برمجيًا.
import CoreLocation
let manager = CLLocationManager()مفاتيح أوصاف الاستخدام في Info.plist
قبل طلب التفويض، يجب إضافة سلسلة لوصف الاستخدام إلى Info.plist. تظهر هذه السلاسل للمستخدم في مربع حوار طلب الإذن. والمفتاحان الأساسيان هما:
NSLocationWhenInUseUsageDescription— للوصول أثناء استخدام التطبيق فقط.NSLocationAlwaysAndWhenInUseUsageDescription— للوصول في الخلفية أيضًا.
يؤدي حذف المفتاح المناسب إلى فشل الطلب بصمت أو إلى تعطل التطبيق.
<!-- Info.plist -->
<key>NSLocationWhenInUseUsageDescription</key>
<string>We use your location to show nearby places.</string>إنشاء CLLocationManager
يُعد CLLocationManager الكائن الأساسي الذي ينسّق خدمات الموقع. أنشئ مثيلًا واحدًا، واحتفظ بمرجع قوي إليه، وعيّن مفوّضًا لاستقبال عمليات الاستدعاء.
final class LocationService: NSObject {
let manager = CLLocationManager()
override init() {
super.init()
manager.delegate = self
}
}طلب التفويض أثناء الاستخدام
استدعِ requestWhenInUseAuthorization() لطلب الوصول أثناء استخدام التطبيق. يعرض النظام مربع الحوار مرة واحدة فقط؛ وبعد ذلك يتذكر الاختيار. وإذا كانت الحالة قد حُسمت من قبل، فلن يفعل الاستدعاء شيئًا.
func requestPermission() {
manager.requestWhenInUseAuthorization()
}طلب التفويض الدائم
للحصول على تحديثات في الخلفية، مثل تحديد المناطق الجغرافية والتتبع المستمر، استدعِ requestAlwaysAuthorization(). تشترط Apple الحصول أولًا على تفويض أثناء الاستخدام، ثم الترقية إلى التفويض الدائم. استخدم هذا الخيار باعتدال، واذكر مبرره في وصف الاستخدام.
func requestAlways() {
manager.requestAlwaysAuthorization()
}قراءة حالة التفويض
توجد حالة الإذن الحالية في manager.authorizationStatus، وهي خاصية مثيل في iOS 14 والإصدارات الأحدث. وتشمل القيم الممكنة .notDetermined و.denied و.restricted و.authorizedWhenInUse و.authorizedAlways.
let status = manager.authorizationStatus
switch status {
case .notDetermined: print("Ask the user")
case .denied, .restricted: print("No access")
case .authorizedWhenInUse, .authorizedAlways: print("Good to go")
@unknown default: break
}مفوّض CLLocationManager
تُسلَّم تغييرات التفويض بشكل غير متزامن عبر المفوّض. نفّذ locationManagerDidChangeAuthorization(_:) للاستجابة عندما يتخذ المستخدم قرارًا. لا تفترض أبدًا منح الإذن فورًا بعد استدعاء طلب التفويض.
extension LocationService: CLLocationManagerDelegate {
func locationManagerDidChangeAuthorization(_ manager: CLLocationManager) {
switch manager.authorizationStatus {
case .authorizedWhenInUse, .authorizedAlways:
manager.startUpdatingLocation()
default:
print("Not authorized")
}
}
}التعامل مع حالتي الرفض والتقييد
إذا رفض المستخدم الوصول، فلا يمكنك عرض طلب الإذن مرة أخرى. بدلًا من ذلك، تحقّق من .denied ووجّه المستخدم إلى الإعدادات. تعني .restricted أن الوصول محظور بسبب أدوات الرقابة الأبوية أو ملف تعريف MDM، ولا يمكن أيضًا معالجة ذلك من داخل التطبيق.
func handle(_ status: CLAuthorizationStatus) {
if status == .denied {
// Deep-link the user to Settings > Privacy > Location
print("Open Settings to enable location")
}
}تفويض الدقة (دقيقة أم مخفّضة)
منذ iOS 14، يمكن للمستخدمين منح دقة مخفّضة (تقريبية) فقط. تحقّق من manager.accuracyAuthorization. وإذا كنت تحتاج فعلًا إلى بيانات دقيقة، مثل التوجيه خطوة بخطوة، فاستدعِ requestTemporaryFullAccuracyAuthorization(withPurposeKey:) باستخدام مفتاح معرّف في Info.plist.
if manager.accuracyAuthorization == .reducedAccuracy {
manager.requestTemporaryFullAccuracyAuthorization(
withPurposeKey: "PreciseForNavigation"
)
}التحقق من تفعيل خدمات الموقع
إضافةً إلى إذن التطبيق، يمكن أن يكون مفتاح خدمات الموقع على مستوى الجهاز متوقفًا. تحقّق من CLLocationManager.locationServicesEnabled() في طابور خلفي، إذ قد يؤدي استدعاؤه في الخيط الرئيسي إلى حظره. وإذا كانت الخدمة متوقفة، فلن يتلقى أي تطبيق بيانات الموقع.
DispatchQueue.global().async {
if CLLocationManager.locationServicesEnabled() {
print("System location is on")
} else {
print("System location is off")
}
}تدفق تفويض كامل
لجمع الخطوات معًا: أنشئ المدير، وعيّن المفوّض، واطلب التفويض أثناء الاستخدام، ثم ابدأ التحديثات داخل استدعاء التفويض. هذا هو النمط المعتمد لأي ميزة تعتمد على الموقع.
final class LocationService: NSObject, CLLocationManagerDelegate {
let manager = CLLocationManager()
override init() {
super.init()
manager.delegate = self
manager.requestWhenInUseAuthorization()
}
func locationManagerDidChangeAuthorization(_ m: CLLocationManager) {
if m.authorizationStatus == .authorizedWhenInUse {
m.startUpdatingLocation()
}
}
}اختبار سريع: التفويض
اختبر فهمك لتدفق التفويض.
مراجعة: طلب التفويض
تعلّمت كيفية طلب إذن الموقع بأمان:
- أضف
NSLocationWhenInUseUsageDescription، ومتغير Always إذا لزم الأمر، إلى Info.plist. - أنشئ
CLLocationManager، واحتفظ بمرجع قوي إليه، وعيّن مفوّضه. - استدعِ
requestWhenInUseAuthorization()، ثم صعّد التفويض إلى Always فقط إذا كان ذلك مطلوبًا. - استجب داخل
locationManagerDidChangeAuthorization(_:)، وتعامل مع حالات الرفض والتقييد والدقة المخفّضة.
الأسئلة الشائعة
هل درس «طلب إذن الموقع» مجاني؟
نعم — نص درس «طلب إذن الموقع» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Swift Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Swift Academy 4 دروس في المجموع.
ماذا ستتعلم في «طلب إذن الموقع»؟
تعامل مع الأذونات والخصوصية بشكل صحيح. تتمرن على Swift Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Swift Academy؟
لا تُشترط خبرة سابقة. Swift Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «طلب إذن الموقع»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Swift Academy هذا؟
نعم. كل درس في Swift Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.