我正在获取一个 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];
}
当我收到数据并且应用程序打开时,会调用“发生回调”,但如果应用程序被最小化,则不会。但是,当应用程序重新启动时,它会在最小化时处理它收到的任何数据。
我将 voip 标签添加到 info.plist。我的 CFReadStreamSetProperty 返回 true。我在设备而不是模拟器上运行。它仍然不起作用,所以我不知道我的问题可能是什么。我可能只是做了一些愚蠢的事情,但是网上几乎没有任何东西可以检查我的代码。
编辑:我无法测试任何答案,因为我不再从事这个项目并且无法访问 mac/iOs sdk。如果有类似问题的人发现以下答案之一有用,请告诉我,我将投票选出最佳答案。