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)