Я получаю сокет VOIP для работы в фоновом режиме в приложении iOS.
Мое соединение работает нормально, но оно не просыпается, когда мое приложение переходит в фоновый режим. Однако, если я снова открою приложение, оно будет отвечать на любые сообщения, полученные во время сна.
Я настроил свой поток следующим образом:
CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault,
(CFStringRef) @"test.iusealocaltestserver.com",
5060,
&myReadStream,
&myWriteStream);
CFReadStreamSetProperty ( myReadStream,
kCFStreamNetworkServiceType,
kCFStreamNetworkServiceTypeVoIP
);
CFSocketNativeHandle native;
CFDataRef nativeProp = CFReadStreamCopyProperty(myReadStream, kCFStreamPropertySocketNativeHandle);
CFDataGetBytes(nativeProp, CFRangeMake(0, CFDataGetLength(nativeProp)), (UInt8 *)&native);
CFRelease(nativeProp);
CFSocketRef theSocket = CFSocketCreateWithNative(kCFAllocatorDefault, native, 0, NULL, NULL);
CFSocketGetContext(theSocket,&theContext);
CFOptionFlags readStreamEvents = kCFStreamEventHasBytesAvailable |
kCFStreamEventErrorOccurred |
kCFStreamEventEndEncountered |
kCFStreamEventOpenCompleted;
CFReadStreamSetClient(myReadStream,
readStreamEvents,
(CFReadStreamClientCallBack)&MyCFReadStreamCallback,
(CFStreamClientContext *)(&theContext));
CFReadStreamScheduleWithRunLoop(myReadStream, CFRunLoopGetCurrent(),
kCFRunLoopCommonModes);
Затем мой обратный вызов настроен следующим образом:
static void MyCFReadStreamCallback(CFReadStreamRef stream, CFStreamEventType type, void *pInfo);
static void MyCFReadStreamCallback (CFReadStreamRef stream, CFStreamEventType type, void *pInfo)
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSLog(@"Callback Happened");
[pool release];
}
«Callback Happened» вызывается, когда я получаю данные и приложение открыто, но этого не происходит, если приложение свернуто. Однако, когда приложение возвращается, оно обрабатывает все данные, которые оно получило в свернутом виде.
Я добавил тег voip в info.plist. Мой CFReadStreamSetProperty возвращает значение true. Я работаю на устройстве, а не на симуляторе. Это все еще не работает, поэтому я не знаю, в чем может быть моя проблема. Я, наверное, только что сделал что-то глупое, но в сети почти нет ничего, с чем можно было бы проверить мой код.
РЕДАКТИРОВАТЬ: я не могу проверить ни один из ответов, потому что я больше не работаю над этим проектом и не имею доступа к mac/iOs sdk. Если кто-то с похожей проблемой нашел один из приведенных ниже ответов полезным, дайте мне знать, и я проголосую за лучший ответ.