Песочница приложения iOS для приема соединений через сокеты TCP

Я использую библиотеку GCDWebServer(https://github.com/swisspol/GCDWebServer) в моем проекте, который требует, чтобы я принимал соединения, исходящие только из процесса моего приложения, по соображениям безопасности. Я надеялся, что это то, что песочница приложения iOS предоставит из коробки, но, похоже, это не так. Песочница, по-видимому, применяется для сокетов домена UNIX (AF_UNIX) посредством разрешений файловой системы. Но для сокетов TCP/IP (AF_INET), используемых GCDWebServer, песочницы, по-видимому, нет.

Мне удалось написать два примера приложений — клиентское и серверное (подписанные разными сертификатами разработчика), и они могли без проблем взаимодействовать друг с другом.

Мне было интересно, есть ли какой-нибудь способ обеспечить то же самое на iOS, по сути, запустить HTTP-сервер в сокете TCP, но принимать соединения только из одного и того же процесса. Я не могу использовать сокеты домена UNIX, потому что клиент, который будет запрашивать контент с HTTP-сервера, является AVPlayer и не знает, как подключиться к сокету домена UNIX моего приложения.


person HungryTux    schedule 27.06.2017    source источник
comment
Возможно, вы могли бы уточнить, почему вы хотите это сделать, и, возможно, есть более подходящая альтернатива, которую можно было бы порекомендовать...   -  person Zigglzworth    schedule 27.06.2017
comment
Я так и думал. Идея состоит в том, чтобы предварительно кэшировать сегменты видео HLS (HTTP Live Streaming) на диске и обслуживать их локальным прокси-сервером, если они кэшированы, или перенаправлять на удаленный URL-адрес в противном случае. Итак, мы бы предоставили AVPlayer URL-адрес, который выглядит как localhost:8080/MyVideo/playlist.m3u8. Это оптимизация, которую мы пытаемся сделать, чтобы сократить время загрузки видео. Надеюсь, это объясняет прецедент.   -  person HungryTux    schedule 28.06.2017


Ответы (2)


Я примерно на 99% уверен, что то, о чем вы просите, невозможно. Я даже не думаю, что это возможно в OS X без написания расширения сетевого ядра (и даже тогда это было бы сложно).

К тому времени, когда сетевой запрос достигает другого процесса, он проходит через сетевой стек и теряет всякое представление о том, какой процесс инициировал соединение (если только это не улучшилось совсем недавно).

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

Педантично, если вам удалось каким-то образом убедить Apple в том, что вы планируете построить VPN, теоретически возможно злоупотребить API VPN таким образом, чтобы вы могли предоставить частную сеть, которая работала бы только внутри вашего приложения. Однако это никогда не будет разрешено в магазине приложений.

Но зачем вам вообще это делать? AVPlayer более чем способен воспроизводить с URL-адреса файла.

person dgatwood    schedule 27.06.2017
comment
Я так и думал. Идея состоит в том, чтобы предварительно кэшировать сегменты видео HLS (HTTP Live Streaming) на диске и обслуживать их локальным прокси-сервером, если они кэшированы, или перенаправлять на удаленный URL-адрес в противном случае. Таким образом, мы должны предоставить AVPlayer URL-адрес, который выглядит как localhost:8080/MyVideo/playlist.m3u8. . Это оптимизация, которую мы пытаемся сделать, чтобы сократить время загрузки видео. Надеюсь, это объясняет прецедент. - person HungryTux; 28.06.2017

Есть много способов сделать это: вы можете проверить входящий запрос в GCDWebServer и решить, хотите ли вы ответить на него или вернуть ошибку.

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

person Pol    schedule 28.06.2017