今天App扩展小工具点击打开包含应用程序

时间:2014-06-03 16:04:38

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

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

+Quotes Today App Extension Widget

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

5 个答案:

答案 0 :(得分:63)

编辑:好的,这里稍作修改。我按照上面的建议和以下代码在标签上放置一个按钮就可以了:

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

我将它与#34; Touch Up Inside"事件。但是,这也会导致应用程序在用户滚动“今日”视图时启动。

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

我遇到了同样的问题。但是,似乎现在没有解决方案,因为iOS 8的第一个测试版的release notes提到了:

  

已知问题:openURL无法通过扩展程序运行。

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

答案 1 :(得分:48)

根据{{​​3}}

Swift 2版本

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

Swift 3版

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

不要忘记将自定义网址结构添加到Info.plist

Apple Doc

答案 2 :(得分:28)

@sunseeker的答案是好的,但它是隐藏的#34;在评论中。正如公认的答案所说,这是不可能的,它可能会误导访客。

此代码有效:

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

我使用Xcode 6.0(6A215l)和Yosemite Beta 1.

就像Apple在Handling Commons Scenarios中所说:

  

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

答案 3 :(得分:3)

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

答案 4 :(得分:2)

以防万一,这里是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>

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