Οι επεκτάσεις εφαρμογών είναι ξεχωριστές εκτελέσιμες μονάδες που επεκτείνουν τις δυνατότητες μιας κινητής εφαρμογής πέρα από την κύρια διεπαφή της: Today Widget στην αρχική οθόνη, χειρισμός κλήσεων VoIP μέσω CallKit και αντίδραση σε συμβάντα συστήματος μέσω BroadcastReceiver. Οι ενσωματώσεις συστήματος επιτρέπουν σε μια εφαρμογή να αλληλεπιδρά με το λειτουργικό σύστημα σε βαθύ επίπεδο, ξεκλειδώνοντας λειτουργίες που δεν είναι διαθέσιμες σε κανονικές οθόνες. Σύμφωνα με την τεκμηρίωση προγραμματιστών της Apple, κάθε επέκταση εκτελείται σε απομονωμένη διεργασία και διαχειρίζεται από το σύστημα ανεξάρτητα από την κύρια εφαρμογή. Οι επεκτάσεις εφαρμογών σε μια κινητή εφαρμογή επιτρέπουν την υλοποίηση λειτουργιών που δεν είναι διαθέσιμες στην κύρια διεργασία.
Βασικά σημεία
Οι επεκτάσεις εφαρμογών στο iOS εμφανίστηκαν στο iOS 8 και έγιναν το θεμέλιο για ενσωματώσεις συστήματος στην κινητή ανάπτυξη. Αυτά είναι ξεχωριστά δυαδικά αρχεία που συσκευάζονται μαζί με την κύρια εφαρμογή, αλλά εκκινούνται σε απομονωμένη διεργασία. Κάθε επέκταση έχει το δικό της Info.plist και σημείο εισόδου που ορίζεται μέσω NSExtensionPrincipalClass. Το σύστημα διαχειρίζεται τον κύκλο ζωής των επεκτάσεων εφαρμογών — δεν μπορούν να παραμείνουν στο παρασκήνιο μετά την ολοκλήρωση μιας εργασίας.
Το WidgetKit (iOS 14+) είναι ένα σύγχρονο πλαίσιο για τη δημιουργία widget στην αρχική οθόνη. WidgetKit χρησιμοποιεί SwiftUI για την περιγραφή της διεπαφής και TimelineProvider για τον καθορισμό προγραμμάτων ενημέρωσης. Τα widget διατίθενται σε τρία μεγέθη: μικρό (2×2 κελιά), μεσαίο (4×2) και μεγάλο (4×4). Το παλιό Today Widget που βασίζεται σε UICollectionViewController εξακολουθεί να υποστηρίζεται, αλλά η Apple συνιστά μετεγκατάσταση στο WidgetKit. Οι επεκτάσεις εφαρμογών στο WidgetKit δεν υποστηρίζουν κινούμενα σχέδια, είσοδο πληκτρολογίου ή χειρονομίες — είναι στατικά ή ψευδο-κινούμενα στοιχεία με περιοδικές ενημερώσεις.
Το Share Extension επιτρέπει την αποστολή περιεχομένου από οποιαδήποτε εφαρμογή στην εφαρμογή σας μέσω του φύλλου κοινής χρήσης συστήματος. Share Extension λαμβάνει δεδομένα μέσω NSExtensionItem και χρησιμοποιεί SLComposeServiceViewController για τη διεπαφή χρήστη. Το Action Extension επεξεργάζεται περιεχόμενο επιτόπου — για παράδειγμα, μεταφράζει κείμενο στο πρόγραμμα περιήγησης χωρίς μετάβαση σε άλλη εφαρμογή. Και οι δύο τύποι πρέπει να ολοκληρώσουν την εργασία σε περιορισμένο χρόνο, διαφορετικά το σύστημα "σκοτώνει" την επέκταση. Αυτός είναι ένας σημαντικός περιορισμός των επεκτάσεων εφαρμογών σε μια κινητή εφαρμογή — οι εργασίες παρασκηνίου δεν είναι διαθέσιμες σε επίπεδο επέκτασης.
Οι ενσωματώσεις συστήματος στο iOS ξεπερνούν κατά πολύ τα widget: τα CallKit, PushKit και SiriKit επιτρέπουν σε μια κινητή εφαρμογή να λειτουργεί σε επίπεδο συστήματος. Αυτά τα πλαίσια απαιτούν ειδικά δικαιώματα, αλλά παρέχουν στον χρήστη μια απρόσκοπτη εμπειρία — οι κλήσεις μέσω CallKit μοιάζουν με κανονικές τηλεφωνικές κλήσεις και η Siri επεξεργάζεται αιτήματα χωρίς άνοιγμα της εφαρμογής.
CallKit ενσωματώνει κλήσεις εφαρμογών τρίτων στην οθόνη κλήσεων συστήματος, συμπεριλαμβανομένης της κλειδωμένης οθόνης. Το CXProvider καταχωρεί την εφαρμογή ως υπηρεσία VoIP και το CXCallController διαχειρίζεται τις κλήσεις. Το CallKit μπλοκάρει αυτόματα διπλότυπες κλήσεις και υποστηρίζει Call Directory Extension για αποκλεισμό ανεπιθύμητων αριθμών. Οι ενσωματώσεις συστήματος στην κινητή ανάπτυξη με CallKit είναι κρίσιμες για εφαρμογές φωνητικής επικοινωνίας — τα WhatsApp, Skype και Zoom το χρησιμοποιούν για εμφάνιση εισερχόμενων κλήσεων.
Το PushKit παραδίδει ειδοποιήσεις push απευθείας στην κινητή εφαρμογή χωρίς να τις εμφανίζει στον χρήστη. PushKit αφυπνίζει την εφαρμογή από "νεκρή" κατάσταση και μεταφέρει δεδομένα μέσω του εκπροσώπου PKPushRegistryDelegate. Αυτός είναι ο κύριος μηχανισμός για εφαρμογές VoIP: το PushKit παραδίδει πληροφορίες κλήσης και το CallKit τις εμφανίζει. Το PushKit έχει υψηλότερη προτεραιότητα παράδοσης από τις κανονικές ειδοποιήσεις push και δεν απαιτεί εμφάνιση banner. Οι επεκτάσεις εφαρμογών σε κινητές εφαρμογές συνδυάζουν συχνά το PushKit με το CallKit για φωνητική επικοινωνία.
Το SiriKit επιτρέπει την επεξεργασία αιτημάτων μέσω Siri και της εφαρμογής Συντομεύσεις. Intents Extension είναι μια ξεχωριστή επέκταση εφαρμογής που καταχωρεί υποστηριζόμενες προθέσεις και τις επεξεργάζεται. Το SiriKit υποστηρίζει πάνω από 20 τομείς: κλήσεις, μηνύματα, πληρωμές, σημειώσεις, προπονήσεις. Οι Συντομεύσεις επιτρέπουν στον χρήστη να δημιουργεί αυτοματισμούς — για παράδειγμα, "Αποστολή μηνύματος στο WhatsApp μέσω Siri." Οι ενσωματώσεις συστήματος με SiriKit και Συντομεύσεις αυξάνουν την αφοσίωση, καθώς ο χρήστης εκτελεί ενέργειες χωρίς άνοιγμα της εφαρμογής.
BroadcastReceiver είναι ένα στοιχείο Android που αντιδρά σε μηνύματα εκπομπής συστήματος. Σε αντίθεση με τις επεκτάσεις εφαρμογών iOS, το BroadcastReceiver δεν απαιτεί ξεχωριστό δυαδικό αρχείο — αρκεί η καταχώρηση του δέκτη στο manifest ή στον κώδικα μέσω Context.registerReceiver. Οι ενσωματώσεις συστήματος στο Android ξεκινούν συχνά με BroadcastReceiver: από την εκκίνηση μιας υπηρεσίας κατά την εκκίνηση της συσκευής έως την αντίδραση στη σύνδεση δικτύου.
IntentFilter συνδέει το BroadcastReceiver με ένα συγκεκριμένο συμβάν συστήματος. Τυπικά συμβάντα: BOOT_COMPLETED (εκκίνηση συσκευής), CONNECTIVITY_ACTION (αλλαγή δικτύου), BATTERY_LOW (χαμηλή μπαταρία), TIME_SET (αλλαγή ώρας). Ο δέκτης καταχωρείται στο AndroidManifest.xml ή μέσω Context.registerReceiver για δυναμική καταχώρηση. Η δυναμική καταχώρηση είναι προτιμότερη — δεν απαιτεί άδειες στο manifest και λειτουργεί μόνο όταν η εφαρμογή είναι ενεργή. Οι επεκτάσεις εφαρμογών στο Android δεν υπάρχουν ως ιδέα, αλλά το BroadcastReceiver παίζει παρόμοιο ρόλο — επεκτείνει τις δυνατότητες της εφαρμογής μέσω ενσωματώσεων συστήματος.
Το NotificationListenerService είναι μια υπηρεσία που λαμβάνει όλες τις ειδοποιήσεις συστήματος. NotificationListenerService απαιτεί άδεια BIND_NOTIFICATION_LISTENER_SERVICE και πρόσβαση μέσω ρυθμίσεων προσβασιμότητας. Το AccessibilityService είναι ένα πιο ισχυρό εργαλείο για ενσωμάτωση συστήματος: μπορεί να διαβάσει περιεχόμενο οθόνης, να προσομοιώσει κλικ και να αυτοματοποιήσει ενέργειες. Και οι δύο υπηρεσίες απαιτούν ρητή ενεργοποίηση από τον χρήστη στις ρυθμίσεις, γεγονός που αυξάνει την ασφάλεια. Οι ενσωματώσεις συστήματος σε κινητές εφαρμογές μέσω AccessibilityService χρησιμοποιούνται για αυτόματες συμπληρώσεις, αναγνώστες οθόνης και εργαλεία προσβασιμότητας.
class BootReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
if (intent.action == Intent.ACTION_BOOT_COMPLETED) {
WorkManager.getInstance(context)
.enqueueUniqueWork("post-boot", ...)
}
}
}
Το παράδειγμα καταχωρεί ένα BroadcastReceiver για το συμβάν BOOT_COMPLETED. WorkManager χρησιμοποιείται για καθυστερημένη εκτέλεση εργασιών μετά την εκκίνηση της συσκευής — αυτή είναι η τυπική προσέγγιση για εφαρμογές Android.
App Widget Provider στο Android είναι το αντίστοιχο των επεκτάσεων εφαρμογών iOS στο πλαίσιο των widget: είναι ένα στοιχείο που εμφανίζει διαδραστικό περιεχόμενο στην αρχική οθόνη. Σε αντίθεση με το WidgetKit, τα Android widget μπορούν να δέχονται είσοδο χρήστη — κλικ, διακόπτες και χειρονομίες. Το App Widget Provider καταχωρείται στο manifest μέσω περιγραφής XML του μεγέθους και της συχνότητας ενημέρωσης.
Το RemoteViews περιγράφει τη διεπαφή widget μέσω διάταξης XML και υποστηρίζει μόνο περιορισμένο σύνολο προβολών. RemoteViews δεν επιτρέπει προσαρμοσμένες προβολές — μόνο τυπικά στοιχεία: TextView, ImageView, Button, ProgressBar. Το AppWidgetProvider είναι η βασική κλάση που χειρίζεται ενημερώσεις, ενεργοποίηση και διαγραφή widget. Η μέθοδος onUpdate καλείται μέσω χρονοδιακόπτη μέσω updatePeriodMillis ή μέσω WorkManager για ακριβή έλεγχο. Οι ενσωματώσεις συστήματος με widget στο Android απαιτούν προσοχή — οι πολύ συχνές ενημερώσεις εξαντλούν την μπαταρία.
Το Glance API είναι μια βιβλιοθήκη Jetpack για τη δημιουργία widget με χρήση Kotlin DSL αντί για XML. Glance API μεταγλωττίζεται σε RemoteViews και υποστηρίζει σύνταξη παρόμοια με Compose: GlanceComposable, Column, Row, Text. Η βιβλιοθήκη λύνει το πρόβλημα του πολύπλοκου κώδικα XML και επιτρέπει τη δοκιμή widget μέσω JUnit. Το Glance API δεν υποστηρίζει ακόμη όλες τις λειτουργίες RemoteViews — για πολύπλοκα διαδραστικά widget, η κλασική προσέγγιση είναι καλύτερη. Οι επεκτάσεις εφαρμογών στην κινητή ανάπτυξη στο Android εξελίσσονται προς το Glance API, απλοποιώντας τη δημιουργία και συντήρηση widget.
Content Provider είναι ένα στοιχείο Android για κοινή χρήση δομημένων δεδομένων μεταξύ εφαρμογών μέσω ενοποιημένης διεπαφής ContentResolver. Σε αντίθεση με τις επεκτάσεις εφαρμογών iOS, το Content Provider δεν δημιουργεί ξεχωριστή διεργασία — τα δεδομένα ζητούνται σύγχρονα στο πλαίσιο της καλούσας εφαρμογής. Το Content Provider αποτελεί το θεμέλιο των ενσωματώσεων συστήματος στο Android: επαφές, αρχεία πολυμέσων, ημερολόγιο και τυπικές εφαρμογές το χρησιμοποιούν για δημοσίευση δεδομένων.
Το FileProvider είναι μια υποκλάση του ContentProvider για ασφαλή μεταφορά αρχείων μεταξύ εφαρμογών. FileProvider δημιουργεί προσωρινά URI content:// αντί για άμεσες διαδρομές file://, οι οποίες απαγορεύονται στο Android 7+. Για χρήση, πρέπει να καθορίσετε files-path ή external-files-path στη διαμόρφωση XML. Οι επεκτάσεις εφαρμογών στην κινητή ανάπτυξη στο Android δεν υπάρχουν ως ξεχωριστή ιδέα, αλλά το FileProvider εκτελεί τη λειτουργία τους — επεκτείνει τις δυνατότητες κοινής χρήσης δεδομένων πέρα από μία εφαρμογή.
Στο iOS, τον ρόλο της κοινής χρήσης αρχείων εκτελεί το File Provider Extension. File Provider Extension δημοσιεύει τα αρχεία της εφαρμογής στην εφαρμογή Αρχεία μέσω NSFileProviderManager. Σε αντίθεση με το FileProvider, η επέκταση iOS απαιτεί ξεχωριστό δυαδικό αρχείο και εκτελείται σε απομονωμένη διεργασία. Το File Provider Extension υποστηρίζει NSFileProviderItem για περιγραφή αρχείων και NSFileProviderEnumerator για πλοήγηση σε φακέλους. Οι ενσωματώσεις συστήματος σε κινητές εφαρμογές μέσω File Provider Extension επιτρέπουν στον χρήστη να διαχειρίζεται αρχεία εφαρμογής από την εφαρμογή Αρχεία χωρίς να την ανοίγει.
class MyFileProviderExtension: NSFileProviderExtension {
override func item(for identifier: NSFileProviderItemIdentifier) throws -> NSFileProviderItem {
return MyFileProviderItem(identifier: identifier)
}
}
Το παράδειγμα δείχνει μια ελάχιστη υλοποίηση του File Provider Extension σε Swift. Η μέθοδος item(for:) επιστρέφει ένα αντικείμενο NSFileProviderItem βάσει αναγνωριστικού — το σύστημα την καλεί κατά την εμφάνιση αρχείων στην εφαρμογή Αρχεία.
Συχνές ερωτήσεις
Οι επεκτάσεις εφαρμογών είναι ξεχωριστά δυαδικά αρχεία που επεκτείνουν τη λειτουργικότητα της εφαρμογής πέρα από τη διεργασία της: Today Widget, Share Extension, Action Extension, Keyboard Extension και άλλοι τύποι που εκτελούνται σε απομονωμένο περιβάλλον.
Το CallKit ενσωματώνει κλήσεις VoIP στη διεπαφή κλήσεων συστήματος με εμφάνιση στην κλειδωμένη οθόνη. Το PushKit παραδίδει ειδοποιήσεις push παρασκηνίου χωρίς εμφάνιση στον χρήστη — αφυπνίζει την εφαρμογή για επεξεργασία δεδομένων, όπως πληροφορίες για μια εισερχόμενη κλήση.
BroadcastReceiver είναι ένα στοιχείο Android που αντιδρά σε μηνύματα εκπομπής συστήματος: εκκίνηση συσκευής (BOOT_COMPLETED), σύνδεση δικτύου (CONNECTIVITY_ACTION), αλλαγές λειτουργίας πτήσης και άλλα συμβάντα λειτουργικού συστήματος.
Χρησιμοποιήστε AppWidgetProvider με RemoteViews για τη δημιουργία της διεπαφής widget ή Glance API (Jetpack) για την προσέγγιση Kotlin DSL. Το widget καταχωρείται στο manifest μέσω περιγραφής XML που καθορίζει το μέγεθος και τη συχνότητα ενημέρωσης.
Content Provider είναι ένα στοιχείο Android για κοινή χρήση δεδομένων μεταξύ εφαρμογών μέσω ContentResolver. Χρησιμοποιείται για πρόσβαση σε επαφές, αρχεία πολυμέσων και οποιαδήποτε δομημένα δεδομένα από άλλες εφαρμογές.
Σύνοψη
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.