【问题标题】:Can imessage extension open host app?图像扩展可以打开主机应用程序吗?
【发布时间】:2016-11-14 03:18:36
【问题描述】:

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

顺便问一下,宿主应用可以激活它的 iMessage 扩展吗?

【问题讨论】:

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


【解决方案1】:

Share Extensions 和 Action Extensions 的设计目的不是用作应用启动器。

App Extension Programming Guide

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

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

应用扩展程序与其包含的应用程序之间可用的交互有限。 今日小部件(并且没有其他应用扩展类型)可以通过调用NSExtensionContext 类的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)
}

}

【讨论】:

  • 谢谢,所以我不能在我的消息扩展中使用openURL:completion
  • 不是完成,但您可以使用那个非常短的扩展来访问隐藏的 sharedApplication 对象,然后在其上调用 openURL。我刚刚更新了我的答案。
  • 我也是 :) 不客气。欢迎来到 SO。请不要忘记将答案标记为正确。
  • 有没有人将使用此扩展程序(或@vmeyer 的 swift3 版本)的应用程序放入应用程序商店?如果在技术上可行,那一切都很好,但如果苹果因此而禁止该应用程序,那并没有真正的帮助。
  • 这是否允许人们从消息扩展中打开网址?
【解决方案2】:

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
    }
  }

}

【讨论】:

  • 我们只需要更新 #selector 语法。
【解决方案3】:

This is apparently not working in Seed 2 but should be fixed in Seed 3.

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

【讨论】:

  • 不是说不行。它们不打算以这种方式运行。这不应该是公认的答案。
  • i just did a test. now you can open host app from iMessage extension on beta 4
【解决方案4】:

这对我来说很好用:

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

【讨论】:

    【解决方案5】:
    [self.extensionContext openURL:YOUR_NSURL completionHandler:nil];
    

    如果您可以传递深层链接以在应用程序中打开特定屏幕,那就太好了

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-23
      • 1970-01-01
      • 1970-01-01
      • 2022-01-17
      • 1970-01-01
      • 2015-02-14
      • 1970-01-01
      相关资源
      最近更新 更多