Опрос на TCP-сервер каждый час IOS
В моем текущем приложении я должен опрашивать сервер по TCP-соединению каждый час. Я знаю, что одним из лучших вариантов является использование Push-уведомлений со стороны сервера, но я не могу этого сделать. Поэтому в настоящее время я использую таймер, который срабатывает каждые 9 минут, чтобы приложение работало в фоновом режиме. Это работает нормально.. В час я звоню опрос на сервер.
Соединение Tcp открыто, и данные опроса генерируются, однако ответа от сервера нет. Это потому, что в фоновом режиме приложение не может запускать блоки кода, которые требуют нескольких секунд времени? Любая помощь будет принята с благодарностью, я также оставлю код ниже,
if ([[UIDevice currentDevice] respondsToSelector:@selector(isMultitaskingSupported)])
{
//Check if our iOS version supports multitasking I.E iOS 4
if ([[UIDevice currentDevice] isMultitaskingSupported])
{
//Check if device supports mulitasking
UIApplication *application = [UIApplication sharedApplication];
__block UIBackgroundTaskIdentifier background_task;
background_task = [application beginBackgroundTaskWithExpirationHandler: ^ {
UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"MainStoryboard"
bundle: nil];
ViewController *controller = (ViewController*)[mainStoryboard
instantiateViewControllerWithIdentifier: @"viewController"];
[controller sendPoll];
});
}
}
Затем код для записи выходных данных:
NSData *data = [[NSData alloc] initWithData:[string dataUsingEncoding:NSASCIIStringEncoding]];
[_cacheArray addObject:string];
[_outputStream write:[data bytes] maxLength:[data length]];
И, наконец, streamDidReturn:
-(void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode
{
NSLog(@"event number %i ", eventCode);
switch (eventCode)
{
case NSStreamEventOpenCompleted:
NSLog(@"Stream opened");
break;
case NSStreamEventHasBytesAvailable:
if (aStream == _inputStream)
{
uint8_t buffer[1024];
int len;
while ([_inputStream hasBytesAvailable])
{
len = [_inputStream read:buffer maxLength:sizeof(buffer)];
if (len > 0)
{
NSString *output = [[NSString alloc] initWithBytes:buffer length:len encoding:NSASCIIStringEncoding];
if (nil != output)
NSLog(@"server said: %@", output);
}
}
}
break;
case NSStreamEventErrorOccurred:
break;
case NSStreamEventEndEncountered:
break;
case NSStreamEventHasSpaceAvailable:
NSLog(@"space available");
break;
default:
NSLog(@"Unknown event");
}
}
Доступное пространство вызывается, но больше ничего с сервера.
1 ответ
Кажется, я нашел ответ!
Смещая мои функции, которые связываются с Сервером, приложение остается в активном состоянии достаточно долго, чтобы отправлять и получать опросы. Казалось, единственная проблема - доступ к другому ViewController из appDelegate и ожидание, что он будет работать, как будто в состоянии переднего плана.
Спасибо за повторное редактирование вопроса, Defiantly немного очистил вопрос, так что спасибо,