web-dev-qa-db-ja.com

UIWebViewでユーザーエージェントを変更する

埋め込みUIWebViewのUserAgentをカスタマイズできるようにする必要があるビジネスがあります。 (たとえば、ユーザーがアプリのあるバージョンと別のバージョンを使用している場合、サーバーの応答が異なるようにします。)

既存のUIWebViewコントロールのUserAgentを、たとえば、Windowsアプリの埋め込みIEブラウザー用に)カスタマイズすることは可能ですか?

67
Steve Murch

モダンスウィフト

StackOverflowユーザーPassKitとKheldarのSwift 3+プロジェクトの提案:

UserDefaults.standard.register(defaults: ["UserAgent" : "Custom Agent"])

ソース: https://stackoverflow.com/a/27330998/128579

以前のObjective-Cの回答

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年前の質問です。 ;-)

92
Louis St-Amour

私もこの問題を抱えており、すべての方法を試しました。このメソッドのみが機能することがわかりました(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で何を設定しようとしても、ユーザーのデフォルトから。

19
winitzki

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];
18
Dshutsi

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])

注:既存のエージェント文字列に追加しないように、アプリをアンインストールして再インストールする必要がある場合があります。

10
PassKit

@ "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」に変わることに注意してください。

6
dodeskjeggen

すべてを取って、これが私にとってどのように解決されたかです:

- (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];
}

みんな、ありがとう。

6

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を自分で管理する必要があります。

6
Danra

プーリングによって ルイ・セント・アムールによる答え およびNSUserDefaults+UnRegisterDefaultsカテゴリ この質問/回答から 、次の方法を使用して、アプリの実行中にいつでもユーザーエージェントスプーフィングを開始および停止できます。

#define kUserAgentKey @"UserAgent"

- (void)startSpoofingUserAgent:(NSString *)userAgent {
    [[NSUserDefaults standardUserDefaults] registerDefaults:@{ kUserAgentKey : userAgent }];
}

- (void)stopSpoofingUserAgent {
    [[NSUserDefaults standardUserDefaults] unregisterDefaultForKey:kUserAgentKey];
}
5
EthanB

この解決策は、それを行うためのかなり賢い方法として見られていたようです

changeing-the-headers-for-uiwebkit-http-requests

Method Swizzlingを使用します。詳細については CocoaDevページ をご覧ください。

それを見てください!

4
Open SEO

私は同じ質問に直面しました。ユーザーエージェントに情報を追加し、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をインスタンス化する前に使用してください。

2
Shannon Chou

私が発見した唯一の問題は、ユーザーエージェントの変更のみでした

- (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];
}
1
Sanjeev sharma

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];

}
1
Aitul

現在の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];
0
Doug