Geliştiriciler
iOS 27'de App Intents: Siri, App Schemas ve Semantic Index
iOS 27'de App Intents Siri ile nasıl çalışır: App Schemas, IndexedEntity ve semantic index, ekran farkındalığı ve iPhone Duo'da IntentValueRepresentation.
AppleDuo EditörlüğüYayınlanma 6 dk okuma
Bu sayfada
- iOS 27'de App Intents nedir?
- App Schemas ve domain'ler Siri'nin uygulamanızı anlamasını nasıl sağlar?
- Uygulamamın içeriğini Siri'nin bulabilmesini nasıl sağlarım?
- İçeriğim indekslenemiyorsa ne olur?
- Siri uygulamamda ekranda ne olduğunu nasıl bilir?
- Siri aracılığıyla diğer uygulamalarla nasıl veri paylaşırım?
- iPhone Duo'da Siri için ne değişiyor?
- Önemli çıkarımlar
iOS 27'deki Siri, uygulamaların içindeki içeriği bulabiliyor, onun üzerinde işlem yapabiliyor ve ekranda ne olduğunu anlayabiliyor. Uygulamanız kendini Siri'nin okuyabileceği bir şekilde tanımlamadıkça bunların hiçbiri gerçekleşmez. Bu tanım App Intents'tir: Shortcuts ve Spotlight eylemlerinin arkasındaki aynı framework; iOS 27'de App Schemas, semantic index ve uygulamalar arasında veri paylaşmanın yeni yollarıyla genişletildi. Bu rehber her parçayı, Apple'ın benimsenmesini önerdiği sırayla ele alıyor.
Yazı Apple'ın WWDC26 oturumlarına ve dokümantasyonuna, Jordan Morgan'ın bir yazısına ve iOS geliştiricisi @sarunw'nun paylaşımlarına dayanıyor. AppleDuo ekibi bu kodu yayımlanan bir uygulamada kullanmadı. Bazı API'ler iOS 27 ve Xcode 27 ile geldi, bazıları iOS 18 veya iOS 26'ya kadar uzanıyor; ayrıntılar sürümler arasında değişebilir.
iOS 27'de App Intents nedir?
@sarunw'nun ifadesiyle, bir App Intent uygulamanızın yapabildiği bir eylemdir. Onu tanımladığınızda sistemin her yerinde kullanılabilir olur: Shortcuts, Spotlight ve widget'lar. WWDC26'daki Build intelligent Siri experiences with App Schemas oturumunda Apple, App Intents'i Siri ve Apple Intelligence ile entegrasyonun temeli olarak tanımlıyor.
Temel bir intent'in bir başlığı ve bir perform() metodu vardır. Bu yapı iOS 16'dan beri mevcut:
struct OpenInboxIntent: AppIntent {
static var title: LocalizedStringResource = "Open Inbox"
static var openAppWhenRun = true
func perform() async throws -> some IntentResult {
// Gelen kutusuna git
return .result()
}
}
iOS 27'deki yenilik, Siri'nin bu eylemleri ne kadar ileri taşıyabildiği. Apple'ın yaklaşımına göre dil anlama işini Siri üstleniyor, uygulamanız ise eyleme odaklanıyor. Bu iş bölümünün çalışması için Siri'nin her eylemin ve her içerik parçasının ne anlama geldiğini bilmesi gerekiyor.
App Schemas ve domain'ler Siri'nin uygulamanızı anlamasını nasıl sağlar?
@sarunw bunu üç parçada özetliyor. App Intents eylemi tanımlar. App Schemas ona Siri'nin anladığı bir anlam kazandırır. Domain'ler ilgili schema'ları bir araya toplar.
Apple, schema'ları App Intents'in özelleşmiş bir hali olarak tanımlıyor: hâlâ App Intents'tirler, ancak Siri'nin onları nasıl işleyeceğini bileceği şekilde biçimlendirilmişlerdir. Bir schema'yı, bildirimin önüne yazılan bir makroyla uygularsınız: AppIntent(schema:), AppEntity(schema:) veya AppEnum(schema:). Apple'ın App schema domains sayfası üç grup listeliyor:
| Domain grubu | Örnekler | Çalıştığı yer |
|---|---|---|
| Birincil domain'ler | Audio, Calendar, Camera, Clock, Mail, Maps, Messages, Notes, Phone, Photos, Reminders, System ve uygulama içi arama | Apple Intelligence ve Siri |
| Tek amaçlı domain'ler | Assistant, Visual intelligence | Belirli tek bir sistem yüzeyi |
| Shortcuts'a özgü domain'ler | Books, Browser, Files, Journaling, Presentation, Reader, Spreadsheet, Whiteboard, Word processor | Yalnızca Shortcuts, Siri değil |
Schema domain'leri ilk olarak iOS 18 ile ortaya çıktı. WWDC26 oturumunda Apple'ın örnek mesajlaşma uygulaması Messages domain'indeki sendMessage schema'sını benimsiyor. Xcode 27 ayrıca derleme zamanında ilgili schema'ları kontrol ediyor: draftMessage olmadan sendMessage'ı benimserseniz, taslak kodu oluşturan bir Fix-It ile birlikte derleme hatası alırsınız.
İçeriğiniz hiçbir schema'ya uymuyorsa yine de düz App Intents yayımlayabilirsiniz. Jordan Morgan'ın iOS 27 yazısı, yeni Siri davranışının ne kadarının bir schema dışındaki uygulamalara ulaştığının henüz net olmadığını belirtiyor.
Uygulamamın içeriğini Siri'nin bulabilmesini nasıl sağlarım?
Eylemler işin yarısı; Siri'nin ayrıca kişinin bahsettiği şeyi bulması gerekiyor. @sarunw, Apple'ın oturumundaki sırayla örtüşen dört adım sıralıyor:
| Adım | API | Neden |
|---|---|---|
| 1. İçeriği tanımlayın | AppEntity | Bir şeyin ne olduğunu, nasıl tanımlandığını ve hangi özelliklerin önemli olduğunu söyler |
| 2. Ona bir anlam verin | @AppEntity(schema:) | Siri'ye bunun ne tür bir içerik olduğunu söyler |
| 3. İndeksleyin | IndexedEntity | Entity'leri sistemin semantic index'ine ekler |
| 4. Yedek yol | EntityStringQuery | Önceden indeksleyemediğiniz içeriği bulur |
- ve 3. adımlar tek bir bildirimde bir araya gelir. Apple'ın WWDC26 oturumundaki mesaj entity'si şöyle:
@AppEntity(schema: .messages.message)
struct MessageEntity: IndexedEntity {
// Mesajın metin içeriği
@Property(indexingKey: \.textContent)
var body: AttributedString?
}
@sarunw bunu üç karara ayırıyor: içeriğin türü, indekse ait olduğu ve hangi alanın indeksleneceği. Apple, IndexedEntity'yi benimsemenin entity çözümlemesini güçlendirmenin birincil yolu olduğunu söylüyor; çünkü indekslenen entity'ler semantic index'e girer ve bu da Siri'nin birebir kelimelerle değil anlamla eşleştirme yapmasını sağlar.
indexingKey kısmı bir çeviridir. @sarunw'nun açıkladığı gibi, özelliğinizin adı body, ancak Spotlight değerini textContent olarak saklıyor. Bu eşleme olmadan sistemin alanlarınızdan hangisinin mesaj metnini tuttuğunu bilmesinin hiçbir yolu yok.
Hangi parçalar yeni?
Apple'ın App Intents updates sayfasına göre IndexedEntity iOS 18'de, @Property(indexingKey:) ise iOS 26'da geldi. iOS 27'nin eklediği şey, Siri'nin bu indeksi anlamsal eşleştirme için kullanması ve IndexedEntityQuery gibi yeni tipler. Code-along oturumunda Apple ayrıca içerik oluşturduktan veya güncelledikten sonra bir CSSearchableIndex üzerinde indexAppEntities'i, içerik sildikten sonra da deleteAppEntities'i çağırarak indeksi güncel tutuyor.
İçeriğim indekslenemiyorsa ne olur?
Bazı içerikler önceden indekslenemez: bir sunucuda durur, sürekli değişir veya çok büyüktür. Bu durumlar için Apple EntityStringQuery'yi işaret ediyor. Siri kişinin kelimelerini uygulamanıza iletir, uygulamanız da eşleşen entity'leri döndürür. Apple'ın örneği şöyle:
struct ContactQuery: EntityStringQuery {
func entities(matching string: String) async throws -> [ContactEntity] {
let predicate = #Predicate<Person> { person in
person.name.localizedStandardContains(string)
}
let descriptor = FetchDescriptor<Person>(predicate: predicate)
let matches = try modelContext.fetch(descriptor)
return matches.map(\.entity)
}
}
Bir string sorgusu anlamı değil metni eşleştirir ve her istekte kodunuzu çalıştırır. Mümkün olan her yerde IndexedEntity'yi tercih edin, string sorgularını geri kalanlar için saklayın.
Siri uygulamamda ekranda ne olduğunu nasıl bilir?
@sarunw, iOS 27'de Siri'nin ekranınızda ne olduğunu okuyabildiğini, ancak bir view'un hangi App Entity'yi temsil ettiğini sizin söylemeniz gerektiğini belirtiyor. Apple'ın Providing contextual cues to Apple Intelligence and Siri makalesi iki yol tanımlıyor; WWDC26 oturumu da kuralı veriyor: ekranda tek bir birincil öğe varsa bir user activity, birden fazla anlamlı öğe görünüyorsa view işaretlemeleri kullanın.
Bir liste için her satıra appEntityIdentifier(_:) uygulayın:
List {
ForEach(messages) { message in
MessageRow(message: message)
.appEntityIdentifier(
EntityIdentifier(
for: MessageEntity.self,
identifier: message.id
)
)
}
}
Ekranı tek bir öğe kapladığında, onu bir NSUserActivity ile işaretleyin ve activity'nin appEntityIdentifier özelliğini ayarlayın. SwiftUI'da userActivity modifier'ı size yapılandırmanız için activity'yi verir. Apple'ın code-along'u etkinlik detay view'una bir EntityIdentifier ile .userActivity uyguluyor, ancak kodu göstermiyor; bu yüzden aşağıdaki bizim taslağımız:
EventDetailView(event: event)
.userActivity("com.example.viewEvent") { activity in
activity.title = event.title
activity.appEntityIdentifier = EntityIdentifier(
for: EventEntity.self,
identifier: event.id
)
}
Her iki API de iOS 27'den önce vardı: Apple'ın dokümantasyonu SwiftUI modifier'ını iOS 18.4'ten, NSUserActivity özelliğini ise iOS 18.2'den itibaren listeliyor. Apple ayrıca ilgisiz entity'ler eklemeye karşı uyarıyor: bir işaretleme, view'un gösterdiği veriyi yansıtmalı. Her entity için ayrı bir view olmayan, özel olarak çizilmiş içerik için appEntityUIElements(_:) kullanın.
Siri aracılığıyla diğer uygulamalarla nasıl veri paylaşırım?
Transferable, ShareLink ile sürükle-bırakın arkasındaki protokoldür. iOS 27'de Siri de onu kullanıyor. Bir IntentValueRepresentation döndürürsünüz ve tek bir uyumluluk her iki yönü de kapsar.
Bunun nedeni, düz dosyaların ve verilerin sınırları olması. Apple'ın örneği: Maps, bir simge yapının fotoğrafını oraya yol tarifi almak için kullanamaz. Kişiler, yerler ve adlar için IntentValueRepresentation (iOS 27 ile geldi), diğer uygulamaların doğrudan kullanabileceği IntentPerson, PlaceDescriptor veya PersonNameComponents gibi bir sistem tipini teslim eder. Apple'ın oturumundan dışa aktarma örneği:
extension ContactEntity: Transferable {
static var transferRepresentation: some TransferRepresentation {
IntentValueRepresentation(
exporting: \.person
)
}
}
Gelen değerler iki yoldan birini izler. Apple'ın kuralı, zaten var olan içeriği çözümlemek (resolve), olmayanı ise içe aktarmak (import). @sarunw'nun IntentValueQuery'yi anlattığı gibi, sistem gelen değeri iletir, siz de kendi verilerinize bakıp eşleşenleri döndürürsünüz:
struct ContactEntityQuery: IntentValueQuery {
func values(for input: [IntentPerson]) async throws -> [ContactEntity] {
let names = input.map(\.displayName)
let descriptor = FetchDescriptor<Contact>()
let contacts = try model.mainContext.fetch(descriptor)
let matches = contacts.filter { contact in
names.contains(where: { name in
contact.name.localizedStandardContains(name)
})
}
return matches.map(\.entity)
}
}
Hiçbir şey eşleşmediğinde içeriği IntentValueRepresentation(exporting:importing:) ile oluşturun; bu, gelen IntentPerson'dan yeni bir entity oluşturan bir closure alır. IntentValueQuery'nin kendisi, visual intelligence için tanıtıldığı iOS 26'ya dayanıyor.
Bir uyarı: forumlardaki bir geliştirici, bir iOS 27 beta sürümünde dışa aktarma closure'larının hiç çalışmadığını ve Siri'nin bunun yerine açıklama istediğini bildirdi. Başlıkta doğrulanmış bir yanıt yok; bu yüzden yayım sürümünde test edin.
iPhone Duo'da Siri için ne değişiyor?
API'lerde hiçbir şey. iPhone Duo'ya özel herhangi bir Siri veya App Intents API'si bulamadık; yukarıdaki kod iOS 27 çalıştıran her iPhone'da aynı.
Değişen şey tuval. iPhone Duo açıkken iç ekran iki yönde de regular size class bildirir; bu yüzden birçok uygulama aynı anda bir sidebar, bir liste ve bir detay view'u gösterir. iPhone Duo size class'ları rehberimiz bu yerleşim değişikliğini anlatıyor. Ekranda daha fazla şey olması, Siri'nin "bunu" veya "üçüncü mesajı" gibi ifadelerle çözümlemesi gereken daha fazla öğe ve eksik bir işaretlemenin Siri'yi tahmin etmeye zorladığı daha fazla yer anlamına geliyor.
Birkaç pratik kontrol:
- Her sütunu işaretleyin. Bir split yerleşim bir detay view'unun yanında bir liste gösteriyorsa, liste satırlarına
appEntityIdentifier, detay view'una da bir user activity verin. - İşaretlemeleri görünen verilere bağlı tutun. Cihaz katlandıkça ve yerleşiminiz değiştikçe, işaretlemeler gerçekten ekranda olan view'ları takip etmeli.
- Aşamalı doğrulayın. Apple, mantık için
AppIntentsTestingframework'ünü, ardından intent yapısı için Shortcuts'ı, indeksleme için Spotlight'ı ve akışın tamamı için Siri'yi öneriyor.
Bir uygulamayı uyarlama işinin geri kalanı için iPhone Duo hazırlık kontrol listemizi kullanın.
Önemli çıkarımlar
- App Intents eylemleri tanımlar;
@AppIntent(schema:)ve@AppEntity(schema:)ile uygulanan App Schemas onlara Siri'nin anladığı bir anlam verir; domain'ler schema'ları gruplar. - İçeriği dört adımda bulunabilir hale getirin: App Entity, App Schema, semantic index için
IndexedEntityve yedek olarakEntityStringQuery. @Property(indexingKey:), alanınızı Spotlight'ınkiyle eşler; örneğinbody'yitextContent'e.- Ekran farkındalığı için liste satırlarında
appEntityIdentifier, ekranı tek bir öğe kapladığında iseNSUserActivitykullanın. - Veri paylaşmak için
IntentValueRepresentation(iOS 27) ileTransferable'ı, gelen değerleri eşleştirmek için deIntentValueQuery'yi benimseyin. - iPhone Duo aynı API'leri kullanır; daha büyük tuvali yalnızca ekrana işaretlenecek daha fazla içerik getirir.
Sırada, iPhone Duo için App Store ekran görüntülerinizi planlayın ya da katlanabilir ekran için zaten geliştirilmiş uygulama ve oyunlara göz atın.
Sık sorulan sorular
Uygulamamın iOS 27'de Siri ile çalışması için neye ihtiyacım var?
Eylemlerinizi App Intents, içeriğinizi App Entities olarak tanımlayın, ardından bunları Messages veya Calendar gibi uygun bir domain'deki App Schemas'a uyumlu hale getirin. Schema'lar Siri'ye bir intent'in veya entity'nin ne anlama geldiğini söyler; böylece eğitim cümleleri yazmanız gerekmez.
IndexedEntity Siri için ne işe yarar?
IndexedEntity'yi benimsemek, app entity'lerinizi sistemin semantic index'ine ekler; bu da Siri'nin onları birebir kelimelerle değil anlamlarıyla bulmasını sağlar. Apple bunu entity çözümlemesini (entity resolution) güçlendirmenin birincil yolu olarak tanımlıyor.
@Property(indexingKey:) ne işe yarar?
Entity'nizin özelliklerinden birini bir Spotlight özniteliğiyle eşler. Örneğin body adlı bir mesaj özelliği textContent anahtarı altında indekslenebilir; böylece sistem o alanın mesaj metnini tuttuğunu bilir.
Siri uygulamamın ekranında ne olduğunu nasıl bilir?
Siz söylersiniz. Görünen her öğenin bir App Entity ile eşleşmesi için bir listenin her satırına appEntityIdentifier modifier'ını uygulayın ya da ekranı tek bir öğe kaplıyorsa appEntityIdentifier içeren bir NSUserActivity ekleyin.
Başka bir uygulamanın Siri aracılığıyla verilerimi kullanmasına nasıl izin veririm?
App Entity'nizi Transferable'a uyumlu hale getirin ve IntentPerson gibi bir sistem tipini dışa aktaran bir IntentValueRepresentation döndürün. Gelen değerleri kabul etmek için onları bir IntentValueQuery ile eşleştirin ya da importing varyantıyla yeni içerik oluşturun.
iPhone Duo'ya özel bir Siri API'si var mı?
Bulabildiğimiz kadarıyla yok. Siri entegrasyonu her iPhone'da aynı App Intents API'lerini kullanır. iPhone Duo'nun daha büyük iç ekranında aynı anda daha fazla içerik görünebildiği için görünen her öğeyi işaretlemek daha da önemli hale gelir.
Kaynaklar
- Build intelligent Siri experiences with App Schemas (WWDC26) · Apple Developer
- Code-along: Make your app available to Siri (WWDC26) · Apple Developer
- Providing contextual cues to Apple Intelligence and Siri · Apple Developer Documentation
- App schema domains · Apple Developer Documentation
- App Intents updates · Apple Developer Documentation
- appEntityIdentifier(_:) · Apple Developer Documentation
- iOS 27, Your App, and Siri · Swiftjective-C (Jordan Morgan)
- An App Intent is an action your app can do · @sarunw on X
- App Intents, App Schemas and domains · @sarunw on X
- Making your app's content findable by Siri, in four steps · @sarunw on X
- Three things make a message searchable by meaning · @sarunw on X
- Three decisions, one declaration · @sarunw on X
- indexingKey is a translation · @sarunw on X
- Siri can read what's on your screen in iOS 27 · @sarunw on X
- When one item fills the screen, annotate it with NSUserActivity · @sarunw on X
- In iOS 27, Siri uses Transferable too · @sarunw on X
- IntentValueQuery: match the incoming value, or create it · @sarunw on X
- Folded, iPhone Duo is an iPhone. Unfolded, it's an iPad · @sarunw on X
- Is .appEntityIdentifier + Transferable the intended way to let Siri send an on-screen image to another app? · Apple Developer Forums
Katlanmayı uygulamanızın bir parçası yapın.
iPhone Duo ile gerçekten bir şey yapan uygulama ve oyunları tanıtıyoruz. App Store bağlantısıyla sizinkini gönderin ya da diğer geliştiricilerin neler yaptığına bakın.