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