continueUserActivity未从搜索关闭应用程序调用

问题描述 投票:15回答:6

我正在尝试使用核心聚光灯从聚光灯搜索结果中打开视图控制器。

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

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

return YES;
}

当应用程序已经在后台运行时,这似乎有效,但是当它关​​闭时我点击聚光灯搜索结果似乎没有调用此方法,我得到的行为是我的应用程序只是在主界面中启动。

当我的应用程序关闭时,你有什么建议让它工作吗?有没有办法调试正在发生的事情(因为我需要运行应用程序以连接调试器我不知道如何从搜索结果模拟应用程序打开)?

ios xcode ios9 user-activity corespotlight
6个回答
37
投票

尼科,

首先:有一种方法可以从Xcode启动您的应用程序而不是立即打开它:打开您的方案属性,转到“运行”部分,在“信息”下,有一个开关可以帮助您调试正在发生的事情:

“等待可执行文件启动”。

如果您激活此开关,您可以从Xcode启动应用程序,Xcode将等待从搜索打开应用程序,然后它将附加调试器。

希望有所帮助!

伊万


21
投票

如果您正在使用Facebook SDK,并且在didfinishlaunching中,您将返回FBSDK而不是纯文本,并在最后返回true,则可能会导致问题达到continueuseractivity

经过大量搜索,并尝试不同的方式,我只需返回true并对此进行评论:

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


9
投票

didFinishLaunchingWithOptions需要返回YES,因此将调用continueUserActivity。

添加到应用程序结束:didFinishLaunchingWithOptions:

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

return NO;

7
投票

如果应用程序已关闭,则不会调用application:continueUserActivity:。相反,您将在应用程序中获取所有信息launchOptions dictionnary:didFinishLaunchingWithOptions:

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

3
投票

在这里,它遵循您的建议后的完整答案。

// 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
投票

continue userActivity在最新版本中更改了。改变功能对我有用。

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

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

1
投票

在打开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欺骗 - 它无济于事。

© www.soinside.com 2019 - 2024. All rights reserved.