Πιστοποιητικό iOS και provisioning profile με Expo
Από Mehdi Azizi
Δημοσιεύτηκε στις , 9 λ.
Το πιστοποιητικό δείχνει ποιος υπογράφει την app σου, το profile ποια app και σε ποια iPhone. Με Expo, το EAS φτιάχνει και ανανεώνει και τα δύο.
Ένα πιστοποιητικό προγραμματιστή iOS αποδεικνύει ποιος υπέγραψε την app σου. Το provisioning profile συνδέει αυτό το πιστοποιητικό με μια συγκεκριμένη app και λέει πού επιτρέπεται να τρέχει. Με το Expo σχεδόν ποτέ δεν χρειάζεται να τα φτιάξεις με το χέρι: το EAS τα δημιουργεί, τα αποθηκεύει και τα ανανεώνει όταν ξεκινάς ένα build.
Αξίζει πάντως να καταλαβαίνεις τι κάνει κάθε αρχείο. Τη μέρα που ένα build δεν εγκαθίσταται ή μια αποστολή κολλάει, αυτή η γνώση σού γλιτώνει μια ολόκληρη μέρα. Αυτός ο οδηγός περνάει από τα τέσσερα στοιχεία, πόσο διαρκούν, τα όρια της Apple και τα συνηθισμένα λάθη, με τη λύση για το καθένα.
Δημοσιεύω τις iOS apps μου με Expo και EAS, ανάμεσά τους το Solys και το TradaZen. Η πλήρης διαδρομή υπάρχει στο δημοσίευση iOS app χωρίς Mac. Εδώ ανοίγουμε το καπό της υπογραφής.
Γιατί η Apple απαιτεί υπογραφή
Μια iOS app πρέπει να είναι υπογεγραμμένη για να εγκατασταθεί σε iPhone ή να σταλεί στο App Store Connect. Η υπογραφή εγγυάται ότι η app προέρχεται από προγραμματιστή γνωστό στην Apple και ότι κανείς δεν την έχει αλλάξει από τότε.
Για το App Store υπάρχει μια καθησυχαστική λεπτομέρεια. Σύμφωνα με το τεχνικό σημείωμα TN3161 της Apple, το App Store ελέγχει ότι το πιστοποιητικό διανομής σου είναι έγκυρο κατά την αποστολή, μετά ξαναϋπογράφει την app, η οποία από εκεί και πέρα δεν εξαρτάται από την ημερομηνία λήξης του πιστοποιητικού σου. Άρα τα πιστοποιητικά σου πρέπει να είναι έγκυρα τη στιγμή της αποστολής, όχι σε όλη τη ζωή της app.
Τα τέσσερα στοιχεία που πρέπει να ξέρεις
Η τεκμηρίωση του Expo για τα credentials μετράει τρία για το iOS: το πιστοποιητικό διανομής, τα profiles και το κλειδί push ειδοποιήσεων. Προσθέτω και το αναγνωριστικό της app, χωρίς το οποίο δεν υπάρχει κανένα profile.
Το πιστοποιητικό διανομής
Είναι η υπογραφή σου ως προγραμματιστή. Η βοήθεια της Apple για τα πιστοποιητικά ξεχωρίζει δύο οικογένειες:
- Apple Development: για να τρέχεις την app στις συσκευές σου κατά την ανάπτυξη. Ανήκει σε ένα πρόσωπο.
- Apple Distribution: για διανομή σε συγκεκριμένες συσκευές δοκιμών ή για αποστολή στο App Store Connect. Ανήκει στην ομάδα, και μόνο ο κάτοχος του λογαριασμού ή ένας admin μπορεί να το δημιουργήσει.
Το πιστοποιητικό διανομής δεν αφορά καμία συγκεκριμένη app: το ίδιο υπογράφει όλες τις apps σου. Συνοδεύεται από ένα ιδιωτικό κλειδί, και αυτό είναι που επιτρέπει την υπογραφή. Σύμφωνα με το TN3161, ένα πιστοποιητικό Apple ισχύει συνήθως έναν χρόνο από τη δημιουργία του.
Το αναγνωριστικό της app (App ID)
Το App ID αναγνωρίζει την app σου μέσα σε ένα profile. Βασίζεται στο bundle identifier σου, για παράδειγμα com.example.myapp (φανταστικό παράδειγμα). Σύμφωνα με τη βοήθεια της Apple, περιέχει επίσης τη λίστα με τις επιτρεπόμενες δυνατότητες: push ειδοποιήσεις, App Groups, Sign in with Apple…
Στο Expo είναι το πεδίο ios.bundleIdentifier της ρύθμισής σου. Διάλεξέ το μία φορά και τέλος: πρέπει να είναι ίδιο παντού, και στη ρύθμισή σου και στο App Store Connect. Το App ID δεν λήγει. Και σύμφωνα με την τεκμηρίωση του Expo για τις δυνατότητες iOS, το EAS συγχρονίζει τις δυνατότητές του με τη ρύθμισή σου σε κάθε build.
Το provisioning profile
Το profile κάνει τη σύνδεση. Περιέχει ένα App ID, ένα πιστοποιητικό και, ανάλογα με τον τύπο του, μια λίστα επιτρεπόμενων συσκευών. Σε αφορούν τρεις τύποι:
- Development: η δοκιμαστική app σου στις καταχωρημένες συσκευές σου.
- Ad hoc: ένα build που εγκαθίσταται σε συγκεκριμένη λίστα συσκευών, η καθεμία με το UDID της. Είναι η «εσωτερική διανομή» του EAS.
- App Store: για το App Store Connect και το TestFlight. Δεν περιέχει λίστα συσκευών, εξηγεί το σημείωμα TN3125.
Κάθε profile έχει ημερομηνία λήξης: συνήθως όχι πάνω από έναν χρόνο κατά την Apple, 12 μήνες κατά το Expo.
Το κλειδί push ειδοποιήσεων (APNs)
Το κλειδί APNs επιτρέπει στον server σου, ή σε αυτόν του Expo, να στέλνει ειδοποιήσεις στην app σου. Είναι ένα αρχείο .p8 που κατεβαίνει μόνο μία φορά: η Apple δεν το κρατάει στον λογαριασμό σου. Ένα κλειδί εξυπηρετεί όλες τις apps σου, και δεν λήγει ποτέ.
Ο συνοπτικός πίνακας
| Στοιχείο | Χρησιμεύει για | Διάρκεια | Ποιος το διαχειρίζεται με Expo |
|---|---|---|---|
| Πιστοποιητικό διανομής | Υπογραφή των builds σου | Συνήθως έναν χρόνο | Το EAS, μετά τη σύνδεση |
| App ID | Αναγνώριση της app σου | Δεν λήγει | Εσύ, μετά το EAS |
| Profile App Store | Αποστολή στην Apple | Έως 12 μήνες | Το EAS |
| Profile ad hoc | Εγκατάσταση στα iPhone σου | Έως 12 μήνες | Το EAS και οι συσκευές σου |
| Κλειδί push APNs | Αποστολή ειδοποιήσεων | Δεν λήγει | Το EAS ή εσύ |
| Profile δωρεάν λογαριασμού | Δοκιμή μέσω Xcode | 7 ημέρες | Το Xcode, όχι το EAS |
«Εσύ, μετά το EAS»: εσύ διαλέγεις το bundle identifier, το EAS φροντίζει τις δυνατότητες. «Το EAS και οι συσκευές σου»: εσύ καταχωρείς κάθε δοκιμαστικό iPhone, το EAS φτιάχνει το profile. Η τελευταία γραμμή αφορά τον δωρεάν λογαριασμό Apple: σύμφωνα με τη βοήθεια της Apple για τους λογαριασμούς, τα profiles του λήγουν 7 ημέρες μετά τη δημιουργία τους.
Τα όρια της Apple που πρέπει να ξέρεις
- Πιστοποιητικά διανομής: πολύ λίγα ανά λογαριασμό. Η βοήθεια της Apple μιλάει για ένα ανά τύπο διανομής και ανά ομάδα, ο πίνακας του Expo για όριο 2. Κράτα τον κανόνα: μη φτιάχνεις νέο πιστοποιητικό σε κάθε build ή σε κάθε υπολογιστή.
- Κλειδιά APNs: 2 το πολύ ανά λογαριασμό, κατά το Expo.
- Profiles: χωρίς όριο, κατά το Expo.
- Συσκευές: έως 100 ανά οικογένεια προϊόντων και ανά έτος συνδρομής, σύμφωνα με τη βοήθεια της Apple για τις συσκευές. Η απενεργοποίηση μιας συσκευής δεν ελευθερώνει θέση. Ο μετρητής επιστρέφει στο 100 στην αρχή του επόμενου έτους συνδρομής, αν αφαιρέσεις τις συσκευές.
Τι κάνει το EAS για σένα
Σύμφωνα με τη σελίδα του Expo για τα managed credentials, το πρώτο σου iOS build σού προτείνει να δημιουργήσεις ό,τι λείπει. Συνδέεσαι στον λογαριασμό σου Apple Developer, το EAS δημιουργεί το πιστοποιητικό διανομής, το profile και το κλειδί push και τα αποθηκεύει στους servers του. Τα επόμενα builds τα ξαναχρησιμοποιούν.
Τρία χρήσιμα σημεία:
- Ο κωδικός σου Apple μένει στο μηχάνημά σου. Η σελίδα ασφάλειας του Expo διευκρινίζει ότι δεν στέλνεται στους servers του και ότι τα αποθηκευμένα credentials είναι κρυπτογραφημένα.
- Το
eas credentialsσού δείχνει τα πάντα: πιστοποιητικό, profiles, κλειδί push. Η εντολή σού επιτρέπει επίσης να τα αντικαταστήσεις ή να τα αφαιρέσεις. - Η διαγραφή στο EAS δεν διαγράφει στην Apple. Για να ελευθερώσεις θέση, πρέπει να κάνεις ανάκληση στο portal της Apple.
Μπορείς επίσης να κρατήσεις τον έλεγχο με τοπικά credentials: ένα αρχείο credentials.json δείχνει στο πιστοποιητικό σου (.p12) και στο profile σου (.mobileprovision). Το Expo ζητάει να προσθέσεις αυτά τα αρχεία στο .gitignore. Είναι ο ίδιος κανόνας με τα API keys μιας Expo app: ένα μυστικό δεν μπαίνει ποτέ στο repository.
Τα συνηθισμένα λάθη και πώς λύνονται
Profile που έληξε
Ένα ad hoc build κουβαλάει μέσα το profile του: όταν αυτό λήξει, η app δεν ανοίγει πια στα δοκιμαστικά σου iPhone. Στο App Store όμως, το Expo επιβεβαιώνει ότι η λήξη δεν επηρεάζει καθόλου την app σε παραγωγή. Η λύση: ξανατρέξε ένα build. Το EAS φτιάχνει νέο profile, ή το κάνεις μόνος σου με eas credentials. Μετά εγκατέστησε ξανά το νέο build στις συσκευές σου.
Μην το μπερδεύεις με το TestFlight: ένα build του TestFlight λήγει μετά από 90 ημέρες, όποιο κι αν είναι το πιστοποιητικό σου. Λεπτομέρειες στο TestFlight για να δοκιμάσεις την iPhone app σου.
Πιστοποιητικό που έληξε ή ανακλήθηκε
Η Apple είναι σαφής: αν η συνδρομή σου είναι ενεργή, οι apps σου που είναι ήδη στο App Store δεν επηρεάζονται. Δεν μπορείς όμως πια να στείλεις build υπογεγραμμένο με αυτό το πιστοποιητικό. Ένα build που στάλθηκε αλλά δεν έχει υποβληθεί ακόμα μπορεί να σημειωθεί Invalid Binary αν το πιστοποιητικό του ανακλήθηκε. Και τα profiles που περιέχουν ανακληθέν πιστοποιητικό γίνονται άκυρα.
Η λύση: φτιάξε νέο πιστοποιητικό από το eas credentials ή στο επόμενο build, και άφησε το EAS να ξαναφτιάξει τα profiles. Και ποτέ μην ανακαλείς από αντανακλαστικό ένα πιστοποιητικό που δουλεύει.
Συσκευή που λείπει από το ad hoc profile
Το link εγκατάστασης δουλεύει σε σένα, αλλά όχι στο iPhone ενός tester. Η αιτία: η τεκμηρίωση του Expo για την εσωτερική διανομή εξηγεί ότι μόνο οι συσκευές που υπάρχουν στο profile τη στιγμή του build μπορούν να εγκαταστήσουν την app.
Η λύση:
- Καταχώρισε τη συσκευή με
eas device:create. - Ξανατρέξε ένα build σε interactive mode, συνδεδεμένος στον λογαριασμό σου Apple, ώστε το EAS να ενημερώσει το profile. Ή ξαναϋπόγραψε το υπάρχον build με
eas build:resign, χωρίς να τα ξανακάνεις compile όλα. - Σε continuous integration, το non-interactive mode ξαναχρησιμοποιεί το profile χωρίς να ενημερώνει τη λίστα του. Πρόσθεσε την επιλογή
--refresh-ad-hoc-provisioning-profile.
Σε νέο ή μόλις ανανεωμένο λογαριασμό, η Apple μπορεί να χρειαστεί 24 έως 72 ώρες για να επεξεργαστεί μια νέα συσκευή. Έτσι το πρώτο build που την περιλαμβάνει μπορεί να αποτύχει: περίμενε και ξαναδοκίμασε.
Έφτασες το όριο πιστοποιητικών
Η Apple αρνείται να δημιουργήσει νέο πιστοποιητικό διανομής. Συχνά υπάρχουν παλιά πιστοποιητικά ξεχασμένα: φτιαγμένα από το Xcode σε άλλο Mac ή από άλλη υπηρεσία build. Ξαναχρησιμοποίησε το υπάρχον πιστοποιητικό αν έχεις το αρχείο .p12 του. Αλλιώς, ανακάλεσε αυτό που δεν χρησιμοποιείς πια στο portal της Apple. Η ανάκληση δεν επηρεάζει τις apps σου που είναι ήδη online, αλλά ακυρώνει τα profiles που το περιείχαν.
«Provisioning profile doesn't include signing certificate»
Αυτό το μήνυμα του Xcode σημαίνει ότι το profile δεν περιέχει το πιστοποιητικό του οποίου το ιδιωτικό κλειδί βρίσκεται στο μηχάνημά σου. Τυπική αιτία: ανακατεύεις την αυτόματη υπογραφή του Xcode με τα credentials του EAS. Διάλεξε μία μόνο πηγή αλήθειας: builds EAS με managed credentials ή τοπικά credentials, όχι και τα δύο.
Ειδοποιήσεις που σταμάτησαν μετά από ανάκληση κλειδιού
Αν ανακαλέσεις το κλειδί APNs, το Expo προειδοποιεί ότι όλες οι apps που το χρησιμοποιούν δεν λαμβάνουν πια ειδοποιήσεις. Φτιάξε νέο κλειδί και ανέβασέ το με eas credentials. Τα Expo Push tokens των χρηστών σου δεν αλλάζουν.
Πρόσθεσες δυνατότητα, το profile έγινε άκυρο
Η ενεργοποίηση μιας υπηρεσίας όπως οι push ειδοποιήσεις ή τα App Groups κάνει το profile άκυρο: πρέπει να το ξαναδημιουργήσεις. Με το EAS, ο συγχρονισμός των δυνατοτήτων γίνεται σε κάθε build. Αν το profile εξακολουθεί να απορρίπτεται, το eas credentials σού επιτρέπει να φτιάξεις καινούργιο.
Τι ακολουθεί μετά την υπογραφή
Ένα υπογεγραμμένο build είναι μόνο ένα βήμα. Η σελίδα της app, τα screenshots, το απόρρητο και η υποβολή για review είναι όλα μαζεμένα στο δημοσίευση εφαρμογής στο App Store. Αν δεν έχεις ακόμα συνδρομή, ξεκίνα από τον λογαριασμό προγραμματιστή Apple. Και για να καταλάβεις γιατί προτείνω το Expo στους αρχάριους, διάβασε το React Native και Expo για mobile app.
Αν ετοιμάζεις την πρώτη σου δημοσίευση
Πριν από την πρώτη σου αποστολή, κάνε το δωρεάν διαγνωστικό: σου λέει τι πραγματικά μπλοκάρει στο project σου και σου στέλνει τη checklist μου κατά των απορρίψεων της Apple.
Για να φτιάξεις την app, να συνδέσεις τις συνδρομές και να τη δημοσιεύσεις χωρίς να παλεύεις με την υπογραφή, το iOS & Android Kit σε καθοδηγεί σε τέσσερα βήματα με τον αρχικό κώδικα των apps μου, με τον δικό σου ρυθμό.
Συχνές ερωτήσεις
Τι είναι ένα provisioning profile;
Είναι το αρχείο που επιτρέπει στην app σου να τρέχει ή να σταλεί στην Apple. Συνδέει ένα αναγνωριστικό app, ένα πιστοποιητικό και, ανάλογα με τον τύπο, μια λίστα συσκευών. Ένα profile App Store δεν περιέχει καμία συσκευή, ένα ad hoc profile περιέχει μερικές.
Είναι δωρεάν το πιστοποιητικό προγραμματιστή iOS;
Δεν έχει ξεχωριστή τιμή: το πιστοποιητικό διανομής περιλαμβάνεται στο Apple Developer Program, στα 99 $ τον χρόνο. Με δωρεάν λογαριασμό Apple, το Xcode σε αφήνει να δοκιμάσεις σε 3 συσκευές το πολύ, αλλά τα profiles λήγουν σε 7 ημέρες και η δημοσίευση είναι αδύνατη.
Πόσο διαρκεί ένα πιστοποιητικό διανομής Apple;
Συνήθως έναν χρόνο από τη δημιουργία του, κατά την Apple. Τα provisioning profiles διαρκούν επίσης 12 μήνες το πολύ. Το κλειδί push ειδοποιήσεων, από την άλλη, δεν λήγει ποτέ.
Τι γίνεται αν λήξει το πιστοποιητικό διανομής μου;
Τίποτα για τις apps σου που είναι ήδη στο App Store, όσο η συνδρομή σου είναι ενεργή. Απλώς δεν μπορείς πια να στείλεις νέο build υπογεγραμμένο με αυτό το πιστοποιητικό. Με το EAS, νέο πιστοποιητικό δημιουργείται στο επόμενο build ή με eas credentials.
Χρειάζομαι Mac για να φτιάξω πιστοποιητικό iOS;
Όχι, αν περάσεις από το EAS. Συνδέεσαι στον λογαριασμό σου Apple από τη γραμμή εντολών και το EAS φτιάχνει το πιστοποιητικό και το profile, σε Windows όπως και σε Linux. Χωρίς EAS, η κλασική μέθοδος περνάει από το Xcode ή το Keychain Access ενός Mac.
Πόσες συσκευές χωράει ένα ad hoc profile;
Ο λογαριασμός σου μπορεί να καταχωρίσει έως 100 iPhone ανά έτος συνδρομής, και άλλες τόσες για κάθε άλλη οικογένεια συσκευών. Μια απενεργοποιημένη συσκευή εξακολουθεί να μετράει. Για δοκιμές με περισσότερο κόσμο, πήγαινε στο TestFlight.

