إطار App Intents في iOS 26: دليلك الشامل لـ Siri وApple Intelligence

دليل عملي لإطار App Intents في iOS 26: بناء أفعال Siri، تعريف الكيانات، Interactive Snippets، ودمج Apple Intelligence مع أمثلة Swift كاملة.

App Intents iOS 26: دليل Siri 2026

آخر تحديث: 26 يونيو 2026

إطار 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 بـ SwiftUIIntents 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 فهرسة عناصرك وعرضها في نتائج البحث.

struct Note: AppEntity {
    let id: UUID
    let title: String
    let body: String

    static var typeDisplayRepresentation: TypeDisplayRepresentation = "ملاحظة"

    var displayRepresentation: DisplayRepresentation {
        DisplayRepresentation(title: "\(title)", subtitle: "\(body.prefix(60))")
    }

    static var defaultQuery = NoteQuery()
}

struct NoteQuery: EntityQuery {
    func entities(for identifiers: [Note.ID]) async throws -> [Note] {
        try await NoteStore.shared.notes(matching: identifiers)
    }

    func suggestedEntities() async throws -> [Note] {
        try await NoteStore.shared.recentNotes(limit: 10)
    }
}

الـ 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 أو الاقتراح.

struct ShowOrderIntent: AppIntent {
    static var title: LocalizedStringResource = "عرض الطلب"

    @Parameter(title: "الطلب")
    var order: OrderEntity

    func perform() async throws -> some IntentResult & ShowsSnippetView {
        let snapshot = try await OrderService.shared.snapshot(for: order.id)
        return .result(view: OrderSnippet(snapshot: snapshot))
    }
}

struct OrderSnippet: View {
    let snapshot: OrderSnapshot

    var body: some View {
        VStack(alignment: .leading, spacing: 12) {
            Text(snapshot.customerName).font(.headline)
            Text(snapshot.total, format: .currency(code: "SAR"))

            Button(intent: ConfirmOrderIntent(orderID: snapshot.id)) {
                Label("تأكيد الطلب", systemImage: "checkmark.circle")
            }
        }
        .padding()
    }
}

الزر يُربط مباشرة بنية أخرى عبر Button(intent:). هذا يُحوّل Siri والاقتراحات إلى سطح تطبيق صغير، ويفتح الباب لتصميم تجارب لا تتطلب فتح التطبيق إطلاقًا. مفيد جدًا لتأكيد طلبات، التحكم بأجهزة المنزل الذكي، أو تنفيذ إجراءات سريعة من شاشة القفل. للتفاعل مع لغة Liquid Glass، استخدم نفس مكونات SwiftUI التي تستعملها داخل التطبيق وسيتولى النظام تطبيق المظهر الزجاجي تلقائيًا.

كيفية اختبار App Intents في Xcode 26

اختبار النوايا أصبح أسهل بكثير في Xcode 26 بفضل مركز App Intents الجديد. هناك ثلاث طرق رئيسية:

  1. تطبيق Shortcuts: أبسط طريق. شغّل تطبيقك على المحاكي، افتح Shortcuts، اضغط +، ابحث عن اسم تطبيقك، وستجد نواياك مدرجة. اسحبها وجرّب التنفيذ.
  2. سطر الأوامر: الأمر shortcuts run "اسم الاختصار" من Terminal يُشغّل أي اختصار كأن المستخدم استدعاه. مفيد جدًا في خطوط CI.
  3. اختبار الوحدات: النوايا أنواع Swift عادية. أنشئ نسخة، اضبط معاملاتها، واستدعِ perform() داخل اختبار.
import Testing
@testable import MyApp

@Test func createsNoteWithBody() async throws {
    let intent = CreateNoteIntent()
    intent.body = "محتوى تجريبي"
    _ = try await intent.perform()
    #expect(await NoteStore.shared.lastNote?.body == "محتوى تجريبي")
}

لمزيد من التفاصيل حول كتابة اختبارات حديثة مع إطار 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 في السلاسل الذكية.

Lukas Müller
عن الكاتب Lukas Müller

iOS developer and Swift author since the Objective-C days. Spends his evenings on side projects and his mornings on SwiftUI internals.