ทางลัด 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
