اختصارات Siri - كيفية تنفيذها؟

نشرت: 2020-01-16

توفر اختصارات Siri ، وهي ميزة جديدة تم تقديمها في WWDC العام الماضي ، القدرة على أداء وظائف معينة للتطبيق في الخلفية. لا يتعين علينا تشغيل التطبيق لاستخدام هذه الوظائف في التطبيق ، يمكننا ببساطة أن نقول لـ Siri ، على سبيل المثال "Burger Time" والنظام يعرف التطبيق الذي تم تعيين هذا الاختصار له ويطلب برغرًا لنا.

ما هي اختصارات Siri؟

  • طريقة ملائمة لإنجاز المهام من شاشة القفل أو منطقة البحث.
  • يمكن أيضًا إضافة الاختصارات إلى Siri لتشغيلها بجملة صوتية على iOS و HomePod و watchOS.
  • يضيف المطورون اختصارات في تطبيقاتهم تمكن Siri من الاتصال بهذه الاختصارات.
  • استخدام نماذج التعلم الآلي لسلوكك لتحليل الوظائف الشائعة التي تؤديها واقتراح الاختصارات تلقائيًا.
  • iOS 12+

في هذه المقالة ، سنركز على تنفيذ اختصار الطلب ، وهو أحد أكثر تطبيقات اختصارات Siri شيوعًا. سننشئ تطبيقًا بسيطًا يتيح لك طلب البرغر

كيف يمكننا إنشاء اختصارات Siri؟

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

حسنًا ، ربما نكتب بعض الرموز؟ ما هي إمكانياتنا كمطورين؟

NSUserActivity & Intents - أمثلة على اختصارات Siri

NSUserActivity - سننشئ اختصارًا يتيح لنا تشغيل الشاشة لتقديم طلب جديد

  1. أضف المفتاح إلى 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 لطلب برجر

النوايا - سنقوم بتنفيذ اختصار لإصدار الأوامر

نصيحة احترافية قبل التنفيذ:
تظهر النوايا عندما يفعل المستخدم شيئًا بشكل منهجي. ومع ذلك ، عندما تريد اختبار هذه الوظيفة بحيث تحصل دائمًا على اقتراح من Siri ، يجب عليك تمكين خيارين - " عرض الاختصارات الحديثة " و " عرض التبرعات على شاشة القفل " في الإعدادات -> المطور.

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

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"))
    }
    
} 
عرض اختصار Siri

هذا كل شيء ، كل شيء يعمل

يمكنك التحقق من المشروع بأكمله على جيثب الخاص بي هنا

مصادر:

  • 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