使用Siri快捷方式打开特定的ViewController而不存储状态

时间:2019-02-19 11:00:26

标签: ios swift siri sirishortcuts

我想使用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?

0 个答案:

没有答案
相关问题