从 Play 商店 xamarin 获取最新的应用程序版本

Getting latest app version from play store xamarin

如何从 Google Play 商店获取最新的 android 应用程序版本?早些时候使用下面的代码

using (var webClient = new System.Net.WebClient())
{
    var searchString = "itemprop=\"softwareVersion\">";
    var endString = "</";
    //possible network error if phone gets disconnected
    string jsonString = webClient.DownloadString(PlayStoreUrl);
    var pos = jsonString.IndexOf(searchString, StringComparison.InvariantCultureIgnoreCase) + searchString.Length;
    var endPos = jsonString.IndexOf(endString, pos, StringComparison.Ordinal);
    appStoreversion = Convert.ToDouble(jsonString.Substring(pos, endPos - pos).Trim());
    System.Diagnostics.Debug.WriteLine($"{currentVersion} :: {appStoreversion}");
    System.Diagnostics.Debug.WriteLine($"{appStoreversion > currentVersion}");
    if ((appStoreversion.ToString() != currentVersion.ToString() && (appStoreversion > currentVersion)))
    {
        IsUpdateRequired = true;
    }
}

& 下面的代码甚至抛出异常

  var document = 
    Jsoup.Connect("https://play.google.com/store/apps/details?id=" + "com.spp.in.spp" + "&hl=en")
    .Timeout(30000)
    .UserAgent("Mozilla/5.0 (Windows; U; WindowsNT 5.1; en-US; rv1.8.1.6) Gecko/20070725 Firefox/2.0.0.6")
    .Referrer("http://www.google.com")
    .Get();

欺骗:

Android.OS.NetworkOnMainThreadException: Exception of type 'Android.OS.NetworkOnMainThreadException' was thrown. at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw ()

但现在 Play 商店似乎改变了一些条件,所以现有的功能被打破了。此处几乎没有类似的主题,但这些主题似乎已经过时。

基于此 link, this exception is thrown when an application attempts to perform a networking operation on its main thread. You may refer with this wherein it stated that network operations on Android need to be performed off the main UI thread. The easiest way is use a Task 将其推送到默认线程池中的线程。

这将 return 一个基于字符串的版本,至少在 Google 再次更改 html 页面内容之前。

var version = await Task.Run(async () =>
{
    var uri = new Uri($"https://play.google.com/store/apps/details?id={PackageName}&hl=en");
    using (var client = new HttpClient())
    using (var request = new HttpRequestMessage(HttpMethod.Get, uri))
    {
      request.Headers.TryAddWithoutValidation("Accept", "text/html");
      request.Headers.TryAddWithoutValidation("User-Agent", "Mozilla/5.0 (Windows NT 6.2; WOW64; rv:19.0) Gecko/20100101 Firefox/19.0");
      request.Headers.TryAddWithoutValidation("Accept-Charset", "ISO-8859-1");
      using (var response = await client.SendAsync(request).ConfigureAwait(false))
      {
            try
            {
                response.EnsureSuccessStatusCode();
                var responseHTML = await response.Content.ReadAsStringAsync().ConfigureAwait(false);
                var rx = new Regex(@"(?<=""htlgb"">)(\d{1,3}\.\d{1,3}\.{0,1}\d{0,3})(?=<\/span>)", RegexOptions.Compiled);
                MatchCollection matches = rx.Matches(responseHTML);
                return matches.Count > 0 ? matches[0].Value : "Unknown";
            }
            catch
            {
                return "Error";
            }
          }
      }
   }
);
Console.WriteLine(version);