7. Χρήση Python σε iOS
**********************

Συγγραφείς:
   Russell Keith-Magee (2024-03)

Η Python σε iOS διαφέρει από την Python σε πλατφόρμες επιτραπέζιων
υπολογιστών. Σε μια πλατφόρμα επιτραπέζιων υπολογιστών, η Python
εγκαθίσταται γενικά ως πόρος συστήματος που μπορεί να χρησιμοποιηθεί
από οποιονδήποτε χρήστη αυτού του υπολογιστή. Στη συνέχεια, οι χρήστες
αλληλεπιδρούν με την Python εκτελώντας ένα εκτελέσιμο αρχείο
**python** και εισάγοντας εντολές σε μια διαδραστική γραμμή εντολών ή
εκτελώντας ένα Python script.

Στο iOS, δεν υπάρχει η έννοια της εγκατάστασης ως πόρου συστήματος. Η
μόνη μονάδα διανομής λογισμικού είναι μια "εφαρμογή". Επίσης, δεν
υπάρχει κονσόλα που θα μπορούσατε να εκτελέσετε ένα εκτελέσιμο αρχείο
**python** ή να αλληλεπιδράσετε με ένα Python REPL.

Ως αποτέλεσμα, ο μόνος τρόπος για να χρησιμοποιήσετε την Python σε iOS
είναι σε ενσωματωμένη λειτουργία - δηλαδή, γράφοντας μια εγγενή
εφαρμογή iOS και ενσωματώνοντας έναν διερμηνέα Python χρησιμοποιώντας
το "libPython", και καλώντας κώδικα Python χρησιμοποιώντας το Python
embedding API. Ο πλήρης διερμηνέας Python, η τυπική βιβλιοθήκη και
όλος ο κώδικας Python σας συσκευάζονται στην συνέχεια ως αυτόνομο
πακέτο που μπορεί να διανεμηθεί μέσω του iOS App Store.

Αν θέλετε να πειραματιστείτε για πρώτη φορά με τη σύνταξη μιας
εφαρμογής iOS σε Python, έργα όπως BeeWare και Kivy θα σας προσφέρουν
μια πολύ πιο προσιτή εμπειρία χρήστη. Αυτά τα έργα διαχειρίζονται τις
πολυπλοκότητες που σχετίζονται με την εκτέλεση ενός έργου iOS,
επομένως χρειάζεται να ασχοληθείτε μόνο με τον ίδιο τον κώδικα Python.


7.1. Python κατά τον χρόνο εκτέλεσης σε iOS
===========================================


7.1.1. Συμβατότητα έκδοσης iOS
------------------------------

Η ελάχιστη υποστηριζόμενη έκδοση iOS καθορίζεται κατά τη στιγμή της
μεταγλώττισης, χρησιμοποιώντας την επιλογή "--host" για τη "ρύθμιση"
παραμέτρων. Από προεπιλογή, όταν μεταγλωττίζεται για iOS, η Python θα
μεταγλωττίζεται με μια ελάχιστη υποστηριζόμενη έκδοση iOS 13.0. Για να
χρησιμοποιήστε μια διαφορετική ελάχιστη έκδοση iOS, δώστε τον αριθμό
έκδοσης ως μέρος του ορίσματος "--host" - για παράδειγμα, το "--
host=arm64-apple-ios15.4-simulator" θα μεταγλωττίσει μια έκδοση
προσομοιωτή ARM64 με στόχο ανάπτυξης 15.4.


7.1.2. Αναγνώριση πλατφόρμας
----------------------------

Κατά την εκτέλεση σε iOS, το "sys.platform" θα αναφέρεται ως "ios".
Αυτή η τιμή θα επιστραφεί σε ένα iPhone ή iPad, ανεξάρτητα από το αν η
εφαρμογή εκτελείται στον προσομοιωτή ή σε μια φυσική συσκευή.

Πληροφορίες σχετικά με το συγκεκριμένο περιβάλλον εκτέλεσης,
συμπεριλαμβανομένης της έκδοσης iOS, του μοντέλου συσκευής και του εάν
η συσκευή είναι προσομοιωτής, μπορούν να ληφθούν χρησιμοποιώντας την
"platform.ios_ver()". Η "platform.system()" θα αναφέρει "iOS" ή
"iPadOS", ανάλογα με τη συσκευή.

Η "os.uname()" αναφέρει λεπτομέρειες σε επίπεδο πυρήνα∙ θα αναφέρει
ένα όνομα "Darwin".


7.1.3. Διαθεσιμότητα τυπικής βιβλιοθήκης
----------------------------------------

Η τυπική βιβλιοθήκη Python έχει κάποιες αξιοσημείωτες παραλείψεις και
περιορισμούς στο iOS. Δείτε στον οδηγό διαθεσιμότητας API availability
guide for iOS για λεπτομέρειες.


7.1.4. Δυαδικά modules επέκτασης
--------------------------------

Μια αξιοσημείωτη διαφορά σχετικά με το iOS ως πλατφόρμα είναι ότι η
διανομή του App Store επιβάλλει αυστηρές απαιτήσεις σχετικά με τη
συσκευασία μιας εφαρμογής. Μία από αυτές τις απαιτήσεις διέπει τον
τρόπο διανομής των δυαδικών modules επέκτασης.

Το iOS App Store απαιτεί από *όλα* τα δυαδικά modules σε μια εφαρμογή
iOS να είναι δυναμικές βιβλιοθήκες, που να περιέχονται σε ένα πλαίσιο
με κατάλληλα μεταδεδομένα, αποθηκευμένα στον φάκελο "Frameworks" της
συσκευασμένης εφαρμογής. Μπορεί να υπάρχει μόνο ένα δυαδικό αρχείο ανά
πλαίσιο, και δεν μπορεί να υπάρχει εκτελέσιμο υλικό εκτός του φακέλου
"Frameworks".

Αυτό έρχεται σε αντίθεση με τη συνήθη προσέγγιση Python για τη διανομή
δυαδικών αρχείων, η οποία επιτρέπει τη φόρτωση μιας δυαδικής επέκτασης
module από οποιαδήποτε τοποθεσία στο "sys.path". Για να διασφαλιστεί η
συμμόρφωση με τις πολιτικές του App Store, ένα ενεργό iOS πρέπει να
επεξεργαστεί εκ των υστέρων τυχόν πακέτα Python, μετατρέποντας τις
δυαδικές μονάδες ".so" σε μεμονωμένα αυτόνομα πλαίσια με κατάλληλα
μεταδεδομένα και υπογραφή. Για λεπτομέρειες σχετικά με τον τρόπο
εκτέλεσης αυτή της μετα-επεξεργασίας, ανατρέξτε στον οδηγό adding
Python to your project.

Για να βοηθηθεί η Python στην ανακάλυψη δυαδικών αρχείων στη νέα τους
θέση, το αρχικό αρχείο ".so" στο "sys.path" αντικαθίσταται με ένα
αρχείο ".fwork". Αυτό το αρχείο είναι ένα αρχείο κειμένου που περιέχει
τη θέση του δυαδικού αρχείου του framework, σε σχέση με το app bundle.
Για να επιτραπεί στο framework να επιστρέψει στην αρχική του θέση, το
framework πρέπει να περιέχει ένα αρχείο ".origin" που περιέχει τη θέση
του αρχείου ".fwork", σε σχέση με το app bundle.

Για παράδειγμα, εξετάστε την περίπτωση μιας εντολής εισαγωγής "from
foo.bar import _whiz", όπου το "_whiz" υλοποιείται με το δυαδικό
module "sources/foo/bar/_whiz.abi3.so", με το "sources" να είναι η
τοποθεσία που έχει καταχωρηθεί στο "sys.path", σε σχέση με το bundle
της εφαρμογής. Αυτό το module *πρέπει* να διανεμηθεί ως
"Frameworks/foo.bar._whiz.framework/foo.bar._whiz" (δημιουργώντας το
όνομα του framework από την πλήρη διαδρομή εισαγωγής του module), με
ένα αρχείο "Info.plist" στον φάκελο ".framework" που να ταυτοποιεί το
δυαδικό ως framework. Το module "foo.bar._whiz" θα εκπροσωπείται στην
αρχική του τοποθεσία με ένα αρχείο δείκτη
"sources/foo/bar/_whiz.abi3.fwork", το οποίο περιέχει τη διαδρομή
"Frameworks/foo.bar._whiz/foo.bar._whiz". Το framework θα περιέχει
επίσης το "Frameworks/foo.bar._whiz.framework/foo.bar._whiz.origin",
το οποίο περιέχει τη διαδρομή προς το αρχείο ".fwork".

Κατά την εκτέλεση σε iOS, ο διερμηνέας της Python θα εγκαταστήσει μια
"AppleFrameworkLoader", η οποία μπορεί να διαβάζει και να εισάγει
αρχεία ".fwork". Μόλις εισαχθεί, το χαρακτηριστικό "__file__" του
δυαδικού module θα αναφέρει ως τοποθεσία το αρχείο ".fwork". Ωστόσο, η
"ModuleSpec" για το φορτωμένο module θα αναφέρει ως "origin" την
τοποθεσία του δυαδικού αρχείου στον φάκελο του framework.


7.1.5. Δυαδικά αρχεία προσομοίωσης μεταγλωττιστή
------------------------------------------------

Το Xcode δεν παρέχει άμεσα ξεχωριστούς μεταγλωττιστές για iOS· αντ’
αυτού, χρησιμοποιεί ένα script "xcrun" που επιλύει την πλήρη διαδρομή
του μεταγλωττιστή (π.χ. "xcrun --sdk iphoneos clang" για να πάρετε τον
"clang" για μια συσκευή iPhone). Ωστόσο, η χρήση αυτού του script
δημιουργεί δύο προβλήματα:

* Η έξοδος του "xcrun" περιλαμβάνει διαδρομές που εξαρτώνται από τη
  συγκεκριμένη μηχανή, με αποτέλεσμα ένα module sysconfig να μην
  μπορεί να κοινοποιηθεί μεταξύ διαφορετικών χρηστών· και

* Αυτό έχει ως αποτέλεσμα οι ορισμοί των "CC"/"CPP"/"LD"/"AR" να
  περιλαμβάνουν κενά. Υπάρχουν πολλά εργαλεία στο οικοσύστημα της C
  που υποθέτουν ότι η εντολή μπορεί να χωριστεί στον πρώτο κενό
  χαρακτήρα ώστε να βρεθεί η διαδρομή προς το εκτελέσιμο του
  μεταγλωττιστή∙ κάτι που δεν ισχύει όταν χρησιμοποιείται το "xcrun".

Για να αποφευχθούν αυτά τα προβλήματα, η Python παρέχει stubs για αυτά
τα εργαλεία. Αυτά τα stubs είναι wrapper scripts κελύφους που τυλίγουν
τα υποκείμενα εργαλεία του "xcrun", και διανέμονται σε έναν φάκελο
"bin" μαζί με το μεταγλωττισμένο iOS framework. Αυτά τα scripts
μπορούν να προσαρμοστούν σε διαφορετικές τοποθεσίες, και πάντα θα
δείχνουν στις σωστές τοπικές διαδρομές του συστήματος.
Συμπεριλαμβάνοντας αυτά τα scripts στο φάκελο bin που συνοδεύει ένα
framework, το περιεχόμενο του module "sysconfig" γίνεται χρήσιμο για
τους τελικούς χρήστες, ώστε να μπορούν να μεταγλωττίζουν τα δικά τους
modules. Όταν μεταγλωττίζετε τρίτα modules Python για iOS, πρέπει να
βεβαιωθείτε ότι αυτά τα stub binaries είναι στο path σας.


7.2. Εγκατάσταση της Python σε iOS
==================================


7.2.1. Εργαλεία για την κατασκευή εφαρμογών iOS
-----------------------------------------------

Η κατασκευή εφαρμογών για iOS απαιτεί τη χρήση των εργαλείων Xcode της
Apple.Συνιστάται έντονα να χρησιμοποιείτε την πιο πρόσφατη σταθερή
έκδοση του Xcode. Αυτό θα απαιτήσει να έχετε την πιο πρόσφατη (ή τη
δεύτερη πιο πρόσφατη) έκδοση του macOS, καθώς η Apple δεν υποστηρίζει
παλαιότερες εκδόσεις macOS με νέες εκδόσεις Xcode. Τα εργαλεία γραμμής
εντολών Xcode δεν επαρκούν για ανάπτυξη iOS∙ χρειάζεται μια *πλήρης*
εγκατάσταση του Xcode.

Αν θέλετε να τρέξετε τον κώδικά σας στον προσομοιωτή iOS, θα χρειαστεί
επίσης να εγκαταστήσετε μια Πλατφόρμα Προσομοίωσης iOS. Κατά την πρώτη
εκκίνηση του Xcode, θα σας ζητηθεί να επιλέξετε μια Πλατφόρμα
Προσομοίωσης iOS. Εναλλακτικά, μπορείτε να προσθέσετε μια Πλατφόρμα
προσομοίωσηςiOS επιλέγοντας την από την καρτέλα Platforms στο πάνελ
ρυθμίσεων του Xcode.


7.2.2. Προσθήκη Python σε ένα έργο iOS
--------------------------------------

Η Python μπορεί να προστεθεί σε οποιοδήποτε έργο iOS, χρησιμοποιώντας
είτε Swift είτε Objective C. Τα ακόλουθα παραδείγματα θα
χρησιμοποιήσουν Objective C∙ εάν χρησιμοποιείτε Swift, μπορεί να σας
φανεί χρήσιμη μια βιβλιοθήκη όπως το PythonKit .

Για να προσθέσετε Python σε ένα έργο iOS Xcode:

1. Δημιουργήστε ή αποκτήστε ένα Python "XCFramework". Δείτε τις
   οδηγίες στο iOS/README.rst (στη διανομή πηγαίου κώδικα CPython) για
   λεπτομέρειες σχετικά με τον τρόπο δημιουργίας ενός Python
   "XCFramework". Κατ' ελάχιστον, θα χρειαστείτε μια έκδοση που
   υποστηρίζει το "arm64-apple-ios", καθώς και ένα από τα "arm64
   -apple-ios-simulator" ή "x86_64-apple-ios-simulator".

2. Μεταφέρετε το "XCframework" στο iOS έργο σας. Στις ακόλουθες
   οδηγίες, θα υποθέσουμε ότι έχετε αποθέσει το "XCframework" στη ρίζα
   του έργου σας ωστόσο, μπορείτε να χρησιμοποιήσετε οποιαδήποτε άλλη
   τοποθεσία θέλετε προσαρμόζοντας τις διαδρομές όπως απαιτείται.

3. Προσθέστε τον κώδικα της εφαρμογής σας ως φάκελο στο έργο σας στο
   Xcode. Στις παρακάτω οδηγίες, θα υποθέσουμε ότι ο κώδικας του
   χρήστη βρίσκεται σε έναν φάκελο με όνομα "app" στη ριζική τοποθεσία
   του έργου σας· μπορείτε να χρησιμοποιήσετε οποιαδήποτε άλλη
   τοποθεσία, προσαρμόζοντας αναλόγως τις διαδρομές. Βεβαιωθείτε ότι
   αυτός ο φάκελος έχει συσχετιστεί με τον στόχο (target) της
   εφαρμογής σας.

4. Επιλέξτε τον στόχο της εφαρμογής επιλέγοντας τον ριζικό κόμβο του
   έργου σας στο Xcode και στη συνέχεια το όνομα του στόχου στην
   πλαϊνή στήλη που εμφανίζεται.

5. Στις ρυθμίσεις  "General" , κάτω από "Frameworks, Libraries and
   Embedded Content", προσθέστε το "Python.xcframework", με επιλεγμένη
   την επιλογή "Embed & Sign"

6. Στην καρτέλα "Build Settings" , τροποποιήστε τα εξής

   * Build Options

     * User Script Sandboxing: No

     * Enable Testability: Yes

   * Search Paths

     * Framework Search Paths: "$(PROJECT_DIR)"

     * Header Search Paths:
       ""$(BUILT_PRODUCTS_DIR)/Python.framework/Headers""

   * Apple Clang - Warnings - All languages

     * Quoted Include In Framework Header: No

7. Προσθέστε ένα βήμα κατασκευής που αντιγράφει τη βασική βιβλιοθήκη
   Python στην εφαρμογή σας. Στην καρτέλα "Build Phases", προσθέστε
   ένα νέο βήμα κατασκευής "Run Script" *πριν* από το βήμα "Embed
   Frameworks", αλλά *μετά* το βήμα "Copy Bundle Resources". Ονομάστε
   το βήμα "Install Target Specific Python Standard Library",
   απενεργοποιήστε το πλαίσιο επιλογής "Based on dependency analysis"
   και ορίστε το περιεχόμενο του script ως εξής:

      set -e
      source $PROJECT_DIR/Python.xcframework/build/build_utils.sh
      install_python Python.xcframework app

   Εάν έχετε τοποθετήσει το XCframework κάπου αλλού εκτός από τη ρίζα
   του έργου σας, τροποποιήστε τη διαδρομή στο πρώτο όρισμα.

8. Προσθέστε κώδικα Objective C για να αρχικοποιήσετε και να
   χρησιμοποιήσετε έναν διερμηνέα Python σε ενσωματωμένη λειτουργία.
   Θα πρέπει να βεβαιωθείτε ότι:

   * Η λειτουργία UTF-8 ("PyPreConfig.utf8_mode") είναι
     *ενεργοποιημένη* ∙

   * Το Buffered stdio ("PyConfig.buffered_stdio") είναι
     *απενεργοποιημένο* ∙

   * Η εγγραφή bytecode ("PyConfig.write_bytecode") είναι
     *απενεργοποιημένη* ∙

   * Οι χειριστές σημάτων ("PyConfig.install_signal_handlers") είναι
     *ενεργοποιημένοι* ∙

   * Η καταγραφή συστήματος ("PyConfig.use_system_logger") είναι
     *ενεργοποιημένη* (προαιρετική, αλλά συνίσταται ανεπιφύλακτα∙
     είναι ενεργοποιημένη από προεπιλογή)∙

   * Το "PYTHONHOME" για τον διερμηνέα έχει ρυθμιστεί ώστε να δείχνει
     στον υποφάκελο "python" της δέσμης της εφαρμογής σας∙ και

   * Το "PYTHONPATH" για τον διερμηνέα περιλαμβάνει:

     * τον υποφάκελο "python/lib/python3.X" της δέσμης της εφαρμογής
       σας,

     * τον υποφάκελο "python/lib/python3.X/lib-dynload" της δέσμης της
       εφαρμογής σας, και

     * τον υποφάκελο "app" της δέσμης της εφαρμογής σας

   Η τοποθεσία της εφαρμογής σας στο πακέτο μπορεί να προσδιοριστεί
   χρησιμοποιώντας την εντολή "[[NSBundle mainBundle] resourcePath]".

Τα βήματα 7 και 8 αυτών των οδηγιών υποθέτουν ότι έχετε έναν μόνο
φάκελο με καθαρό κώδικα εφαρμογής Python, με όνομα "app". Εάν έχετε
δυαδικά modules τρίτων στην εφαρμογή σας, θα απαιτηθούν επιπλέον
βήματα:

* Πρέπει να βεβαιωθείτε ότι τυχόν φάκελοι που περιέχουν δυαδικά αρχεία
  τρίτων είναι είτε συσχετισμένοι με τον στόχο της εφαρμογής είτε
  αντιγραμμένοι ως μέρος του βήματος 7. Το βήμα 7 θα πρέπει επίσης να
  καθαρίσει τυχόν δυαδικά αρχεία που δεν είναι κατάλληλα για την
  πλατφόρμα στην οποία στοχεύει μια συγκεκριμένη έκδοση (δηλαδή, να
  διαγράψει τυχόν δυαδικά αρχεία συσκευής εάν δημιουργείτε μια
  εφαρμογή που στοχεύει τον προσομοιωτή).

* Εάν χρησιμοποιείτε ξεχωριστό φάκελο για πακέτα τρίτων, βεβαιωθείτε
  ότι ο φάκελος προστίθεται στο τέλος της κλήσης προς το
  "install_python" στο βήμα 7, και ως μέρος της διαμόρφωσης
  "PYTHONPATH" στο βήμα 8.

* Εάν οποιοιδήποτε από τους φακέλους που περιέχουν πακέτα τρίτων θα
  περιέχουν αρχεία ".pth", θα πρέπει να προσθέσετε αυτόν τον φάκελο ως
  *site directory* (χρησιμοποιώντας τη "site.addsitedir()"), αντί να
  τον προσθέσετε απευθείας στο "PYTHONPATH" ή στο "sys.path".


7.2.3. Δοκιμή ενός πακέτου Python
---------------------------------

Το δένδρο πηγαίου κώδικα της CPython περιέχει το a testbed project που
χρησιμοποιείται για την εκτέλεση της σουίτας δοκιμών CPython στον
προσομοιωτή iOS. Αυτό το δοκιμαστικό πλαίσιο μπορεί επίσης να
χρησιμοποιηθεί ως έργο δοκιμαστικής πλατφόρμας για την εκτέλεση της
σουίτας δοκιμών της βιβλιοθήκης Python σε iOS.

Αφού δημιουργήσετε ή αποκτήσετε ένα iOS XCFramework (δείτε το
iOS/README.rst για λεπτομέρειες), δημιουργήστε ένα κλώνο του έργου
δοκιμαστικής πλατφόρμας Python iOS. Εάν χρησιμοποιήσατε το script
κατασκευής "Apple" για να δημιουργήσετε το XCframework, μπορείτε να
εκτελέσετε:

   $ python cross-build/iOS/testbed clone --app <path/to/module1> --app <path/to/module2> app-testbed

Ή, εάν έχετε δημιουργήσει το δικό σας XCframework, εκτελώντας:

   $ python Apple/testbed clone --platform iOS --framework <path/to/Python.xcframework> --app <path/to/module1> --app <path/to/module2> app-testbed

Οποιοιδήποτε φάκελοι καθοριστούν με το flag "--app" θα αντιγραφούν στο
κλωνοποιημένο έργο testbed. Το τελικό testbed θα δημιουργηθεί στον
φάκελο "app-testbed". Σε αυτό το παράδειγμα, τα "module1" και
"module2" θα είναι module που μπορούν να εισαχθούν κατά τον χρόνο
εκτέλεσης. Αν το έργο σας έχει επιπλέον εξαρτήσεις μπορείτε να τις
εγκαταστήσετε στον φάκελο "app-testbed/Testbed/app_packages"
(χρησιμοποιώντας το "pip install --target app-
testbed/Testbed/app_packages" ή παρόμοια εντολή).

Μπορείτε στη συνέχεια να χρησιμοποιήσετε το φάκελο "app-testbed" για
να εκτελέσετε τη σουίτα δοκιμών για την εφαρμογή σας. Για παράδειγμα,
εάν το "module1.tests" ήταν το σημείο εισόδου για τη σουίτα δοκιμών
σας, θα μπορούσατε να εκτελέσετε:

   $ python app-testbed run -- module1.tests

Αυτό ισοδυναμεί με την εκτέλεση της εντολής "python -m module1.tests"
σε μια έκδοση Python για επιτραπέζιους υπολογιστές. Οποιαδήποτε
ορίσματα μετά το "--" θα περαστούν στο testbed σαν να ήταν ορίσματα
στην εντολή "python -m" σε έναν επιτραπέζιο υπολογιστή.

Μπορείτε επίσης να ανοίξετε το έργο δοκιμαστικής πλατφόρμας στο Xcode
εκτελώντας:

   $ open app-testbed/iOSTestbed.xcodeproj

Αυτό θα σας επιτρέψει να χρησιμοποιήσετε την πλήρη σουίτα εργαλείων
Xcode για τον εντοπισμό σφαλμάτων.

Τα ορίσματα που χρησιμοποιούνται για την εκτέλεση της σουίτας δοκιμών
ορίζονται ως μέρος του σχεδίου δοκιμών. Για να τροποποιήσετε το σχέδιο
δοκιμών, επιλέξτε τον κόμβο του σχεδίου δοκιμών στο δέντρο του έργου
(θα πρέπει να είναι το πρώτο παιδί του ριζικού κόμβου) και επιλέξτε
την καρτέλα "Configurations". Τροποποιήστε την τιμή "Arguments Passed
On Launch" για να αλλάξετε τα ορίσματα δοκιμής.

Το σχέδιο δοκιμών απενεργοποιεί επίσης τις παράλληλες δοκιμές και
καθορίζει τη χρήση του αρχείου "Testbed.lldbinit" για την παροχή
διαμόρφωσης του αποσφαλματωτή. Η προεπιλεγμένη διαμόρφωση του
αποσφαλματωτή απενεργοποιεί τους αυτόματους σημερινούς σταθμούς
(breakpoints) στα σήματα "SIGINT", "SIGUSR1", "SIGUSR2", και
"SIGXFSZ".


7.3. Συμμόρφωση με το App Store
===============================

Ο μόνος μηχανισμός για τη διανομή εφαρμογών σε τρίτες συσκευές iOS
είναι η υποβολή της εφαρμογής στο iOS App Store∙ οι εφαρμογές που
υποβάλλονται για διανομή πρέπει να περάσουν τη διαδικασία αξιολόγησης
εφαρμογών της Apple. Αυτή η διαδικασία περιλαμβάνει ένα σύνολο
αυτοματοποιημένων κανόνων επικύρωσης που ελέγχουν τη δέσμη της
υποβληθείσας εφαρμογής για προβληματικό κώδικα. Υπάρχουν ορισμένα
βήματα που πρέπει να ληφθούν για να διασφαλιστεί ότι η εφαρμογή σας θα
μπορεί να περάσει αυτά τα βήματα επικύρωσης.


7.3.1. Κώδικας ασύμβατος με την τυπική βιβλιοθήκη
-------------------------------------------------

Η τυπική βιβλιοθήκη Python περιέχει κώδικα που είναι γνωστό ότι
παραβιάζει αυτούς τους αυτοματοποιημένους κανόνες. Ενώ αυτές οι
παραβιάσεις φαίνεται να είναι ψευδώς θετικές, οι κανόνες αξιολόγησης
της Apple δεν μπορούν να αμφισβητηθούν∙ επομένως, είναι απαραίτητο να
τροποποιήσετε την τυπική βιβλιοθήκη Python για να περάσει μια εφαρμογή
την αξιολόγηση του App Store.

Το δένδρο πηγαίου κώδικα της Python περιέχει a patch file που θα
αφαιρέσει όλον τον κώδικα που είναι γνωστό ότι προκαλεί προβλήματα με
τη διαδικασία αξιολόγησης του App Store. Αυτό το patch εφαρμόζεται
αυτόματα κατά την κατασκευή για iOS.


7.3.2. Δηλώσεις απορρήτου
-------------------------

Τον Απρίλιο του 2025, η Apple εισήγαγε μια απαίτηση για ορισμένες
βιβλιοθήκες τρίτων κατασκευαστών να παρέχουν μια Δήλωση Απορρήτου. Ως
αποτέλεσμα, εάν έχετε ένα δυαδικό module που χρησιμοποιεί μία από τις
επηρεαζόμενες βιβλιοθήκες, πρέπει να παρέχετε ένα αρχείο ".xcprivacy"
για αυτήν τη βιβλιοθήκη. Το OpenSSL είναι μία βιβλιοθήκη που
επηρεάζεται από αυτήν την απαίτηση, αλλά υπάρχουν και άλλες.

Εάν παράγετε ένα δυαδικό module με το όνομα "mymodule.so", και
χρησιμοποιήσετε το script κατασκευής Xcode που περιγράφεται στο βήμα 8
παραπάνω, μπορείτε να τοποθετήσετε ένα αρχείο "mymodule.xcprivacy"
δίπλα στο "mymodule.so", και η δήλωση απορρήτου θα εγκατασταθεί στην
απαιτούμενη τοποθεσία όταν το δυαδικό module μετατραπεί σε framework.
