Я получаю сокет 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. Я запускаю устройство, а не симулятор. Это все еще не работает, поэтому я не знаю, что может быть с моей проблемой. Я, наверное, просто сделал что-то глупое, но почти ничего не было, чтобы проверить мой код.
EDIT: я не могу проверить ни один из ответов, потому что я больше не работаю над этим проектом и не имею доступа к mac/iOs sdk. Если кто-то с подобной проблемой нашел один из приведенных ниже ответов полезным, дайте мне знать, и я проголосую за его лучший ответ.