ContinueUserActivity не вызывается из поиска закрытого приложения

Я пытаюсь использовать core spotlight, чтобы открыть контроллер просмотра из результатов поиска в центре внимания.

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

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

return YES;
}

Это похоже на работу, когда приложение уже работает в фоновом режиме, однако, когда оно закрыто, и я нажимаю на результат поиска в центре внимания, кажется, что этот метод не вызван, и поведение, которое я получаю, заключается в том, что мое приложение просто запускается в основной интерфейс.

Есть ли у вас предложение заставить его работать, когда мое приложение закрыто? Есть ли способ отладить то, что происходит (поскольку мне нужно запустить приложение, чтобы подключить отладчик, я не знаю, как имитировать открытие приложения из результата поиска?).

Ответ 1

Здесь следует полный ответ, следующий за вашими советами.

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

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

Ответ 2

Niko,

в первую очередь: есть способ запустить ваше приложение из Xcode и не сразу его открыть: откройте свойства схемы, перейдите в раздел "run", а под "info" - переключатель, который поможет вам отлаживать что происходит:

"Подождите, пока исполняемый файл будет запущен".

Если вы активируете этот переключатель, вы можете запустить приложение из Xcode, Xcode будет ждать, пока приложение будет открыто из поиска, а затем он присоединяет к нему отладчик.

Надеюсь, что это поможет!

Иван

Ответ 3

Если вы используете SDK для Facebook, а в didfinishlaunching возвращаете FBSDK вместо обычного текста и возвращаете true в конце, это может вызвать проблемы с нажатием continueuseractivity.

После многого поиска и разных способов, я просто должен был return true и прокомментируйте это:

FBSDKApplicationDelegate.sharedInstance(). application (application, didFinishLaunchingWithOptions: launchOptions)

Ответ 4

didFinishLaunchingWithOptions должен возвращать YES, поэтому будет вызываться continueUserActivity.

Добавить в конец приложения: didFinishLaunchingWithOptions:

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

return NO;

Ответ 5

Если приложение было закрыто, приложение: continueUserActivity: не вызывается. Вместо этого вы получаете всю информацию launchOptions dictionnary в приложении: didFinishLaunchingWithOptions:

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

Ответ 6

continue userActivity изменена в последней версии swift. Смена функции сработала для меня.

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

в

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

Ответ 7

Подобные проблемы возникали при открытии динамических ссылок 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

Обратите внимание, как именно написан звонок. Не обманывайтесь предупреждением Xcode, предлагающим добавить private - это не поможет.

Ответ 8

В новом Swift 5 появился новый новый файл под названием SceneDelegate.swift. Используйте метод scene(_ scene: UIScene, continue userActivity: NSUserActivity)