program tip

UIWebView에서 사용자 에이전트 변경

radiobox 2020. 11. 10. 07:59
반응형

UIWebView에서 사용자 에이전트 변경


임베디드 UIWebView에 대해 UserAgent를 사용자 지정할 수 있어야하는 비즈니스가 있습니다. (예를 들어, 사용자가 한 버전의 앱을 다른 버전과 사용하는 경우 서버가 다르게 응답하기를 바랍니다.)

예를 들어 Windows 앱에 포함 된 IE 브라우저에 대해 기존 UIWebView 컨트롤에서 UserAgent를 사용자 지정할 수 있습니까?


모던 스위프트

다음은 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 는 아래 답변에서 지적한대로 사용자 에이전트변경 합니다. 해당 페이지의 댓글에서 4.3 이전 버전에서도 작동하는 것으로 보입니다.

앱이 시작될 때이 코드를 한 번 실행하여 "UserAgent"기본값을 변경합니다.

NSDictionary *dictionary = @{@"UserAgent": @"Your user agent"};
[[NSUserDefaults standardUserDefaults] registerDefaults:dictionary];
[[NSUserDefaults standardUserDefaults] synchronize];

4.3 / 5.0 이전의 iOS 버전에서 작동하는 메소드가 필요한 경우이 게시물의 이전 편집을 참조하십시오. 광범위한 편집으로 인해이 페이지의 다음 댓글 / 기타 답변이 의미가 없을 수 있습니다. 결국 이것은 4 년 된 질문입니다. ;-)


나도이 문제가 있었고 모든 방법을 시도했습니다. 이 방법 만 작동 함 (iOS 5.x) : UIWebView iOS5 사용자 에이전트 변경

원칙은 사용자 설정에서 사용자 에이전트를 영구적으로 설정하는 것입니다. 이것은 작동합니다. Webview는 주어진 헤더를 보냅니다. 두 줄의 코드 :

NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:@"Mozilla/Whatever version 913.6.beta", @"UserAgent", nil];
[[NSUserDefaults standardUserDefaults] registerDefaults:dictionary];

변경 가능한 요청에서 User-Agent 또는 User_Agent를 설정하거나 swizzling으로 NSHttpRequest에서 setValue를 재정의합니다. 사용자 기본값에서 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.

responseData를 얻으려면 NSURLConnection을 사용해야합니다. 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])

참고 : 기존 에이전트 문자열에 추가되지 않도록 앱을 제거하고 다시 설치해야 할 수 있습니다.


실제로 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이 덮어 쓴 user-agent 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"로 바뀐다는 점이 흥미 롭습니다.


이것이 나를 위해 해결 된 방법입니다.

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

모두 감사합니다.


풀링하여 루이스 세인트 아무르로 대답NSUserDefaults+UnRegisterDefaults범주 이 질문 / 답변에서를 , 당신은 당신의 응용 프로그램이 실행되는 동안 언제든지 시작 및 정지 사용자 에이전트 스푸핑하기 위해 다음과 같은 방법을 사용할 수 있습니다 :

#define kUserAgentKey @"UserAgent"

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

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

이 솔루션은이를 수행하는 매우 영리한 방법으로 간주 된 것 같습니다.

uiwebkit-http 요청에 대한 헤더 변경

It uses Method Swizzling and you can learn more about it on the CocoaDev page

Give it a look !


I faced the same question. I want to add some info to the user-agent, also need to keep the original user-agent of webview. I solved it by using the code below:

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

Use it before you instancing webview.


Try this in the 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];

}

The only problem I have found was change user agent only

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

To just add a custom content to the current UserAgent value, do the following:

1 - Get the user agent value from a NEW WEBVIEW

2 - Append the custom content to it

3 - Save the new value in a dictionary with the key UserAgent

4 - Save the dictionary in standardUserDefaults.

See the exemple below:

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

참고URL : https://stackoverflow.com/questions/478387/change-user-agent-in-uiwebview

반응형