Зарегистрировать класс NSURLProtocol (URLProtocol) для использования с внешним приложением?

Я хочу использовать кастом NSURLProtocol класс для обслуживания статических данных для тестирования, и я сделал это, реализуя протокол в самом приложении и регистрируя его в NSURLSessionConfiguration.protocolClasses, Я хочу переместить класс протокола в другое приложение и зарегистрировать его для использования другими приложениями. Это возможно?

Документация Apple для registerClass: состояния:

Пытается зарегистрировать подкласс NSURLProtocol, делая его видимым для системы загрузки URL.

В новом приложении, которое я хочу использовать в качестве протокола, я регистрирую протокол, но внешнее приложение не обращается к нему.

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

Я хочу, чтобы внешнее приложение могло использовать мой класс протокола с NSURLSession и назовите его с помощью URL-адреса, такого как foo://externalApplication.com,

Спасибо за помощь!

1 ответ

Решение

NSURLProtocol регистрация является неотъемлемой частью процесса. Невозможно зарегистрировать протокол в одном процессе и использовать его в другом, потому что это будет дырой в безопасности, позволяющей любому приложению тривиально манипулировать трафиком любого другого приложения.

Предполагая, что это только для целей тестирования, и предполагая, что вы контролируете оба приложения, вы можете подумать о том, чтобы либо А. записать свой код сервера в расширение приложения, либо Б. использовать openURL для установления канала связи между приложениями, подобного этому:

  • Сделайте ваше серверное приложение настоящим веб-сервером. (Существует множество сторонних веб-серверов.)
  • Зарегистрируйте схему URL для этого серверного приложения, чтобы другое приложение могло запускать ее по требованию.
  • В другом приложении зарегистрируйте схему URL-адреса, чтобы приложение сервера могло вернуть управление этому приложению после запуска.
  • В другом приложении используйте openURL, чтобы запустить приложение сервера и передать пользовательский URL, который откроет другое приложение.
  • В серверном приложении декодируйте этот URL-адрес и используйте openURL, чтобы переключиться обратно на другое приложение, добавив номер порта как часть URL-адреса, который он отправляет другому приложению.
  • В другом приложении извлеките номер порта из URL-адреса и начните общаться с локальным веб-сервером. Если это не отвечает, отправьте еще один запрос openURL.

Для получения подробной информации, а также для получения дополнительных советов и приемов взаимодействия между приложениями, я бы предложил прочитать эту статью: http://www.goldmansachs.com/what-we-do/engineering/see-our-work/app-to-app-comm.html

Другие вопросы по тегам