Playストアからモバイルアプリの最新バージョンを自動チェックする方法

このソリューションが適用されているプロジェクト:Senzagroモバイルアプリ

課題

ユーザーがモバイルアプリを開いた際、アプリはPlayストア上の最新バージョンを取得し、現在のアプリのバージョンと比較したうえで、現在のバージョンが最新版より古い場合にはユーザーへ更新を促す通知を行う必要がある。

当初のアプローチは、react-native-version-checkライブラリを使用するというものであった。しかし、実装から数週間後、この機能は動作しなくなった。react-native-version-checkライブラリは、Google Playストア上のSenzAgroアプリの静的HTMLページを取得し、そこからバージョンを抽出する仕組みであったため問題が生じた。というのも、最近Google Playストアのウェブページが更新され、バージョンを表示するには以下のようにボタンをクリックする必要が生じたためである。

以下の静的ページでは、アプリのバージョンは表示されていない。

7th blog

矢印をクリックすると、同一URL上に以下のコンポーネントが読み込まれる。そのため、指定されたURLから静的ページを取得するだけでは、バージョンを取得することができない。

7th blog 2

解決策

この課題を解決するため、代替アプローチとして、Webドライバーを用いてヘッドレスのGoogle Chromeブラウザ上で該当URLを読み込み、矢印のCSSセレクタを使って矢印をクリックする方法を採用した。このアプローチは、APIを用いてSenzAgroのバックエンドに実装された。

技術的な実装

  • プログラミング言語:Java
  • 使用フレームワーク:Selenium(オープンソースの自動テストフレームワーク)
  • バックエンド技術:Spring Boot

手順

以下は、更新されたappVersionタグを取得するという目標を達成するために従うべき主な手順である。

1. 以下のMaven依存関係を追加する

<dependancy>
   <groupId>org.seleniumhq.selenium</groupId>
   <artifactId>selenium-java</artifactId>
   <version>3.141.59</version>
</dependancy>

2. 使用中のブラウザバージョンに対応するGoogle Chromeドライバーを、以下のウェブサイトからダウンロードする

3. ダウンロードしたWebドライバーの保存場所を指定する

System.setProperty("webdriver.chrome.driver", "/usr/bin/chromedriver");
4. Chromeドライバーの初期化を行う

ChromeOptions options = new ChromeOptions();
options.addArguments("--headless", "--disable-gpu", "--window-size=1920,1200", " --ignore-certificate-errors");
driver = new ChromeDriver(options);
driver.manage().window().maximize();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
5. ヘッドレスブラウザを開き、対象URLに移動する

6. 矢印ボタンを取得する

WebElement button= driver.findElement(By.cssSelector(
   "#yDmH0d > c-wiz.SSPGKf.Czez9d > div > div >
   div.tU8Y5c > div.wkMJlb.YWi3ub > div > div.qZmL0 >
   c-wiz:nth-child(2) > div > section > header > div >
   div:nth-child(2) > button"));
7. ボタンをクリックする

button.click();
8. 動的コンポーネントが読み込まれるまで待機する

WebDriverWait wait = new WebDriverWait(driver,30);
   wait.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("#yDmH0d >
   div.VfPpkd-Sx9Kwc.cC1eCc.UDxLd.PzCPDd.HQdjr.VfPpkd-S x9Kwc-OWXEXe-FNFY6c > div.VfPpkd-wzTsW > div > div >
   div > div > div.fysCi > div.G1zzid > div:nth-child(1) >
   div.reAt0")));
9. バージョンを含むdivタグを取得する

WebElement version= driver.findElement(By.cssSelector("#yDmH0d >
div.VfPpkd-Sx9Kwc.cC1eCc.UDxLd.PzCPDd.HQdjr.VfPpkd-Sx9Kwc-OWXEXe-FNF
Y6c > div.VfPpkd-wzTsW > div > div > div > div > div.fysCi > div.G1zzid >
div:nth-child(1) > div.reAt0"));
String appVersion= version.getText();

これで、取得したappVersionを既存のバージョンと比較し、現在のアプリが最新版かどうかを判定できるようになる。最新版でない場合は、ユーザーにアプリの更新を促すポップアップを表示することができる。