1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

WKWebViewのUserAgentを変更する

Last updated at Posted at 2023-04-19

背景

Web側がスマートフォンからのアクセスで、Safari以外のブラウザの場合にデータのアップロードができない仕様となっていた。
サーバーサイドに対応を依頼するにしても時間がかかることが考えられるので、一旦アプリ側でUserAgentを偽装することに。

偽装するUserAgentの確認

PCのchromeで以下にアクセスすると、ユーザーエージェントが確認できる。
→chrome://version/

image.png

WKWebViewでUserAgentを設定する

3つくらい方法があるらしいので、用途によって使い分ける感じです

1. UserDefaultsのUserAgentを変更する方法

  • WebView生成前にUserDefaultsに対して、先程PCで確認したカスタムUserAgentを設定する(WKWebView生成前に設定が必要となる)
Hoge.swift
UserDefaults.standard.register(defaults: ["UserAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36"])

...Xcode15 x iOS17の組み合わせだと使えないらしい?→Xcode15でビルドするとUserDefaultsからのUserAgentの変更ができなくなる(iOS17のみ)

これはUIWebViewみたいですが一応…
UserAgent cannot be changed from UserDefaults only iOS 17 Device using Xcode 15

2. customUserAgentを使う方法

  • WebViewのcustomUserAgentに対してUserAgentを設定する(WKWebView生成後に設定)
Hoge.swift
webView.customUserAgent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36"

3. applicationNameForUserAgentを使う方法(未検証)

WebViewに設定されているUserAgentの確認方法

Hoge.swift
webView.evaluateJavaScript("navigator.userAgent;") { result, error in
    if let error = error {
        print(error)
        return
    }
    print("UserAgent: \(result ?? "nil")")
}

おまけ

デフォルトのUserAgentの末尾に情報を追加してみる(customUserAgent)

用途:"デフォルトのUserAgent" + "バンドルID" + "アプリバージョン"としたい場合など

デフォルトUserAgentの取得

Hoge.swift
webView.evaluateJavaScript("navigator.userAgent;") { [weak self] result, error in
    guard let self = self else { return }
    if let defaultUserAgent = result as? String {
    }
}

バンドルIDの取得

Hoge.swift
let appBundleId = Bundle.main.bundleIdentifier ?? ""

アプリバージョンの取得

Hoge.swift
let appVersion = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String ?? ""

"デフォルトのUserAgent" + "バンドルID" + "アプリバージョン"

Hoge.swift
webView.evaluateJavaScript("navigator.userAgent;") { [weak self] result, error in
    guard let self = self else { return }
    if let defaultUserAgent = result as? String {
        let appBundleId = Bundle.main.bundleIdentifier ?? ""
        let appVersion = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String ?? ""
        let userAgent = "\(defaultUserAgent) \(appVersion)"
        self.webView.customUserAgent = userAgent
    }
}

参考

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?