Опрос на 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 немного очистил вопрос, так что спасибо,

Другие вопросы по тегам