XCode11 错误“open(_:options:completionHandler:) 在应用程序扩展中不可用”

2024-03-20

启动后触摸图 v1.0 https://apps.apple.com/us/app/touchgram-for-imessage/id1447336478?ls=1,这是 99% iMessage 应用程序扩展,我尝试更新到 XCode 11。

我开始收到错误open(_:options:completionHandler:) is unavailable in application extensions

我确认即使在琐碎的样本 https://github.com/AndyDentFree/im-plausibilities/tree/master/webFromIM/webFromIM%20MessagesExtension尝试从 iMessage 应用程序启动 Web URL:

For example https://github.com/AndyDentFree/im-plausibilities/blob/896219d07fa630f8ad960bc05ee0e9fcac76bb22/webFromIM/webFromIM%20MessagesExtension/MessagesViewController.swift#L117:

    let openSel = #selector(UIApplication.open(_:options:completionHandler:))
    while (responder != nil){
        if responder?.responds(to: openSel ) == true {
            // cannot package up multiple args to openSel 
            // so we explicitly call it on the iMessage application instance

            // found by iterating up the chain
            (responder as? UIApplication)?.open(url, completionHandler:handler) 
            return
        }
        responder = responder!.next
    }

2020年更新

下面是我自己对这个问题的回答,详细介绍了解决方法的工作原理。请注意,上面链接的示例已修复为既使用此解决方法,又显示在WKWebView在 iMessage 扩展本身内部。


如(唯一)中所述issue https://github.com/AndyDentFree/im-plausibilities/issues/2在该样本上,这是一个iOS 13 中的有意更改由 DTS 确认。我相信这是打击键盘扩展中滥用行为的一部分,该行为的副作用是 iMessage 扩展。

我已经想出了一个解决方法,与他们建议的相同。

  1. 使用以下命令将 URL 转发到您的父应用程序self.extensionContext?.open
  2. 让父应用程序启动您的外部应用程序或 URL 代表。

这是 Touchgram 的完整工作扩展

// UIViewController+iMessageContext.swift
// applied to class MessagesViewController: MSMessagesAppViewController, UrlOpeningInIMessage 

protocol UrlOpeningInIMessage {
    func openFromiMessageContext(url:URL)
}


extension UrlOpeningInIMessage where Self:UIViewController {
    func openFromiMessageContext(url:URL) {
        let handler = { (success:Bool) -> () in
            if success {
                os_log("Finished opening URL", log:tgEnv.logImUI, type:.debug)
            } else {
                os_log("Failed to open URL", log:tgEnv.logImUI, type:.debug)
            }
        }
        // logic same as onLaunchMainPressed, since XCode11 unable to compile extension using UIApplication.open
        // so we pass the URL through to the parent app to launch on our behalf
        let appName = Bundle.appName()
        let encodedUrl = url.dataRepresentation.base64EncodedString()
        guard let appUrl: URL = URL(string: "\(appName)://?url=\(encodedUrl)") else { return }
        // can only open our app, not generalised URLs
        self.extensionContext?.open(appUrl, completionHandler: handler)
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

XCode11 错误“open(_:options:completionHandler:) 在应用程序扩展中不可用” 的相关文章

随机推荐

  • 如何在命令行中从 .NET 程序集获取 IDL(或如何将 TLB 转换为 IDL)?

    我们有一个 NET 程序集 实际上是 Aspose Words 我们希望客户端能够从 COM 客户端轻松使用它 因此 我们随程序集提供了 TLB 以便客户端可以从 C 或 Delphi 等语言中使用它 而不必自己提取 TLB 我们还随程序集
  • 将所有对象从一个 Realm 复制到另一个 Realm

    我正在尝试添加使用领域将以前导出的数据库加载到手机应用程序中的功能 该数据库包含在一个 zip 文件中 我将其从电子邮件导入到应用程序中 将其提取 然后将领域文件写入应用程序本地存储 将其写入文件后 我将加载备份领域文件 查询对象 然后将它
  • SQLite3 Node.js JSON

    我正在使用sqlite3NPM 包 我想将 JSON 存储在我的数据库列之一中 据我所知 SQLite本身能够存储JSONhttps www sqlite org json1 html https www sqlite org json1
  • Coq 中的案例分析证明

    我试图证明关于以下函数的命题 Program Fixpoint division m nat n nat measure m nat match lt nat 0 n with false gt 0 true gt match leq na
  • Steam:使用 PHP 将 SteamID64 转换为 SteamID

    有人如何使用 PHP javascript 将 steamid64 例如 76561198074259974 转换为 steamid STEAM 0 0 56997123 我想在加载屏幕上显示 steamid 但不是 steamid64 看
  • 在 C# 中查找 MP3 长度

    我在用着TagLib http developer novell com wiki index php TagLib Sharp从一些 MP3 中获取 ID3 标签数据 但我似乎无法找到 MP3 的长度 如何在 C 中找到 MP3 的长度
  • Microsoft Teams Tab 应用程序无法访问剪贴板

    I m developing the Microsoft Teams Tab application Tab application is run inside Microsoft Teams through iframe so there
  • 上下文操作模式自定义行为

    在 Android 开发者中菜单指南 http developer android com guide topics ui menus html CAB其中提到 当用户取消选择所有项目 按 后退 按钮或选择操作栏左侧的 完成 操作时 操作模
  • 中继器控件 - 取消特定项目的绑定

    在转发器控件中 是否有一种方法可以在呈现页面之前解除某些项目的绑定 目前 我们有一个绑定到转发器的项目集合 如果该项目不是当前语言的一部分 我们将隐藏该项目 我希望能够对中继器进行计数并返回有效的号码 不包括隐藏项目的计数 是否可以解除特定
  • 创建实时数据仓库

    我正在做一个个人项目 其中包括创建数据仓库 DWH 的完整架构 在本例中 作为 ETL 和 BI 分析工具 我决定使用 Pentaho 它具有许多功能 从允许轻松创建仪表板到完整的数据挖掘流程和 OLAP 多维数据集 我读过数据仓库必须是关
  • 在Java中使用分隔符(与分割相反)连接数组元素的一种快速而简单的方法[重复]

    这个问题在这里已经有答案了 See 相关 NET 问题 https stackoverflow com questions 455438 opposite of string split with separators net 我正在寻找一
  • 为什么 std::vector 这么快(或者我的实现太慢)

    前几天我在玩游戏 试图看看我能在多大程度上优化某些东西 我决定从一个简单的映射开始 它只进行线性搜索来查找元素是否存在 然后尝试对其大部分进行优化 另外 为了进行比较 我使用 std find 对 std map 和 std vector
  • Protractor - 检查单选按钮是否被选中

    所以我遇到了这个问题 我运行量角器 硒测试 有时在测试过程中已经检查了单选按钮 有时则没有 etc div class radio item checked or div class radio item 您可以在其中看到该类有时具有 检查
  • 如何使用 Java 11 HttpClient 和 Jackson 将 JSON 响应映射到 Java 类?

    我是 Java 11 HttpClient 的新手 想尝试一下 我有一个返回 JSON 的简单 GET 请求 我想将 JSON 响应映射到名为的 Java 类Questionnaire 我知道我可以将响应直接转换为字符串或输入流 如下所示
  • 如何在 emacs 中删除引用的字符串?

    我想删除源文件中带引号的字符串 无需标记字符串的开头和终止区域 但只需将点放置在引用字符串内的任意位置并按快捷键即可 我尝试在 elisp 中为此编写一个函数 但我发现该文件 需要从头到点进行解析 以确定该点是否在带引号的字符串内 并找到带
  • 将 Mutations 添加到 Vuex 存储作为 Vue 插件的一部分

    我正在创建一个小型 Vue 插件 允许用户从任何组件内添加 页面通知 我已经成功地实现了类似的东西 this notifications add a message 它有效 但我必须注册我的插件工作所需的突变和操作 作为为我的应用程序设置商
  • Lisp 内部引用工作

    口齿不清是如何做到的quote内部工作 例如 quote 1 1 2 似乎相当于 list 1 list 1 2 这意味着它是如何递归地象征 Head 值的 这个功能是内置的吗 Run equal quote 1 1 2 list 1 li
  • 使用团队成员参数进行 ASP.NET Core 身份授权

    我有一个带有这样的表的应用程序 用户 ASP NET Core 身份 Team UserTeam 多对多联接表 用户可以是多个团队的成员 并且可以在团队中具有不同的角色 例如 用户可能是 TeamA 的团队管理员 但只是 TeamB 的普通
  • Foo.cmd 不会输出进程中的行(在网站上)

    我无法理解 NET 中 ProcessStartInfo 类的内部和外部 我使用此类来执行 FFmpeg 等 exe 程序 没有任何问题 但是当我使用 ProcessStartInfo 启动 cmd 程序时 例如一个简单的 foo cmd
  • XCode11 错误“open(_:options:completionHandler:) 在应用程序扩展中不可用”

    启动后触摸图 v1 0 https apps apple com us app touchgram for imessage id1447336478 ls 1 这是 99 iMessage 应用程序扩展 我尝试更新到 XCode 11 我