اختصارات 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