一、 問(wèn)題
最近在開(kāi)發(fā)macOS的過(guò)程中中,遇到一個(gè)關(guān)于外部網(wǎng)絡(luò)的問(wèn)題。macOS開(kāi)發(fā)無(wú)法連接外部網(wǎng)絡(luò)或者遇到此報(bào)錯(cuò)SocketException: Connection failed (OS Error: Operation not permitted, errno = 1)。
開(kāi)發(fā)的手機(jī)端工程運(yùn)行正常,并且可以正常的請(qǐng)求網(wǎng)絡(luò)。
二、 原因
由于macOS開(kāi)發(fā)需要開(kāi)啟沙盒機(jī)制,沙盒機(jī)制需要開(kāi)啟應(yīng)用明確請(qǐng)求網(wǎng)絡(luò)訪問(wèn)權(quán)限,您需要在應(yīng)用的entitlements文件中聲明這些權(quán)限。
1、App Sandbox(沙盒)是macOS中提供的一種訪問(wèn)控制技術(shù),在內(nèi)核級(jí)別實(shí)施。開(kāi)啟沙盒模式后,各應(yīng)用間的數(shù)據(jù)相互獨(dú)立,且不能互相訪問(wèn)。官網(wǎng)介紹為:
1.1、限制對(duì)macOS應(yīng)用程序中的系統(tǒng)資源和用戶數(shù)據(jù)的訪問(wèn),以防止應(yīng)用程序受到損害。
1.2、應(yīng)用沙箱通過(guò)限制應(yīng)用程序?qū)κ跈?quán)請(qǐng)求的資源的訪問(wèn),為系統(tǒng)資源和用戶數(shù)據(jù)提供保護(hù)。
1.3、要在Mac app Store上面發(fā)布macOS應(yīng)用,必須啟用應(yīng)用沙箱功能。
官網(wǎng)鏈接:https://developer.apple.com/documentation/security/app_sandbox

三、解決方法
需要修改Flutter工程下的Runner文件夾中的Release文件和DebugProfile文件中的權(quán)限。添加權(quán)限
com.apple.security.network.server:允許應(yīng)用接受入站網(wǎng)絡(luò)連接,充當(dāng)服務(wù)器。如果你的應(yīng)用需要監(jiān)聽(tīng)某個(gè)端口等待外部連接,就需要這個(gè)權(quán)限。
com.apple.security.network.client:允許應(yīng)用作為客戶端發(fā)起網(wǎng)絡(luò)請(qǐng)求。例如,應(yīng)用需要從互聯(lián)網(wǎng)上下載數(shù)據(jù),就需要這個(gè)權(quán)限。
四、原理
當(dāng)我們開(kāi)發(fā)的macOS應(yīng)用發(fā)布到Mac App Store的應(yīng)用程序必須啟用沙盒模式(Sandboxing)。開(kāi)啟沙盒模式主要通過(guò)為應(yīng)用程序的entitlements文件添加相應(yīng)的權(quán)限聲明來(lái)實(shí)現(xiàn)。
Entitlements文件
在一個(gè)Mac應(yīng)用程序包中,entitlements文件并不直接作為一個(gè)單獨(dú)的文件存放。相反,當(dāng)應(yīng)用程序被打包和簽名時(shí),它的entitlements配置被編碼進(jìn)了應(yīng)用的簽名信息中。不過(guò),開(kāi)發(fā)者在開(kāi)發(fā)階段會(huì)創(chuàng)建一個(gè)具體的entitlements文件,通常是一個(gè).entitlements擴(kuò)展名的XML格式文件,用于定義應(yīng)用程序在沙盒中所具有的權(quán)限。
4.1、開(kāi)啟沙盒方式
在Xcode開(kāi)發(fā)環(huán)境中,你可以通過(guò)以下步驟為應(yīng)用程序啟用沙盒:
打開(kāi)項(xiàng)目的Target設(shè)置。
選擇“Signing & Capabilities”選項(xiàng)卡。
點(diǎn)擊左下角的“+ Capability”按鈕,選擇“App Sandbox”來(lái)添加沙盒功能。
配置你的應(yīng)用程序需要的具體沙盒權(quán)限。
4.2、所有權(quán)限配置
com.apple.security.app-sandbox:這是開(kāi)啟沙盒模式的基本權(quán)限。僅添加這個(gè)權(quán)限,應(yīng)用就處于沙盒環(huán)境中,但默認(rèn)情況下,對(duì)系統(tǒng)資源的訪問(wèn)非常有限。
com.apple.security.network.client:允許應(yīng)用作為客戶端發(fā)起網(wǎng)絡(luò)請(qǐng)求。例如,應(yīng)用需要從互聯(lián)網(wǎng)上下載數(shù)據(jù),就需要這個(gè)權(quán)限。
com.apple.security.network.server:允許應(yīng)用接受入站網(wǎng)絡(luò)連接,充當(dāng)服務(wù)器。如果你的應(yīng)用需要監(jiān)聽(tīng)某個(gè)端口等待外部連接,就需要這個(gè)權(quán)限。
com.apple.security.files.user-selected.read-only:允許應(yīng)用讀取用戶通過(guò)文件對(duì)話框選擇的文件,但不能修改這些文件。
com.apple.security.files.user-selected.read-write:允許應(yīng)用讀取并修改用戶通過(guò)文件對(duì)話框選擇的文件。
com.apple.security.files.downloads.read-only:允許應(yīng)用訪問(wèn)用戶的下載文件夾中的文件,但只能進(jìn)行讀取操作。
com.apple.security.files.downloads.read-write:允許應(yīng)用訪問(wèn)并修改用戶的下載文件夾中的文件。
參考技術(shù)博客:https://zhuanlan.zhihu.com/p/691991684