可以imessage扩展打开主机应用程序吗?

时间:2016-07-12 03:11:59

标签: objective-c swift ios-extensions ios10 imessage

我已尝试[self.extensionContext openURL:completion],但我的应用程序崩溃了。我听说有些扩展无法使用此方法,可以使用iMessage扩展吗?

顺便说一句,主持应用程序可以激活其iMessage扩展吗?

5 个答案:

答案 0 :(得分:5)

  

共享扩展程序和动作扩展程序并非旨在用作应用程序启动程序。

App Extension Programming Guide

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

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

应用扩展程序与其包含应用程序之间的可用交互有限。 今日小部件(并且没有其他应用扩展程序类型)可以通过调用openURL:completionHandler:类的NSExtensionContext方法让系统打开其包含的应用。 “

enter image description here

从这个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)
}

}

答案 1 :(得分:1)

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

tymac答案是正确的,但是openURL已经在Swift 3中打开了。

我在这个帖子中找到了一个更简单的解决方案: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
    }
  }

}

答案 2 :(得分:0)

func scrollViewDidZoom(scrollView: UIScrollView){ //Change the subview of scroll frame as per the scroll frame scale //rect = initial position & size of the image.<class instance> stampView.frame = CGRectMake((CGRectGetMaxX(rect)-rect.size.width)*webView.scrollView.zoomScale, (CGRectGetMaxY(rect)-rect.size.height)*webView.scrollView.zoomScale, rect.width*webView.scrollView.zoomScale,rect.height*webView.scrollView.zoomScale) }

https://forums.developer.apple.com/message/153441#153441

答案 3 :(得分:-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];
    }

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

考虑How to open our app from iMessage

答案 4 :(得分:-2)

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

如果您可以传递深层链接以打开应用程序中的特定屏幕

,那就太好了