Я получаю 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. Я работаю на устройстве, а не на симуляторе. Это все еще не работает, поэтому я не знаю, в чем может быть моя проблема. Я, наверное, просто сделал что-то глупое, но в интернете почти нечего проверять.
РЕДАКТИРОВАТЬ: Я не могу проверить ни один из ответов, потому что я больше не работаю над этим проектом и не имею доступа к SDK для Mac / iOs. Если кто-то с подобной проблемой нашел один из приведенных ниже ответов полезным, дайте мне знать, и я проголосую за него наилучшим ответом.