إطار App Intents في iOS 26 هو واجهة برمجة تطبيقات تعريفية تتيح لتطبيقك الكشف عن أفعاله وبياناته للنظام، بحيث يستطيع Siri وSpotlight واختصارات Shortcuts وApple Intelligence استدعاءها مباشرة دون فتح التطبيق. ببساطة، تكتب نوعًا يتوافق مع بروتوكول AppIntent، وتُعرّف معاملاته عبر @Parameter، فيتحول كودك إلى قدرة قابلة للاستدعاء عبر الصوت والاقتراحات الذكية ولوحات التحكم. مع iOS 26، أضافت Apple مفاهيم جديدة مثل Interactive Snippets ودمج أعمق مع نماذج Apple Intelligence على الجهاز.
إطار App Intents حلّ بدلاً من SiriKit القديم منذ iOS 16، وأصبح في iOS 26 الواجهة الرسمية لكل تكاملات Siri وSpotlight وApple Intelligence.
يحتاج كل تطبيق إلى نوع يطبّق AppIntent ودالة perform() غير متزامنة تُرجع نتيجة من نوع IntentResult.
المعاملات تُعرَّف بـ @Parameter، ويتولى النظام عرض واجهات الإدخال وطلب التأكيد عند الحاجة.
الكيانات (AppEntity) تُمكّن Siri والاختصارات من فهم نماذج بياناتك، مثل المهام أو الملاحظات أو العملاء.
Interactive Snippets في iOS 26 تتيح عرض مكونات SwiftUI تفاعلية ضمن واجهة Siri والاقتراحات.
اختبار النوايا يتم عبر تطبيق Shortcuts، ومركز App Intents الجديد في Xcode 26، وأدوات سطر الأوامر للتحقق من البيانات الوصفية.
ما هو إطار App Intents في iOS 26؟
إطار App Intents هو طبقة تعريفية تربط منطق تطبيقك بنظام التشغيل دون كتابة ملفات Intents Definition أو امتدادات منفصلة كما كان الحال مع SiriKit. تُعرّف فعلًا واحدًا (مثلاً "أضف مهمة جديدة") كنوع Swift يطبّق بروتوكول AppIntent، ويتولى Xcode إنشاء البيانات الوصفية تلقائيًا أثناء البناء، فيظهر الفعل في تطبيق Shortcuts وSpotlight وSiri وعلى Apple Watch وشاشة القفل.
في iOS 26 وسّعت Apple الإطار ليصبح المسار الموحّد لكل تكاملات الذكاء على الجهاز. أي تطبيق يريد الظهور كأداة لـ Apple Intelligence (سواء عبر سؤال صوتي، أو اقتراح في Spotlight، أو فعل ينفذه ChatGPT داخل النظام) يجب أن يُصرّح عن قدراته من خلال App Intents. هذا يُغيّر طريقة تصميم البنية: لم تعد الأفعال تعيش داخل الـ ViewControllers فقط، بل تتحول إلى وحدات قابلة لإعادة الاستخدام يستدعيها النظام مثلما تستدعي زرًا داخل التطبيق.
أعمل على Swift منذ أيام Objective-C، وما يميّز App Intents من زاوية تصميم API أنه يستفيد من الـ macros وتعليقات النوع بشكل طبيعي، بحيث يصبح التوصيف ذاتيًا. لم نعد بحاجة إلى لوحة .intentdefinition منفصلة ولا توليد أكواد يدوي مزعج.
الفرق بين App Intents وSiriKit القديم
SiriKit أُطلق في 2016 وكان يفرض اختيارًا من قائمة جاهزة من المجالات (Messaging، Workouts، Payments…) ولم يكن مرنًا. App Intents يقلب المعادلة: أنت من يُعرّف الأفعال والكيانات، والنظام يتعلّم منها. الجدول أدناه يلخّص الفروقات الأساسية.
الجانب
App Intents (iOS 16 فما فوق)
SiriKit القديم
نموذج التعريف
نوع Swift يطبّق AppIntent
ملف .intentdefinition + امتداد منفصل
المجالات المدعومة
مفتوح لأي فعل في تطبيقك
قائمة محدودة (Messaging، Workouts…)
المعاملات
@Parameter مع استنتاج النوع
معرَّفة يدويًا في ملف الـ definition
التكامل مع Apple Intelligence
أصلي ومدعوم في iOS 26
غير مدعوم
الواجهات الديناميكية
Interactive Snippets بـ SwiftUI
Intents UI Extension محدودة
الكتابة
Swift خالص، آمن نوعيًا
كود مُولَّد ومُتفرّع
إن كنت تصون تطبيقًا قديمًا يستخدم SiriKit، فالنصيحة في 2026 هي الترحيل التدريجي: ابدأ بكتابة الأفعال الجديدة في App Intents، وأبقِ امتدادات SiriKit للمجالات التي تعتمد عليها (مثل المكالمات الصوتية أو الرسائل) لأن بعضها لا يزال مرتبطًا بأدوار النظام. تذكّر أيضًا أن App Intents تعمل من iOS 16 فما فوق، فإن كنت تدعم iOS 15 فستحتاج إلى مسارين.
بناء أول AppIntent خطوة بخطوة
لنبني فعلًا بسيطًا في تطبيق ملاحظات: "أنشئ ملاحظة جديدة بمحتوى محدد". الكود التالي يكفي لجعل الفعل متاحًا في Shortcuts وSpotlight وSiri.
import AppIntents
import SwiftUI
struct CreateNoteIntent: AppIntent {
static var title: LocalizedStringResource = "إنشاء ملاحظة"
static var description = IntentDescription("ينشئ ملاحظة جديدة في التطبيق.")
@Parameter(title: "المحتوى")
var body: String
static var parameterSummary: some ParameterSummary {
Summary("أنشئ ملاحظة بمحتوى \(\.$body)")
}
func perform() async throws -> some IntentResult & ProvidesDialog {
let note = try await NoteStore.shared.create(body: body)
return .result(dialog: "تم حفظ الملاحظة \(note.title).")
}
}
ما يحدث هنا: العنوان والوصف يظهران في واجهة Shortcuts، وparameterSummary يُولّد جملة طبيعية تُعرض للمستخدم عند تركيب الاختصار. الدالة perform() غير متزامنة لأنها قد تُنفَّذ من الخلفية، وترجع نتيجة مع حوار يُقرأ بصوت Siri أو يُعرض كنص.
إضافة معاملات وطلبها من المستخدم
الأفعال الحقيقية نادرًا ما تأخذ سلسلة نصية واحدة. @Parameter يدعم أنواع Swift القياسية (String، Int، Date، URL، IntentFile…) إضافةً إلى التعدادات والكيانات. إذا لم يقدّم المستخدم قيمة، يستخدم النظام مربعات حوار آلية لجمعها.
struct ScheduleReminderIntent: AppIntent {
static var title: LocalizedStringResource = "جدولة تذكير"
@Parameter(title: "العنوان")
var title: String
@Parameter(title: "وقت التذكير", kind: .dateTime)
var dueDate: Date
@Parameter(title: "الأهمية", default: .normal)
var priority: ReminderPriority
static var parameterSummary: some ParameterSummary {
Summary("ذكّرني بـ \(\.$title) في \(\.$dueDate)") {
\.$priority
}
}
func perform() async throws -> some IntentResult {
try await ReminderService.shared.schedule(
title: title, at: dueDate, priority: priority
)
return .result()
}
}
enum ReminderPriority: String, AppEnum {
case low, normal, high
static var typeDisplayRepresentation: TypeDisplayRepresentation = "الأهمية"
static var caseDisplayRepresentations: [Self: DisplayRepresentation] = [
.low: "منخفضة", .normal: "عادية", .high: "عالية"
]
}
لاحظ كيف يلتقط parameterSummary المعاملات الإلزامية في الجملة الأساسية ويُخفي الاختيارية تحت قسم منفصل. هذا يُحسّن تجربة الاختصارات كثيرًا. التعدادات تطبّق AppEnum مع تمثيلات نصية مترجمة، فتظهر بالعربية تلقائيًا للمستخدم الذي اختار العربية لغةً للنظام.
طلب التأكيد
للأفعال الحساسة (الدفع، الحذف، الإرسال) استخدم requestConfirmation داخل perform() لإجبار Siri على عرض شاشة تأكيد قبل التنفيذ. لا تعتمد على الحوار النصي فقط؛ التأكيد التفاعلي يحمي المستخدم ويحمي تقييم تطبيقك من شكاوى "نفّذ الفعل دون أن أطلبه".
تعريف الكيانات عبر AppEntity وEntityQuery
الكيانات هي الجسر بين بيانات تطبيقك والنظام. عندما تُعرّف نوعك كـ AppEntity، يستطيع المستخدم اختيار "ملاحظة محددة" أو "العميل ذو الاسم X" كمعامل لفعلك، ويستطيع Spotlight فهرسة عناصرك وعرضها في نتائج البحث.
الـ EntityQuery تُجيب على سؤالين: "ما العناصر المتاحة الآن لاقتراحها؟" و"كيف أحضر عنصرًا بمعرّف معيّن؟". إذا أردت بحثًا نصيًا حرًا داخل الاختصارات، طبّق بروتوكول EntityStringQuery الإضافي. للحصول على أداء جيد، احرص أن يكون suggestedEntities سريعًا، استخدم cache أو استعلامًا محدود الصفوف، لأن النظام يستدعيها بشكل متكرر عند بناء الاختصارات.
للتعمّق في نمذجة البيانات المحلية، راجع دليل SwiftData الشامل؛ يمكنك تحويل أي @Model إلى كيان App Intent بسطور قليلة بفضل التكامل الجديد بين الإطارين في iOS 26.
ربط النوايا بالاختصارات عبر AppShortcutsProvider
تعريف النية وحدها لا يكفي لجعلها قابلة للاستدعاء صوتيًا. تحتاج إلى AppShortcutsProvider يُعرّف عبارات Siri التي تُطلق الفعل. النظام يكتشف هذا المزوّد تلقائيًا أثناء البناء ويُسجّل العبارات.
struct NotesShortcuts: AppShortcutsProvider {
static var appShortcuts: [AppShortcut] {
AppShortcut(
intent: CreateNoteIntent(),
phrases: [
"أنشئ ملاحظة في \(.applicationName)",
"ملاحظة جديدة في \(.applicationName)",
"Create a note in \(.applicationName)"
],
shortTitle: "ملاحظة جديدة",
systemImageName: "square.and.pencil"
)
}
}
الحد الأقصى الموصى به هو 10 عبارات لكل تطبيق و4 اختصارات في المزوّد. زيادة العدد لن تكسر التطبيق، لكنها تربك المستخدم في صفحة الاختصارات. ضع الأفعال الأكثر استخدامًا فقط، واترك البقية للمستخدم ليُركّبها يدويًا في تطبيق Shortcuts.
دمج App Intents مع Apple Intelligence في iOS 26
أكبر تحوّل في iOS 26 هو أن Apple Intelligence أصبح يستدعي App Intents مباشرة. عندما يطلب المستخدم من Siri "لخّص آخر اجتماع وأضفه إلى ملاحظاتي"، يقوم النظام بتفكيك الجملة وتحديد سلسلة من النوايا المسجّلة (واحدة للتلخيص، أخرى لإنشاء ملاحظة)، ثم يُنفّذها بالتتابع مع تمرير البيانات بينها.
لتجعل نواياك مرشحة قويّة لهذا النمط:
اكتب أوصافًا غنية في IntentDescription، فيستخدمها النموذج لاختيار الفعل المناسب.
اجعل معاملاتك منطقية ومستقلّة، وتجنّب الاعتماد على حالة داخلية مخفية.
أضف resultValueName للنوايا التي تُرجع بيانات، حتى يفهم النموذج كيفية تمرير النتيجة إلى الفعل التالي.
ادعم OpensIntent أو ReturnsValue بدلاً من الاكتفاء بـ IntentResult العادي.
إن كنت تستخدم نماذج اللغة على الجهاز لتوليد محتوى داخل الفعل، فالنمط الأفضل هو استدعاء واجهة Foundation Models داخل perform(). لتفاصيل هذا الإطار راجع مقالنا حول إطار Foundation Models في iOS 26. الجمع بين الاثنين (نوايا تُكشف عن الفعل، ونماذج تُولّد محتواه) هو ما يجعل تطبيقًا "ذكيًا" بمعنى Apple Intelligence.
Interactive Snippets: واجهات SwiftUI داخل Siri
كان بإمكانك سابقًا إرجاع SnippetView ثابت من نية App Intent لعرض ملخّص بصري. في iOS 26، أصبحت هذه اللقطات تفاعلية: يمكن للمستخدم أن يضغط أزرارًا، يُغيّر قيمًا، ويستدعي نوايا فرعية، دون أن تخرج واجهة Siri أو الاقتراح.
الزر يُربط مباشرة بنية أخرى عبر Button(intent:). هذا يُحوّل Siri والاقتراحات إلى سطح تطبيق صغير، ويفتح الباب لتصميم تجارب لا تتطلب فتح التطبيق إطلاقًا. مفيد جدًا لتأكيد طلبات، التحكم بأجهزة المنزل الذكي، أو تنفيذ إجراءات سريعة من شاشة القفل. للتفاعل مع لغة Liquid Glass، استخدم نفس مكونات SwiftUI التي تستعملها داخل التطبيق وسيتولى النظام تطبيق المظهر الزجاجي تلقائيًا.
كيفية اختبار App Intents في Xcode 26
اختبار النوايا أصبح أسهل بكثير في Xcode 26 بفضل مركز App Intents الجديد. هناك ثلاث طرق رئيسية:
تطبيق Shortcuts: أبسط طريق. شغّل تطبيقك على المحاكي، افتح Shortcuts، اضغط +، ابحث عن اسم تطبيقك، وستجد نواياك مدرجة. اسحبها وجرّب التنفيذ.
سطر الأوامر: الأمر shortcuts run "اسم الاختصار" من Terminal يُشغّل أي اختصار كأن المستخدم استدعاه. مفيد جدًا في خطوط CI.
اختبار الوحدات: النوايا أنواع Swift عادية. أنشئ نسخة، اضبط معاملاتها، واستدعِ perform() داخل اختبار.
لمزيد من التفاصيل حول كتابة اختبارات حديثة مع إطار Swift Testing الجديد، راجع دليل Swift Testing والترحيل من XCTest. للتحقق من البيانات الوصفية المُولَّدة (asset catalog النوايا)، استخدم الأمر xcrun appintentsmetadataprocessor --validate؛ يكشف المشاكل قبل أن يفشل النظام في رؤية أفعالك. توثيق اختبار App Intents الرسمي من Apple يستحق القراءة، خصوصًا قسم تشخيص أخطاء البناء.
أفضل الممارسات والأخطاء الشائعة
بعد كتابة عشرات النوايا في مشاريع إنتاجية، إليك ما تعلّمته:
افصل المنطق عن واجهة المستخدم. ضع كل ما يفعله الفعل في خدمة (NoteService) واستدعِها من داخل perform(). هذا يجعل النية قابلة للاختبار ويسمح لزر داخل التطبيق باستدعاء نفس المنطق.
اجعل النوايا قابلة للاستدعاء من الخلفية. لا تفترض أن التطبيق في المقدّمة. تجنّب استدعاء UIApplication.shared أو الوصول إلى الـ ViewControllers مباشرة.
ترجم العناوين والأوصاف. استخدم LocalizedStringResource دائمًا. النصوص الحرفية لا تُترجم تلقائيًا وستظهر بالإنجليزية للمستخدم العربي.
تجنّب الأفعال المركّبة جدًا. فعل واحد = هدف واحد. إن احتجت إلى تجميع، اتركه للمستخدم في تطبيق Shortcuts.
راقب أخطاء التشغيل. ارمِ أخطاء واضحة من perform()، فيستخدمها Siri في الحوار ("لم أتمكن من العثور على الملاحظة المطلوبة").
اختبر على جهاز فعلي. بعض السلوكيات (الاستجابة الصوتية، تكامل Apple Intelligence) لا تعمل على المحاكي.
الخطأ الأكثر شيوعًا الذي رأيته: مطوّرون يكتبون النوايا ثم يفشلون في رؤيتها في Shortcuts. السبب 90% من الوقت هو أن النوع غير public أو أنه داخل امتداد لا يضم البيانات الوصفية. تأكد أن النوع في الهدف الرئيسي للتطبيق، أو فعّل تجميع البيانات الوصفية في إعدادات الإطار المشترك.
الأسئلة الشائعة
ما الحد الأدنى من iOS المطلوب لاستخدام App Intents؟
iOS 16 فما فوق للأساسيات. ميزات مثل Interactive Snippets ودمج Apple Intelligence تحتاج iOS 26، بينما الكيانات المتقدمة وعمليات البحث النصي متاحة من iOS 17.
هل يمكن استدعاء App Intents من داخل التطبيق نفسه؟
نعم، استخدم Button(intent:) في SwiftUI أو أنشئ نسخة من النية واستدعِ perform() مباشرة. هذا يُشجّع على فصل المنطق ويعيد استخدام نفس الكود من Siri والتطبيق.
ما الفرق بين App Intents وWidgetKit؟
WidgetKit يعرض المحتوى، وApp Intents تُنفّذ الأفعال. منذ iOS 17 يمكن للودجات استدعاء App Intents مباشرة عبر Button(intent:)، فيتعاون الإطاران لبناء ودجات تفاعلية بالكامل.
هل تعمل App Intents في watchOS وmacOS؟
نعم. نفس الكود يعمل عبر iOS وiPadOS وwatchOS 10 فأحدث وmacOS 14 فأحدث. فقط احرص أن المنطق داخل perform() لا يستخدم واجهات برمجة تطبيقات حصرية لمنصة واحدة.
كيف أمنع Apple Intelligence من استدعاء نية معيّنة؟
اضبط static var isDiscoverable = false على النية. سيظل المستخدم قادرًا على استدعائها يدويًا من Shortcuts، لكن النظام لن يقترحها ولن يستخدمها Apple Intelligence في السلاسل الذكية.
دليل عملي لبناء التنقل في SwiftUI باستخدام NavigationStack وNavigationPath ونمط الموجّه Router على iOS 26، مع أمثلة كاملة للتنقل البرمجي، الروابط العميقة، دعم VoiceOver، واختبار المسارات بـ Swift Testing.
دليل عملي شامل لإطار Swift Testing الجديد في Xcode 26: تركيب @Test و#expect، الاختبارات المعاملة، السمات، التزامن async/await، وخطوات ترحيل تدريجي من XCTest دون كسر CI.
تعلّم بناء تطبيقات ذكاء اصطناعي تعمل على الجهاز بالكامل باستخدام إطار Foundation Models في iOS 26 — من التوليد الموجّه والبث المباشر إلى استدعاء الأدوات، مع أمثلة Swift وSwiftUI عملية.