另外一個好同事, 幫我把 mac 版的測試過.
當要移轉到 iOS 時, 發生下列幾個大問題了
1. NSHost 不存在 iOS , 所以 getLocalAddresses 需要找外援
2. CocaAsynSocket 移轉到 iOS , 按下 Build 出現一堆reference 不存在
Undefined symbols for architecture i386:
"_SSLClose", referenced from:
-[GCDAsyncSocket closeWithError:] in GCDAsyncSocket.o
"_SSLCopyPeerTrust", referenced from:
-[GCDAsyncSocket ssl_continueSSLHandshake] in GCDAsyncSocket.o
"_SSLCreateContext", referenced from:
-[GCDAsyncSocket ssl_startTLS] in GCDAsyncSocket.o
"_SSLGetBufferedReadSize", referenced from:
___33-[GCDAsyncSocket flushSSLBuffers]_block_invoke in GCDAsyncSocket.o
-[GCDAsyncSocket doReadData] in GCDAsyncSocket.o
"_SSLHandshake", referenced from:
-[GCDAsyncSocket ssl_continueSSLHandshake] in GCDAsyncSocket.o
"_SSLRead", referenced from:
-[GCDAsyncSocket flushSSLBuffers] in GCDAsyncSocket.o
-[GCDAsyncSocket doReadData] in GCDAsyncSocket.o
"_SSLSetCertificate", referenced from:
-[GCDAsyncSocket ssl_startTLS] in GCDAsyncSocket.o
"_SSLSetConnection", referenced from:
-[GCDAsyncSocket ssl_startTLS] in GCDAsyncSocket.o
"_SSLSetEnabledCiphers", referenced from:
-[GCDAsyncSocket ssl_startTLS] in GCDAsyncSocket.o
"_SSLSetIOFuncs", referenced from:
-[GCDAsyncSocket ssl_startTLS] in GCDAsyncSocket.o
"_SSLSetPeerDomainName", referenced from:
-[GCDAsyncSocket ssl_startTLS] in GCDAsyncSocket.o
"_SSLSetPeerID", referenced from:
-[GCDAsyncSocket ssl_startTLS] in GCDAsyncSocket.o
"_SSLSetProtocolVersionMax", referenced from:
-[GCDAsyncSocket ssl_startTLS] in GCDAsyncSocket.o
"_SSLSetProtocolVersionMin", referenced from:
-[GCDAsyncSocket ssl_startTLS] in GCDAsyncSocket.o
"_SSLSetSessionOption", referenced from:
-[GCDAsyncSocket ssl_startTLS] in GCDAsyncSocket.o
"_SSLWrite", referenced from:
-[GCDAsyncSocket doWriteData] in GCDAsyncSocket.o
"_kCFStreamNetworkServiceType", referenced from:
-[GCDAsyncSocket enableBackgroundingOnSocketWithCaveat:] in GCDAsyncSocket.o
"_kCFStreamNetworkServiceTypeVoIP", referenced from:
-[GCDAsyncSocket enableBackgroundingOnSocketWithCaveat:] in GCDAsyncSocket.o
"_kCFStreamPropertySSLSettings", referenced from:
-[GCDAsyncSocket cf_startTLS] in GCDAsyncSocket.o
"_kCFStreamSSLAllowsAnyRoot", referenced from:
-[GCDAsyncSocket ssl_startTLS] in GCDAsyncSocket.o
"_kCFStreamSSLAllowsExpiredCertificates", referenced from:
-[GCDAsyncSocket ssl_startTLS] in GCDAsyncSocket.o
"_kCFStreamSSLAllowsExpiredRoots", referenced from:
-[GCDAsyncSocket ssl_startTLS] in GCDAsyncSocket.o
"_kCFStreamSSLCertificates", referenced from:
-[GCDAsyncSocket ssl_startTLS] in GCDAsyncSocket.o
"_kCFStreamSSLIsServer", referenced from:
-[GCDAsyncSocket ssl_startTLS] in GCDAsyncSocket.o
"_kCFStreamSSLLevel", referenced from:
-[GCDAsyncSocket ssl_startTLS] in GCDAsyncSocket.o
"_kCFStreamSSLPeerName", referenced from:
-[GCDAsyncSocket ssl_startTLS] in GCDAsyncSocket.o
"_kCFStreamSSLValidatesCertificateChain", referenced from:
-[GCDAsyncSocket ssl_startTLS] in GCDAsyncSocket.o
ld: symbol(s) not found for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)
解法
1. iPhone/iPad/OSX: How to get my IP address programmatically?
2.新增 Library for Security and CFNetwork
- CFNetwork.framework
- Security.framework