我想使用Siri快捷方式打开特定的UIViewController
。我的应用具有如下用户流;
Fake Splash Controller (Controller A) --> Welcome Screen (Controller B) --> Controller C --> Controller D
目的:我想使用Siri Shortcut从头开始以相同的顺序打开Controller C(我的意思是,App首先打开假启动,然后是B,然后是C)。因此,每次Siri都要恢复状态快捷方式运行。没有得到旧状态。
缺少解决方案:
用于处理Siri快捷方式的类:
class SiriController: NSObject {
public static func siriApplyShourcutEnabler(thumbnail: UIImage?) -> NSUserActivity {
let siriActivityType = "com.adeveloper.myapp.myshortcut"
let activity = NSUserActivity(activityType: siriActivityType)
activity.persistentIdentifier =
NSUserActivityPersistentIdentifier(siriActivityType)
activity.title = "Do Something"
let attributes = CSSearchableItemAttributeSet(itemContentType: kUTTypeItem as String)
attributes.contentDescription = "You can use this shortcut to.."
attributes.thumbnailData = thumbnail?.jpegData(compressionQuality: 1.0)
activity.suggestedInvocationPhrase = "Nice shortcut"
activity.isEligibleForSearch = true
activity.isEligibleForPrediction = true
activity.contentAttributeSet = attributes
return activity
}
}
假Splash视图控制器:
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
setupUI()
if #available(iOS 12.0, *) {
self.userActivity = SiriController.siriApplyShourcutEnabler(thumbnail: nil)
self.userActivity?.becomeCurrent()
} else {
// Fallback on earlier versions
}}
AppDelegate:
func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
//controller.present(ApplyViewController(), animated: true, completion: nil)
if let unWrappedController = window?.rootViewController, unWrappedController is SplashViewController {
//isComingFromSiri is a boolean I store on AppDelegate
self.isComingFromSiri = true
return true
} else {
self.isComingFromSiri = false
return false
}
}
控制器B(我检查用户是否使用siriShortcut打开应用程序,如果是,则打开控制器C:
override viewDidAppear() {
let delegate = UIApplication.shared.delegate as! AppDelegate
if(delegate.isComingFromSiri) {
let controller = ApplyViewController()
let navController = UINavigationController(rootViewController: controller)
delegate.isComingFromSiri = false
self.present(navController, animated: true, completion: nil)
}
问题:现在,我可以使用上面分享的解决方案来做到这一点。 但是,我想在Controller D
上显示一个弹出窗口,请检查用户是否需要此快捷方式。如果是,我需要使用siriApplyShortCutEnabler
创建一个,然后将其设置为self.userActivity
。但是,当我这样做时,如果我正确理解,则App会存储其状态。因为我要获取有关Controller C和Controller D的私人信息。我无法存储状态,因此当应用程序关闭时,所有内容都将消失,并且每次打开应用程序时,都应重新启动。
问题:如何在self.userActivity
上设置Controller D
,但是当用户打开应用程序时,存储控制器C后没有活动。
在我搜索时,社区中有一个问题问。但是,它还会在用户所在的控制器中获得userActivity。 How can I use Siri Shortcuts to show a specific page in my app?