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 文章。这篇文章是不完整的,因为它没有创建依赖服务。所以这很有趣
- 在Shared Project中创建一个
IProxyInfoProvider
界面,如图:
public interface IProxyInfoProvider
{
WebProxy GetProxySettings();
}
- 创建平台实现:
(不要忘记在命名空间上方添加 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
- 我们想要使用现在从依赖服务返回的 WebProxy。更新您的 HttpClient 处理程序,使其看起来像这样:
var _handler = new HttpClientHandler();
_handler.Proxy = DependencyService.Get<IProxyInfoProvider>().GetProxySettings();
确保您的 HttpClient
在其构造函数中使用此处理程序,例如:new HttpClient(_handler.Value)
第 3 步:将您的应用上传到 BrowserStack
- 繁荣。然后 Android 与 BrowserStack 本地测试一起工作!你问为什么它对 iOS 不起作用?好问题。我仍在努力弄清楚那部分...
- 同样奇怪的是,如果您使用代理在您的本地环境中调试您的应用程序,此解决方案有效!但是当您将您的应用程序放入 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 文章。这篇文章是不完整的,因为它没有创建依赖服务。所以这很有趣
- 在Shared Project中创建一个
IProxyInfoProvider
界面,如图:
public interface IProxyInfoProvider
{
WebProxy GetProxySettings();
}
- 创建平台实现: (不要忘记在命名空间上方添加 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
- 我们想要使用现在从依赖服务返回的 WebProxy。更新您的 HttpClient 处理程序,使其看起来像这样:
var _handler = new HttpClientHandler();
_handler.Proxy = DependencyService.Get<IProxyInfoProvider>().GetProxySettings();
确保您的 HttpClient
在其构造函数中使用此处理程序,例如:new HttpClient(_handler.Value)
第 3 步:将您的应用上传到 BrowserStack
- 繁荣。然后 Android 与 BrowserStack 本地测试一起工作!你问为什么它对 iOS 不起作用?好问题。我仍在努力弄清楚那部分...
- 同样奇怪的是,如果您使用代理在您的本地环境中调试您的应用程序,此解决方案有效!但是当您将您的应用程序放入 BrowserStack 时它会停止工作。