記錄開發 ios App 使用 c++ 混編時遇到的問題:
開發環境
macOS Sonoma(最新版本14.3.1)
Xcode Version 15.2
ipadOS(最新版本17.3.1)
問題:在mac 上 和 ipad上測試,當 udp 發送廣播,地址為 255.255.255.255 時 send失敗,wireshark 抓包沒有發送出去,改成單播地址就可以發成功。沒更新ipad前 ios 15 上是可以發廣播的,懷疑是升級到17后 安全性提高了?在網上搜說需要 申請組播廣播權限,c++偽代碼:
int port=0;WHUDP *wh =new WHUDP();wh->ServerInit("0.0.0.0", port);whls.push_back(wh);//發送for(int i=0;i<whls.size();i++){whls[i]->sendcmd("255.255.255.255", serverport,cmd);}void WHUDP::ServerInit(const char *loaclip,int localport) //用于廣播
{CreateSocket();uport = localport;//設置非阻塞setnonblocking( usock ,1);if (setbroadcast( usock ,1)<0) //if (::setsockopt( usock , SOL_SOCKET, SO_BROADCAST, (char FAR*)&opt, sizeof(opt)) <0){debug_printf("setsockopt SO_BROADCAST failed ! [%ld]\n", GetLastErrorCode());ShutAndClose( usock );return ;}if (setreuseaddr( usock ,1)<0) //if (::setsockopt( usock , SOL_SOCKET, SO_REUSEADDR, (char FAR*)&opt1, sizeof(opt1)) <0){debug_printf("setsockopt SO_REUSEADDR failed ! [%ld]\n", GetLastErrorCode());ShutAndClose( usock );return ;}if (false == BindAddrPort( loaclip , uport)){//cout << "bind error :" << GetLastError() <<endl;ShutAndClose( usock );}
}void WHUDP::sendcmd(const char *ip, unsigned short remoteport,char * cmd)
{char szMsg[1024]={0};strcpy(szMsg, cmd);//int nRet = ::sendto( usock , szMsg, 50, 0, (sockaddr*)&m_toAddr, sizeof(m_toAddr));int nRet =Send(szMsg,50,"255.255.255.255",remoteport);if (nRet <=0){debug_printf("sendcmd sendto() failed ! [%ld]\n", GetLastErrorCode());}debug_printf("ok...\n");
}
解決:根據下面網站填寫申請
https://developer.apple.com/contact/request/networking-multicast
等待郵件回復,通過后登錄蘋果開發者中心 查看證書修改,之前我沒有申請過 證書就沒有 Additional Capabilities 沒有這一項,xcode 也沒有 Multicast Networking ,現在有了 需要證書 和 xcode配置一下,廣播地址255.255.255.255就可以發送成功了
證書勾選保存
?xcode