ทางลัด Siri — จะใช้งานอย่างไร
เผยแพร่แล้ว: 2020-01-16คำสั่งลัด Siri ซึ่งเป็นคุณสมบัติใหม่ที่นำเสนอใน WWDC ปีที่แล้ว ให้ความสามารถในการใช้งานฟังก์ชันบางอย่างของแอปพลิเคชันในเบื้องหลัง เราไม่จำเป็นต้องเปิดแอปพลิเคชันเพื่อใช้ฟังก์ชันเหล่านี้ในแอปพลิเคชัน เราพูดกับ Siri ได้ง่ายๆ เช่น "Burger Time" และระบบจะรู้ว่าทางลัดนี้กำหนดให้แอปพลิเคชันใดและสั่งเบอร์เกอร์ให้เรา
ทางลัด Siri คืออะไร
- วิธีที่สะดวกในการทำงานให้สำเร็จจากหน้าจอล็อกหรือพื้นที่ค้นหา
- คุณสามารถเพิ่มทางลัดไปยัง Siri เพื่อเรียกใช้วลีเสียงบน iOS, HomePod และ watchOS ได้
- นักพัฒนาเพิ่มปุ่มลัดลงในแอพที่ช่วยให้ Siri เชื่อมต่อกับปุ่มลัดเหล่านี้ได้
- การใช้โมเดลการเรียนรู้ของเครื่องเพื่อวิเคราะห์ฟังก์ชันทั่วไปที่คุณใช้งานและแนะนำทางลัดโดยอัตโนมัติ
- iOS 12+
ในบทความนี้ เราจะเน้นการใช้งานคำสั่งลัด ซึ่งเป็นหนึ่งในแอปพลิเคชั่นยอดนิยมของ Siri Shortcuts เราจะสร้างแอปพลิเคชั่นง่าย ๆ ที่จะให้คุณสั่งเบอร์เกอร์
เราจะสร้างทางลัดของ Siri ได้อย่างไร

- ในตอนเริ่มต้น เราต้องคิดถึง ฟังก์ชันที่ผู้ใช้ต้องการทำให้ง่ายขึ้นในแอปพลิเคชันของเรา นี่ควรเป็นฟังก์ชันที่ผู้ใช้ดำเนินการบ่อยๆ และต้องการให้ผู้ใช้เข้าสู่แอปพลิเคชันและผ่านเส้นทางยาวเข้าไป ทางลัดจะทำให้เส้นทางนี้สั้นลงเพื่อใช้งานฟังก์ชันต่างๆ
- ในขั้นตอนต่อไป คุณต้องบริจาคทางลัด สิ่งนี้หมายความว่า? เราต้อง ส่งข้อมูลไปยังระบบ เกี่ยวกับข้อเท็จจริงที่เราได้สั่งซื้อ เช่น เบอร์เกอร์กับเบคอน เราให้ข้อมูลนี้กับระบบ และต่อมา Siri สามารถแนะนำเราในเวลาที่กำหนดเพื่อทำการสั่งซื้อเฉพาะนี้
- สิ่งสุดท้ายที่ต้องทำคือจัดการกับทางลัดนี้ ซึ่งเกิดขึ้นเมื่อ ผู้ใช้บอก Siri ถึงคำสั่งที่กำหนดไว้ก่อนหน้านี้ เช่น "เวลาเบอร์เกอร์" หรือในกรณีที่ผู้ใช้กดทางลัดที่แนะนำโดย Siri บนหน้าจอล็อก
ตกลง บางทีเราจะเขียนโค้ด? ศักยภาพของเราในฐานะนักพัฒนาคืออะไร?

NSUserActivity — เราจะสร้างทางลัดที่จะให้เราเปิดหน้าจอสำหรับการสั่งซื้อใหม่
- เพิ่มคีย์ไปยัง Info.plist
<key>NSUserActivityTypes</key> <array> <string>com.miquido.SiriShotcutDemo.make-order</string> </array>
2. บริจาคทางลัดเมื่อผู้ใช้เข้าสู่หน้าจอ
ให้ orderActivity = NSUserActivity (activityType: "com.miquido.SiriShotcutDemo.make-order") orderActivity.persistentIdentifier = NSUserActivityPersistentIdentifier ("com.miquido.SiriShotcutDemo.make-order") orderActivity.isEligibleForSearch = true orderActivity.isEligibleForPrediction = true orderActivity.title = "ทำการสั่งซื้อ" orderActivity.suggestedInvocationPhrase = "เวลาเบอร์เกอร์" ให้แอตทริบิวต์ = CSSearchableItemAttributeSet (itemContentType: kUTTypeItem เป็นสตริง) attributes.contentDescription = "เบอร์เกอร์แสนอร่อย !" attributes.thumbnailData = UIImage (ชื่อ: "โลโก้")?.pngData () orderActivity.contentAttributeSet = แอตทริบิวต์ userActivity = สั่งซื้อกิจกรรม
3. ใน AppDelegate
คุณต้องใช้ ผู้รับ continueUserActivity
สิทธิ์ ContinueUserActivity ซึ่งหลังจากได้รับประเภทนี้แล้วจะเปลี่ยนเส้นทางไปยังหน้าจอที่กำหนด
แอปพลิเคชัน func (_ แอปพลิเคชัน: UIApplication, ดำเนินการต่อ userActivity: NSUserActivity, restoreHandler: @escaping ([UIUserActivityRestoring]?) -> โมฆะ) -> Bool { ถ้า userActivity.activityType == "com.miquido.SiriShotcutDemo.make-order" { // จัดการแอปที่เปิดอยู่บนหน้าจอคำสั่งซื้อ คืนความจริง } คืนค่าเท็จ }

ความตั้งใจ — เราจะใช้ทางลัดเพื่อสร้างคำสั่งซื้อ
เคล็ดลับ Pro ก่อนนำไปใช้:
ความตั้งใจปรากฏขึ้นเมื่อผู้ใช้ทำบางสิ่งอย่างเป็นระบบ อย่างไรก็ตาม เมื่อคุณต้องการทดสอบฟังก์ชันนี้เพื่อรับคำแนะนำจาก Siri เสมอ คุณต้องเปิดใช้งานสองตัวเลือก — “ แสดงทางลัดล่าสุด ” และ “ แสดงการบริจาคบนหน้าจอล็อค ” ในการตั้งค่า -> นักพัฒนา

- สร้างไฟล์คำจำกัดความความตั้งใจ วิธีที่ดีที่สุดคือเพิ่มลงในเฟรมเวิร์กแยกต่างหากในโครงการของฉัน ซึ่งจะอยู่ใน
OrderKit

2. เลือกหมวดหมู่ ในกรณีนี้คือ “คำสั่งซื้อ” ในไฟล์นี้ เราต้องเลือกพารามิเตอร์ที่เราจะส่งผ่านไปยังระบบและสร้างชุดค่าผสมของพารามิเตอร์เหล่านี้


3. สร้างเป้าหมายใหม่ด้วยส่วนขยายสำหรับความตั้งใจ เลือก "รวมส่วนขยาย UI" เมื่อคุณสร้าง



Order.intentdefinition
4. สร้าง UI สำหรับความตั้งใจในไฟล์ MainInterface.storyboard

5. กำหนดค่าสถานะความ ready
และ success
ใน IntentViewController
func configureView (สำหรับพารามิเตอร์: Set<INParameter>, ของการโต้ตอบ: INInteraction, พฤติกรรมโต้ตอบ: INUIInteractiveBehavior, บริบท: INUIHostedViewContext, เสร็จสิ้น: @escaping (Bool, Set<INParameter>, CGSize) -> โมฆะ) { ยามให้เจตนา = ปฏิสัมพันธ์ เจตนาเป็น? OrderIntent อื่น { เสร็จสิ้น (เท็จ, ตั้งค่า (), .zero) กลับ } ถ้า Interaction.intentHandlingStatus == .ready { การตั้งค่า (ด้วย: เจตนา) waitTime.isHidden = true เสร็จสิ้น (จริง, พารามิเตอร์, ขนาดที่ต้องการ) } อื่น ๆ ถ้า Interaction.intentHandlingStatus == .success ให้การตอบกลับ = Interaction.intentResponse as? OrderIntentResponse { การตั้งค่า (ด้วย: เจตนา) waitTime.isHidden = false ถ้าให้ waitTimeText = response.waitTime { waitTime.text = "คำสั่งซื้อจะพร้อมใน \(waitTimeText) นาที" } everythingIsOkLabel.text = "แตะเพื่อแสดงคำสั่งซื้อ" เสร็จสิ้น (จริง, พารามิเตอร์, ขนาดที่ต้องการ) } เสร็จสิ้น (เท็จ, พารามิเตอร์, .zero) } การตั้งค่า func ส่วนตัว (โดยมีเจตนา: OrderIntent) { burgerNameLabel.text = เจตนา.burgerName ถ้าให้ปริมาณ = ความตั้งใจ ปริมาณ?.stringValue { quantityLabel.text = "\(จำนวน) ชิ้น" } ถ้าให้เพิ่มเติม = เจตนาเพิ่มเติม { addedsLabel.text = addeds.elements.toString } }
6. หลังจากสร้าง UI แล้ว เราก็สามารถไปบริจาคตามความตั้งใจของเราได้ ในกรณีนี้ เป็นการดีที่สุดที่จะบริจาคตามความตั้งใจเมื่อทำการสั่งซื้อ เราให้ข้อมูลทั้งหมดไปยังระบบที่เรากำหนดไว้ก่อนหน้านี้ในไฟล์ Order.intentdefinition
เช่น ชื่อเบอร์เกอร์ จำนวนและส่วนเพิ่มเติม และวลีที่เสนอจะแสดงในกรณีที่เราต้องการเพิ่มทางลัดนี้ไปยัง Siri ทันทีเมื่อทำการสั่งซื้อ .
บริจาค func ส่วนตัวโต้ตอบ (สำหรับการสั่งซื้อ: สั่งซื้อ) { ให้การโต้ตอบ = INInteraction (เจตนา: order.intent ตอบกลับ: ไม่มี) ปฏิสัมพันธ์บริจาค { (ข้อผิดพลาด) ใน ถ้าเกิดข้อผิดพลาด != ไม่มี { // จัดการข้อผิดพลาด } อื่น { print("บริจาคสำเร็จแล้ว") } } }
คำสั่งขยายเวลาสาธารณะ { เจตนา var: OrderIntent { ให้ orderIntent = OrderIntent () orderIntent.burgerName = ชื่อ ถ้าให้ intValue = Int (ปริมาณ) { orderIntent.quantity = NSNumber (ค่า: intValue) } orderIntent.suggestedInvocationPhrase = "เวลาเบอร์เกอร์" orderIntent.additions = added.map { ตัวเลือก -> INObject ใน ส่งคืน INObject (ตัวระบุ: option.rawValue, แสดง: option.rawValue) } ส่งคืนคำสั่งเจตนา } }
7. ตอนนี้ เราสามารถจัดการกับสถานการณ์ว่าจะเกิดอะไรขึ้นในกรณีที่ผู้ใช้ได้รับคำแนะนำของคำสั่งลัดและคลิกที่มัน และในกรณีที่ผู้ใช้เรียกคำสั่งลัดโดย Siri
OrderIntentHandler คลาสสาธารณะ: NSObject, OrderIntentHandling { ยืนยัน func สาธารณะ (เจตนา: OrderIntent, เสร็จสิ้น: @escaping (OrderIntentResponse) -> โมฆะ) { เสร็จสิ้น (OrderIntentResponse (รหัส: OrderIntentResponseCode.ready, userActivity: ไม่มี)) } จัดการ func สาธารณะ (เจตนา: OrderIntent, เสร็จสิ้น: @escaping (OrderIntentResponse) -> โมฆะ) { guard ให้ burgerName = เจตนา.burgerName อื่น { เสร็จสิ้น (OrderIntentResponse(รหัส: .failure, userActivity: null)) กลับ } Defaults.save(คำสั่ง: คำสั่ง(จาก: เจตนา)) เสร็จสิ้น (OrderIntentResponse.success(burgerName: burgerName, waitTime: "5")) } }

แค่นั้นทุกอย่างก็ใช้การได้
คุณสามารถตรวจสอบโครงการทั้งหมดบน GitHub ของฉันได้ที่นี่
ที่มา:
- 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