【问题标题】:Today App Extension Widget Tap To Open Containing AppToday App Extension Widget 点击以打开包含的应用程序
【发布时间】:2014-07-24 01:31:30
【问题描述】:

我已经为我的应用程序 +Quotes 实现了一个 Today 小部件,它在这些 Apple Docs 的帮助下在通知中心内显示当天的报价。我想要完成的是打开包含应用程序,在这种情况下为 +Quotes,当用户在他们的 Today 通知视图中点击 +Quotes 小部件时,不完全确定如何调用它,如果你在今日观点。我试过在标签上覆盖一个按钮,它会调用 -(void)openURL:(NSURL *)URL completionHandler:(void (^)(BOOL success))completionHandler 点击它后,打开我声明的自定义 URL 方案以打开包含应用程序。问题是它没有打开包含的应用程序。

-(IBAction)myButton:(id)sender {
    NSURL *customURL = [NSURL URLWithString:@"PositiveQuotes://"];
    [self openURL:customURL completionHandler:nil];
}

【问题讨论】:

    标签: ios ios8 ios-app-extension today-extension


    【解决方案1】:

    编辑:好的,这里只是稍微更正一下。就像上面建议的那样,我通过在标签上放置一个按钮和以下代码来实现它:

    - (IBAction) goToApp: (id)sender { 
        NSURL *url = [NSURL URLWithString:@"floblog://"];
        [self.extensionContext openURL:url completionHandler:nil]; 
      }
    

    我将它与“Touch Up Inside”活动相关联。但是,这也会导致应用在用户滚动 Today 视图时启动。

    ========================================

    我遇到了同样的问题。但是,自从release notes 提到 iOS 8 的第一个测试版之后,似乎目前还没有解决方案:

    已知问题:openURL 不适用于扩展。

    所以我想我们至少要等到 beta 2。

    【讨论】:

    • 好的,这里稍微修正一下。我让它在标签上放置一个按钮,就像上面建议的那样,下面的代码: - (IBAction) goToApp: (id)sender { NSURL *url = [NSURL URLWithString:@"floblog://"]; [self.extensionContext openURL:url completionHandler:nil];我将它与“Touch Up Inside”事件联系起来。但是,这也会导致应用在用户滚动 Today 视图时启动。
    • 没问题。您知道如何解决我在上一句中描述的行为吗?
    • 只有当你滚动并且你的手指仍然在你的隐形按钮上时才会发生这种情况?
    • 是的,但是当您滚动到不可见按钮之外时也不应该发生这种情况。基本上它应该只发生在点击而不是滚动手势上。
    • 对于未来的读者,值得注意的是,这种方法仅在 Today Extensions 中允许使用。
    【解决方案2】:

    Swift 2 版本,根据Apple Doc

    extensionContext?.openURL(NSURL(string: "foo://")!, completionHandler: nil)
    

    Swift 3 版本

    extensionContext?.open(URL(string: "foo://")! , completionHandler: nil)
    

    别忘了将自定义网址方案添加到Info.plist

    【讨论】:

    • 如何像点击搜索一样恢复 userActivity?我们是否需要在 TodayViewController 中创建一个 NSUserActivity 作为它被点击的小部件(即在 openURL 调用之前)?
    • 以防万一其他人像我一样愚蠢:这个URL Type 在主应用程序目标的信息选项卡中 - 而不是小部件的
    【解决方案3】:

    @sunseeker 的答案很好,但它“隐藏”在 cmets 中。由于公认的答案表明这是不可能的,因此可能会误导访问者。

    此代码有效:

    - (IBAction)launchHostingApp:(id)sender
    {
      NSURL *pjURL = [NSURL URLWithString:@"hostingapp://home"];
      [self.extensionContext openURL:pjURL completionHandler:nil];
    }
    

    我正在使用 Xcode 6.0 (6A215l) 和 Yosemite Beta 1。

    就像苹果在Handling Commons Scenarios 中所说的那样:

    扩展程序不会直接告诉其包含的应用程序打开; 相反,它使用 openURL:completionHandler: 方法 NSExtensionContext 告诉系统打开其包含的应用程序。什么时候 扩展使用此方法打开 URL,系统验证 在完成之前请求。

    【讨论】:

    【解决方案4】:

    在不添加隐藏按钮的情况下执行此操作的另一种方法是在 UILabel 上添加 UITapGestureRecognizer(确保在标签上将 userInteractionEnabled 设置为 true)。检查处理程序中的识别器状态以确保您达到 UIGestureReconizerStateEnded(而不是 Canceled 或 Failed),然后运行您的 openUrl 代码。

    【讨论】:

      【解决方案5】:

      以防万一,这里是带有错误处理版本的 Swift 3 版本:

      let myAppUrl = URL(string: "main-screen:")!
      extensionContext?.open(myAppUrl, completionHandler: { (success) in
          if (!success) {
              print("error: failed to open app from Today Extension")
          }
      })
      

      要使其工作,您需要打开应用程序的 info.plist(作为源代码打开)并在最顶部,在此之后

      <?xml version="1.0" encoding="UTF-8"?>
      <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
      <plist version="1.0">
      <dict>
      

      添加以下内容,以便应用知道它应该处理哪些 URL 这里是 complete example 如何打开包含的应用程序并在应用程序和扩展程序之间共享用户默认值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-29
        • 1970-01-01
        • 2020-04-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多