web-dev-qa-db-ja.com

閉じたアプリの検索からcontinueUserActivityが呼び出されない

コアスポットライトを使用して、スポットライトの検索結果からビューコントローラーを開こうとしています。

- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void(^)(NSArray *restorableObjects))restorationHandler 
{

if(self.window.rootViewController){
    [self.window.rootViewController restoreUserActivityState:userActivity];
}

return YES;
}

これは、アプリがすでにバックグラウンドで実行されている場合に機能するようですが、アプリを閉じてスポットライト検索結果をタップすると、このメソッドが呼び出されないようで、アプリケーションがメインインターフェイスで起動するだけの動作が得られます。

私のアプリが閉じているときにも機能させるための提案はありますか?何が起こっているのかをデバッグする方法はありますか(デバッガーを接続するためにアプリを実行する必要があるため、検索結果からアプリの起動をシミュレートする方法がわかりません)?.

18
Niko Zarzani

ここでそれはあなたのアドバイスに従った完全な答えに従います。

// In application: didFinishLaunchingWithOptions:
NSDictionary *activityDic = [launchOptions objectForKey:UIApplicationLaunchOptionsUserActivityDictionaryKey];

if (activityDic) {
    if(self.window.rootViewController){
        NSUserActivity * userActivity = [activityDic valueForKey:@"UIApplicationLaunchOptionsUserActivityKey"];
        [self.window.rootViewController restoreUserActivityState:userActivity];
    }
}
3
Niko Zarzani

ニコ、

まず第一に、Xcodeからアプリを起動し、すぐには開かない方法があります。スキームのプロパティを開き、[実行]セクションに移動し、[情報]の下に、何が起こっているかをデバッグするのに役立つスイッチがあります。

「実行可能ファイルが起動するのを待ちます」。

このスイッチをアクティブにすると、Xcodeからアプリを起動できます。Xcodeは、アプリが検索から開かれるまで待機し、デバッガーを接続します。

お役に立てば幸いです。

イワン

42
Ivan Oliver

Facebook SDKを使用していて、didfinishlaunchingでプレーンテキストではなくFBSDKを返し、最後にtrueを返す場合、continueuseractivityを押すときに問題が発生する可能性があります。

たくさん検索し、さまざまな方法を試した後、trueを返し、これにコメントする必要がありました。

FBSDKApplicationDelegate.sharedInstance()。application(application、didFinishLaunchingWithOptions:launchOptions)

21
hopye2

新しいSwift 5には、_SceneDelegate.Swift_という新しい新しいファイルがあります。メソッドscene(_ scene: UIScene, continue userActivity: NSUserActivity)を使用してください。

11
adam eliezerov

didFinishLaunchingWithOptionsはYESを返す必要があるため、continueUserActivityが呼び出されます。

アプリケーションの終わりに追加:didFinishLaunchingWithOptions:

NSDictionary *activityDictionary = launchOptions[UIApplicationLaunchOptionsUserActivityDictionaryKey];
if (activityDictionary) {
    NSUserActivity *userActivity = activityDictionary[UIApplicationLaunchOptionsUserActivityTypeKey];
    if (userActivity) {
        return YES;
    }
}

return NO;
9
cbartel

アプリが閉じられた場合、application:continueUserActivity:は呼び出されません。代わりに、アプリケーションでlaunchOptions辞書のすべての情報を取得します。didFinishLaunchingWithOptions:

// In application: didFinishLaunchingWithOptions:
NSDictionary *activityDic = [launchOptions objectForKey:UIApplicationLaunchOptionsUserActivityDictionaryKey];  
if (activityDic) {
    // Continue activity here
}
8

continue userActivityは最新のSwiftバージョンで変更されました。funcの変更は私のために働きました。

func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([Any]?) -> Void) -> Bool

func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool.
4
Arnab

Firebaseの動的リンクを開いているときに同様の問題が発生しました。私の場合、問題は呼び出しが変更されたことでした。これは、これ以上呼び出されなかったレガシーコードにあったものです。

func application(_ application: UIApplication, 
                   continue userActivity: NSUserActivity, 
                   restorationHandler: @escaping ([Any]?) -> Void) -> Bool

これは私の場合に機能した呼び出しです:

func application(_ application: UIApplication, 
                   continue userActivity: NSUserActivity, 
                   restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool

通話がどの程度正確に書かれているかに注意してください。 privateを追加することを提案するXcodeの警告にだまされないでください-それは役に立ちません。

2
Vitalii