为 CFStream 获取本机套接字的调用总是在 iOS 上失败

Call to get native socket for CFStream always fails on iOS

我使用以下代码在 iOS 应用程序中获取本机套接字句柄。

CFReadStreamRef readStream = NULL;
CFWriteStreamRef writeStream = NULL;

CFStreamCreatePairWithSocketToHost(NULL, (__bridge CFStringRef)@"example.com", 443, &readStream, &writeStream);

Boolean readOpen = CFReadStreamOpen(readStream);
Boolean writeOpen = CFWriteStreamOpen(writeStream);

CFDataRef socketData = CFWriteStreamCopyProperty(writeStream, kCFStreamPropertySocketNativeHandle);
if (socketData == NULL) {
    NSLog(@"Failed to get native socket!"); // Always fails
}

然而,函数 CFWriteStreamCopyProperty 的结果总是 NULL。打开套接字的两个调用都成功(readOpenwriteOpen 为真)。我找不到任何关于为什么这可能会失败的文档。可能是什么原因导致这段代码没有按预期工作?

流可能在后台打开,在这种情况下 CFWriteStreamOpen 将始终 return 为真,流的状态将为 kCFStreamStatusOpening。只有成功打开流后,才能获取本机套接字。您可以使用 CFWriteStreamScheduleWithRunLoop 来监听打开完成事件。