CSRのHTMLをAndroidとiOSで取得する方法
SSR(サーバサイドレンダリング)の場合はサーバで HTML が構築されるので、ktor-client (opens in a new tab)というマルチプラットフォーム対応のライブラリを使って、HTML を取得することができます。
CSR(クライアントサイドレンダリング)の場合は javascript で HTML が構築されるため、ktor-client では javascript が構築する部分の HTML を取得することができません。
そのため、各言語毎の CSR 対応ライブラリを使って、HTML を取得する必要があります。
今回は、Android と iOS で CSR の HTML を取得する方法を紹介します。
Android
Android ではhtmlunit-android (opens in a new tab)という「GUI レスブラウザ」ライブラリを使い CSR の HTML を取得します。
実装例
androidApp/build.gradle.kts
dependencies {
...
implementation("net.sourceforge.htmlunit:htmlunit-android:2.67.0")
}
Sample.kt
suspend fun getCsrHtml(
urlString: String,
userAgent: String,
): String? {
val webClient = WebClient(BrowserVersion.CHROME)
return try {
// Scriptでエラーが起きてもExceptionを投げないようにする
webClient.options.isThrowExceptionOnScriptError = false
webClient.options.isThrowExceptionOnFailingStatusCode = false
// javaScriptTimeoutを設定しないと、いつまでたってもページが取得できない可能性がある
webClient.javaScriptTimeout = 3000
// 必要に応じてユーザーエージェントをセットする
webClient.addRequestHeader("User-Agent", userAgent)
// 通信はバックグラウンドスレッドで行う
val page: HtmlPage = withContext(Dispatchers.Default) {
webClient.getPage(urlString)
}
return page.asXml()
} catch (e: IOException) {
Log.d(TAG, "Failed to get CSR HTML")
null
}
}
iOS
iOS の場合は、標準ライブラリのURLSession (opens in a new tab)クラスを使えば、CSR の HTML を取得できます。
実装例
func getCsrHtml(urlString: String, userAgent: String) async -> String? {
guard let url = URL(string: urlString) else { return nil }
var request = URLRequest(url: url)
// 必要に応じてユーザーエージェントをセットする
request.setValue(userAgent, forHTTPHeaderField: "User-Agent")
do {
let (data, _) = try await URLSession.shared.data(for: request, delegate: nil)
return String(data: data, encoding: .utf8)
} catch {
print("Failed to get CSR HTML: \(error)")
return nil
}
}