2009-05-22 6 views
2

Я разрабатываю сетевое приложение на iPhone, которое требует интернет-подключения все время. Однако, как только я заходил на сервер и некоторое время простаивал на iPhone, iPhone переходит в спящий режим и отключает мое сетевое подключение (он меня отключает).Устранение сетевого подключения на iPhone

Если я запускаю одно приложение на iPhone, а iPhone подключен к ПК через USB-кабель, он никогда не теряет сетевого подключения.

В файле info.plist я добавил эти два флага, но, похоже, не имеет никакого эффекта.

UIRequiresPersistentWifi -> истинный SBUsesNetwork - целое число -> 3

Я пропускаю что-нибудь? Не могли бы вы сообщить мне, как я могу убедиться, что сетевое соединение является постоянным на протяжении всего срока службы приложения?

ответ

1

Что вы подразумеваете под «logs me out» здесь? На сетевом уровне нет «вошедшего в систему» ​​(*). Есть только пакеты. Вы отправляете их или нет. Таким образом, ваш серверный процесс имеет некоторое ожидание появления пакетов или сообщений? Если это так, то вы должны отправить их, а это значит, что вы не можете простаивать (idleTimerDisabled = YES). Если вы управляете сервером, лучше сделать его менее требовательным к тому, как часто вы общаетесь с ним. Однако все это происходит намного выше уровня сети.

UIRequiresPersistentWifi означает, что Wi-Fi-радиоприемник поддерживается во время работы приложения, даже если вы не говорите об этом. Это важно для получения данных. В противном случае вы выходите из сети, а другие не могут разговаривать с вами через 30 минут. Он должен быть установлен в Info.plist, но это, безусловно, в вашем приложении. Если бы это не так, ваше приложение не запускалось, так что это не проблема.

(*) У сети сотовой сети есть концепция входа в систему, но это не является причиной вашей проблемы.

+0

Спасибо за ваш ответ. Под «logs me out» я имею в виду, что приложение теряет TCP-соединение с сервером. – ebaccount

+0

Вот что я подразумеваю под «Есть только пакеты». В результате я отключил свой компьютер, не нарушая TCP-соединение. И TCP не имеет никакого способа узнать, остается ли другая сторона. Единственное, что прекращает сеанс TCP, - это FIN, RST и отказ от ответа, когда другая сторона говорит со мной. «TCP keepalive» вводит в заблуждение, потому что он даже не вступает в игру в течение нескольких часов. Итак, почему вы потеряли TCP-соединение? Сервер отправляет вам данные, на которые вы не отвечаете? –

+0

Да, через некоторое время я не получаю данные с сервера – ebaccount

4

В прикладном делегатом («AppDelegate»), отключить таймер простоя в методе +initialize:

myApp.idleTimerDisabled = YES; 

Обратите внимание, что это будет держать ваш iPhone от сна в то время как ваше приложение работает. Это может привести к проблемам с аккумулятором.

Другим вариантом может быть установка фонового потока, который открывает небольшую CFStream по времени.

+0

Спасибо за ваш ответ. Я думаю, myApp.idleTimerDisabled = YES; однако, это не будет приемлемым решением. Мне было интересно узнать о параметре UIRequiresPersistentWifi. Он должен работать. Нужно ли включать файл info.plist в мой проект? – ebaccount

+0

Я хотел добавить еще один момент, я отправляю периодические keepalives на сервер. Однако я использую socket() (не CFStream) – ebaccount

+0

Я думаю, вам может понадобиться флаг idleTimedDisabled, установленный в YES. UIRequiresPersistentWifi просто гарантирует, что Wi-Fi-радио включено, но это не мешает вашему iPhone спать. –

Смежные вопросы