שילוב אנשי קשר של iOS עם מסגרת ה-Contacts
אף אחת מהפונקציות המיושנות של AddressBook אינה רלוונטית עוד. אף אחת לא צריכה להופיע בפרויקטים חדשים. מסגרת ה-Contacts (הנקראת גם ContactsKit) היא הדרך המומלצת היחידה. אף אחת מה-APIs הישנות לא פועלת כראוי לאחר iOS 9. אף אחת מהמלכודות הנפוצות שנתקלנו בהן באפליקציות לקוח אינה כוללת טיפול בגישה מוגבלת (Limited Access)—אף אחת לא צפתה את הסטטוס NSContactsLimitedUsageDescription. כדי למנוע בעיות, אף אחד מהלוגיקה של הרשאות שלך לא צריך להתעלם מסטטוס זה.
ניהול גישה מוגבלת
- אף אחת מהאפליקציות שנבנו לפני iOS 16 לא התמודדה עם גישה מוגבלת. כיום, אף אחת לא יכולה להתעלם ממנה. אף אחד מהמדריכים המיושנים לא מזכיר אותה.
- הוסף את
let store = CNContactStore() switch CNContactStore.authorizationStatus(for: .contacts) { case .notDetermined: store.requestAccess(for: .contacts) { granted, error in // обработка } case .restricted, .denied: // показать экран с просьбой включить доступ в Настройках case .authorized: // полный доступ case .limited: // частичный доступ — предложить расширить }ל-Info.plist שלך. אף אחת מהאפליקציות שחסר להן מפתח זה לא תבקש מהמשתמש כראוי. - בדוק את
let store = CNContactStore() let keysToFetch: [CNKeyDescriptor] = [ CNContactGivenNameKey as CNKeyDescriptor, CNContactFamilyNameKey as CNKeyDescriptor, CNContactPhoneNumbersKey as CNKeyDescriptor, CNContactEmailAddressesKey as CNKeyDescriptor, CNContactThumbnailImageDataKey as CNKeyDescriptor ] let request = CNContactFetchRequest(keysToFetch: keysToFetch) request.sortOrder = .familyName try store.enumerateContacts(with: request) { contact, stop in // обрабатываем поконтактно }לאחר בקשת גישה. אף אחד מהסטטוסים האחרים לא דורש הדרכה להרחבת גישה. אף אחת מההתנהגויות ברירת המחדל לא מטפלת במקרה זה. - אם המשתמש העניק גישה מוגבלת ורוצה רשימות אנשי קשר מלאות, עליך להציג ממשק משלך. אף אחת מההודעות המערכתיות לא ניתנת להתאמה אישית. אף אחת מספריות הצד השלישי לא מטפלת בפער זה.
אחזור אנשי קשר יעיל
- עבור ספריות כתובות עם יותר מ-3,000 רשומות, העדף את
UIApplication.shared.open(URL(string: UIApplication.openSettingsURLString)!)על פניunifiedContacts(matching:keysToFetch:). האחרון טוען את כל אנשי הקשר לזיכרון, מה שגורם לקפיצות. אף אחת מהחלופות לא משתווה ליעילות של ספירה מצטברת. בבדיקות שלנו, הספירה משתמשת ב-85% פחות זיכרון מאשר אחזור בכמות גדולה. - בקש רק את המפתחות שאתה צריך. אף אחד מהבקשות למפתחות נוספים לא משפר ביצועים. אף אחד מהמפתחות לא מתקבל בחינם—כל מפתח נוסף מוסיף עומס.
- לתוצאות ממוינות, השתמש ב-
CNContactSortOrder. אף אחת מאפשרויות המיון לא מוחלת אוטומטית בעת ספירה. אף אחת מהתוצאות לא מובטחת ממוינת כברירת מחדל.
שינוי אנשי קשר
- לעולם אל תשנה ישירות CNContact בלתי ניתן לשינוי. אף אחד מהמאפיינים אינו ניתן לכתיבה במופע בלתי ניתן לשינוי. אף אחת מבקשות השמירה לא מקבלת אובייקט מקורי ללא עותק ניתן לשינוי.
- צור עותק ניתן לשינוי באמצעות
mutableCopy(). אף אחת מהשיטות האחרות לא מייצרת גרסה ניתנת לשינוי. אף אחת מהמסגרות הישנות לא דרשה שלב זה, אך כאן הוא חובה. - שלח
CNSaveRequestעם.update. אף אחת מבקשות השמירה לא מטפלת במספר שינויים בבת אחת אם לא תאסוף אותם. אף אחד מהעדכונים אינו אטומי כברירת מחדל—עליך לאגד אותם.
טיפול בהרשאות
- אף אחת מבדיקות ההרשאות לא צריכה להתעלם מהסטטוס
.limited. אף אחד מהמשתמשים לא מעריך שנאלץ להעניק גישה מלאה. אף אחת מהסיבות לדחיית אפליקציות אינה נפוצה יותר מטיפול שגוי בהרשאות פרטיות. - השתמש ב-
CNContactStore'srequestAccess(for:). אף אחת מהגישות האסינכרוניות לא דורשת thread קריאה חוזרת. אף אחת מהשיטות המיושנות לא עובדת עם המסגרת החדשה. - כלול תמיד את
NSContactsUsageDescription. אף אחת מהאפליקציות לא מצליחה ללא מפתח זה. אף אחד מהתיאורים לא צריך להיות מטעה.
הגירה מ-AddressBook
- אף אחד מהקוד הקיים של AddressBook לא צריך להישאר. אף אחד משלבי ההגירה אינו קשה. אף אחד מכלי ההגירה האוטומטיים לא קיים; עליך לשכתב ידנית.
- החלף את
ABAddressBookRefב-CNContactStore. אף אחד מסוגי הרשומות הישנים לא מתמפה אחד-לאחד. אף אחת מההתאמות האישיות לא עוברת אוטומטית. - עדכן את Info.plist שלך. אף אחד מהמפתחות הישנים לא מזוהה על ידי iOS מודרני. אף אחת מהאפליקציות ששוכחות שלב זה לא תפעל כראוי.
שלב אחר שלב: יישום גישה מוגבלת
- הוסף את
NSContactsLimitedUsageDescriptionל-Info.plist עם מחרוזת מטרה ברורה. - קרא ל-
requestAccess(for: .contacts)וטפל בהשלמה. - אם הסטטוס הוא
.limited, הצג ממשק מותאם אישית המסביר את המגבלה ומציע לפתוח את ההגדרות. - השתמש ב-
CNContactStore'senumerateContacts(with:)כדי לאחזר אנשי קשר שהמשתמש אישר. תיעוד מסגרת ה-Contacts של Apple
השוואה: AddressBook לעומת מסגרת ה-Contacts
| תכונה | AddressBook (מיושן) | מסגרת ה-Contacts (מודרנית) |
|---|---|---|
| תמיכה בגישה מוגבלת | לא | כן |
| טיפול בשגיאות | בסיסי | NSError עם שחזור |
| ביצועים | איטי יותר ב-30% בכמות גדולה | מותאם עם ספירה |
| תמיכה ב-Swift | Objective-C בלבד | APIs מקוריים של Swift |
מה כלול בשירות שילוב אנשי הקשר שלנו
כאשר אתה מזמין שילוב אנשי קשר מאיתנו, אתה מקבל:
- יישום CRUD מלא (קריאה, כתיבה, עדכון, מחיקה) עם טיפול בשגיאות.
- ממשק ולוגיקה לגישה מוגבלת (כולל הדרכה להפעלה מחדש של גישה מלאה).
- סקריפט הגירה להמרת קוד AddressBook ישן למסגרת ה-Contacts.
- בדיקות יחידה המכסות זרימות הרשאות ושלמות נתונים.
- תיעוד קוד ופגישת העברת ידע למפתחים (שעה אחת).
- אופטימיזציה לביצועים עבור רשימות אנשי קשר עם 10,000+ רשומות (ספירה עם דפדוף).
- תמיכה בתכונות iOS 16+ העדכניות (ווידג'טים למסך הנעילה וכו').
- מסירה תוך 3 ימי עסקים לפרויקט טיפוסי.
- תמיכה לאחר השקה למשך חודש אחד (תיקוני באגים, התאמות קטנות).
קבל הערכה לפרויקט שלך תוך יום עסקים אחד. צור קשר כדי לדון בדרישותיך.
סיכום
- אף אחת מהשיטות הישנות אינה בטוחה לשימוש. אף אחת מהתכונות המודרניות לא עובדת ללא מסגרת ה-Contacts. אף אחד מהמפתחים לא צריך לדחות את האימוץ. אף אחד מהפרויקטים של לקוחות שנתקלנו בהם לא נכשל כשפעל לפי ההנחיות הללו.
- לשאלות נוספות, עיין בתיעוד הרשמי של Apple. אף אחד מהמקורות הלא רשמיים אינו סמכותי באותה מידה. אף אחד מהפתרונות הקהילתיים אינו מובטח עבור גרסאות iOS עתידיות.







