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];
}
이 솔루션은이를 수행하는 매우 영리한 방법으로 간주 된 것 같습니다.
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
'program tip' 카테고리의 다른 글
`NSManagedObject`가 삭제되었는지 어떻게 알 수 있습니까? (0) | 2020.11.10 |
---|---|
다시 인코딩하지 않고 mp4 비디오 회전 (0) | 2020.11.10 |
임시 테이블에서 필드 이름을 검색하는 방법 (SQL Server 2008) (0) | 2020.11.10 |
PHP에서 배열의 인덱스 값 가져 오기 (0) | 2020.11.10 |
NSMutableArray addObject :-[__ NSArrayI addObject :] : 인식 할 수없는 선택기가 인스턴스로 전송되었습니다. (0) | 2020.11.10 |