Как приложение iOS может поддерживать постоянное соединение TCP в фоновом режиме?
Приложение iPhone, подключающееся к удаленному серверу через TCP. Сценарии использования:
- приложение (пользователь) отправляет данные на сервер, а сервер отвечает на данные назад.
- сервер может отправлять данные в приложение, пока он ничего не делает.
Предположим, что если приложение не отправляет данные на сервер в течение 30 минут, сервер закроет соединение. Я хочу сохранить соединение в течение 120 минут, даже если пользователь ничего не делает.
Случай 1: если приложение находится на переднем плане, я могу использовать таймер для отправки на сервер каких-либо данных do-nothing. Нет проблем.
Случай 2: если пользователь нажал Домой и приложение перешли на задний план, что я мог сделать? Я не хочу показывать предупреждение или что-то прерывать пользователя (он ушел или играл в игры). Я просто хочу сохранить связь в течение более длительного периода, и когда пользователь вернется в приложение, он узнал, что соединение будет еще живым и быть счастливым с этим.
Я прочитал документацию о выполнении фона, многозадачности и локальных оповещениях API-интерфейсов iphone. Я не уверен, смогу ли я достичь случая 2.
Используйте только юридические API, без джейлбрейка.
Ответы
Ответ 1
Tapbots решили эту проблему с помощью Pastebot, предложив пользователю всегда запускать тихую фоновую звуковую дорожку.
Обратите внимание, что Apple хмурится тем, что использует хаки, такие как использование фонового звука или API-интерфейсов VOIP, для поддержки приложений без звука или VOIP (о чем свидетельствует "обходной путь", описанный в статье выше), поэтому борьба с этими методами рискует отторжением в точке представления.
К сожалению, нет законного API, чтобы поддерживать связь в фоновом режиме. Возможно, они представит один из них в будущем обновлении iOS, но вы можете рассмотреть возможность отправки запроса функции, чтобы озвучить свою поддержку для него.
Ответ 2
Пожалуйста, посмотрите Внедрение приложения VoIP в Руководстве по программированию приложений Apple iOS. Это не проверенное решение, но я думаю, что его можно использовать для достижения того, о чем вы просите.
Реализация VoIP-приложения
Голос через интернет-протокол (VoIP) приложение позволяет пользователю телефонные звонки с использованием Интернета соединение вместо устройств сотовая связь. Такое приложение необходимо поддерживать постоянную сеть подключение к связанной службе так что он может принимать входящие вызовы и другие соответствующие данные. Скорее, чем поддерживать приложения VoIP пробуждать все времени, система позволяет им быть приостановлено и предоставляет средства для контролируя их сокеты для них. Когда обнаружен входящий трафик, система пробуждает приложение VoIP и возвращает управление своими сокетами он.
Я не уверен, что вы разрабатываете VoIP-приложение, но сможете получить доступ к сокетам и реагировать на входящие пакеты. Текст после цитаты относится к [setKeepAliveTimeout:handler:][2]
, который позволяет вам установить блок кода, который позволит вам поддерживать соединение (ваше VoIP). Однако минимальное время составления расписания составляет 10 минут.
В реализации приложения VoIP есть параграф Установка обработчика Keep-Alive. Мне любопытно, если это поможет. Пожалуйста, сообщите нам, если это решит вашу проблему.
Ответ 3
1.Создайте свой сокет с свойством VOIP следующим образом
[inputStream setProperty:NSStreamNetworkServiceTypeVoIP forKey:NSStreamNetworkServiceType] ;
[outputStream setProperty:NSStreamNetworkServiceTypeVoIP forKey:NSStreamNetworkServiceType] ;
2.Добавить требуемый фоновый режим, поскольку "Приложение предоставляет услуги передачи голоса по IP" в app.plist
Если ваше приложение в фоновом режиме, voip-разъем не будет закрыт. Используя этот сокет с уведомлением uilocal, вы можете получить.
"Если ваше приложение не является оригинальным хранилищем приложений приложений voip отклонит"
Ответ 4
Если приложение находится на переднем плане:
Посмотрите на STOMP http://stomp.codehaus.org/Protocol
Структура STOMP в Obj-C http://code.google.com/p/stompframework/
и брокер ActiveMQ http://activemq.apache.org/
Если приложение находится в фоновом режиме, я бы, вероятно, пошел на использование APNS (Уведомления), чтобы побудить пользователя пробудить приложение обратно...