【问题标题】:continueUserActivity not called from search closed appcontinueUserActivity 未从搜索关闭的应用程序中调用
【发布时间】:2015-12-17 03:23:26
【问题描述】:

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

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

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

return YES;
}

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

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

【问题讨论】:

  • 你有没有想过这个问题?我遇到了同样的问题: continueUserActivity 曾经被调用过。
  • 嗨@Travis,请参阅下面的答案:)

标签: ios xcode ios9 user-activity corespotlight


【解决方案1】:

尼可,

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

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

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

希望有帮助!

伊万

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 在这上面浪费了 2 个小时,愚蠢的过时文档。
    • 如果应用仍然支持 iOS 9,如何从用户活动中获取 url ...?
    【解决方案3】:

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

    在搜索了很多,并尝试了不同的方法之后,我只需要 返回 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;
    

    【讨论】:

    • willFinishLaunchingWithOptions 需要返回YES
    • thx @MeXx 我浪费了很多时间才找到您的评论,并且 willFinishLaunchingWithOptions 也需要为我返回 YES!
    【解决方案5】:

    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.
    

    【讨论】:

    • 这太棒了!!
    • 谢谢!!!!这救了我的命
    【解决方案6】:

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

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

    【讨论】:

      【解决方案7】:

      根据您的建议,这里是完整的答案。

      // In application: didFinishLaunchingWithOptions:
      NSDictionary *activityDic = [launchOptions objectForKey:UIApplicationLaunchOptionsUserActivityDictionaryKey];
      
      if (activityDic) {
          if(self.window.rootViewController){
              NSUserActivity * userActivity = [activityDic valueForKey:@"UIApplicationLaunchOptionsUserActivityKey"];
              [self.window.rootViewController restoreUserActivityState:userActivity];
          }
      }
      

      【讨论】:

        【解决方案8】:

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

        这是针对点击链接时应用未运行的情况:

           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's documentation about Universal Links了解更多详情。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-05-17
          • 2017-04-22
          • 2019-10-03
          • 1970-01-01
          相关资源
          最近更新 更多