Flutter-macOS開(kāi)發(fā) 無(wú)法連接網(wǎng)絡(luò)

一、 問(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

官網(wǎng)沙盒機(jī)制介紹


三、解決方法

需要修改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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容