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

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

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

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

return YES;
}

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

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


person Niko Zarzani    schedule 20.09.2015    source источник
comment
Вы когда-нибудь догадывались об этом? У меня та же проблема: всегда вызывается continueUserActivity.   -  person Travis    schedule 30.09.2015
comment
Привет @Travis, см. мой ответ ниже :)   -  person Niko Zarzani    schedule 17.10.2015


Ответы (8)


Нико,

прежде всего: есть способ запустить ваше приложение из Xcode и не открывать его сразу: откройте свойства схемы, перейдите в раздел «Выполнить» и в разделе «Информация» есть переключатель, который поможет вам отлаживать происходящее:

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

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

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

Иван

person Ivan Oliver    schedule 21.09.2015

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

person adam eliezerov    schedule 04.10.2019
comment
Потратил на это 2 часа, глупая устаревшая документация. - person KVISH; 28.05.2020
comment
Как получить URL-адрес из активности пользователя, если приложение все еще поддерживает iOS 9...? - person swifthing; 20.07.2021

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

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

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

person hopye2    schedule 18.11.2015
comment
это неожиданное правильное решение для меня, после нескольких часов удара головой о стену. проголосовал. - person Xu Yin; 19.12.2015
comment
Чувак, отличный улов. Это спасло меня. - person marcshilling; 05.01.2016
comment
Вау, это было неожиданно. Будь проклят Фейсбук! Действительно отличный улов! - person George Marmaridis; 23.02.2016
comment
Это неожиданно справедливо даже сегодня. Спасибо тебе за это. - person Ale Ravasio; 29.11.2018

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

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

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

return NO;
person cbartel    schedule 08.02.2016
comment
willFinishLaunchingWithOptions также необходимо вернуть YES - person MeXx; 08.03.2018
comment
спасибо @MeXx Я потерял много времени, прежде чем найти ваш комментарий, и от меня тоже требовалось, чтобы willFinishLaunchingWithOptions вернул YES! - person Chris; 06.07.2019

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

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

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

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

to

func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool.
person Arnab    schedule 22.07.2019
comment
Это круто!! - person Umit Kaya; 15.01.2020
comment
Большое спасибо :) - person Naqeeb Ahmed; 15.02.2021

Если ваше приложение использует сцены, убедитесь, что вы реализовали оба делегата:

это для случая, когда приложение не запущено в момент перехода по ссылке:

   func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
      // the url is expected to be in connectionOptions.userActivities.first?.webpageURL in case if its type is NSUserActivityTypeBrowsingWeb
   }

И это для случая, когда приложение в фоне или на переднем плане:

   func scene(_ scene: UIScene, continue userActivity: NSUserActivity) {
       // the url is going to be in userActivity.webpageURL
   }

Если ваше приложение НЕ использует сцены:

Тщательно перепроверьте вызов этого метода, потому что он изменился некоторое время назад, и в устаревших проектах все еще может быть старый код:

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 - это не поможет)

Дополнительные сведения см. в документации Apple об универсальных ссылках. Детали.

person Vitalii    schedule 14.02.2019

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

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

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