Xamarin 应用程序可以在 BrowserStack 上使用 App Live 本地测试吗

Can Xamarin apps use App Live Local Testing on BrowserStack

我用 Xamarin.Forms 开发了一个跨平台移动应用程序。我有我的应用程序命中的本地服务。我的 Xamarin 应用程序定义了 HTTPClient,如下所示。在 BrowserStack 的 App Live 产品上进行测试时,我无法使用 BrowserStack Local 应用程序从我的应用程序访问我的本地服务(我收到“No Such Host Is Known”响应)。我可以使用设备的默认浏览器访问我的服务。

Xamarin 应用程序中的 HTTPClient 设置:

public static readonly HttpClient client = new HttpClient()

我的本地服务有内部域名(不是简单的'localhost:443',而是像'customservice.com'这样的域名)

Xamarin App 是否可以在使用 Local Testing 的同时使用 BrowserStack App Live 产品?如果可以,怎么做?

由于您可以通过他们的设备浏览器访问您的内部域,您的应用程序似乎无法通过 BrowserStack 的 Local Testing 基础设施路由流量。

如果是这种情况,您可以联系 BrowserStack 支持团队寻求进一步帮助。

我找到了适用于 Android 的解决方案, 应该 适用于 iOS(但没有)。也许通过一些修补它也适用于 iOS,但我想我会分享我的发现:

第 1 步:创建依赖服务

此步骤大致基于 this 文章。这篇文章是不完整的,因为它没有创建依赖服务。所以这很有趣

  1. 在Shared Project中创建一个IProxyInfoProvider界面,如图:
public interface IProxyInfoProvider
{
   WebProxy GetProxySettings();
}
  1. 创建平台实现: (不要忘记在命名空间上方添加 assembly 标记以导出依赖服务!)

iOS

public class ProxyInfoProvider : IProxyInfoProvider
{
    public WebProxy GetProxySettings()
    {
        var systemProxySettings = CFNetwork.GetSystemProxySettings();

        var proxyPort = systemProxySettings.HTTPPort;
        var proxyHost = systemProxySettings.HTTPProxy;
        Console.WriteLine("Proxy Port: " + proxyPort.ToString());
        Console.WriteLine("Proxy Host: " + Convert.ToInt64(proxyHost));

        return !string.IsNullOrEmpty(proxyHost) && proxyPort != 0
            ? new WebProxy(proxyHost, proxyPort)
            : null;
    }
}

Android

public class ProxyInfoProvider : IProxyInfoProvider
{
    public WebProxy GetProxySettings()
    {
        var proxyHost = JavaSystem.GetProperty("http.proxyHost");
        var proxyPort = JavaSystem.GetProperty("http.proxyPort");

        Console.WriteLine("Proxy Host: " + proxyHost);
        Console.WriteLine("Proxy Port: " + proxyPort);

        return !string.IsNullOrEmpty(proxyHost) && !string.IsNullOrEmpty(proxyPort)
            ? new WebProxy($"{proxyHost}:{proxyPort}")
            : null;
    }
}

第 2 步:更新您的 HttpClientHandler

  1. 我们想要使用现在从依赖服务返回的 WebProxy。更新您的 HttpClient 处理程序,使其看起来像这样:
var _handler = new HttpClientHandler();
_handler.Proxy = DependencyService.Get<IProxyInfoProvider>().GetProxySettings();

确保您的 HttpClient 在其构造函数中使用此处理程序,例如:new HttpClient(_handler.Value)

第 3 步:将您的应用上传到 BrowserStack

  1. 繁荣。然后 Android 与 BrowserStack 本地测试一起工作!你问为什么它对 iOS 不起作用?好问题。我仍在努力弄清楚那部分...
  2. 同样奇怪的是,如果您使用代理在您的本地环境中调试您的应用程序,此解决方案有效!但是当您将您的应用程序放入 BrowserStack 时它会停止工作。