快捷指令有多种添加方式。
- 通过NSUserActivity,静默注册,在用户添加快捷指令时,会有对应的app列表指示,但不会添加到用户的快捷指令列表。
NSUserActivity 主要用途
Handoff
SiriKit
Spolight search results
- 通过系统自带的IntentUI,用户主动触发,可以支持用户自定义触发指令。
1. NSUserActivity
2. IntentUI
- 先生成 intent文件。参考
掘金文章- 添加 INUIAddVoiceShortcutButton
- present INUIAddVoiceShortcutViewController 控制器
//
// ViewController.swift
// SiriKitIntentsUIExample
//
// Created by Domo on 19/11/2019.
// Copyright © 2019 Domo. All rights reserved.
//
import UIKit
import IntentsUI
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
addSiriButton(to: self.view)
}
func addSiriButton(to view: UIView) {
if #available(iOS 12.0, *) {
let button = INUIAddVoiceShortcutButton(style: .whiteOutline)
button.shortcut = INShortcut(intent: intent )
button.delegate = self
button.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(button)
view.centerXAnchor.constraint(equalTo: button.centerXAnchor).isActive = true
view.centerYAnchor.constraint(equalTo: button.centerYAnchor).isActive = true
}
}
func showMessage() {
let alert = UIAlertController(title: "Done!", message: "This is your first shortcut action!", preferredStyle: UIAlertController.Style.alert)
alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
self.present(alert, animated: true, completion: nil)
}
}
extension ViewController {
@available(iOS 12.0, *)
public var intent: DoSomethingIntent {
let testIntent = DoSomethingIntent()
testIntent.suggestedInvocationPhrase = "Test command"
return testIntent
}
}
extension ViewController: INUIAddVoiceShortcutButtonDelegate {
@available(iOS 12.0, *)
func present(_ addVoiceShortcutViewController: INUIAddVoiceShortcutViewController, for addVoiceShortcutButton: INUIAddVoiceShortcutButton) {
addVoiceShortcutViewController.delegate = self
addVoiceShortcutViewController.modalPresentationStyle = .formSheet
present(addVoiceShortcutViewController, animated: true, completion: nil)
}
@available(iOS 12.0, *)
func present(_ editVoiceShortcutViewController: INUIEditVoiceShortcutViewController, for addVoiceShortcutButton: INUIAddVoiceShortcutButton) {
editVoiceShortcutViewController.delegate = self
editVoiceShortcutViewController.modalPresentationStyle = .formSheet
present(editVoiceShortcutViewController, animated: true, completion: nil)
}
}
extension ViewController: INUIAddVoiceShortcutViewControllerDelegate {
@available(iOS 12.0, *)
func addVoiceShortcutViewController(_ controller: INUIAddVoiceShortcutViewController, didFinishWith voiceShortcut: INVoiceShortcut?, error: Error?) {
controller.dismiss(animated: true, completion: nil)
}
@available(iOS 12.0, *)
func addVoiceShortcutViewControllerDidCancel(_ controller: INUIAddVoiceShortcutViewController) {
controller.dismiss(animated: true, completion: nil)
}
}
extension ViewController: INUIEditVoiceShortcutViewControllerDelegate {
@available(iOS 12.0, *)
func editVoiceShortcutViewController(_ controller: INUIEditVoiceShortcutViewController, didUpdate voiceShortcut: INVoiceShortcut?, error: Error?) {
controller.dismiss(animated: true, completion: nil)
}
@available(iOS 12.0, *)
func editVoiceShortcutViewController(_ controller: INUIEditVoiceShortcutViewController, didDeleteVoiceShortcutWithIdentifier deletedVoiceShortcutIdentifier: UUID) {
controller.dismiss(animated: true, completion: nil)
}
@available(iOS 12.0, *)
func editVoiceShortcutViewControllerDidCancel(_ controller: INUIEditVoiceShortcutViewController) {
controller.dismiss(animated: true, completion: nil)
}
}
在程序入口获取数据输入
func scene(_ scene: UIScene, continue userActivity: NSUserActivity) {
if let _ = userActivity.interaction?.intent as? DoSomethingIntent {
if let windowScene = scene as? UIWindowScene {
self.window = UIWindow(windowScene: windowScene)
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let initialViewController = storyboard.instantiateViewController(withIdentifier: "ViewController") as! ViewController
self.window!.rootViewController = initialViewController
self.window!.makeKeyAndVisible()
initialViewController.showMessage()
}
}
}











网友评论