組み込みUIWebView用にUserAgentをカスタマイズできるようにする必要があります。(たとえば、ユーザーがアプリのあるバージョンと別のバージョンを使用している場合、サーバーの応答を変えたいと思います。)
既存のUIWebViewコントロールのUserAgentを、たとえばWindowsアプリの組み込みIEブラウザーのようにカスタマイズすることは可能ですか?
組み込みUIWebView用にUserAgentをカスタマイズできるようにする必要があります。(たとえば、ユーザーがアプリのあるバージョンと別のバージョンを使用している場合、サーバーの応答を変えたいと思います。)
既存のUIWebViewコントロールのUserAgentを、たとえばWindowsアプリの組み込みIEブラウザーのようにカスタマイズすることは可能ですか?
StackOverflow ユーザーの PassKit と Kheldar からの Swift 3+ プロジェクトの提案は次のとおりです。
UserDefaults.standard.register(defaults: ["UserAgent" : "Custom Agent"])
ソース: https://stackoverflow.com/a/27330998/128579
iOS 5 の変更に伴い、この StackOverflow の質問から引用した次のアプローチをお勧めします。そのページのコメントでは、4.3 以前でも動作するようです。
アプリの起動時に次のコードを 1 回実行して、「UserAgent」のデフォルト値を変更します。
NSDictionary *dictionary = @{@"UserAgent": @"Your user agent"}; [[NSUserDefaults standardUserDefaults] registerDefaults:dictionary]; [[NSUserDefaults standardUserDefaults] synchronize];
4.3/5.0 より前のバージョンの iOS で機能するメソッドが必要な場合は、この投稿の以前の編集を参照してください。大幅な編集のため、このページの次のコメント/その他の回答は意味をなさない場合があることに注意してください。結局のところ、これは 4 年前の質問です。;-)
私もこの問題を抱えていて、すべての方法を試しました。この方法のみが機能することがわかりました(iOS 5.x): UIWebViewiOS5ユーザーエージェントの変更
原則は、ユーザー設定でユーザーエージェントを永続的に設定することです。これは機能します。Webviewは指定されたヘッダーを送信します。たった2行のコード:
NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:@"Mozilla/Whatever version 913.6.beta", @"UserAgent", nil];
[[NSUserDefaults standardUserDefaults] registerDefaults:dictionary];
可変リクエストでUser-AgentまたはUser_Agentを設定するか、スウィズリングによってNSHttpRequestのsetValueをオーバーライドします-私はそれをすべて試し、wiresharkで結果を制御しましたが、Webviewはまだユーザーエージェント値を使用しているため、どれも機能しないようですNSHttpRequestで何を設定しようとしても、ユーザーのデフォルトから。
Swift では非常にシンプルです。以下を App Delegate に配置するだけです。
UserDefaults.standard.register(defaults: ["UserAgent" : "Custom Agent"])
既存のエージェント文字列に追加する場合:
let userAgent = UIWebView().stringByEvaluatingJavaScript(from: "navigator.userAgent")! + " Custom Agent"
UserDefaults.standard.register(defaults: ["UserAgent" : userAgent])
注: 既存のエージェント文字列への追加を避けるために、アプリをアンインストールして再インストールする必要がある場合があります。
これをすべて取って、私にとって解決した方法は次のとおりです。
- (void)viewDidLoad {
NSURL *url = [NSURL URLWithString: @"http://www.amazon.com"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[request setValue:@"Foobar/1.0" forHTTPHeaderField:@"User-Agent"];
[webView loadRequest:request];
}
みんな、ありがとう。
実際に shouldStartLoadWithRequest の NSURLRequest 引数にヘッダー フィールドを追加する と、リクエストが setValue:ForHTTPHeaderField に応答するため、機能しているように見えますが、実際には機能しません。リクエストはヘッダーなしで送信されます。
したがって、この回避策を shouldStartLoadWithRequest で使用しました。これは、指定されたリクエストを新しい変更可能なリクエストにコピーし、再ロードするだけです。実際、これは送信されるヘッダーを変更します。
if ( [request valueForHTTPHeaderField:@"MyUserAgent"] == nil )
{
NSMutableURLRequest *modRequest = [request mutableCopyWithZone:NULL];
[modRequest setValue:@"myagent" forHTTPHeaderField:@"MyUserAgent"];
[webViewArgument loadRequest:modRequest];
return NO;
}
残念ながら、Apple によって上書きされたように見えるユーザー エージェントの http ヘッダーを上書きすることはまだ許可されていません。それをオーバーライドするには、自分で NSURLConnection を管理する必要があると思います。
@"User_Agent" を使用すると、カスタム ヘッダーが GET 要求に表示されます。
User_agent: Foobar/1.0\r\n
User-Agent: Mozilla/5.0 (iPhone; U; Mac OS X のような CPU iPhone OS 3_1_2; en-us) AppleWebKit/528.18 (Gecko のような KHTML) Mobile/7D11\r\n
上記は、分析された HTTP パケットに表示されるものであり、基本的に Sfjava がそのフォーラムから引用していたことを確認しています。「User-Agent」が「User_agent」に変わることに注意してください。
このソリューションは、それを行うためのかなり賢い方法と見なされているようです
uiwebkit-http-requests のヘッダーの変更
これは Method Swizzling を使用しており、詳細についてはCocoaDev ページを参照してください。
それを見てください!
私は同じ質問に直面しました。ユーザーエージェントに情報を追加したいのですが、webview の元のユーザーエージェントも保持する必要があります。以下のコードを使用して解決しました。
//get the original user-agent of webview
UIWebView *webView = [[UIWebView alloc] initWithFrame:CGRectZero];
NSString *oldAgent = [webView stringByEvaluatingJavaScriptFromString:@"navigator.userAgent"];
NSLog(@"old agent :%@", oldAgent);
//add my info to the new agent
NSString *newAgent = [oldAgent stringByAppendingString:@" Jiecao/2.4.7 ch_appstore"];
NSLog(@"new agent :%@", newAgent);
//regist the new agent
NSDictionary *dictionnary = [[NSDictionary alloc] initWithObjectsAndKeys:newAgent, @"UserAgent", nil];
[[NSUserDefaults standardUserDefaults] registerDefaults:dictionnary];
WebView をインスタンス化する前に使用してください。
私が見つけた唯一の問題は、ユーザーエージェントの変更のみでした
- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
NSDictionary *dictionary = [NSDictionary
dictionaryWithObjectsAndKeys:
@"Mozilla/5.0 (iPod; U; CPU iPhone OS 4_3_3 like Mac OS X; ja-jp) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5",
@"UserAgent", nil];
[[NSUserDefaults standardUserDefaults] registerDefaults:dictionary];
}
AppDelegate.m でこれを試してください
+ (void)initialize
{
// Set user agent (the only problem is that we can’t modify the User-Agent later in the program)
// iOS 5.1
NSDictionary *dictionnary = [[NSDictionary alloc] initWithObjectsAndKeys:@”Mozilla/5.0 (iPad; CPU OS 5_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9B176 Safari/7534.48.3”, @”UserAgent”, nil];
[[NSUserDefaults standardUserDefaults] registerDefaults:dictionnary];
}