Table of Contents
بناء نظام تسجيل الصوت - يمكن استخدامه في نظام iOS مع شركة Siri Integration
وقد أصبحت مراقبة الصوت توقعا رئيسيا في أجهزة الإنتاجية الحديثة، إذ إن تمكين المستعملين من إدارة المهام الخالية من اليد، يمكن لمطوري النظام الإلكتروني لرصد المحيطات أن يخلقوا خبرة أكثر سهولة وأكثر كفاءة في مجال القائمة، وسيري، مساعد الصوت الذكي لـ " آبل " ، يوفر إطارا قويا لإدماج أوامر الصوت مباشرة في تطبيقكم، وهذا الدليل يمشيكم من خلال كل خطوة من خطوات بناء جهاز للتفاعل الصوتي مع قائمة الأدوات، من خلال استحداث تقنيات أولية للنشر.
فهم السيريكيت ودورها في إدارة المهام
(سيريكيت) هو إطار يسمح لمقدمتك بتوسيع نطاق عملها إلى (سيري)، وبدلاً من بناء واجهة صوتية منفصلة، تحددون الإجراءات التي يمكن أن يقوم بها مستخدمو هذه الأجهزة من خلال أوامر الصوت، ويتعامل (سيري) مع الاعتراف بالكلمات وتجهيز اللغات الطبيعية، وكي يتسنى تطبيق القائمة القيام بأعمال مثل إضافة مهمة، أو إزالة مهمة، أو إظهار المهام الحالية، أو حتى وضع مهمة كاملة.
ويستخدم الإطار intents - أجسام تمثل أفعالاً للمستعملين، ويعرف تطبيقك النوايا العرفية للعمليات المحددة التي يدعمها، وعندما يتكلم المستخدم عن قيادة مثل " السيري، يضيف الحليب إلى قائمة التسوق في بلدي يؤكد أن " سيري يطابق العبارة التي تتوخاها، ويستخرج بارامترات (مثل اسم المهمة وقائمة المعالجها) ثم يستعملها.
وتشمل الفوائد الرئيسية لاستخدام نظام سيريكيت ما يلي:
- Hands-free operation:] Users can manage tasks while driving, cooking, or exercising.
- Increased accessibility:] Voice control helps users with motor or visual impairments.
- ] Consistency with system voice interactions: Your app feels like a first-class iOS citizen.
- Shortcut integration:] Users can create custom Siri shortcuts for frequently used actions.
SiriKit vs. Other Voice Solutions
وقد تتساءلون عما إذا كان ينبغي استخدام نظام " سيريكيت " ، أو الاعتراف بالكلمات الجمركية )عن طريق إطار سبيك(، أو خدمة طرف ثالث مثل " غوغل سبيك - تيكست " ، وهو النهج الموصى به للتكامل مع مساعد النظام لأنه لا يتطلب تسجيلا صوتيا مستقلا، ولا يوجد نظام للتعرف على الكلمات، ويعمل على أجهزة التصفيق، ويصلح إطار " سبيك " بشكل أفضل للقائمة التي تحتاج إلى معالجة سمعية.
وضع مشروعك للتكامل السيري
إنشاء تطبيق قابل للصوت يبدأ بتشكيل مشروع قياسي للرمز Xcode، كما ستحتاجون إلى تمكين قدرة السيري وإضافة تمديد للمواضيع لمعالجة الطلبات حتى عندما لا يُنفذ التطبيق.
الخطوة 1: إنشاء مشروع جديد للزجاجات
(د) إطلاق الرمز Xcode وإنشاء مشروع جديد باستخدام نموذج App ] App ]، وإعطاء مشروعك اسماً، مثل ]VoiceTodo، وضمان اختيار SwiftUI أو UIKit على أساس تفضيلكم.
الخطوة 2: تمكين قدرة السيري
In your app target’s Signing " Capabilities] tab, read the + Capability] blue and search for Siri. Add the intent and ensure the checkbox is mandatory, this stepi
الخطوة 3: إضافة تمديد الأحكام
In allow Siri to handle intents even when your app is in the background or not launched, you need an Intents extension. Go to File > Target[Fice:3]], select Intents extension
الخطوة 4: إنشاء ملف تعريفي
In your main app target, create a new file using the Intents definition template (found under Resource Templates). Name it ] TodoIntententententententents.intdefinition.] This file is where you define your custom intents. It will automatically be shared with your Intents.
ولضمان توافر ملف التعريف لكلا الهدفين، اختيار TodoIntents.intentdefinition] file in the project navigator and, in the File Inspector, add both your main app and the Intents extension to the ]Target Membershiploo.
تحديد العناصر العرفية للعمليات
ومع إعداد ملف التعريف، يمكن الآن أن تخلق النوايا المحددة التي ستصدر أوامر صوتك، ولتطبيق قائمة أساسية، فإنكم سترغبون في ثلاثة نوايا على الأقل: AddTaskIntent،
إنشاء مركز الادتاك
- Open TodoIntents.intentdefinition]. Click the ]+] at the bottom-left of the canvas and select new Intent.
- سمي النية .]
- Under Parameters], add a new parameter named of type String. Optionally, add a ]] if your app supports multiple lists.
- (ب) تحديد اسم البارامترات Display Name] (مثل " الاسم الحركي " ) و]Prompt (مثلاً، " Wh task should I add? " )، وهذا يبدو سريعاً عندما يحتاج السيري إلى توضيح.
- In the Response section, choose Success] and define a response template like “Added {taskName}} to your to-do list.”
- تأكدي من فحص الصفوف القاعية والاسم الفصلي هو .
إنشاء مركز إزالة الألغام
Repeat the process for a with a ]] parameter. The response could be “Removed {taskName}” or “{taskName} is not found.” You may also add a ] Failure] response type for when the task does not exist.
إنشاء برنامج (شوتسك)
For , you might not need any parameters. instead, rely on the response to contain a list of tasks. In the response section, add a Content] property of type ]String. Use a response template like “You have {countally} programmatic tasks }
تولد الصفوف المتميزة
بعد تحديد جميع النوايا، بناء مشروعك، سينتج (إكسيد) تلقائياً حصصاً من (سويفت) لكل نية ورد عليها، وتعيش هذه الفصول في Derivedata] ملف، ولكن مرئي في المحررة، وستستخدمها في رمزك للمعالج.
تنفيذ نهج متقن في تطبيقك وتمديده
الآن بعد أن تم تحديد النوايا، تحتاج إلى كتابة الرمز الذي يتعامل معها عندما يتذرع سيري بتطبيقك.
معالجة المدخلات في تمديد المداخل
ويشمل هدف تمديد المداخل ملفاً غير مقصود ]]، يفتحه ويحل محل محتوياته بفئة تتوافق مع بروتوكولات مناولة النوايا المتولدة، وكل نية ستكون لها طريقة معالجته الخاصة.
import Intents
class IntentHandler: INExtension, AddTaskIntentHandling, RemoveTaskIntentHandling, ShowTasksIntentHandling {
override func handler(for intent: INIntent) -> Any? {
return self
}
// MARK: - Add Task
func handle(intent: AddTaskIntent, completion: @escaping (AddTaskIntentResponse) -> Void) {
guard let taskName = intent.taskName else {
completion(AddTaskIntentResponse.failure(taskName: "unknown"))
return
}
// Persist the task to your data store (Core Data, UserDefaults, etc.)
// For simplicity, we'll assume a shared data manager
TaskDataManager.shared.addTask(taskName: taskName, listName: intent.listName ?? "Default")
completion(AddTaskIntentResponse.success(taskName: taskName))
}
func resolveTaskName(for intent: AddTaskIntent, with completion: @escaping (INStringResolutionResult) -> Void) {
if let taskName = intent.taskName, !taskName.isEmpty {
completion(.success(with: taskName))
} else {
// Prompt user for a task name
completion(.needsValue())
}
}
// MARK: - Remove Task
func handle(intent: RemoveTaskIntent, completion: @escaping (RemoveTaskIntentResponse) -> Void) {
guard let taskName = intent.taskName else {
completion(.failure(taskName: "unknown"))
return
}
let removed = TaskDataManager.shared.removeTask(taskName: taskName)
if removed {
completion(.success(taskName: taskName))
} else {
completion(.notFound(taskName: taskName))
}
}
// MARK: - Show Tasks
func handle(intent: ShowTasksIntent, completion: @escaping (ShowTasksIntentResponse) -> Void) {
let tasks = TaskDataManager.shared.allTasks()
let taskList = tasks.map { $0.name }.joined(separator: ", ")
let count = tasks.count
let response = ShowTasksIntentResponse.success(count: count, content: taskList)
completion(response)
}
}
مستودع البيانات المتقاسم
ونظراً لأن تمديد المداخلات يجري في عملية منفصلة، لا يمكن أن تصل مباشرة إلى نموذج البيانات الرئيسي الخاص بطلبكم، ويتعين أن تستخدموا حاوية مشتركة (مجموعة آب) لتخزين المهام في موقع مشترك مثل مجموعة موحّدة من وحدات التشغيل () أو مجموعة من أجهزة الإرشاد (As AppLT:1]) التي لا تزال قائمة.
معالجة المدخلات في التطبيق الرئيسي
عندما يكون تطبيقك في المقدمة ويُحدث المستعمل طريقاً مختصراً في السيري، قد ترغب أيضاً في التعامل مع النوايا مباشرة في التطبيق الرئيسي (دون التمديد)، ويمكنك أن تتوافق مع مندوب تطبيقك أو مندوب المشهد مع بروتوكولات النوايا ذاتها، ولكن، بالنسبة لمعظم الحالات المستخدمة، فإن التمديد كاف لأنه يعمل بغض النظر عما إذا كان التطبيق في المعالم الأمامية.
توسيع نطاق الأداء: التأكيد والوحدة والمعالم
المناولة الأساسية هي البداية فقط لجعل قائمة صوتك قوية، إضافة الدعم لأجهزة تأكيد الإتصالات و حل البارامترات
أساليب القرار
وبالنسبة لكل بارامتر، يمكن أن تنفذ طريقة ]FLT:12[ تحقق أو تطلب توضيحا، مثلا إذا كان المستخدم يقول " أضواء " دون تحديد القائمة، فإن طريقة ]FLT:13[ الخاصة بك يمكن أن تدفع: " أي قائمة تريد أن تضيف إليها؟ " إذا كان لديك قائمة واحدة فقط، فإن تصميمها تلقائيا على تلك القائمة.
ردود التأكيد
ويمكنك أن تدع السيري يطلب من المستخدم تأكيد إجراء قبل تنفيذه، وهذا مفيد للعمليات المدمرة مثل إزالة المهام، وفي صف الاستجابة المتعمدة، تضاف إلى نوع الاستجابة ، وعند معالجة النية، يمكن أن ترد رداً على تأكيد يتضمن التفاصيل، ثم يطلب من المستخدم تأكيد أسلوبك [المسمى بالعلم: 14]، وإذا تأكد ذلك.
URL Handling for Deep Linking
بعد القيام بعمل ما، قد ترغب في فتح تطبيقك لإظهار القائمة المستكملة، ويمكن لمعالج النوايا أن يدعو إذا كان متاحا، أو أن تطبيقك الرئيسي يمكن أن يستجيب لمخططات الجبهة الثورية الأوروبية.
اختبار صوتك قابل للأكل
ويتطلب اختبار التكامل في السيري بعض التجهيزات لأن الأوامر التي يُنطق بها لا يمكن محاكاتها مباشرة.
استخدام سيملوتور السيري في إكسيد
ثم أوقفوا التلميح التالي، أديروا هدف "المرشدين" باستخدام مخطط مصمم للمحفز
اختبار مع جهاز حقيقي
وللاعتراف الدقيق بمقاصدكم المحددة، اختبار جهاز اليوسفي الحقيقي الذي يدير محطة إيوس 14 أو بعد ذلك، وبعد تركيب تطبيقكم، فتحت " المسلسل والبحث " " ، وتكفل أن تكون النوايا مطروحة، وقل " يا سيري، أضيف رمزا إلى قائمة ما أضيفه في توب " ، وتحقق من النتيجة.
القضايا المشتركة والمناقشة
- Intent not recognized:] Verify that the Intents extension’s Info.plist includes the intent class names under ]Intentsupported].
- Data not shared:] Ensure both targets belong to the same App Group and that the data store path is correct.
- Response not spoken:] Use response templates that include ] variables; Siri reads them aloud.
- Parameter missing:] Implement resolution methods to handle ambiguous input.
اعتبارات النشر والتقسيم
عند تقديم طلبك إلى متجر آب يجب أن تعلن قدرة سيري في شركة آب ستور
وللتعظيم في اعتماد المستعملين، النظر في أفضل الممارسات التالية:
- Onboard users:] show a brief tutorial on available voice commands when the app is first launched.
- Support Shortcuts:] Allow users to create custom vocal shortcuts for specific tasks (e.g., “ Hey Siri, add groceries”) via and .
- ترجمة نواياكم: ] Provide localized prompts and response templates for different languages.
- Handle errors brfully:] always return a meaningful response - even if the task fails - to guide the user.
الترشيحات المتقدمة والخطوات التالية
بمجرد أن يكون لديك قائمة الصوت الأساسية التي يمكن أن تعمل، يمكنك توسيع نطاقها مع:
- Natural language date parsing: let users say “Add buy milk for tomorrow” and automatically set a due date using .
- Group and tag support:] Add parameters for categories like or .
- Inter-app integration:] Use SiriKit’s Workout, Media], or other domains if your app expands beyond to-do lists.
- Custom vocabulary:] Provide a vocabulary plist to train Siri to recognize app-specific wordss like “ my grocery list” or “work tasks.”
خاتمة
إن بناء تطبيق قائم على أساس الصوت مع إدماج السيري هو طريقة عملية لتحسين إنتاجية المستخدمين وإمكانية الوصول، وبتحديد النوايا العرفية، وتنفيذ المتعاملين في تمديد مكرس، واستخدام مخزن بيانات مشترك، يمكن أن تخلق تجربة خالية من الأيدي، والخطوات المحددة في هذا الدليل - من المشروع الذي أنشئ للاختبار وتقديمه - تعطيك أساسا صلبا، حيث يصبح التفاعل الصوتي أكثر انتشارا، وتضيف إلى عملية السيري.
For more details, refer to Apple’s official SiriKit documentation] and the Shortcuts guide]. If you are new to iOS development, also review Start Developing iOS Apps (Swi6)