簡體   English   中英

Xamarin.iOS 應用程序在 iOS 14.0 中詢問本地網絡權限

[英]Xamarin.iOS app asking Local Network permission in iOS 14.0

我在生產中使用 Xamarin.iOS 應用程序,它要求在 iOS 14 設備上啟動時獲得本地網絡許可。 應用程序未使用任何 Bonjour 服務,也未使用任何特定於本地網絡的內容。 應用程序有各種 nuget 包,包括 Xamarin.Essentials、MvvmCross、Firebase 服務、Realm DB 等。

我瀏覽了 developer.apple.com 上的各種開放線程,包括WWDC2020 視頻,但仍然沒有得到觸發此權限對話框的原因。

經過多次嘗試和錯誤,我們終於能夠識別本地網絡權限觸發點。

  • 由於我們使用 SSHConnection 檢查方法來識別越獄的 iPhone 設備,因此觸發此提示。
  • 此方法檢查 SSH 客戶端是否嘗試在端口 22 上連接到 127.0.0.1(localhost) 如果連接成功,則設備已越獄。
  • 此代碼導致權限提示CrossConnectivity.Current.IsRemoteReachable("127.0.0.1", 22, 5000);

所以我的應用程序使用套接字通信,並且應用程序第一次創建連接時,用戶會收到此權限提示。 不幸的是,這導致我第一次嘗試套接字通信失敗。 為了解決這個問題,我在應用程序生命周期的最開始添加了以下代碼。 (我有一個配置頁面,它總是在應用程序第一次啟動時顯示,所以我在那里添加了它。)此代碼然后強制權限提示。 我注意到的一件事是,如果我在強制提示時沒有使用相同的 ipaddress/端口,因為我稍后將使用它來建立我的套接字連接,我第二次被提示輸入權限。 (我使用的是 IP 地址 192.0.0.1 和端口 20。)這很令人沮喪。 我似乎也找不到檢查此權限的方法

無論如何,這里有一些簡單的代碼可以在您的應用程序中更早地強制提示,以防止您實際嘗試連接時出現通信問題。

    public async static void ForcePermissions(string ps_IPAddress, int pi_Port)
    {
        try
        {

            IPAddress ipAddress = IPAddress.Parse(ps_IPAddress);
            //This is only done to force the local network permissions access in iOS 14. 
            IPEndPoint remoteEndPoint = new IPEndPoint(ipAddress, pi_Port);

            // Create a TCP/IP socket.  
            var client = new Socket(ipAddress.AddressFamily,
                                SocketType.Stream, ProtocolType.Tcp);

            var lb_ReturnValue = await client.ConnectAsync(remoteEndPoint).ConfigureAwait(false);

        }
        catch (Exception ex)
        {
            App.ProcessException(ex);
        }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM