59

我已经为我的应用程序 +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];
}
4

5 回答 5

63

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

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

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

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

我遇到了同样的问题。但是,由于iOS 8 的第一个 beta版本的发行说明中提到,现在似乎没有解决方案:

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

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

于 2014-06-04T13:25:11.400 回答
51

Swift 2 版本,根据Apple Doc

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

斯威夫特 3 版本

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

并且不要忘记将自定义 URL 方案添加到Info.plist

在此处输入图像描述

于 2015-08-24T17:07:38.593 回答
27

@sunseeker 的答案很好,但它在评论中“隐藏”了。正如公认的答案所说,这是不可能的,它可能会误导访问者。

此代码有效:

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

我将 Xcode 6.0 (6A215l) 与 Yosemite Beta 1 一起使用。

就像苹果在处理公共场景中所说的那样:

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

于 2014-06-14T21:49:25.447 回答
3

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

于 2014-06-17T18:55:45.103 回答
3

以防万一,这里是带有错误处理版本的 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 以下是如何打开包含应用程序并在应用程序和扩展程序之间共享用户默认值的完整示例。

于 2017-02-16T05:29:00.163 回答