ObjecTips

Swift & Objective-C で iOS とか macOS とか

WebView の UserAgent を取得設定する iOS 9対応

UserAgent の取得

UIWebView では stringByEvaluatingJavaScriptFromString: メソッドJavaScript を実行して UserAgent を取得できる。

iOS 8以降の WKWebView では evaluateJavaScript:completionHandler: メソッドJavaScript を実行して UserAgent を取得できる。
WKWebViewJavaScript は非同期で実行される。

UserAgent の設定

iOS 8までは UIWebView WKWebView 共に NSUserDefaults のデフォルト値に UserAgent の値を書き込んでからインスタンスを作るというちょっとトリッキーな事をする必要があった。

iOS 9以降では WKWebView に公式に UserAgent を変更するメソッドが提供された。


WKWebViewConfiguration で UserAgent の一部をカスタマイズ

iOS 9で WKWebViewWKWebViewConfigurationapplicationNameForUserAgent というプロパティが追加された。

@property (nullable, nonatomic, copy) NSString *applicationNameForUserAgent NS_AVAILABLE(10_11, 9_0);

この値はデフォルトでは UserAgent の最後の部分
Mozilla/5.0 (iPhone; CPU iPhone OS 9_0 like Mac OS X) AppleWebKit/601.1.32 (KHTML, like Gecko) Mobile/13A4254v

Mobile/13A4254v
の部分を指し示す。

configuration を作成して applicationNameForUserAgent を設定し、WebView を初期化する際の引数に指定すれば WebView の元々の UserAgent の一部だけを変更する事ができる。

上記のコードでは元々の UserAgent の
Mozilla/5.0 (iPhone; CPU iPhone OS 9_0 like Mac OS X) AppleWebKit/601.1.32 (KHTML, like Gecko) Mobile/13A4254v

Mozilla/5.0 (iPhone; CPU iPhone OS 9_0 like Mac OS X) AppleWebKit/601.1.32 (KHTML, like Gecko) ApplicationName
に変更される。

なお WKWebView に customUserAgent を設定していると WKWebViewConfiguration の applicationNameForUserAgent は無視され、customUserAgent で設定した値そのままが UserAgent になる。