気になったので、オープンソースな iOS の Web ブラウザアプリで、 WKWebview
のカスタムユーザーエージェント(customUserAgent
) を設定している部分を見てみる。
Chrome
ユーザーエージェントの例
Mozilla/5.0 (iPhone; CPU iPhone OS 13_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) CriOS/84.0.4147.71 Mobile/15E148 Safari/604.1
- リポジトリ(これが Chrome アプリそのもののコードなのかは自信がない)
- https://chromium.googlesource.com/chromium/src/+/refs/heads/master/ios/
- Chrome の iOS は Swift ではなく、C++, Objective-C ++ メインで開発されている。
- UserAgent 関連コード
UserAgent関連コードを抜粋(これがすべてではない)
std::string BuildOSCpuInfo() { std::string os_cpu; // Remove the end of the platform name. For example "iPod touch" becomes // "iPod". std::string platform = base::SysNSStringToUTF8([[UIDevice currentDevice] model]); size_t position = platform.find_first_of(" "); if (position != std::string::npos) platform = platform.substr(0, position); base::StringAppendF(&os_cpu, "%s; CPU %s %s like Mac OS X", platform.c_str(), (platform == "iPad") ? "OS" : "iPhone OS", OSVersion().c_str()); return os_cpu; } /* 中略 */ std::string BuildMobileUserAgent(const std::string& mobile_product) { std::string user_agent; base::StringAppendF(&user_agent, "Mozilla/5.0 (%s) AppleWebKit/605.1.15" " (KHTML, like Gecko) %s Mobile/15E148 Safari/604.1", BuildOSCpuInfo().c_str(), mobile_product.c_str()); return user_agent; }
Firefox
ユーザーエージェントの例
Mozilla/5.0 (iPhone; CPU OS 13_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) FxiOS/28.0 Mobile/15E148 Safari/605.1.15
- リポジトリ
- UserAgent 関連コード
以下、UserAgent関連コードを抜粋(これがすべてではない)
public static let uaBitSafari = "Safari/605.1.15" public static let uaBitMobile = "Mobile/15E148" public static let uaBitFx = "FxiOS/\(AppInfo.appVersion)" public static let product = "Mozilla/5.0" public static let platform = "AppleWebKit/605.1.15" public static let platformDetails = "(KHTML, like Gecko)" /* 中略 */ public static func defaultMobileUserAgent() -> UserAgentBuilder { return UserAgentBuilder(product: UserAgent.product, systemInfo: "(\(UIDevice.current.model); CPU OS \(UIDevice.current.systemVersion.replacingOccurrences(of: ".", with: "_")) like Mac OS X)", platform: UserAgent.platform, platformDetails: UserAgent.platformDetails, extensions: "FxiOS/\(AppInfo.appVersion) \(UserAgent.uaBitMobile) \(UserAgent.uaBitSafari)") }
DuckDuckGo
ユーザーエージェントの例
Mozilla/5.0 (iPhone; CPU iPhone OS 12_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.4 Mobile/15E148 DuckDuckGo/7 Safari/605.1.15
- リポジトリ
- UserAgent 関連コード
UserAgent関連コードを抜粋(これがすべてではない)
struct UserAgent { private struct Constants { // swiftlint:disable line_length static let fallbackWekKitVersion = "605.1.15" static let fallbackSafariComponent = "Safari/\(fallbackWekKitVersion)" static let fallbackDefaultAgent = "Mozilla/5.0 (iPhone; CPU iPhone OS 13_5 like Mac OS X) AppleWebKit/\(fallbackWekKitVersion) (KHTML, like Gecko) Mobile/15E148" static let desktopPrefixComponent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15)" static let fallbackVersionComponent = "Version/13.1.1" // swiftlint:enable line_length }
メモ
- customUserAgentはそれぞれのアプリで基本的には、コード内でリテラルで指定している
AppleWebKit
,Safari
のバージョンもコード内で固定値で記述されている- Chrome は CriOS, Firefox は FxiOS, DuckDuckGo は DuckDuckGo がそれぞれ設定される。
- ユーザエージェントを確認する側は、これを頼りにアプリを区別できる。
- ただし Chrome は将来的にはユーザーエージェント利用が縮小されるので、変わる可能性は大きい