Зарегистрировать класс 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.

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


person lostAtSeaJoshua    schedule 09.01.2017    source источник
comment
Чтобы уточнить, добавили ли вы этот код и класс, на который он ссылается, во внешнее приложение?   -  person Holly    schedule 09.01.2017
comment
@ Холли, я отредактировал вопрос и добавил уточнение. Пожалуйста, дайте мне знать, если все еще не ясно. Приведенный выше код и класс протокола находятся в приложении, которое я хочу использовать для перехвата вызовов, а во внешнем приложении нет этого кода или класса протокола. Внешнее приложение — это приложение, которое я хочу вызвать в протоколе.   -  person lostAtSeaJoshua    schedule 09.01.2017


Ответы (1)


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

Предполагая, что это только для целей тестирования, и предполагая, что вы контролируете оба приложения, вы можете рассмотреть либо A. написание кода сервера в расширении приложения, либо B. использование 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

person dgatwood    schedule 09.01.2017