3

私の現在のアプリケーションでは、毎時間 TCP 接続を介してサーバーにポーリングする必要があります。最良のオプションの 1 つは、サーバー側からプッシュ通知を使用することだと認識していますが、それはできません。そのため、現在、アプリをバックグラウンドで実行し続けるために、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");
    }
}

使用可能なスペースが呼び出されますが、サーバーからそれ以上のことはありません..

4

1 に答える 1