SSL 접속 테스트 TSLv1.0 ~ TSLv1.2 전체 접속 테스트를 진행 


$ nscurl --ats-diagnostics --verbose https://www.google.com/


관련 테스트를 통과하면 <Result: PASS>로 각 항목별로 표시됨.



어떤 ATS 방식으로 접속하는 지 확인을 하려면 curl을 이용


$ curl -v https://www.google.com/



XCODE에서 프로젝트를 하나 생성해서 작업하는데, 다음과 같은 로그가 콘솔에 계속 찍힌다.


nw_socket_set_common_sockopts setsockopt SO_NOAPNFALLBK failed: [42] Protocol not available


흠...이 것 말고도 로그가 좀 찍히기는 하는데, 아무튼 실행에는 문제가 없지만 거슬린다.



빌드 설정에서 다음과 같이 체크를 해준다. (Xcode 8.1에서 해결되었다고 하지만 실제로 해결되지 않았다. 증상이 반복됨)


>> http://stackoverflow.com/questions/37800790/hide-strange-unwanted-xcode-8-logs/39461256#39461256



일단 위와 같이 스킴 설정 화면에서 OS_ACTIVITY_MODE를 disable 로 체크해주니 사라졌다.

 


치과 의사는 독특한 사람이었다. 그는 기이한 방법으로 구강 마취를 시킨 환자의 이를 뽑으며 물었다.


"아파?"


그러나 환자는 대답 대신 회전의자의 팔걸이를 움켜쥔 채 눈을 크게 치켜뜨고 땀을 뻘뻘 흘렸다. 이따금 아프다거나 싫은 소리를 하기 위해 기를 쓰는 환자도 없지 않았지만 대부분 치과 의사의 완강한 손아귀에 제지당한 채 자못 위엄에 찬 욕설을 들어야 했다.


"젠장, 가만있지 못해! 이 손을 떼란 말이야. 아프다는 건 나도 잘 알아. 하지만 이게 다 누구 탓인데? 생각해 봐! 아픈 게 내 잘못이야? 이렇게 이가 썩고 아픈 것은 내가 아니라 이놈의 정부 탓이라고! 내 말 알아듣겠어?"


- 루이스 세풀베다의 '연애 소설 읽는 노인 중에서 



ㅋㅋㅋ 다시 읽어도 재미있네.


일반적으로 공공이나 일부 금융, 통신 프로젝트에서는 인터넷이 안되는 환경이 대부분이다.


이로 인해서 그래들 설정을 통해서 라이브러리를 적용하고 초기 환경을 구축하는 데에 애로사항이 발생하기도 한다.

(보통은 인터넷이 되는 PC에서 다운로드 후 파일서버에 올려서 내려받는 형태로 진행한다)


AsyncHttpClient라는 사용이 간편할 뿐 아니라 강력하고 유용한 통신 라이브러리를 사용하기 위해서 몇 가지 확인이 필요했다.


1.4.9 이상의 버전에서는 안드로이드 스튜디오에서 그래들 적용하면 큰 이슈가 없지만 로컬 사용 시에는 추가적인 라이브러리가 필요했다.


헤더 관련해서 랩핑한 cz.msebera.android 라이브러리를 추가하여 주었더니 정상적으로 작동이 되었다.



1) 그래들 Maven Repository 적용 시 (아래의 한 줄을 추가)


compile 'com.loopj.android:android-async-http:1.4.9'


2) 로컬 라이브러리 적용 시 (libs 폴더에 해당 파일을 담고 링크)


compile files('libs/android-async-http-1.4.9.jar')

        compile files('libs/httpclient-4.3.6.jar')



*. AsyncHttpClient 관련 이슈 (API23 부터는 httpClient 를 사용할 수 없음...사용하고 싶으면 라이브러리를 추가하여 사용)

http://stackoverflow.com/questions/29685395/android-asynchttpclient-unable-to-find-symbol-class-header


*. cz.msebera.android 라이브러리 관련 이슈를 확인

http://stackoverflow.com/questions/33028542/how-to-add-the-android-async-http-jar-in-eclipse-java-build-path




자바스크립트의 Promise 패턴에 대한 이야기가 있어서 한 번 검색해보았다.


작업을 하다보면 자꾸 내가 하는 영역을 벗어나서 작업을 해야 하는 경우가 빈번하다...혹은 다른 플랫폼이나 언어에서 좋은 것들을 다 가져다가 붙이기 일쑤이고, 제품을 사용하다보면 어쩔 수 없이 사용하게 되는 경우도 발생한다.


https://davidwalsh.name/promises


https://developers.google.com/web/fundamentals/getting-started/primers/promises


간단하게 읽어는 봤는데, 나중에 다시 한 번 읽어봐야 할 듯.

앱 위변조 제품이 바이너리를 서버에 등록하여 바이너리 사이즈와 info.plist 정보를 저장한 뒤 앱 실행 시 해당 정보를 비교하는 방식이었는데, 이런 형식의 존재 여부가 희미해졌다.


실제 바이너리가 디바이스나 OS 버전에 따라서 달라질 수 있다는 점 때문으로 실제 바이너리의 구성이나 파일 사이즈를 확인하지는 못했지만 이런 증상들이 계속된다고 한다.


그럼, 어떻게 iOS에서 이런 일이 발생하게 된 것일까? (안드로이드의 경우도 이런 형태로 단말에 최적화한 리소스와 바이너리를 구성하게 하는 방향으로 가고 있다.)


http://stackoverflow.com/questions/30722606/what-does-enable-bitcode-do-in-xcode-7

http://www.imore.com/app-thinning-ios-9-explained

http://lowlevelbits.org/bitcode-demystified/



관련해서 스택과 웹에서 관련 내용을 좀 찾아보았다.


관련 이슈는 앱의 용량을 줄이는 슬라이싱(App Slicing)이라는 이슈 아래에 몇 가지 형태의 이슈가 보인다.


아이폰의 경우 단말에 확장 메모리를 추가할 수 없고, 최소 사양의 단말은 항상 16기가 정도를 유지하고 있어서 OS의 업데이트 및 앱 다운로드에 이슈가 되어 왔다.


아마도 이런 문제점을 해소하고 용량의 제약을 해결하기 위해서 그리고 단말의 서로 다른 아키텍처 지원 등이 이슈가 되어 왔던 것 같다.



비트코드의 경우 iOS 9 (Xcode 7)부터 등장한 개념으로 다음과 같이 애플의 문서에 기술되어 있다.



  Bitcode is an intermediate representation of a compiled program. Apps you upload to iTunes Connect that contain bitcode will be compiled and linked on the App Store. Including bitcode will allow Apple to re-optimize your app binary in the future without the need to submit a new version of your app to the store. 





예상해보건대 내가 올린 바이너리를 각 디바이스의 아키텍처 맞도록 다시 컴파일해서 해당 디바이스에 맞도록 바이너리를 생성 후 사용자가 다운로드 받게 해주는 것이다.


내용을 좀 보완을 하자면 향후 추가되는 아키텍처가 있더라도 별도의 바이너리 빌드 후 업로드가 추가적으로 내가 빌드해서 올리지 않아도 될 수도 있다는 것이다.


스택의 글을 읽어보니 비트코드가 re-optimize라는 문구로 인해서 용량이 줄도록 해주는 지 혹은 용량과 관련없이 아키텍처에 최적화에만 맞춰져 있는지 유저간 이야기가 오가는 것을 볼 수 있다.


일단 내 생각에도 이 부분은 용량의 감소보다는 플랫폼에 해당하는 아키텍처에 따른 최적화가 아닐까 생각이 든다.


사용자가 아이튠즈(iTunes)를 통해서 앱을 내려받을 때 사용자의 단말에 적합한 아키텍처에 해당하는 바이너리를 내려줄 수 있다는 이야기인데, 여기에도 약간의 의문이 남는다.


사용자가 비트코드가 적용된 바이너리를 다운받고 사용하면서 iCloud 또는 iTunes 앱을 통해서 앱을 백업하고, 이를 이용하다가 단말의 변경(이전 아키텍처 폰으로 간다든지)할 때에도 모든 앱의 바이너리 적합성을 애플 서버에서 체크하는 지의 여부이다. (아마도 그렇게 구현되었을 것이라고 생각한다.)


만약에 애플이 바이너리를 디바이스에 적합하게 다시 바이너리를 내려준다면 앱 위변조가 사용된 앱들은 검증에 통과하지 못할 것이다.



또한 bitcode 설정이 되었다면 새로운 바이너리를 생성할 때 앱 슬라이싱에 대한 부분이 적용된다고 봐야 한다.


따라서 결국은 적합한 아키텍처를 위한 바이너리 생성을 위해서 bitcode도 앱의 파일 사이즈에 영향은 미치게 될 것이다.


아무튼, 앱 위변조 프로그램의 유용성을 생각해보다가 여기까지 왔는데...실제 이제 앱 위변조 프로그램의 역할이란 단순히 jailbreak를 체크하고 앱의 패키지와 빌드 버전 체크 정도가 아닐까 생각이 든다.


iOS에서는 백신도 앱 위변조도 크게 유용성을 갖지 못하는 것 같다.



iOS는 웹뷰에 문서를 띄워서 볼 수 있다.

웹 주소를 읽어서 문서를 띄울 수도 있고, 로컬 저장소(Document Directory 등)에 있는 파일을 웹뷰에 로드하여 볼 수도 있다.

대부분의 문서 양식(오피스 및 PDF, TXT 등)을 지원하지만 한글(HWP)은 웹뷰에서는 볼 수 없으므로 외부 프로그램을 호출하는 방식으로 열어야 한다.


    // 문서 로드

    NSURL *targetURL = [NSURL URLWithString:self.urlStr];

    NSURLRequest *request = [NSURLRequest requestWithURL:targetURL];

    [_webView loadRequest:request];

    

    // 저장 문서 로드

    NSArray *paths = NSSearchPathForDirectoriesInDomains( NSDocumentDirectory, NSUserDomainMask ,YES );

    NSString *documentsDirectory = [paths objectAtIndex:0];

    NSString *path = [documentsDirectory stringByAppendingPathComponent:self.fileName];

    [_webView loadRequest:[NSURLRequest requestWithURL:[NSURL fileURLWithPath:path]]];



Swift에서 하는 방법은 다음의 링크를 참고한다.





아이폰 작업 시 해상도 및 아이콘 사이즈 확인이 필요할 때 참고할 수 있는 사이트로 아이콘을 만들거나 UI 작업 시 유용하다.


User-Agent 정보를 변경하려고 해보니 다음과 같은 이슈가 있었다.


일반적으로 NSMutableURLRequest를 생성하고, 새로운 항목을 헤더에 추가하는 것은 이슈가 없다.


하지만, 기본적으로 헤더가 가지고 있는 항목인 User-Agent와 같은 경우는 기존의 값에 변경을 가하려면 이런 형태로는 수정한 값으로 반영이 되지 않는다.


    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:url]];

    [request setValue:@"test" forHTTPHeaderField:@"test"];

    [_webView loadRequest:request];



검색을 해보니 NSUserDefault에 UserAgent 값으로 수정할 값을 적용하면, 이후의 헤더 값에 User-Agent가 원하는 형태로 적용이 된다는 것이었다.


    NSDictionary *userAgentDictionary = [[NSDictionary alloc] initWithObjectsAndKeys:@"my user agent string",@"UserAgent", nil];

    [[NSUserDefaults standardUserDefaults] registerDefaults:userAgentDictionary];




그런데, 좀 문제가 발생했다.


웹뷰의 객체를 받아서 현재 웹뷰의 헤더 값을 읽어내고, NSUserDefault에 값을 적용하니 실제로 반영이 되지 않는 것이다. 웹뷰를 한 번 로드하면서 해당 값이 적용되어 버리는 듯이 보였다. 


그래서, 별도의 웹뷰 객체를 하나 생성해서 값을 얻어온 뒤에 저장하는 프로세스를 진행하고 현재의 웹뷰 컨트롤러의 웹뷰를 로드하니 내가 원하는 형태로 User-Agent가 저장되고 로드되었다.


- (void)setUserAgent {


    UIWebView *webView = [[UIWebView alloc] initWithFrame:CGRectZero];

    NSString *userAgent = [webView stringByEvaluatingJavaScriptFromString:@"navigator.userAgent"];

    userAgent = [NSString stringWithFormat:@"%@ MY_APP_NAME", userAgent];

    

    NSDictionary *userAgentDictionary = [[NSDictionary alloc] initWithObjectsAndKeys:userAgent,@"UserAgent", nil];

    [[NSUserDefaults standardUserDefaults] registerDefaults:userAgentDictionary];

    

    NSLog(@"userAgent: %@", userAgent);

}


이 형태의 함수를 앱 시작 시 호출하여 적용하니, 내가 원하는대로 기본 User-Agent에 앱 명을 추가한 형태로 로드 되었다.


*. 참조

1) Objective-C에서 설정 방법

http://stackoverflow.com/questions/478387/change-user-agent-in-uiwebview-iphone-sdk


2) Swift에서 설정 방법

http://stackoverflow.com/questions/26219997/how-can-i-set-the-user-agent-header-of-a-uiwebview-in-swift



OpenFire download

http://igniterealtime.org/downloads/index.jsp




How to uninstall Openfire from a Mac:

sudo rm -rf /usr/local/openfire
sudo rm -rf /Library/PreferencePanes/Openfire.prefPane
sudo rm -rf /Library/LaunchDaemons/org.jivesoftware.openfire.plist
sudo rm -rf /Library/Receipts/Openfire.pkg



간단하게 봉쥬르를 통해서 메시지를 전송할 수 있다.(로컬 네트워크 내에서)

http://apple.stackexchange.com/questions/97714/send-short-message-to-another-mac-on-the-lan



+ Recent posts