我尝试过
顺便问一下,主机应用程序是否可以激活其iMessage扩展?
[self.extensionContext openURL:completion]
,但我的应用程序崩溃了。我听说有些扩展不能使用这种方法,iMessage扩展可以吗?顺便问一下,主机应用程序是否可以激活其iMessage扩展?
[self.extensionContext openURL:completion]
,但我的应用程序崩溃了。我听说有些扩展不能使用这种方法,iMessage扩展可以吗?分享扩展和操作扩展不是设计为应用程序启动器。
应用程序扩展与其包含的应用程序之间没有直接通信;通常,在包含的扩展运行时,包含应用程序甚至没有在运行。应用程序扩展的包含应用程序和宿主应用程序根本不进行通信。
扩展显示用户界面,执行一些工作,并且如果适用于扩展的目的,则将数据返回给宿主。
应用程序扩展与其包含应用程序之间有限的交互可用。只有“今天”小部件(而没有其他应用程序扩展类型)可以通过调用NSExtensionContext
类的openURL:completionHandler:
方法来要求系统打开其包含的应用程序。"
这是从 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
吗? - Maizeself.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这在Seed 2中显然不起作用,但应该在Seed 3中得到修复。
i just did a test. now you can open host app from iMessage extension on beta 4
- Maize这对我来说很好用:
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];
}
记得重新安装主机应用程序。
[self.extensionContext openURL:YOUR_NSURL completionHandler:nil];
如果您可以传递深度链接以打开应用程序中的特定屏幕,那将是很好的。