Я хочу открыть определенное UIViewController
с помощью Siri Shortcut.Мое приложение имеет поток пользователя, как показано ниже:
Fake Splash Controller (Controller A) --> Welcome Screen (Controller B) --> Controller C --> Controller D
Цель: Я хочу открыть контроллер C с нуля в том же порядке (я имею в виду, приложение сначала открывает поддельный всплеск, затем B,затем C) с помощью Siri Shortcut. Поэтому восстанавливайте состояние при каждом запуске Siri Shortcut.Не получить старое состояние.
Отсутствует решение:
Класс для обработки ярлыка 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
}
}
Контроллер поддельного представления всплеска:
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
. Однако, когда я это делаю, ЕСЛИ Я ПРАВИЛЬНО ПОНИМАЮ, приложение сохраняет свое состояние. Поскольку я получаю приватную информацию о контроллере C и Controller D. Я не могу сохранить состояние, когда приложение закрывается, все должнопропадать, и каждый раз, когда приложение открывается, нужно начинать заново.
Вопрос: Как установить self.userActivity
на Controller D
, но когда пользователь открывает приложение, никаких действий после контроллера C не происходитсохранен.
Пока я искал, есть вопрос, заданный в сообществе.Также получим userActivity в контроллере, где находится пользователь. Как использовать ярлыки Siri для отображения определенной страницы в моем приложении?