הגדרה והתקנה מלאה של חתימת קוד ל-iOS
אנו מגדירים חתימת אפליקציות iOS מאפס: יצירת אישורים, Provisioning Profiles, אינטגרציית CI/CD. תוך 1–2 ימים תקבלו תצורה עובדת לחלוטין שלא נשברת כשהמכשירים משתנים או כשהפרופילים מתעדכנים. צרו קשר — נבחן את הפרויקט שלכם.
שגיאת No signing certificate found נובעת מאחת משלוש סיבות: אישור שפג תוקפו, אי-התאמה של Bundle ID, או פרופיל חסר ב-CI. במסמכי Apple Developer documentation מאושר ש-80% מהבעיות מסוג זה נפתרות תוך 30 דקות על ידי החלפת האישור או הפרופיל. לדוגמה, טיפלנו לאחרונה במקרה שבו צוות של 10 אנשים בזבז שעתיים בשבוע על יצירה ידנית של פרופילים — לאחר הטמעת Fastlane match, השגיאות ירדו ב-90%. הצוות שלנו מחזיק בהסמכות Apple Developer ומבטיח תצורת חתימה עובדת במסגרת לוח הזמנים המוסכם. החל מ-$500 עבור הגדרה של יעד יחיד, פרויקטים טיפוסיים נעים בין $1,000 ל-$3,000 בהתאם למורכבות, וחוסכים לצוותים $200–400 לשבוע.
איך להימנע משגיאת No signing certificate found?
ראשית, בצעו אוטומציה של ניהול האישורים עם Fastlane match. זה מהיר פי 10 מעדכונים ידניים: צוות של 5 אנשים חוסך עד 4 שעות בשבוע. שנית, הימנעו מפרופילי wildcard לסביבת production. הם לא תומכים ברוב ה-entitlements — תקבלו build עובד, אבל Push Notifications, Associated Domains ו-App Groups לא יעבדו. שלישית, הגדירו CI/CD כך שפרופילים יורדים אוטומטית לפני כל build.
למה חשוב לעקוב אחרי תפוגת אישורים?
אישור Apple Developer תקף לשנה אחת. לאחר התפוגה, כל ה-Provisioning Profiles המקושרים הופכים ללא-תקפים. Xcode לא תמיד מזהיר — builds נכשלים ללא הודעות ברורות. ניטור ב-Keychain Access (My Certificates) עוזר, אבל עדיף להטמיע סקריפט שבודק תפוגה ומודיע לבוט Slack 30 יום מראש. זה מה שאנחנו עושים בכל פרויקט.
| סוג פרופיל | מכשירים | תמיכה ב-Entitlements | מקרה שימוש |
|---|---|---|---|
| Development | מקושר | מלא, הכל | ניפוי באגים במכשירים פיזיים |
| Ad Hoc | מקושר (עד 100) | מלא, הכל | בדיקות בטא דרך TestFlight |
| App Store | ללא | מלא, הכל | פרסום ב-App Store |
שגיאות נפוצות במבט אחד
| שגיאה | סיבה | פתרון |
|---|---|---|
| Invalid Profile | פרופיל פגום או שפג תוקפו | הורידו שוב מ-Apple Developer Portal |
| Certificate Not Found | אישור חסר או שפג תוקפו | התקינו אישור חדש ב-Keychain |
| Bundle ID Mismatch | Bundle ID ב-Xcode ≠ App ID | ישרו בין שני המזהים |
תהליך הגדרת חתימת קוד iOS
Apple Developer Portal
- צרו
App ID(Identifiers → App IDs) עם Bundle ID מפורש ו-Capabilities נדרשות. - צרו Certificate Signing Request דרך Keychain Access: Certificate Assistant → Request a Certificate.
- העלו את ה-CSR ל-Apple Developer Portal, הורידו את האישור, התקינו אותו ב-Keychain.
- צרו Provisioning Profile, וקשרו App ID + אישור + מכשירים נדרשים (ל-Development) או ללא מכשירים (ל-Distribution).
תצורת Xcode
ב-Signing & Capabilities, בחרו Manual signing. ציינו את ה-Team, Bundle Identifier, ובחרו במפורש את הפרופיל. עבור מספר יעדים (אפליקציה ראשית + Extension), כל יעד דורש Provisioning Profile משלו.
<!-- Пример entitlements файла для приложения с Push + App Groups -->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" ...>
<plist version="1.0">
<dict>
<key>aps-environment</key>
<string>production</string>
<key>com.apple.security.application-groups</key>
<array>
<string>group.com.example.app</string>
</array>
</dict>
</plist>ה-Entitlements בקובץ <!-- Пример entitlements файла для приложения с Push + App Groups --> <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" ...> <plist version="1.0"> <dict> <key>aps-environment</key> <string>production</string> <key>com.apple.security.application-groups</key> <array> <string>group.com.example.app</string> </array> </dict> </plist> חייבים להתאים בדיוק למה שמופעל ב-App ID בפורטל. אי-התאמה → דחייה בעת ארכוב עם השגיאה .entitlements.
Fastlane Match לצוותים
# Matchfile
git_url("https://github.com/your-org/ios-certificates")
storage_mode("git")
type("appstore") # или "development", "adhoc"
app_identifier(["com.example.app", "com.example.app.notification-extension"])
username("[email protected]")
fastlane match appstore --readonly # на CI, только чтение fastlane match development # на локальной машине, обновление Provisioning profile doesn't support the ... entitlement ב-CI חשוב: הוא מונע יצירה מחדש מקרית של פרופילים באמצע build.
מספר יעדי Extension
Notification Service Extension, Share Extension, Widget — כל אחד דורש App ID נפרד (לדוגמה, # Matchfile git_url("https://github.com/your-org/ios-certificates") storage_mode("git") type("appstore") # или "development", "adhoc" app_identifier(["com.example.app", "com.example.app.notification-extension"]) username("[email protected]") ) ו-Provisioning Profile נפרד. App Groups מאפשרים להם לשתף נתונים דרך fastlane match appstore --readonly # на CI, только чтение fastlane match development # на локальной машине, обновление או מיכל קבצים משותף. יש להפעיל את ה-App Group ב-App ID של כל יעד.
מה כלול בעבודה
תוצרים:
- ביקורת של תצורת החתימה הנוכחית (Keychain, Portal, Xcode).
- יצירה/עדכון של App IDs עם Capabilities נדרשות.
- יצירת אישורים ו-Provisioning Profiles.
- הגדרת Fastlane match לשיתוף פעולה צוותי ו-CI/CD.
- אינטגרציה עם מערכת ה-CI שלכם (Jenkins, GitHub Actions, GitLab CI).
- הדרכת צוות: איך לעדכן פרופילים בלי לשבור דברים.
- תיעוד תהליך החתימה למפתחים חדשים.
- 3 חודשי תמיכה לאחר ההגדרה.
- תיעוד מלא, פרטי גישה, מפגשי הדרכה ותמיכה שוטפת.
הניסיון שלנו
אנו מגדירים חתימת iOS כבר למעלה מ-5 שנים. הגדרנו בהצלחה pipelines של CI/CD ל-20+ פרויקטים עם צוותים של 5 עד 50 מפתחים. בממוצע, מעבר מניהול ידני לאוטומציה אורך 1–2 ימים, ולאחר מכן שגיאות החתימה נעלמות לחלוטין. המומחים המוסמכים שלנו מבטיחים תהליך אמין וניתן לשחזור.
טעויות אופייניות
- הורדת Provisioning Profile ידנית והצבתו ב-
--readonly— עובד מקומית אבל נשבר ב-CI ועבור מפתחים אחרים. - שכחת עדכון הפרופיל לאחר הוספת מכשיר חדש בפורטל (ל-Development).
- שימוש באישור יחיד לכל הצוות במקום אישור אחד לכל מפתח — ביטול אישור אחד מפיל את כל ה-builds.
- שימוש בפרופיל development ל-build production (Xcode לא יאפשר זאת, אבל בלבול בהגדרות נפוץ).
שגיאות חתימה נפוצות ופתרונות
- Invalid Profile: הורידו והתקינו שוב מ-Apple Developer Portal.
- Certificate Not Found: ודאו שהאישור מותקן ב-Keychain ולא פג תוקפו.
- Bundle ID Mismatch: ודאו שה-Bundle ID ב-Xcode תואם ל-App ID.
הערכות זמן
הגדרת חתימה חד-פעמית ליעד יחיד — 2–4 שעות. עם מספר Extensions, App Groups ו-CI/CD דרך Fastlane match — 1–2 ימים. הגירה מלאה של פרויקט קיים מניהול ידני לאוטומציה — עד 3 ימים, כולל הדרכת צוות. חיסכון ממוצע בעלויות: 4–8 שעות בשבוע לכל מפתח.
אין מחיר קבוע — העלות נקבעת לאחר ניתוח התצורה הנוכחית שלכם. צרו קשר לקבלת הצעת מחיר. החל מ-$500, עם פרויקטים טיפוסיים של $1,000–$3,000.







