web-dev-qa-db-ja.com

UIWebView iOS5変更ユーザーエージェント

IOS 5でUIWebViewのユーザーエージェントを変更するにはどうすればよいですか?

これまでに行ったこと:デリゲートコールバックを使用して、NSURLRequestをインターセプトし、新しいURLリクエストを作成し、ユーザーエージェントを必要に応じて設定し、データをダウンロードして、UIWebViewを「 loadData:MIMEType:.... "。

問題:これは無限再帰を引き起こします。ここでデータをロードし、デリゲートをコールバックし、インターンがデリゲートをコールします。

デリゲートメソッドは次のとおりです。

- (BOOL)webView:(UIWebView *)aWebView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {



    dispatch_async(kBgQueue, ^{
        NSURLResponse *response = nil;
        NSMutableURLRequest *newRequest = [NSMutableURLRequest requestWithURL:[request URL]];
        NSDictionary *headers = [NSDictionary dictionaryWithObject:
                                 @"custom_test_agent" forKey:@"User-Agent"];
        [newRequest setAllHTTPHeaderFields:headers];
        [self setCurrentReqest:newRequest];
        NSData *data = [NSURLConnection sendSynchronousRequest:newRequest 
                                             returningResponse:&response 
                                                         error:nil];
        dispatch_sync(dispatch_get_main_queue(), ^{
            [webView loadData:data 
                     MIMEType:[response MIMEType] 
             textEncodingName:[response textEncodingName] 
                      baseURL:[request URL]];
        });
    });

    return YES;
}
35
0xSina

アプリの起動時にこのコードを1回実行して、「UserAgent」のデフォルト値を変更します。

NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:@"Your user agent", @"UserAgent", nil];
[[NSUserDefaults standardUserDefaults] registerDefaults:dictionary];  

編集:私はこれを大成功で使用しましたが、詳細を追加したいと思います。ユーザーエージェントを取得するには、[開発者]メニューを有効にし、ユーザーエージェントを設定してから、このサイトに接続して印刷してください: WhatsMyAgent 。同様に、あらゆる種類のモバイルデバイスを使用して接続し、その方法でも取得できます。ところで、これはまだiOS7 +でうまく動作しています

89
Martin Wickman

Swiftでは、これを使用してserAgentを設定します。

func setUserAgent(){

    var userAgent = NSDictionary(objectsAndKeys:  "YourUserAgentName","UserAgent")

    NSUserDefaults.standardUserDefaults().registerDefaults(userAgent as [NSObject : AnyObject])

}

これを使用してテストし、

println(WebView.stringByEvaluatingJavaScriptFromString("navigator.userAgent"));
1
Zaid Pathan

メッセージ_[aWebView loadData:MIMEType:textEncodingName:baseURL:]_を送信するとき

その後、_aWebView shouldStartLoadWithRequest:_が再度呼び出され、再び呼び出されます-これが無限再帰を取得する理由です

たとえば、従来のURLを使用して、dispatch_async()ブロックの呼び出しを制限する必要があります。

_- (BOOL)webView:(UIWebView *)aWebView shouldStartLoadWithRequest:(NSURLRequest *)request 
        navigationType:(UIWebViewNavigationType)navigationType {


    if ([[[request URL] absoluteString] isEqualToString:@"http://yourdomain.com/?local=true"]) {
        return YES;
    }


    ...

    dispatch_async(...
            [aWebView loadData:data 
                      MIMEType:[response MIMEType] 
              textEncodingName:[response textEncodingName] 
                       baseURL:[NSURL URLWithString:@"http://yourdomain.com/?local=true"]];

    );
    return NO;
}
_
0
funberry