지난 WWDC에서 iOS 9가 발표되면서 apple developer 사이트에도 iOS 9 베타 버전이 공개되었는데요,


그래서인지 벌써부터 iOS 9 베타를 설치하시는 분들이 많이 계시더군요.


그런데 iOS 9로 업데이트한 후 운영 중인 앱이 사용할 수 없다는 VOC가 들어오더군요.


마침 xcode 7 베타 버전도 같이 공개되어 부랴부랴 다운로드 받아서 설치해 봤습니다.


시뮬레이터로 확인해 보니


App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure. Temporary exceptions can be configured via your app's Info.plist file.

CFNetwork SSLHandshake failed (-9824)

NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9824)

Error Domain=NSURLErrorDomain Code=-1022 "The resource could not be loaded because the App Transport Security policy requires the use of a secure connection."


secure connection 이 필요하다는 메시지가 나오네요.


검색을 해보니 iOS 9.0 이상에서는 ATS(App Transport Security)라는 기술이 나오네요.


결론은 app - web 간 connection 에서는 secure connection 이 기본값이라는 ....


그런데 서버가 특A급은 아니다 보니.... 아무래도 SSL 암복호화 부하를 무시할 수는 없어서....


로그인이 필요 없는 일부 기능만이라도  SSL을 좀 피해보려고....


관련 내용을 찾아 봤습니다.


찾아보니 info.plist 에서 예외 처리를 할 수 있더군요.


NSAppTransportSecurity > NSAllowsArbitraryLoads : true 로 설정하면 ATS 를 비활성화 할 수 있습니다.




또는





다시 리빌드 해보니 정상적으로 사용이 가능하네요.


조금이나마 도움 되시기를....


※ 참고


https://developer.apple.com/library/prerelease/ios/technotes/App-Transport-Security-Technote/index.html


https://github.com/facebook/react-native/issues/1563

  1. 마느링 2015.09.22 21:50

    본문에 NSAllowsArbitaryLoads -> NSAllowsArbitraryLoads 로 바뀌어야 할 것 같아요

    복사할수 있는 텍스트가 약간 잘못되있네요

    좋은 정보 감사합니다!!!!

    • hyshin 2015.09.30 11:51 신고

      지적 감사합니다 ^^ 바로 수정했습니다~ 조금이나마 도움 되셨기를 바랍니다 ^^

  2. 안드로이드 개발자 2015.11.06 18:12

    책보고 하는데 안되길래 서치해서 보게 되었습니다.
    저의 경우에 info.plist에 해당 key-value가 없어서 추가를 했습니다.
    추가할 수 있다는 것도 첨 알았네요

    잘 배우고 갑니다.~

    • hyshin 2015.11.17 17:50 신고

      댓글 감사합니다 ^^ 도움 되셨으면 다행이네요. 좋은 하루 되세요 ^^

API를 통해 JSON 데이터를 받아

version의 NEWIVERSION을 찾아 NSUserDefaults에 값을 저장하는 로직입니다.


    NSString *ver = [[mainInfoDict objectForKey:@"version"] objectForKey:@"NEWIVERSION"];

    if (ver != nil) {
        [[NSUserDefaults standardUserDefaults] setObject:ver forKey:@"NEWIVERSION"];
        [[NSUserDefaults standardUserDefaults] synchronize];
    }

그런데 API에 문제가 생겨 NEWIVERSION을 가져오지 못하게 되자

시뮬레이터에서 App이 죽는 현상이 발생하더군요.


Attempt to set a non-property-list object null as an NSUserDefaults/CFPreferences value for key NEWIVERSION

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Attempt to insert non-property list object null for key NEWIVERSION'


NEWIVERSION key를 갖는 값 자체가 존재하지 않다 보니

Null 객체 insert 오류가 생겼던 거 같습니다.


그래서 NSNull 객체 검사를 추가해 봤습니다. 


    NSString *ver = [[mainInfoDict objectForKey:@"version"] objectForKey:@"NEWIVERSION"];

    if (ver != nil &&
        ![ver isEqual:[NSNull null]]) {
        [[NSUserDefaults standardUserDefaults] setObject:ver forKey:@"NEWIVERSION"];
        [[NSUserDefaults standardUserDefaults] synchronize];
    }


이렇게 처리하고 나니 API에서 오류가 발생해도 App 중지 없이 실행할 수 있었습니다.



+ Recent posts