26

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

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

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

return YES;
}

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

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

4

8 回答 8

53

尼可,

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

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

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

希望有帮助!

伊万

于 2015-09-21T15:33:29.270 回答
37

在新的 Swift 5 中,有一个名为SceneDelegate.swift. 使用方法scene(_ scene: UIScene, continue userActivity: NSUserActivity)

于 2019-10-04T14:06:09.820 回答
23

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

经过大量搜索并尝试了不同的方法后,我只需要返回 true 并对此发表评论:

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

于 2015-11-18T23:49:55.333 回答
10

didFinishLaunchingWithOptions 需要返回 YES 所以 continueUserActivity 将被调用。

添加到应用程序末尾:didFinishLaunchingWithOptions:

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

return NO;
于 2016-02-08T22:04:54.417 回答
9

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.
于 2019-07-22T10:21:38.190 回答
8

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

// In application: didFinishLaunchingWithOptions:
NSDictionary *activityDic = [launchOptions objectForKey:UIApplicationLaunchOptionsUserActivityDictionaryKey];  
if (activityDic) {
    // Continue activity here
}
于 2015-10-07T14:36:13.560 回答
4

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

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

if (activityDic) {
    if(self.window.rootViewController){
        NSUserActivity * userActivity = [activityDic valueForKey:@"UIApplicationLaunchOptionsUserActivityKey"];
        [self.window.rootViewController restoreUserActivityState:userActivity];
    }
}
于 2015-10-17T10:32:39.637 回答
4

如果您的应用使用场景,请确保您已实现两个委托:

这是在单击链接时应用程序未运行的情况:

   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 关于通用链接的文档

于 2019-02-14T12:49:46.083 回答