اختصارات Siri - كيفية تنفيذها؟
نشرت: 2020-01-16توفر اختصارات Siri ، وهي ميزة جديدة تم تقديمها في WWDC العام الماضي ، القدرة على أداء وظائف معينة للتطبيق في الخلفية. لا يتعين علينا تشغيل التطبيق لاستخدام هذه الوظائف في التطبيق ، يمكننا ببساطة أن نقول لـ Siri ، على سبيل المثال "Burger Time" والنظام يعرف التطبيق الذي تم تعيين هذا الاختصار له ويطلب برغرًا لنا.
ما هي اختصارات Siri؟
- طريقة ملائمة لإنجاز المهام من شاشة القفل أو منطقة البحث.
- يمكن أيضًا إضافة الاختصارات إلى Siri لتشغيلها بجملة صوتية على iOS و HomePod و watchOS.
- يضيف المطورون اختصارات في تطبيقاتهم تمكن Siri من الاتصال بهذه الاختصارات.
- استخدام نماذج التعلم الآلي لسلوكك لتحليل الوظائف الشائعة التي تؤديها واقتراح الاختصارات تلقائيًا.
- iOS 12+
في هذه المقالة ، سنركز على تنفيذ اختصار الطلب ، وهو أحد أكثر تطبيقات اختصارات Siri شيوعًا. سننشئ تطبيقًا بسيطًا يتيح لك طلب البرغر
كيف يمكننا إنشاء اختصارات Siri؟

- في البداية ، علينا التفكير في الوظيفة التي يريد المستخدم حقًا تسهيلها في تطبيقنا . يجب أن تكون هذه وظيفة يؤديها المستخدم بشكل متكرر وتتطلب من المستخدم الدخول إلى التطبيق وتمرير مسار طويل فيه. ستمكّن الاختصارات من تقصير هذا المسار لأداء الوظيفة.
- في الخطوة التالية ، تحتاج إلى التبرع باختصار. ماذا يعني هذا؟ يجب أن نمرر المعلومات إلى النظام حول حقيقة أننا قدمنا طلبًا ، على سبيل المثال برغر واحد مع لحم الخنزير المقدد. نحن نقدم هذه المعلومات إلى النظام ويمكن لـ Siri لاحقًا أن تقترحنا في وقت محدد لإجراء هذا الطلب المحدد.
- آخر شيء يجب فعله هو التعامل مع هذا الاختصار ، والذي يحدث عندما يخبر المستخدم Siri بالأمر المحدد مسبقًا ، على سبيل المثال "وقت البرجر" ، أو في حالة قيام المستخدم بالضغط على الاختصار الذي اقترحه Siri على شاشة القفل.
حسنًا ، ربما نكتب بعض الرموز؟ ما هي إمكانياتنا كمطورين؟

NSUserActivity - سننشئ اختصارًا يتيح لنا تشغيل الشاشة لتقديم طلب جديد
- أضف المفتاح إلى Info.plist
<key> أنواع NSUserActivityTypes </key> <array> <string> com.m Liquido.SiriShotcutDemo.make-order </string> </array>
2. تبرع بالاختصار عندما يدخل المستخدم الشاشة
اسمح لـ orderActivity = NSUserActivity (نوع النشاط: "com.m Liquido.SiriShotcutDemo.make-order")
orderActivity.persistentIdentifier = NSUserActivityPersistentIdentifier ("com.m Liquido.SiriShotcutDemo.make-order")
orderActivity.isEluableForSearch = صحيح
orderActivity.isEluableForPrediction = صحيح
orderActivity.title = "تقديم طلب"
orderActivity.suggestInvocationPhrase = "وقت البرجر"
اسمحوا السمات = CSSearchableItemAttributeSet (itemContentType: kUTTypeItem كسلسلة)
attributes.contentDescription = "البرغر اللذيذ!"
attributes.thumbnailData = UIImage (اسمه: "logo") ؟. pngData ()
orderActivity.contentAttributeSet = السمات
userActivity = OrderActivity 3. في AppDelegate ، يجب عليك تنفيذ مندوب continueUserActivity الذي ، بعد الحصول على هذا النوع المعين ، سيعيد التوجيه إلى الشاشة المحددة
تطبيق func (_ application: UIApplication ،
متابعة userActivity: NSUserActivity ،
restorationHandler: @ escaping ([UIUserActivityRestoring]؟) -> Void) -> Bool {
إذا كان userActivity.activityType == "com.m Liquido.SiriShotcutDemo.make-order" {
// التعامل مع التطبيق المفتوح على شاشة الطلب
العودة صحيحة
}
عودة كاذبة
} 
النوايا - سنقوم بتنفيذ اختصار لإصدار الأوامر
نصيحة احترافية قبل التنفيذ:
تظهر النوايا عندما يفعل المستخدم شيئًا بشكل منهجي. ومع ذلك ، عندما تريد اختبار هذه الوظيفة بحيث تحصل دائمًا على اقتراح من Siri ، يجب عليك تمكين خيارين - " عرض الاختصارات الحديثة " و " عرض التبرعات على شاشة القفل " في الإعدادات -> المطور.

- قم بإنشاء ملف تعريف النية. أفضل طريقة هي إضافته إلى إطار عمل منفصل في مشروعي سيكون في
OrderKit.

2. حدد فئة ، في هذه الحالة "ترتيب". في هذا الملف ، يتعين علينا اختيار المعلمات التي سنمررها إلى النظام وإنشاء مجموعات من هذه المعلمات.


3. قم بإنشاء هدف جديد بامتداد للنوايا ، حدد "تضمين ملحق واجهة المستخدم" عند إنشائه.



Order.intentdefinition 4. قم بإنشاء واجهة مستخدم للقصد في ملف MainInterface.storyboard .

5. تكوين حالة ready success في IntentViewController .
func configView (للمعلمات: Set <INParameter> ،
من التفاعل: INInteraction،
السلوك التفاعلي: INUI InteractiveBehavior ،
السياق: INUIHostedViewContext ،
الإكمال: @ escaping (Bool، Set <INParameter>، CGSize) -> Void) {
الحارس دع النية = التفاعل. قصد مثل؟ OrderIntent آخر {
إكمال (خطأ ، تعيين () ، صفر)
إرجاع
}
إذا كان التفاعل .intentHandlingStatus ==. جاهز {
الإعداد (مع: intent)
waitTime.isHidden = صحيح
إكمال (صحيح ، معلمات ، المطلوب الحجم)
} وإلا إذا كان التفاعل .intentHandlingStatus ==. النجاح ،
اسمحوا الاستجابة = التفاعل. intentResponse كـ؟ OrderIntentResponse {
الإعداد (مع: intent)
waitTime.isHidden = خطأ
if let waitTimeText = response.waitTime {
waitTime.text = "سيكون الطلب جاهزًا خلال \ (waitTimeText) دقائق"
}
everythingIsOkLabel.text = "انقر لإظهار الطلبات"
إكمال (صحيح ، معلمات ، المطلوب الحجم)
}
إكمال (خطأ ، معلمات ،. صفر)
}
إعداد func خاص (مع intent: OrderIntent) {
burgerNameLabel.text = intent.burgerName
إذا تركت الكمية = intent.quantity؟ .stringValue {
quantityLabel.text = "\ (الكمية) قطعة."
}
إذا تركت الإضافات = intent.additions {
additionsLabel.text = additions.elements.toString
}
} 6. بعد إنشاء واجهة المستخدم ، يمكننا أن نذهب للتبرع بنيتنا. في هذه الحالة ، من الأفضل التبرع بالنوايا عند تقديم الطلب. نحن نقدم جميع المعلومات إلى النظام الذي حددناه مسبقًا في ملف Order.intentdefinition ، أي اسم برجر والكمية والإضافات والعبارة المقترحة المعروضة في الحالة عندما نرغب في إضافة هذا الاختصار على الفور إلى Siri عند تقديم الطلب .
func donateInteraction (للطلب: Order) {
اسمحوا التفاعل = INInteraction (intent: order.intent، response: nil)
التفاعل. donate {(خطأ) في
إذا كان خطأ! = لا شيء {
// معالجة الخطأ
} آخر {
طباعة ("تم التبرع بنجاح التفاعل")
}
}
} أمر الإرشاد العام {
var intent: OrderIntent {
اسمح لـ orderIntent = OrderIntent ()
orderIntent.burgerName = الاسم
إذا تركت intValue = Int (الكمية) {
orderIntent.quantity = NSNumber (القيمة: intValue)
}
orderIntent.suggestInvocationPhrase = "وقت البرجر"
orderIntent.additions = additions.map {option -> INObject in
إرجاع INObject (المعرف: option.rawValue ،
عرض: option.rawValue)
}
أمر الإرجاع النية
}
}7. الآن يمكننا التعامل مع الموقف ما سيحدث في حالة حصول المستخدم على اقتراح اختصار والنقر عليه وفي حالة اتصال المستخدم بالاختصار بواسطة Siri.
فئة عامة OrderIntentHandler: NSObject ، OrderIntentHandling {
تأكيد الوظيفة العامة (القصد: OrderIntent ،
الإكمال: @ escaping (OrderIntentResponse) -> Void) {
الإكمال (OrderIntentResponse (الكود: OrderIntentResponseCode.ready ، userActivity: لا شيء))
}
مقبض func العام (القصد: OrderIntent ،
الإكمال: @ escaping (OrderIntentResponse) -> Void) {
اسم الحارس burgerName = intent.burgerName آخر {
الإكمال (OrderIntentResponse (الكود: .failure ، userActivity: لا شيء))
إرجاع
}
Defaults.save (Order: Order (from: intent))
الإكمال (OrderIntentResponse.success (burgerName: burgerName ، waitTime: "5"))
}
} 
هذا كل شيء ، كل شيء يعمل
يمكنك التحقق من المشروع بأكمله على جيثب الخاص بي هنا
مصادر:
- https://developer.apple.com/videos/play/wwdc2018/211/
- https://developer.apple.com/videos/play/wwdc2018/214/
- https://developer.apple.com/documentation/sirikit/donating_shortcuts
- https://developer.apple.com/design/human-interface-guidelines/sirikit/overview/siri-shortcuts/
- https://www.raywenderlich.com/6462-siri-shortcuts-tutorial-in-ios-12
