Intents Extension είναι μια επέκταση iOS που επιτρέπει σε εφαρμογές τρίτων να επεξεργάζονται φωνητικές εντολές Siri και να αλληλεπιδρούν με υπηρεσίες συστήματος μέσω SiriKit. Η εφαρμογή ορίζει τα δικά της intents στο Intents.intentdefinition, υλοποιεί χειριστές βασισμένους στο INIntentHandler και τους καταχωρεί για αναγνώριση φωνητικών φράσεων. Σύμφωνα με το Apple Developer Documentation (2025), το SiriKit υποστηρίζει πάνω από 20 τομείς intent — από μηνύματα και πληρωμές μέχρι προπονήσεις και κρατήσεις, και από το iOS 14 προστέθηκε υποστήριξη για προσαρμοσμένα intents μέσω IntentsExtension.
Βασικά σημεία
Intents Extension είναι μια επέκταση εφαρμογής που επιτρέπει στο Siri, στο Shortcuts και σε άλλες υπηρεσίες συστήματος να καλούν τη λειτουργικότητα της εφαρμογής μέσω του τυποποιημένου πρωτοκόλλου INIntentHandler. Όταν ο χρήστης λέει “Γεια Siri, στείλε μήνυμα στο Messenger X”, το Siri ενεργοποιεί την αντίστοιχη επέκταση, μεταφέρει τις παραμέτρους του αιτήματος και λαμβάνει το αποτέλεσμα για να το εκφωνήσει.
Σε αντίθεση με άλλους τύπους επεκτάσεων, το Intents Extension λειτουργεί στο παρασκήνιο χωρίς ορατή διεπαφή — το Siri εμφανίζει την απάντηση με φωνή ή κάρτα κειμένου. Η επέκταση μπορεί προαιρετικά να παρέχει προσαρμοσμένη διεπαφή μέσω INUIHostedViewProviding, η οποία εμφανίζεται εντός Siri πριν από την εκτέλεση της εντολής για επιβεβαίωση.
Η επέκταση δεν έχει πρόσβαση στην οθόνη της συσκευής και δεν μπορεί να ξεκινήσει ενέργειες αυτόνομα — μόνο ως απάντηση σε αίτημα από Siri ή Shortcuts. Αυτό διασφαλίζει την ασφάλεια: ο χρήστης ελέγχει πάντα ποιες ενέργειες εκτελεί η εφαρμογή μέσω φωνητικών εντολών.
SiriKit είναι το πλαίσιο της Apple για ενσωμάτωση με Siri, που παρουσιάστηκε στο iOS 10. Καθορίζει τομείς — κατηγορίες ενεργειών που μπορεί να επεξεργαστεί το Siri: μηνύματα, τηλεφωνικές κλήσεις, πληρωμές, λίστες, υπενθυμίσεις, φωτογραφίες, προπονήσεις, κρατήσεις και άλλα. Κάθε τομέας έχει ένα σταθερό σύνολο intents και απαντήσεων.
INSendMessageIntent — αποστολή μηνυμάτων. INStartWorkoutIntent — έναρξη προπόνησης. INSearchForPhotosIntent — αναζήτηση φωτογραφιών. INRequestRideIntent — παραγγελία ταξί. Κάθε τομέας καθορίζει υποχρεωτικές και προαιρετικές παραμέτρους που εξάγει το Siri από το φωνητικό αίτημα. Σύμφωνα με την Apple, για τυπικούς τομείς δεν απαιτείται αρχείο intentdefinition — αρκεί η υλοποίηση του αντίστοιχου handler.
Για εφαρμογές που δεν εντάσσονται σε τυπικούς τομείς, από το iOS 14 προέκυψε η δυνατότητα προσαρμοσμένων intents. Η εφαρμογή ορίζει δικούς της τύπους εντολών και παραμέτρων μέσω Intents.intentdefinition, και το Siri μαθαίνει να αναγνωρίζει τις αντίστοιχες φράσεις βάσει παραδειγμάτων που παρέχονται από τον προγραμματιστή.
Το Intents Extension καταχωρείται μέσω του κλειδιού IntentsSupported στο Info.plist, όπου απαριθμούνται όλες οι κλάσεις intent που επεξεργάζεται η επέκταση. Το Siri χρησιμοποιεί αυτήν τη λίστα για να επιλέξει την κατάλληλη επέκταση κατά την αναγνώριση μιας φωνητικής εντολής. Εάν πολλές επεκτάσεις υποστηρίζουν το ίδιο intent, το Siri προσφέρει επιλογή στον χρήστη.
class MessageIntentHandler: NSObject,
INSendMessageIntentHandling {
func handle(
intent: INSendMessageIntent,
completion: @escaping
(INSendMessageIntentResponse) -> Void
) {
let response = INSendMessageIntentResponse(
code: .success, userActivity: nil)
completion(response)
}
}
INIntentHandler — το πρωτόκολλο που ορίζει μεθόδους για την επεξεργασία κάθε σταδίου λειτουργίας του intent: επίλυση παραμέτρων, επιβεβαίωση και εκτέλεση. Η επέκταση υλοποιεί αυτές τις μεθόδους για κάθε τύπο intent που υποστηρίζει.
resolve — έλεγχος και διευκρίνιση παραμέτρων intent. Το Siri καλεί αυτήν τη μέθοδο για κάθε παράμετρο. Εάν μια παράμετρος δεν έχει καθοριστεί ή είναι λανθασμένη, η επέκταση επιστρέφει αίτημα διευκρίνισης και το Siri κάνει πρόσθετη ερώτηση στον χρήστη. confirm — επιβεβαίωση πρόθεσης. Η επέκταση ελέγχει εάν μπορεί να εκτελέσει το intent στο τρέχον περιβάλλον. handle — πραγματική εκτέλεση της λειτουργίας και επιστροφή αποτελέσματος.
Η διαίρεση σε τρία στάδια είναι κρίσιμη για την εμπειρία φωνητικού χρήστη: εάν μια παράμετρος δεν αναγνωριστεί, το Siri δεν εκτελεί την ενέργεια αλλά ρωτά ξανά. Για παράδειγμα, εάν ο χρήστης είπε “Στείλε μήνυμα στον Αλεξέι”, αλλά υπάρχουν τρεις Αλεξέι στις επαφές — η επέκταση επιστρέφει resolve με αίτημα διευκρίνισης και το Siri ρωτά “Σε ποιον Αλεξέι;”.
INIntentResponse — το αντικείμενο που επιστρέφει η επέκταση στο completion μετά την εκτέλεση του intent. Το Response περιέχει τον κωδικό αποτελέσματος (success, failure, requiresAuthentication, inProgress) και προαιρετικά δεδομένα για εκφώνηση από το Siri. Ο κωδικός καθορίζει πώς θα αντιδράσει το Siri: success — φωνητική επιβεβαίωση, failure — μήνυμα σφάλματος, inProgress — ένδειξη μακροχρόνιας λειτουργίας.
func resolve(
for intent: INSendMessageIntent,
with completion: @escaping
(INStringResolutionResult) -> Void
) {
if let text = intent.content, !text.isEmpty {
completion(.success(with: text))
} else {
completion(.needsValue())
}
}
Από το iOS 14, οι προγραμματιστές απέκτησαν τη δυνατότητα να ορίζουν δικά τους intents εκτός των τυπικών τομέων SiriKit. Τα προσαρμοσμένα intents περιγράφονται στο αρχείο Intents.intentdefinition — είναι ένας οπτικός επεξεργαστής εντός Xcode όπου δημιουργούνται νέοι τύποι εντολών με παραμέτρους και απαντήσεις.
Κάθε προσαρμοσμένο intent αποτελείται από INIntent (ορισμός αιτήματος) και INIntentResponse (ορισμός απάντησης). Το INIntent περιέχει παραμέτρους με τύπο δεδομένων — String, Integer, CurrencyAmount, αντικείμενα που βρέθηκαν και άλλα. Το INIntentResponse περιέχει ιδιότητες για επιστροφή αποτελέσματος και πίνακα κωδικών απάντησης. Το Xcode δημιουργεί αυτόματα κλάσεις Swift βάσει αυτού του ορισμού.
Η Apple συνιστά ένα προσαρμοσμένο intent να μην έχει περισσότερες από 5 παραμέτρους — ο υπερβολικός αριθμός υποβαθμίζει την αναγνώριση φωνής και περιπλέκει την εμπειρία χρήστη. Για κάθε παράμετρο είναι επιθυμητό να παρέχονται παραδείγματα φράσεων στο Assistant Dialog για να μάθει το Siri να τις αναγνωρίζει σωστά.
Στο Intents.intentdefinition για κάθε intent μπορούν να καθοριστούν παραδείγματα προτάσεων — φράσεις που θα πει ο χρήστης στο Siri για να ενεργοποιήσει το intent. Παραδείγματα: “Παρήγγειλε καφέ στην ΕφαρμογήΜου”, “Ζήτα από την ΕφαρμογήΜου να βρει συνταγή για πίτσα”. Το Siri χρησιμοποιεί αυτές τις φράσεις για να μάθει αναγνώριση και τις προτείνει στον χρήστη κατά τη ρύθμιση του Shortcuts.
// Intents.intentdefinition (οπτικός επεξεργαστής)
Intent: OrderCoffeeIntent
Parameters:
- beverage (String)
- size (String)
- quantity (Integer)
Response:
- orderNumber (String)
- price (CurrencyAmount)
Phrases:
- "Order coffee in MyApp"
- "Get a latte from MyApp"
INUIHostedViewProviding — το πρωτόκολλο που επιτρέπει στο Intents Extension να εμφανίζει προσαρμοσμένη διεπαφή εντός Siri πριν από την εκτέλεση της εντολής. Για παράδειγμα, κατά την παραγγελία ταξί, η επέκταση μπορεί να εμφανίσει χάρτη με διαδρομή και κόστος, και ο χρήστης επιβεβαιώνει την ενέργεια με άγγιγμα.
Το πρωτόκολλο ορίζει τη μέθοδο configure(with:for:completion:), όπου η επέκταση λαμβάνει το intent και επιστρέφει ένα UIViewController που θα ενσωματωθεί στο Siri. Το μέγεθος του ελεγκτή είναι περιορισμένο — μέγιστο ύψος 200 σημεία. Συνιστάται η χρήση συμπαγών καρτών με βασικές πληροφορίες: ποσό, χρόνος, διεύθυνση.
Η προσαρμοσμένη διεπαφή είναι προαιρετική — εάν η επέκταση δεν υλοποιεί INUIHostedViewProviding, το Siri εμφανίζει τυπική κάρτα με τον τύπο intent και την εφαρμογή. Για τα περισσότερα intents, η τυπική διεπαφή είναι επαρκής και η Apple συνιστά την προσθήκη προσαρμοσμένης διεπαφής μόνο όταν πραγματικά βελτιώνει την κατανόηση — για παράδειγμα, για εμφάνιση διαδρομής ή επιβεβαίωση πληρωμής.
Για intents που σχετίζονται με οικονομικά ή προσωπικά δεδομένα απαιτείται ταυτοποίηση. Το INIntentResponse υποστηρίζει τον κωδικό requiresAuthentication, ο οποίος αναγκάζει το Siri να ζητήσει Face ID ή Touch ID πριν από την εκτέλεση. Μετά την ταυτοποίηση, η επέκταση λαμβάνει επιβεβαίωση μέσω ξεχωριστής κλήσης handle, όπου ελέγχεται η κατάσταση ταυτοποίησης.
Η Apple τονίζει ιδιαίτερα: το Intents Extension δεν πρέπει να ζητά δικό του κωδικό ή βιομετρικά στοιχεία — χρησιμοποιείται ταυτοποίηση συστήματος. Η αποθήκευση διακριτικών πρόσβασης στο Keychain με κοινή πρόσβαση μεταξύ εφαρμογής και επέκτασης είναι συνήθης πρακτική για μακροχρόνιες συνεδρίες.
class IntentViewController: UIViewController {
func configure(
with intent: INIntent,
completion: @escaping
(UIViewController?) -> Void
) {
let cardView = ConfirmationCardView()
let hostingController =
UIHostingController(rootView: cardView)
completion(hostingController)
}
}
Συχνές Ερωτήσεις
Ναι, η επέκταση μπορεί να επεξεργαστεί intents από την εφαρμογή Shortcuts χωρίς φωνητική είσοδο. Ο χρήστης δημιουργεί μια συντόμευση από τις προτεινόμενες ενέργειες και η επέκταση την εκτελεί χωρίς συμμετοχή του Siri.
Προσαρμοσμένα intents είναι διαθέσιμα από iOS 14 και νεότερες εκδόσεις. Για iOS 10–13 είναι διαθέσιμοι μόνο οι τυπικοί τομείς SiriKit. Τα προσαρμοσμένα intents απαιτούν Intents.intentdefinition και δημιουργία κλάσεων Swift.
Το Siri αναμένει απάντηση από την επέκταση για περίπου 15 δευτερόλεπτα. Σε περίπτωση υπέρβασης του ορίου, το Siri ενημερώνει τον χρήστη ότι η ενέργεια απέτυχε. Για μακροχρόνιες λειτουργίες, χρησιμοποιήστε τον κωδικό απάντησης inProgress.
Χρησιμοποιήστε το Keychain με κοινή πρόσβαση μέσω access group μεταξύ της κύριας εφαρμογής και της επέκτασης. Το App Group shared UserDefaults είναι εναλλακτική, αλλά υστερεί σε σχέση με το Keychain όσον αφορά την ασφάλεια.
Intents Extension επεξεργάζεται τη λογική — resolve, confirm, handle. Intents UI Extension παρέχει προσαρμοσμένη διεπαφή για εμφάνιση εντός Siri μέσω INUIHostedViewProviding. Και τα δύο μπορούν να λειτουργήσουν μαζί.
Σύνοψη
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης