swift3でSiriショートカットでアプリを呼び出せるアプリを作っています。
(NSUserActivityを使用する方法で作っています)
XCODEのバージョンは、10.1 (10B61)です。
アプリ起動時にviewControllerでSiriショートカットでの起動か、通常のクリック起動かを処理を分けたいと考えています。
そのため、AppDelegateで以下のように記載しています。
swift3
1var siriStart:Int = 0 2@objc(application:continueUserActivity:restorationHandler:) 3func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool { 4 siriStart = 1 5 (省略) 6}
起動時にviewControllerでsiriStartを以下のように呼び出してます。
swift3
1let appDelegate = UIApplication.shared.delegate as! AppDelegate 2 3override func viewDidAppear(_ animated: Bool) { 4 super.viewDidAppear(animated) 5 func_abc () 6 (省略) 7} 8func func_abc (){ 9 if ( appDelegate.siriStart != 0 ) { 10 (省略) 11 } 12}
ただ、appDelegate.siriStartで読み出すと"0"のままで、現状ではAppDelegateで1に変更する処理よりもviewControllerでppDelegate.siriStartを読み込んで処理する方が早いようです。
(アプリを終了した状態で、Siriショートカットで起動した場合。アプリをバックで起動している状態では問題なさそうです。)
別の処理もあるため、タイマーで処理を遅らせるなどは実施できないので、起動時にSiriショートカットでの起動か、通常のクリック起動かを識別する方法をご教授をお願いします。
application(_:continue:restorationHandler:)よりもviewDidAppear(_:)が先に呼ばれるということですか?ブレークポイントかprintで確認してもらえますか?
はい、その通りです。
ただ、アプリを終了してからの動作時のみ問題で、バックで起動させている場合は問題ありません。
そのため、アプリを終了させていますのでBreakできず、動作自体で確認しています。
確実にあとで処理しているかは不明ですが、取得した変数siriStartは間違いなくあとで更新されています。
appDelegateの別関数の以下で同様に
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
siriStart = 1
}
に記載して取得すると間違いなく、viewControllerより先にsiriStartを更新できていますし、何度も確認していますので間違いないと思います。
また、@objcのために判定処理が遅れるのかと思い、以下でも動作するので試しましたが、やはりviewDidAppearが先に呼ばれているように見えます。
func application(_ application: UIApplication, continueUserActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
でも、動作していますが、viewDidAppearよりもあとで動作しているように見えています。
>>アプリを終了させていますので
あぁそうか、そうですよね。
このメソッドはそういう用途で使うものではないのでしょうかね。
ちなみにこれ、Siriショートカット以外でも呼ばれるようですよ。
情報ありがとうございます。
Siriショートカット起動で呼び出されるappDelegate内はこのメソッドしか無さそうなので、どちらで起動しているかviewControllerでの判定が難しいそうですので他の処理と問題にならないように順番に処理して改善できないか検討してます。
appDelegate内はメソッドはせめて全てviewDidAppear以前に処理して欲しいですが、なさそうなので他で対応するしか無さそうと思っています。
あとは、NSUserActivity を利用せずにIntentsフレームワークを利用してSiriショートカットを実装すれば解決できるような気がしてますが、今更変更はちょっと。。。
launchOptionsに何か入ってたりしませんかね?
ありがとうございます。少し確認した感じでは
let remoteNotif = launchOptions?[UIApplicationLaunchOptionsKey.remoteNotification] as? [String: Any]
ではnilになってます。ちょっと確認した感じでは無さそうでした。
入ってました。やり方に問題がありました。
BestAnswerで回答を頂きました。
回答1件
あなたの回答
tips
プレビュー