iOS 17 업데이트
iOS 17이 릴리즈 되면서 여러가지 변화가 생겼는데요,
오늘은 그 중 iOS 17에서의 URL Parsing 에 대해서 간단하게 소개하고 넘어가려 합니다.
먼저
Apple의 URL 구문 분석은 RFC1738/1808 표준을 따랐었고
iOS 17부터 RFC3986으로 변경되었습니다.
이는 이전 버전 URL 문서 에 포함된 내용입니다 .
Important
For apps linked on or after iOS 17 and aligned OS versions, URL parsing has updated from the obsolete RFC 1738/1808 parsing to the same RFC 3986 parsing as URLComponents. This unifies the parsing behaviors of the URL and URLComponents APIs. Now, URL automatically percent- and IDNA-encodes invalid characters to help create a valid URL.
iOS 17 및 정렬된 OS 버전 이후에 링크된 앱의 경우, URL 파싱이 RFC 1738/1808 에서 URL Components와 동일한 RFC3986으로 업데이트 되었다는 내용입니다. 이에 따라 URL Components API 와 URL 의 파싱이 통합된다고 합니다.
이제 URL 은 자동으로 유효한 URL을 만드는 데 도움이 되도록 잘못된 문자를 백분율로 인코딩하고 IDNA를 인코딩 한다고 하네요 :)
전부 다 알아듣기는 힘들지만,
URL의 파싱방법이 변경되었고 이에 따라서 URL을 파싱할 때 잘못된문자를 nil이 아닌 인코딩한 값으로 인식한다는 뜻 같네요..!
(제가 이해한게 다른 점이 있다면 알려주세요...!)
RFC 1738 /1808?
정보처리기사 필기 공부할 때 봤었던 개념 같은데 Requests for Comments 의 약자입니다. 간단하게 말해서 인터넷 개발에 있어서 필요한 기술, 연구 결과, 절차등을 기술해 놓은 문서입니다. 거의 모든 인터넷 표준은 항상 RFC로 문서화가 되어있습니다. 따라서 HTTP 프로토콜 또한 이 RFC 문서에 따르겠죠?
뒤의 숫자는 앱의 버전을 적듯이, 이 문서의 수정과 발달에 따른 버전 같은 것이라고 생각하시면 될 것 같습니다..!
다시 돌아와서,
공식문서에 따르면 이전 방식의 URL parsing은 문제가 생길 수 있습니다.
왜냐하면 현재는 URL(string: "Invalid URL")
가 nil
이 아니기 때문이죠.
// iOS 16
let validURL = URL (string: "https://google.com" ) // -> https://google.com
let url = URL (string: "Not URL" ) // -> nil
// iOS 17
let validURL = URL (string: "https://google.com" ) // -> https://google.com
let url = URL (string: "Not URL" ) // -> Not %an%URL
이런 방식은 링크를 검색 문자열과 결합하여 공백과 키릴문자가 있는 방식에도 작동하는지 확인할 수 있습니다.
그렇지만 언제나.. 우리가 예상하지 못했던 케이스들도 생기겠죠?
예를들어,
// iOS 16
let validURL = URL (string: "https://naver.com/Swift is updated" ) // -> nil
// iOS 17
let validURL = URL (string: "https://naver.com/Swift is updated" ) // -> https://naver.com/%D0%BA%D0%BB%D1%8F%D1%82%D0%B0%20%D1%80%D1%83%D1%81% D0%BD%D1%8F
이렇게 URL의 nil 값을 체크하는 코드에서는 제대로 작동하지 않게 되겠죠.
위 코드는 iOS 16에서는 올바르게 작동하겠지만
iOS 17에서는 모든 문자열을 URL 로 인식하여 설정하게 되기때문에 문제가 생길 수 있습니다.
해결 방법
이러한 문제를 위해서 Apple이 새로운 파라미터를 업데이트했습니다
This initializer returns nil if the string doesn’t represent a valid URL even after encoding invalid characters. To check if a URL string is strictly valid according to the RFC, use the new init(string:encodingInvalidCharacters:) initializer and pass encodingInvalidCharacters: false. This leaves all characters as they are and returns nil if the URL string is explicitly invalid.
이 이니셜라이저 잘못된 문자를 인코딩한 후에도 문자열이 유효하지 않은 URL 을 나타내지 않은면 nil
을 반환합니다.
RFC에 따라서 엄격하게 유효한지에 확인하려면 새 initializer(string:encodingINcalidCharacters:)
를 사용하고 encodingInvalidCharacters
를 false
로 둡니다.
이 파라미터의 default 값은 true
입니다.
이렇게 하면 iOS17에서 업데이트 된 것과 같이 모든 문자열이 유지되고 만약 URL 이 유효하지 않다면 nil
을 리턴합니다.
// iOS 16
let url = URL(string: "Not an URL") // => nil
// iOS 17
let url = URL(string: "Not an URL", encodingInvalidCharacters: false) // => nil
다음과 같이 사용하면 iOS 17 업데이트 내용의 이점을 가져가면서도 이에 따른 유효하지 않은 URL 의 return 을 방지 할 수 있습니다!
encodingInvalidCharacters 의 디폴트 값은 true
이기 때문에 반드시 false처리를 해줘야 합니다.
여기까지 iOS 17 업데이트에서 URL parsing 에 관련된 업데이트 내용이었습니다!
도움이 되셨다면 좋겠습니다! 즐거운 개발하세요!
참고사이트
1. RFC
2. Handling a new URL parsing behavior in iOS 17
3. 애플공식문서
'Swift' 카테고리의 다른 글
[Swift / iOS ] 디자인 패턴 (MVVM, MVP, MVI에 대한 모든 것 ) - Hyeon's iOS 개발 (0) | 2023.12.14 |
---|---|
[Swift] 고차함수 Flatmap, CompatMap, map 의 사용 (0) | 2023.11.21 |
[Swift] ClosedRange (1) | 2023.10.23 |
[Swift] 라이노 님의 FileIO 코드 분석하기 (0) | 2023.10.03 |
[Swift] 정렬 메소드 sort( ), sorted( ) (0) | 2023.05.14 |