팩트 설명.


0. UIWebView 에 Delegate 연결

0. webView:shouldStartLoadWithRequest:navigationType: 함수 선언

0. [[request URL] absoluteString] 으로 케치

0. 입맛대로 코딩




코딩



클라이언트 -


- (BOOL) webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {

    NSLog(@"%@", [request URL].absoluteString);

    

    if ([[request URL].absoluteString isEqualToString:@"appscheme://callNative"]) {

        /// 입맛대로 코딩 ///

 ...

    }

    return YES;

}




웹 -


<script type='text/javascript'>(function callNative(){window.location = 'appscheme://callNative';}());</script>





웹에서 버튼 호출 시 클라이언트가 처리해야 되는 부분이 있으면 이런식으로 호출을 하고 받을 수가 있다.


이건 어려운거 아니니 간단하게 테스트해봐도 된다.





이번에 어플 업데이트 하면서 아주 곤욕을 치룬 코드이다.


보면 아주 간단하지만. 이것때문에 일주일간을 몸져누울뻔했다.



코드는 아래와 같이 간단하게 되어 있다.



NSDictionary* infoDictionary = [[NSBundle mainBundle] infoDictionary];

NSString* bundleId = infoDictionary[@"CFBundleIdentifier"];

NSURL* url = [NSURL URLWithString:[NSString stringWithFormat:@"http://itunes.apple.com/lookup?bundleId=%@", bundleId]];

NSData* data = [NSData dataWithContentsOfURL:url];

NSDictionary* lookup = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];

     

if ([lookup[@"resultCount"] integerValue] >= 1){

     NSString* appStoreVersion = lookup[@"results"][0][@"version"];

     NSString* currentVersion = infoDictionary[@"CFBundleVersion"];

         

if (![appStoreVersion isEqualToString:currentVersion]) {

return NO;

}

}

return YES;



위 코드는 일반적으로 구글에서 검색해보면 나오는 코드이다.


여기서 핵심은 


1. [[NSBundle mainBundle] infoDictionary];

2. http://itunes.apple.com/lookup? 에서 받아오는 데이터와 주소


1번 같은경우는 우리가 만든 프로젝트의 BundleId를  가져오는 것이다.

2번은 해당 주소를 호출해 우리가 원하는 데이터를 가져오는 것이다.




그런데 이번에 이 부분을 업데이트 하면서 아주 곤욕을 치룬 일을 공유해본다.



이번에 대대적인 업데이트를 하면서


해당 코드를 추가하고 버전이 다르면 업데이트 팝업창을 호출하는 형식을 만들었다.



그런데!! 이게 왠말인가




 문제점 발견



출시가 되어도 업데이트 팝업창이 나오지 않는 현상을 발견했다.


처음에는 출시되고 동기화가 되는데에 좀 걸릴 수 있지 라고 생각하고 기다려보았다.

보통 출시되고 30분 ~ 2시간 이내에 동기화가 된다.


그래 마냥 기다리면 동기화가 되겠지하고 손놓고 기다리는데 퇴근할때까지 업데이트가 안되는걸 확인하고 


부랴부랴 해당 로그를 확인해본보았다.





현재 버전 : 2.0  

스토어에 업데이트 되는 버전 : 2.1


우선 테스트 한 순서


1. http://itunes.apple.com/lookup?bundleId="com.crazybrain.appstoreversion"

2. http://itunes.apple.com/lookup?id="12341234"

3. http://itunes.apple.com/lookup?bundleId="com.crazybrain.appstoreversion"&id=12341234

4. Mobile 에서 http://itunes.apple.com/lookup?id="12341234" 주소 호출

= Chrome 어플 에서 주소 호출

= Samsung Browser 어플 에서 주소 호출

= Daum 어플 에서 주소 호출

= Naver 어플 에서 주소호출



테스트 결과


1. version="2.0"

2. version="2.0"

3. version="2.1"

4. Mobile = Crhome 어플 [ version= "2.1" ]

= Samsung Browser 어플 [ version="2.1" ]

= Daum 어플 [ version="2.1" ]

= Naver 어플 [ version="2.0" ]



모냐 이거... 왜 다 다르냐... 이해할려고 해도 할 수 가 없는 현상...


* 이거는 읽으신분 중에 혹시 아시는분은 답변좀 달아 주셨으면 한다.




저렇게 불확실한거 그냥 서버에 DB만들어서 내가 버전체크해주는게 속 편하다는 생각에 그냥 서버 통신으로 우회..



그래서 필자는 버전체크를 중요치 않은 앱들은 위 방법을 쓰라고 추천해드리지만. 그게 아니면 내부적으로 버전체크하는게 좋다고 본다.





아.. 보기 좋게 만드는거는 나중에 해야겠다 지금은 자다가 빡침에 글올리느라 그냥 끄적끄적...

// [ 자료형 ] //







크게 달라지는건 없지만 

Objective - C는  C 를 더 쉽게 쓰기 위해 새로운 자료형들로 만들어졌다.




대표적인 예 

[ NSString, NSNumber, NSArray, NSDictionary, NSInteger, NSUInteger, BOOL, ENUM ]



다 알고 있고 많은 블로그에 자세한 설명이 있으니 자세한 설명은 제외하고 


가장 많이 쓰는 부분을 예시로 한번 해보자.



1. NSString



// - [ 빈 문자열 생성 ]

   [NSString string]; 



// - [ 문자열 초기화 ]

   mStr = [NSString stringWithString:@" 문자열 초기화 (stringWithString) "];

   mStr = [[NSString alloc] initWithString:@" 문자열 초기화 (initWIthString)"];



// - [ 문자열 길이 ]

mLength = [mStr length];



// - [ 문자열 합치기 ]

mStr = [mStr stringByAppendingString:mStrSub];    // -> mStr자신에 mStrSub 문자열 합치기 //

 


// - [ 문자열 비교 ]

BOOL mIsEqual = [mStr isEqualToString:mStrSub];  // -> return type [ BOOL ] //



// - [ 문자열 비교 ( 대 소문자 구분 )

mStr = @"One";

mStrSub = @"one";

NSComparisonResult mCompare = [mStr compare:mStrSub option:NSCaseInsensitiveSearch];


if (mCompare == NSOrderedSame) {

NSLog(" 같음 ");

}

 


// - [ 대문자로 변환 ]

mStr = [mStr uppercaseString];

 


 // - [ 소문자 변환 ]

mStr = [mStr lowercaseString];



 // - [ UTF - 8 형식 인코딩 ]

const char *mChr = [mStr UTF8String];



// - [ 인덱스까지 문자 추출 ] : (1~10) -> value : 5 = result : 1,2,3,4,5

mStr = [mStr substringToIndex:5];

 


// - [ 인덱스부터 문자열 끝까지 추출 ] : (1~10) -> value : 5 = result : 5,6,7,8,9

mStr = [mStr substringFromIndex:5];

 


 // - [ 문자열 검사 ]

mRng = [mStr rangeOfString:@"RngOfString"];

if (mRng.location == NSNotFound) { }



// - [ 문자열 형변환 ]

[mStr intValue];        // -> int 형

[mStr floatValue];     // -> float 형

[mStr doubleValue];    // -> double 형

[mStr longValue];     // -> long 형

[mStr charValue];     // -> char 형
 



NSString 자료형을 더 다양하게는 쓰겠지만 이정도만 알아도 많이안다고 할 수 있다.



내가 공부할때까지는 NSString 이었지만 더 확장한 NSMutableString 나왔다.


NSMutableString부분은 다음에 이어서 같이 해보자.





[ 중요 ] NSString 때문에 들어오신분들의 생각의 전환을 주기 위한 글


* 문자열 비교 시 여러가지 방법이 있다.


[ 비교할 문자를 변환하지 않고 비교하는 방법도 있고! ]

[ 모든 문자를 대문자로 변환 후 비교 하는 방법도 있고! ]

[ 모든 문자를 소문자로 변환 후 비교 하는 방법도 있고! ]

[ 띄어쓰기 검사 후 비교 하는 방법도 있고! ]

[ 앞에서 몇글자 추출 후 비교하는 방법도 있고! ]

[ 뒤에서 몇글자 추출 후 비교하는 방법도 있고! ]

[ 중간에서 몇글자 추출 후 비교하는 방법도 있고! ]

[ 빈문자열인지 비교하는 방법도 있고! ]

[ 문자열 길이가 같은지 다른지 비교하는 방법도 있고! ]







+ Recent posts