suroMind

[iPhone]UIWebView에서 User-Agent 변경 본문

IT분야/iOS

[iPhone]UIWebView에서 User-Agent 변경

suroMind 2011. 3. 24. 11:31
아래 코드는 iOS5 부터는 적용되지 않습니다.
http://blog.suromind.com/94
위 링크에 새로운 방법이 제시 되어 있으니 확인해 보세요

=-=-====================================================================================================================
여러모로 삽질을 많이 한 부분입니다.

첫번째로 performselector를 이용하여 setCustomUserAgent 함수를 호출하고 수정하거나

두번째로
-(BOOL) webView:(UIWebView*) webView shouldStartLoadWithRequest:(NSURLRequest*) req navigationType:(UIWebViewNavigationType) navigationType

위 함수에서 헤더를 셋팅해주는 방법도 있다..
첫번째 방법은 비공개API라서 안된다하고 두번째 방법으로 해봤는데.. 되긴 되는데 잘 안된다.
JAVA 서블릿을 타면 헤더가 바뀔때도 있고 안바뀔때도 있고 지 멋대로다.. ㅜ

결국 찾은 방법은 외국사이트에서 찾았다.


================================= MethodSwizzling.h =================================
#import <Foundation/Foundation.h>

@interface NSObject (Swizzle)

+(BOOL)swizzleMethod:(SEL)origSelector withMethod:(SEL)newSelector;

@end
================================= MethodSwizzling.m ================================
#import "MethodSwizzling.h"
#import <objc/runtime.h>

@implementation NSObject (Swizzle)

+(BOOL)swizzleMethod:(SEL)origSelector withMethod:(SEL)newSelector{
    Method origMethod = class_getInstanceMethod(self, origSelector);
    Method newMethod = class_getInstanceMethod(self, newSelector);
   
    if (origMethod && newMethod) {
        if (class_addMethod(self, origSelector, method_getImplementation(newMethod), method_getTypeEncoding(newMethod))) {
            class_replaceMethod(self, newSelector, method_getImplementation(origMethod), method_getTypeEncoding(origMethod));
        } else {
            method_exchangeImplementations(origMethod, newMethod);
        }
        return YES;
    }
    return NO;
}

@end
================================ MyMutableURLRequest.h ===========================
#import <Foundation/Foundation.h>

@interface NSMutableURLRequest (MyMutableURLRequest)

+ (void) setupUserAgentOverwrite;

@end
================================= MyMutableURLRequest.m ==========================
#import "MyMutableURLRequest.h"
#import "MethodSwizzling.h"

@implementation NSMutableURLRequest (MyMutableURLRequest)

- (void)newSetValue:(NSString *)value forHTTPHeaderField:(NSString *)field;
{
    if ([field isEqualToString:@"User-Agent"]) {
        if (![value hasPrefix:@"webview_iphone"]) {
            value = [value stringByAppendingString:@",webview_iphone"];
        }
        //value = @"The new User-Agent string";
    }
    [self newSetValue:value forHTTPHeaderField:field];
}

+ (void)setupUserAgentOverwrite
{
    [self swizzleMethod:@selector(setValue:forHTTPHeaderField:)
             withMethod:@selector(newSetValue:forHTTPHeaderField:)];
}

@end
==========================================================================================

UserAgent값은 MyMutableURLRequest.m에서 value값을 통해 수정할 수 있다.
본인은 기본적으로 출력되는 값 뒤에 ,webview_iphone 을 stringByAppendingString 통해 추가하는
형식으로 집어넣었다. 이부분을 입맛에 맛게 수정하면 될듯 하다.

사용은 아래처럼 import해주고 뷰가 시작될때 한줄만 써주면 된다.
....
#import "MyMutableURLRequest.h"
....
-(void)viewDidLoad{
[super viewDidLoad];
[NSMutableURLRequest setupUserAgentOverwrite];
}

Comments