埋め込み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の質問からの次のアプローチをお勧めします: UIWebView iOS5はuser-agent を以下の回答で指摘されているように変更します。そのページのコメントでは、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): IWebView iOS5 changing user-agent
原則は、ユーザー設定でユーザーエージェントを永続的に設定することです。これは機能します。 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で何を設定しようとしても、ユーザーのデフォルトから。
Kusoが書いたように、NSMutableURLRequestで動作するはずです。
NSMutableURLRequest *urlRequest = [[NSMutableURLRequest alloc] initWithURL: [NSURL URLWithString: @"http://www.google.com/"]];
[urlRequest setValue: @"iPhone" forHTTPHeaderField: @"User-Agent"]; // Or any other User-Agent value.
NSURLConnectionを使用してresponseDataを取得する必要があります。 responseDataをUIWebViewに設定すると、webViewがレンダリングするはずです。
[webView loadData:(NSData *)data MIMEType:(NSString *)MIMEType textEncodingName:(NSString *)encodingName baseURL:(NSURL *)baseURL];
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])
注:既存のエージェント文字列に追加しないように、アプリをアンインストールして再インストールする必要がある場合があります。
@ "User_Agent"を使用すると、GETリクエストにカスタムヘッダーが表示されるだけです。
User_agent:Foobar/1.0\r\n
ユーザーエージェント:Mozilla/5.0(iPhone; U; CPU Mac OS XのようなiPhone OS 3_1_2; en-us)AppleWebKit/528.18(KHTML、Geckoのような)Mobile/7D11\r\n
上記は、分析されたHTTPパケットに表示されるものであり、Sfjavaがそのフォーラムから引用しているものを本質的に確認しています。 「User-Agent」が「User_agent」に変わることに注意してください。
すべてを取って、これが私にとってどのように解決されたかです:
- (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];
}
みんな、ありがとう。
ShouldStartLoadWithRequestseemsのNSURLRequest引数に実際にヘッダーフィールドを追加します。これは、リクエストがsetValue:ForHTTPHeaderFieldに応答するためですがdoes n'tは実際に動作します-リクエストはヘッダーなしで送信されます。
そのため、この回避策をshouldStartLoadWithRequestで使用しました。この回避策では、指定されたリクエストを新しい可変リクエストにコピーし、再ロードします。実際、これは送信されるヘッダーを変更します。
if ( [request valueForHTTPHeaderField:@"MyUserAgent"] == nil )
{
NSMutableURLRequest *modRequest = [request mutableCopyWithZone:NULL];
[modRequest setValue:@"myagent" forHTTPHeaderField:@"MyUserAgent"];
[webViewArgument loadRequest:modRequest];
return NO;
}
残念ながら、これにより、user-agent httpヘッダーをオーバーライドすることはまだできません。これは、明らかにAppleによって上書きされます。オーバーライドするには、NSURLConnectionを自分で管理する必要があります。
プーリングによって ルイ・セント・アムールによる答え およびNSUserDefaults+UnRegisterDefaults
カテゴリ この質問/回答から 、次の方法を使用して、アプリの実行中にいつでもユーザーエージェントスプーフィングを開始および停止できます。
#define kUserAgentKey @"UserAgent"
- (void)startSpoofingUserAgent:(NSString *)userAgent {
[[NSUserDefaults standardUserDefaults] registerDefaults:@{ kUserAgentKey : userAgent }];
}
- (void)stopSpoofingUserAgent {
[[NSUserDefaults standardUserDefaults] unregisterDefaultForKey:kUserAgentKey];
}
この解決策は、それを行うためのかなり賢い方法として見られていたようです
changeing-the-headers-for-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];
}
現在のUserAgent値にカスタムコンテンツを追加するには、次の手順を実行します。
1-新しいWEBVIEWからユーザーエージェント値を取得する
2-カスタムコンテンツを追加する
3-キーUserAgentを使用して新しい値を辞書に保存します
4-辞書をstandardUserDefaultsに保存します。
以下の例をご覧ください。
NSString *userAgentP1 = [[[UIWebView alloc] init] stringByEvaluatingJavaScriptFromString:@"navigator.userAgent"];
NSString *userAgentP2 = @"My_custom_value";
NSString *userAgent = [NSString stringWithFormat:@"%@ %@", userAgentP1, userAgentP2];
NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:userAgent, @"UserAgent", nil];
[[NSUserDefaults standardUserDefaults] registerDefaults:dictionary];