티스토리 뷰

노션으로 읽기 [스위리 사랑채 바로가기]

문제상황 & 원인

서버에서 내려받은 스킴값에 따라 카카오톡 플러스친구 화면으로 랜딩하는 기능을 만들고 있었다. 그런데 랜딩이 안된다? UIApplication.shared.canOpenURL(url:)로 확인해보니 false가 떠버린다. canOpenURL이 false가 뜨려면 (1) 스킴에 해당하는 어플리케이션이 설치되어 있지 않거나 (2) Info.plist에 스킴을 등록을 안했거나. 두 경우가 모두 아닌데... 왜 안될까? 브레이크포인트를 찍어보았다.

ㄷㄷ... 서버에서 값은 받는데 canOpenURL이나 open으로 URL을 넘겨줘야할 시점에는 URL = nil 이었던 것!

받는 스킴은 톡스킴://@플친문의/개인정보_수정 처럼 생겼는데... 한.글이 원인이었습니다;;^^

분석

원래 인터넷으로 전송이 가능한 문자는 ASCII 뿐인데, 한글은 ASCII 문자가 아니라서 전송 가능한 형태로 바꿔줘야 한다. 인코딩을 하게 되면 %XY 형태로  바뀌게 되는데 이때 XY는 아스키코드 2개를 조합한 값이다. 이게 ASCII도 원래 알파벳 표현을 위해 만든 8비트짜리 코드인데 한글은 16비트라 그냥 두개 합쳐서 16진수로 표현하는 것이라고 한다ㅋㅋㅋ

더보기

한글은 유니코드

유니코드는 아스키코드로 표현할 수 없는 문자들을 특정 키 값에 1:1로 매핑된 형태의 코드이다.

전 세계 모든 문자들이 특정 키 값에 매핑되어 있다.

암튼 도메인주소?input=스위리 뭐 이렇게 쓰면 스위리쪽이 %EC%8A%A4%EC%9C%84%EB%A6%AC로 변환되는 것! 일단 당장 문제의 원인은 알아냈고 인코딩이 필요하다는 사실도 알았는데~

 

자 근데여~

 

도메인주소?input=스위리에서 쓰인 ?는 query parameter를 연결하기 위한 문자일 수도 있는 것 처럼 어떤 의미를 갖기 때문에 인코딩에서 제외시켜야 할 수도 있다. 그럴 땐 당연히 예외처리를 해줘야 하는데 이 때 필요한 것이 addingPercentEncoding(withAllowedCharacters:) 인 것. (근데 뭔가 예외처리라는 부정적 어감이 드는 말 보다 allowed characters라니까 포용하는 것 같은데...)

사용법은 쓔퍼심플. 메소드를 통해 변환에서 제외시킬 문자들을 CharacterSet으로 넘겨주면 된다. 넘겨 줄 수 있는 CharacterSet에는 아래 보이는 것들이 있다. (물론, custom character set을 정의할 수도 있음)

 

urlPathAllowed랑 urlQueryAllowed를 많이 쓴다던데 아래와 같은 문자들을 인코딩에서 뺴준다.

  • urlPathAllowed : ! $ & \ ( ) * + - . / : = @ _ ~
  • urlQueryAllowed : ! $ & \ ( ) * + - . / : **;** = **?** @ _ ~

그러니까 예를 들어 ?를 query parameter를 쓰는데 urlPathAllowed로 인코딩을 해버리면 ?를 %3F 로 변환시켜버리겠지? 그러면 안되는거잖아!!!ㅋㅋㅋ 그러니 이럴 땐 urlQueryAllowed를 통해 변환하면 되는 것이다.

해결

자, 이상적인(?) 해결방법은 위에서 언급한 것 처럼 (+이 포스트의 제목처럼) addingPercentEncoding을 통해 인코딩을 해주는 것이다. 그러나~? 다양한 경우의 수를 고려해보았을 때 서버에서 처리해서 보내주는 것이 가장 바람직하다고 판명나서, 서버에서 encode 해서 보내주는걸로 해따…ㅎ 헿 서버 체고야 서버 짱이야 서버 짱짱맨 I 서브컨트롤 ♥️

(P.S. 이미 인코딩이 되어있는 문자열에 대해 addingPercentEncoding을 호출하면 안되기 때문에!)

참고문서

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함