Получение последней версии приложения из магазина воспроизведения xamarin

Как я могу получить последнюю версию приложения для Android в магазине Google Play? Раньше для этого использовали приведенный ниже код

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();

Eception:

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

Но теперь магазин Play, похоже, изменил несколько условий, поэтому существующая функциональность нарушена. Здесь уже доступно несколько подобных тем, но они, похоже, устарели.

stackoverflow.com/a/49574025/5497874
Nikunj 09.07.2018 11:16

Вам нужно запустить его в фоновом потоке.

Nikunj 09.07.2018 12:33
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
1 243
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

На основе этого ссылка на сайт это исключение выдается, когда приложение пытается выполнить сетевую операцию в своем основном потоке. Вы можете сослаться на этот нить, в котором говорится, что сетевые операции на Android должны выполняться вне основного потока пользовательского интерфейса. Самый простой способ - использовать Task, чтобы протолкнуть его в поток в пуле потоков по умолчанию.

Ответ принят как подходящий

Это вернет строковую версию, по крайней мере, до тех пор, пока 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);

@ CGPA6.4 См. Мое обновление регулярного выражения, теперь оно должно соответствовать многосимвольным форматам xxx.xxx и xxx.xxx.xxx.

SushiHangover 01.02.2019 14:42

@ CGPA6.4 Рад, что помог

SushiHangover 01.02.2019 15:08

Другие вопросы по теме