imessage 扩展程序可以打开主机应用程序吗?
Can imessage extension open host app?
我试过 [self.extensionContext openURL:completion]
,但我的应用程序崩溃了。听说有些扩展不能用这个方法,iMessage扩展可以吗?
顺便问一下,宿主应用程序可以激活其 iMessage 扩展程序吗?
Share Extensions and Action Extensions are not designed to function as app launchers.
App Extension Programming Guide
应用程序扩展与其包含的应用程序之间没有直接通信;通常,包含的应用程序甚至不是 运行,而包含的扩展程序是 运行。应用扩展的包含应用和宿主应用根本不通信。
扩展程序显示用户界面,执行一些工作,并且如果适合扩展程序的目的,returns 数据到主机。
应用扩展与其包含的应用之间可用的交互有限。 Today 小部件(没有其他应用程序扩展类型) 可以通过调用 NSExtensionContext
[=43= 的 openURL:completionHandler:
方法要求系统打开其包含的应用程序]. “
由此 SO question 派生的解决方法。
键盘扩展的工作解决方案(在 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)
}
}
This is apparently not working in Seed 2 but should be fixed in Seed 3.
[self.extensionContext openURL:YOUR_NSURL completionHandler:nil];
如果您可以通过深层链接在应用程序中打开特定屏幕,那就太好了
self.extensionContext?.open(url, completionHandler: nil)
在我的 iMessage 扩展程序中不起作用。
tymac 的回答是正确的,但是 openURL 已被移动到 Swift3 中打开。
我在这个线程中找到了一个更简单的解决方案:openURL not work in Action Extension
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
}
}
}
这对我来说很好用:
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:completion]
,但我的应用程序崩溃了。听说有些扩展不能用这个方法,iMessage扩展可以吗?
顺便问一下,宿主应用程序可以激活其 iMessage 扩展程序吗?
Share Extensions and Action Extensions are not designed to function as app launchers.
App Extension Programming Guide
应用程序扩展与其包含的应用程序之间没有直接通信;通常,包含的应用程序甚至不是 运行,而包含的扩展程序是 运行。应用扩展的包含应用和宿主应用根本不通信。
扩展程序显示用户界面,执行一些工作,并且如果适合扩展程序的目的,returns 数据到主机。
应用扩展与其包含的应用之间可用的交互有限。 Today 小部件(没有其他应用程序扩展类型) 可以通过调用 NSExtensionContext
[=43= 的 openURL:completionHandler:
方法要求系统打开其包含的应用程序]. “
由此 SO question 派生的解决方法。
键盘扩展的工作解决方案(在 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)
}
}
This is apparently not working in Seed 2 but should be fixed in Seed 3.
[self.extensionContext openURL:YOUR_NSURL completionHandler:nil];
如果您可以通过深层链接在应用程序中打开特定屏幕,那就太好了
self.extensionContext?.open(url, completionHandler: nil)
在我的 iMessage 扩展程序中不起作用。
tymac 的回答是正确的,但是 openURL 已被移动到 Swift3 中打开。
我在这个线程中找到了一个更简单的解决方案:openURL not work in Action Extension
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
}
}
}
这对我来说很好用:
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];
}
记得重新安装主机应用。
考虑一下