注册 NSURLProtocol (URLProtocol) class 以与外部应用程序一起使用?

Register NSURLProtocol (URLProtocol) class for use with external app?

我想使用自定义 NSURLProtocol class 来提供用于测试的静态数据,我已经在应用程序本身中实现了协议并将其注册到 NSURLSessionConfiguration.protocolClasses。我想将协议 class 移动到另一个应用程序并注册它以供其他应用程序使用。这可能吗?

registerClass: 的 Apple 文档指出:

Attempts to register a subclass of NSURLProtocol, making it visible to the URL loading system.

在我想用作协议的新应用中,我注册了协议,但外部应用没有调用它。

// Swift 3
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    URLProtocol.registerClass(MyCustomURLProtocolClass)
}

我希望外部应用程序能够将我的协议 class 与 NSURLSession 一起使用,并使用 url 调用它,例如 foo://externalApplication.com.

感谢您的帮助!

NSURLProtocol 注册本质上是按进程进行的。不可能在一个进程中注册协议以在另一个进程中使用它,因为这将是一个安全漏洞,允许任何应用程序轻易地操纵任何其他应用程序的流量。

假设这只是为了测试目的,并且假设您可以控制这两个应用程序,您可以考虑 A. 在应用程序扩展中编写服务器代码或 B. 使用 openURL 建立一个应用程序之间的通信渠道如下:

  • 让您的服务器应用成为真正的网络服务器。 (有许多第三方 Web 服务器框架。)
  • 为该服务器应用程序注册一个 URL 方案,以便其他应用程序可以按需启动它。
  • 在另一个应用程序中,注册一个URL方案,以便服务器应用程序在启动后可以return控制该应用程序。
  • 在另一个应用程序中,使用 openURL 启动服务器应用程序并传递将打开另一个应用程序的自定义 URL。
  • 在服务器应用程序中,解码 URL 并使用 openURL 切换回另一个应用程序,附加一个端口号作为 URL 的一部分发送到其他应用程序。
  • 在另一个应用程序中,从 URL 中获取端口号并开始与本地 Web 服务器通信。如果这没有响应,请发送另一个 openURL 请求。

有关详细信息以及更多应用程序间通信的技巧和技巧,我建议阅读这篇文章:http://www.goldmansachs.com/what-we-do/engineering/see-our-work/app-to-app-comm.html