UI 웹 보기에서 사용자 에이전트 변경
내장된 UI WebView에 대해 UserAgent를 사용자 지정할 수 있어야 합니다. (예를 들어, 사용자가 한 버전의 앱을 사용하는 경우와 다른 버전의 앱을 사용하는 경우 서버가 다르게 응답했으면 합니다.)
Windows 앱에 내장된 IE 브라우저와 같은 방식으로 기존 UI WebView에서 UserAgent를 사용자 지정할 수 있습니까?
모던 스위프트
다음은 StackOverflow 사용자 PassKit 및 Kheldar의 Swift 3+ 프로젝트에 대한 제안입니다.
UserDefaults.standard.register(defaults: ["UserAgent" : "Custom Agent"])
출처: https://stackoverflow.com/a/27330998/128579
이전 목표-C 답변
iOS 5를 변경할 경우, 원래 스택 오버플로 질문에서 나온 다음과 같은 접근 방식을 권장합니다. UI WebView 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).UI WebView iOS5 사용자 에이전트 변경
원칙은 사용자 설정에서 사용자 에이전트를 영구적으로 설정하는 것입니다.이것은 작동합니다. 웹 보기는 지정된 머리글을 보냅니다.두 줄의 코드만 있으면 됩니다.
NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:@"Mozilla/Whatever version 913.6.beta", @"UserAgent", nil];
[[NSUserDefaults standardUserDefaults] registerDefaults:dictionary];
변경 가능한 요청에서 User-Agent 또는 User_Agent 설정 또는 NSHttpRequest에서 setValue를 스위즐링하여 재정의함 - 모든 것을 시도하고 wireshark로 결과를 제어했지만, 웹뷰는 NSHtpRequest에서 무엇을 설정하려고 해도 여전히 사용자 기본값에서 사용자 에이전트 값을 사용하기 때문에 아무 것도 작동하지 않는 것 같습니다.
NSMutable과 함께 작동해야 합니다.Kuso가 작성한 URL 요청.
NSMutableURLRequest *urlRequest = [[NSMutableURLRequest alloc] initWithURL: [NSURL URLWithString: @"http://www.google.com/"]];
[urlRequest setValue: @"iPhone" forHTTPHeaderField: @"User-Agent"]; // Or any other User-Agent value.
응답 데이터를 가져오려면 NSURL 연결을 사용해야 합니다.UIWebView에 responseData를 설정하면 webView가 다음을 렌더링합니다.
[webView loadData:(NSData *)data MIMEType:(NSString *)MIMEType textEncodingName:(NSString *)encodingName baseURL:(NSURL *)baseURL];
스위프트에서는 매우 간단합니다.앱 위임자에 다음을 입력하면 됩니다.
UserDefaults.standard.register(defaults: ["UserAgent" : "Custom Agent"])
기존 에이전트 문자열에 추가하려면 다음을 수행합니다.
let userAgent = UIWebView().stringByEvaluatingJavaScript(from: "navigator.userAgent")! + " Custom Agent"
UserDefaults.standard.register(defaults: ["UserAgent" : userAgent])
참고: 기존 에이전트 문자열에 추가되지 않도록 하려면 앱을 제거했다가 다시 설치해야 할 수도 있습니다.
요청이 setValue:For에 응답하므로 실제로 의 StartLoadWithRequest 인수에 헤더 필드를 추가하는 것이 작동하는 것 같습니다.HTTP HeaderField - 실제로는 작동하지 않습니다 - 헤더 없이 요청이 전송됩니다.
그래서 shouldStartLoadWithRequest에서 주어진 요청을 새 가변 요청으로 복사하고 다시 로드하는 이 해결 방법을 사용했습니다.이렇게 하면 실제로 전송되는 헤더가 수정됩니다.
if ( [request valueForHTTPHeaderField:@"MyUserAgent"] == nil )
{
NSMutableURLRequest *modRequest = [request mutableCopyWithZone:NULL];
[modRequest setValue:@"myagent" forHTTPHeaderField:@"MyUserAgent"];
[webViewArgument loadRequest:modRequest];
return NO;
}
불행하게도, 이것은 여전히 사용자 에이전트 http 헤더를 재정의하는 것을 허용하지 않습니다. 이것은 분명히 Apple에 의해 덮어쓰여졌습니다.이를 재정의하려면 NSURL 연결을 직접 관리해야 할 것 같습니다.
@"User_Agent"를 사용하면 GET 요청에 사용자 지정 헤더가 나타납니다.
사용자_에이전트:푸바/1.0\r\n
사용자 MozillaX와 CPU OS ; (Gecko) 파일: Mozilla/5.0 (iPhone, U; Mac OS X와 같은 CPU Ikit 3.2) Web_1(U)
위의 내용은 해부된 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];
}
이 솔루션은 상당히 현명한 방법으로 간주된 것 같습니다.
Method Swizzling을 사용하며 CocoaDev 페이지에서 자세한 내용을 확인할 수 있습니다.
한번 보세요!
저도 같은 질문에 직면했습니다.사용자 에이전트에 정보를 추가하고 웹 뷰의 원래 사용자 에이전트를 유지해야 합니다.아래 코드를 사용하여 해결했습니다.
//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];
웹 보기를 인스턴스화하기 전에 사용합니다.
AppDelegate에서 사용해 보십시오.
+ (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];
}
내가 발견한 유일한 문제는 사용자 에이전트만 변경하는 것이었습니다.
- (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];
}
Apple은 곧 UI WebView가 포함된 앱의 수락을 중지할 것입니다.WKWebView에서 사용자 에이전트를 변경하는 방법은 아래에서 확인하십시오.
let config = WKWebViewConfiguration()
config.applicationNameForUserAgent = "My iOS app"
webView = WKWebView(frame: <the frame you need>, configuration: config)
사용자 정의 콘텐츠를 현재 UserAgent 값에 추가하려면 다음을 수행하십시오.
1 - 새 WEBVIEW에서 사용자 에이전트 값 가져오기
2 - 사용자 정의 컨텐츠를 추가합니다.
3 - 키 UserAgent를 사용하여 새 값을 사전에 저장합니다.
4 - 사전을 표준 사용자 기본값으로 저장합니다.
아래 예를 참조하십시오.
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
'programing' 카테고리의 다른 글
rootViewController를 애니메이션과 스왑하시겠습니까? (0) | 2023.08.13 |
---|---|
기록 없이 새 분기를 푸시하는 방법 (0) | 2023.08.13 |
증분이 5인 UI 슬라이더 (0) | 2023.08.13 |
PSCustomObject의 어레이에 속성 값을 가진 인스턴스가 포함되어 있는지 확인합니다. (0) | 2023.08.13 |
선 세그먼트의 다른 두 점 사이에 점이 있는지 어떻게 확인할 수 있습니까? (0) | 2023.08.13 |