iMessage扩展能否打开主机应用程序?

3
我尝试过[self.extensionContext openURL:completion],但我的应用程序崩溃了。我听说有些扩展不能使用这种方法,iMessage扩展可以吗?
顺便问一下,主机应用程序是否可以激活其iMessage扩展?

5个回答

6

分享扩展和操作扩展不是设计为应用程序启动器。

应用程序扩展编程指南

应用程序扩展与其包含的应用程序之间没有直接通信;通常,在包含的扩展运行时,包含应用程序甚至没有在运行。应用程序扩展的包含应用程序和宿主应用程序根本不进行通信。

扩展显示用户界面,执行一些工作,并且如果适用于扩展的目的,则将数据返回给宿主。

应用程序扩展与其包含应用程序之间有限的交互可用。只有“今天”小部件(而没有其他应用程序扩展类型)可以通过调用NSExtensionContext类的openURL:completionHandler:方法来要求系统打开其包含的应用程序。"

enter image description here

这是从 Stack Overflow问题中得出的解决方法。

适用于键盘扩展的工作解决方案(在iOS 9.2上测试通过)。

该类别添加了特殊方法,用于访问隐藏的 sharedApplication 对象,并在其上调用 openURL: 方法。(当然,然后您必须使用带有您的应用程序方案的 openURL: 方法。)

// Valentin Shergin

extension UIInputViewController {

func openURL(url: NSURL) -> Bool {
    do {
        let application = try self.sharedApplication()
        return application.performSelector("openURL:", withObject: url) != nil
    }
    catch {
        return false
    }
}

func sharedApplication() throws -> UIApplication {
    var responder: UIResponder? = self
    while responder != nil {
        if let application = responder as? UIApplication {
            return application
        }

        responder = responder?.nextResponder()
    }

    throw NSError(domain: "UIInputViewController+sharedApplication.swift", code: 1, userInfo: nil)
}

}

谢谢,所以我无法在我的消息扩展中使用openURL:completion吗? - Maize
不是完成,而是您可以使用非常短的扩展来访问隐藏的'sharedApplication'对象,然后在其上调用“openURL”。我刚刚更新了我的答案。 - Edison
有人已经将使用这个扩展(或者@vmeyer的Swift3版本)的应用程序发布到应用商店了吗?如果苹果因为它而不允许该应用程序,那么技术上可行就没有什么帮助了。 - SuperDuperTango
这个功能允许用户从消息扩展中打开URL吗? - blue

2

self.extensionContext?.open(url, completionHandler: nil)在我的iMessage扩展中不起作用。

tymac的答案是正确的,但在Swift 3中,openURL已经移动到open中。

我在这个线程中找到了一个更简单的解决方案:在操作扩展中打开URL不起作用

extension UIViewController {

  func openURL(url: URL) {
    var responder = self as UIResponder?

    while (responder != nil){
      if responder?.responds(to: Selector("openURL:")) == true{
        responder?.perform(Selector("openURL:"), with: url)
      }
      responder = responder!.next
    }
  }

}

我们只需要将其更新为#selector语法。 - Rivera

0

它不是不工作。它们不应该以这种方式运行。这不应该被接受为答案。 - MattWright
1
i just did a test. now you can open host app from iMessage extension on beta 4 - Maize

-1

这对我来说很好用:

NSString *customURL = @"myHostAppName://";

    if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:customURL]]) {
        [[UIApplication sharedApplication] openURL:[NSURL URLWithString:customURL]];
    } else {

        UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"URL error" message:[NSString stringWithFormat:@"No custom URL defined for %@", customURL] preferredStyle:UIAlertControllerStyleAlert];

        UIAlertAction* ok = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:nil];
        [alertController addAction:ok];

        [self presentViewController:alertController animated:YES completion:nil];
    }

记得重新安装主机应用程序。

考虑一下如何从iMessage打开我们的应用程序


-2
[self.extensionContext openURL:YOUR_NSURL completionHandler:nil];

如果您可以传递深度链接以打开应用程序中的特定屏幕,那将是很好的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接