У меня есть простой TCP-клиент, который подключается к простому TCP-серверу, отправляющему слово «ping» каждые 5 секунд. Я прочитал эти «pings», используя команду, считанную из стандартной библиотеки сокетов C.iphoneOS backgrounding socket
int numberOfBytes = read(m_clientSocketFileDescriptor,buffer,255);
if (numberOfBytes < 0) {
error("reading from socket");
}
Я установил использование WIFI, фонового звука и значений фонового звука в файле приложения plist. я объявляю мое гнездо, чтобы быть следующим справочная:
- (void)applicationWillEnterForeground:(UIApplication *)application
{
if (m_clientSocketFileDescriptor) {
CFStreamCreatePairWithSocket(kCFAllocatorDefault, m_clientSocketFileDescriptor, &m_tcpReadStream, nil);
if (m_tcpReadStream != NULL) {
CFReadStreamSetProperty(m_tcpReadStream, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeVoIP);
}
}
}
Это отлично работает, когда я нажимаю кнопку домой. Мои пины получены с сервера, и когда я пробуждаю свое приложение, все сообщения были получены. Моя проблема в том, что я использую кнопку питания для блокировки экрана iPhone. Сокет фактически закрыт. Мой сервер получает ошибку SIGPIPE, и когда я разбужу телефон, функция read() говорит: «Socket не подключается».
Я думаю, что это довольно глупо иметь фоновый сокет, если это происходит, когда пользователь блокирует экран (по умолчанию это происходит между 1 или 5 минутами), поэтому, возможно, я делаю что-то неправильно ,
Неужели кому-то удалось преодолеть эту проблему? Протестировано на iOS 5.0 с iphone 3GS & iphone 4.
Вы попробовали 'setKeepAliveTimeout: обработчик:' как это было предложено @DarkDust? Возможно, есть какая-то подготовка для 'applicationWillResignActive:'? – Thompsonian