标签: cfreadstream

iOS Voip Socket不会在后台运行

我正在获得一个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);
Run Code Online (Sandbox Code Playgroud)

然后我的回调设置如下:

static void MyCFReadStreamCallback(CFReadStreamRef stream, CFStreamEventType type, void *pInfo);

static void MyCFReadStreamCallback (CFReadStreamRef stream, CFStreamEventType type, void *pInfo)
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; …
Run Code Online (Sandbox Code Playgroud)

voip objective-c background-process cfreadstream ios4

21
推荐指数
2
解决办法
3万
查看次数

CFReadStreamRead在iOS 7下永久阻止

我发现一个问题,其中CFReadStreamRead,作为流式文件上传的一部分,从来没有返回.

似乎只发生在iOS7上 - 而且在对物理设备进行调试时比在模拟器中更常见 - 或者至少在那里更明显.

我们POST通过直线阻塞(非事件驱动)CFNetwork调用来获取文件的HTTP(或HTTPS,问题以本地托管或远程服务器的方式发生).调用此处理程序的C代码是必需的; 没有回拨的规定.

这很好,网络调用发生在后台线程和/或异步调度.

有问题的网络代码归结为(为简洁起见,删除错误处理):

CFReadStreamRef upload = CFReadStreamCreateWithFile(
  kCFAllocatorDefault, upload_file_url);
CFRelease(upload_file_url);
CFReadStreamOpen(upload);

CFReadStreamRef myReadStream = CFReadStreamCreateForStreamedHTTPRequest(
  kCFAllocatorDefault, myRequest, upload);

CFReadStreamOpen(myReadStream);

CFIndex numBytesRead = CFReadStreamRead(myReadStream, buf, sizeof(buf));

// etc.
Run Code Online (Sandbox Code Playgroud)

就其本身而言,此代码希望立即在iOS7下挂起.如果我usleep在它之前添加一个带有一些调用的循环(CFReadStreamHasBytesAvailable沿途检查),它几乎总是会成功.每隔几百次尝试,它仍将失败,永不返回.同样,主线程不受影响.

我希望通用汽车能够清除这种行为,但它仍然存在.

添加runloop/callback方法以监视字节可用事件无效 - 当调用挂起时,也不会看到任何事件.

有关为什么会发生这种情况或如何防止这种情况的任何建议?其他人CFReadStream在iOS 7下看到不同的行为?

cfnetwork cfreadstream ios ios7

9
推荐指数
1
解决办法
1125
查看次数