Playストアからモバイルアプリの最新バージョンを自動チェックする方法
このソリューションが適用されているプロジェクト:Senzagroモバイルアプリ
課題
ユーザーがモバイルアプリを開いた際、アプリはPlayストア上の最新バージョンを取得し、現在のアプリのバージョンと比較したうえで、現在のバージョンが最新版より古い場合にはユーザーへ更新を促す通知を行う必要がある。
当初のアプローチは、react-native-version-checkライブラリを使用するというものであった。しかし、実装から数週間後、この機能は動作しなくなった。react-native-version-checkライブラリは、Google Playストア上のSenzAgroアプリの静的HTMLページを取得し、そこからバージョンを抽出する仕組みであったため問題が生じた。というのも、最近Google Playストアのウェブページが更新され、バージョンを表示するには以下のようにボタンをクリックする必要が生じたためである。
以下の静的ページでは、アプリのバージョンは表示されていない。

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

解決策
この課題を解決するため、代替アプローチとして、Webドライバーを用いてヘッドレスのGoogle Chromeブラウザ上で該当URLを読み込み、矢印のCSSセレクタを使って矢印をクリックする方法を採用した。このアプローチは、APIを用いてSenzAgroのバックエンドに実装された。
技術的な実装
- プログラミング言語:Java
- 使用フレームワーク:Selenium(オープンソースの自動テストフレームワーク)
- バックエンド技術:Spring Boot
手順
以下は、更新されたappVersionタグを取得するという目標を達成するために従うべき主な手順である。
1. 以下のMaven依存関係を追加する
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>3.141.59</version>
</dependancy>
2. 使用中のブラウザバージョンに対応するGoogle Chromeドライバーを、以下のウェブサイトからダウンロードする
3. ダウンロードしたWebドライバーの保存場所を指定する
4. Chromeドライバーの初期化を行う
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. 矢印ボタンを取得する
"#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. ボタンをクリックする
8. 動的コンポーネントが読み込まれるまで待機する
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タグを取得する
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を既存のバージョンと比較し、現在のアプリが最新版かどうかを判定できるようになる。最新版でない場合は、ユーザーにアプリの更新を促すポップアップを表示することができる。