출처 : http://wkqqn.tistory.com/archive/20110711

기존에 user-agent 변경하는 방법을 Swizzle을 이용해서 변경했었는데
iOS 5로 업데이트 되면서 변경이 안되었다. 물론 앱스토어에 올라가 있는 앱들이 제대로 되지도 않고..

그래서 찾아보다가 한참을 헤매었는데 위 블로그에서 아래와 같은 방법을 찾았다.

AppDelegate.m 파일에 아래 코드를 넣으면 됩니다.
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
   NSString *deviceModel = [[UIDevice currentDevice].model stringByReplacingOccurrencesOfString:@"" withString:@""];
    NSString *userAgent = [NSString stringWithFormat:@"Mozilla/5.0 (%@; CPU OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Mobile/9A334,webView_iphone",deviceModel];
    NSDictionary *dictionnary = [[NSDictionary alloc] initWithObjectsAndKeys:userAgent,@"UserAgent", nil];
    [[NSUserDefaults standardUserDefaults] registerDefaults:dictionnary];
    [dictionnary release];

    .....  
    .....
}

본인은 스마트폰에서 모바일웹으로 접속한 것인지 앱에서 웹뷰로 접속한 것인지 구분하기 위해
UserAgent 맨 뒤에 ,webView_iphone  문자열을 삽입하였습니다.

확인은 웹뷰를 구현한 곳에서 아래처럼 출력하시면 확인 할 수 있습니다
-(BOOL) webView:(UIWebView*) webView shouldStartLoadWithRequest:(NSURLRequest*) req navigationType:(UIWebViewNavigationType) navigationType{
    NSMutableURLRequest *request = (NSMutableURLRequest *)req;
   
    NSLog(@"%@",[request allHTTPHeaderFields]);
    ....
    ....
}
저작자 표시
신고

UIWebView에서 링크 클릭시 Webview의 페이지 이동이 아닌 사파리 창을 띄우는 일이 생겼다..찾아보니 간단했다

-(BOOL)webView:(UIWebView *)descriptionTextView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
      if (UIWebViewNavigationTypeLinkClicked == navigationType) {
           [[UIApplication sharedApplication] openURL:[request URL]];
          
return NO;
     
}
     
return YES;
}

출처 : http://stackoverflow.com/questions/5330974/open-link-in-uiwebview-in-safari
저작자 표시
신고
아이폰의 웹뷰를 구현하면서 상하로 스크롤시에 필요치 않은 부분까지 스크롤되는 점이 있다.
뭐랄까 뷰가 끝까지 스크롤되었지만 그 뒷부분까지 더 스크롤 되는 경향 말이다.
아이폰 특유의 냄새가 나는 부분이지만 없앨려면 아래코드를 viewDidLoad 에 넣으면 된다.

for (id subview in webView.subviews){

if ([[subview class] isSubclassOfClass: [UIScrollView class]]){

((UIScrollView *)subview).bounces = NO;

}

}


출처 : http://cafe.naver.com/mcbugi/131260    맥부기카페 댓글
저작자 표시
신고
아래 코드는 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];
}

저작자 표시
신고