質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

610閲覧

viewControllerでSiriショートカット起動か、通常クリック起動かの識別

yamayamak

総合スコア131

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

1クリップ

投稿2019/01/29 00:50

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ショートカットでの起動か、通常のクリック起動かを識別する方法をご教授をお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fuzzball

2019/01/29 02:15

application(_:continue:restorationHandler:)よりもviewDidAppear(_:)が先に呼ばれるということですか?ブレークポイントかprintで確認してもらえますか?
yamayamak

2019/01/29 02:24

はい、その通りです。 ただ、アプリを終了してからの動作時のみ問題で、バックで起動させている場合は問題ありません。 そのため、アプリを終了させていますので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よりもあとで動作しているように見えています。
fuzzball

2019/01/29 02:44

>>アプリを終了させていますので あぁそうか、そうですよね。 このメソッドはそういう用途で使うものではないのでしょうかね。 ちなみにこれ、Siriショートカット以外でも呼ばれるようですよ。
yamayamak

2019/01/29 02:52

情報ありがとうございます。 Siriショートカット起動で呼び出されるappDelegate内はこのメソッドしか無さそうなので、どちらで起動しているかviewControllerでの判定が難しいそうですので他の処理と問題にならないように順番に処理して改善できないか検討してます。 appDelegate内はメソッドはせめて全てviewDidAppear以前に処理して欲しいですが、なさそうなので他で対応するしか無さそうと思っています。 あとは、NSUserActivity を利用せずにIntentsフレームワークを利用してSiriショートカットを実装すれば解決できるような気がしてますが、今更変更はちょっと。。。
fuzzball

2019/01/29 02:56

launchOptionsに何か入ってたりしませんかね?
yamayamak

2019/01/29 03:57

ありがとうございます。少し確認した感じでは let remoteNotif = launchOptions?[UIApplicationLaunchOptionsKey.remoteNotification] as? [String: Any] ではnilになってます。ちょっと確認した感じでは無さそうでした。
yamayamak

2019/01/30 13:55 編集

入ってました。やり方に問題がありました。 BestAnswerで回答を頂きました。
guest

回答1

0

ベストアンサー

https://qiita.com/wonderfulboyx/items/ce46fb45e1280414cc78

これと同じ話じゃないでしょうか?
これを参考にしてAppDelegateのdidFinishLaunchingWithOptionsに
次のようなコードを書いて試してみたら、Siriショートカットからの起動か
否かを切り分けできました。

swift

1let userActivityDictionary = launchOptions?[.userActivityDictionary] as? [UIApplication.LaunchOptionsKey : Any] 2if userActivityDictionary?[.userActivityType] != nil { 3 siriStart = 1 4}

なお、アプリ起動時の様子をデバッグしたい時は、
https://qiita.com/AlecYawata/items/79f45e85ecc573860dcb
に書かれてあるように、Edit Scheme -> Run -> Infoの
「Wait for executable to be launched」を選択して
XcodeからRunし、「Waiting to Attach」の状態になってから
テストしたい方法でアプリを起動すればデバッグできます。

投稿2019/01/30 12:59

TakeOne

総合スコア6299

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yamayamak

2019/01/30 13:54 編集

ありがとうございます。確かに上記で動作しました。 アプリ起動時もデバッグできるんですね。ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問