気になったので、オープンソースな iOS の Web ブラウザアプリで、 WKWebview
のカスタムユーザーエージェント(customUserAgent
) を設定している部分を見てみる。
ユーザーエージェントの例
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
UserAgent関連コードを抜粋(これがすべてではない)
std::string BuildOSCpuInfo() {
std::string os_cpu;
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;
}
ユーザーエージェントの例
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関連コードを抜粋(これがすべてではない)
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)")
}
ユーザーエージェントの例
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関連コードを抜粋(これがすべてではない)
struct UserAgent {
private struct Constants {
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"
}
メモ
- customUserAgentはそれぞれのアプリで基本的には、コード内でリテラルで指定している
AppleWebKit
, Safari
のバージョンもコード内で固定値で記述されている
- iOS の API で取得できる内容だと思ったが、そうではないようだ
- Chrome は CriOS, Firefox は FxiOS, DuckDuckGo は DuckDuckGo がそれぞれ設定される。
- ユーザエージェントを確認する側は、これを頼りにアプリを区別できる。
- ただし Chrome は将来的にはユーザーエージェント利用が縮小されるので、変わる可能性は大きい