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

时间:2017-01-09 16:25:41

标签: ios nsurlsession url-scheme nsurlprotocol nsurlsessionconfiguration

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

registerClass:州的Apple文档:

  

尝试注册NSURLProtocol的子类,使其对URL加载系统可见。

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

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

我希望外部应用能够将我的协议类与NSURLSession一起使用,并使用foo://externalApplication.com等网址调用它。

感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

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

假设这仅用于测试目的,并假设您可以控制这两个应用程序,您可以考虑A.在服务器代码中编写服务器代码或使用openURL在这些应用程序之间建立通信通道:

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

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