문제 상황

특정 화면에서 오류가 발생할 경우 카카오톡의 플러스 친구가 상담을 돕도록 플친 화면으로 랜딩 해주는 기능을 구현하고 있었음. 물론 플친에 대한 스킴은 서버에서 내려 주는 것.

그런데…

서버에서는 분명 값을 내려주는데 막상 클라 쪽에서 URL을 찍어보면 nil로 뜨는거야! 으으으으 왜 이러는데 나한테!

원인

정확한 스킴을 적을 수는 없지만 대충 톡스킴://@플친문의/개인정보_수정 이렇게 생긴 URL 때문이었지비ㅋㅋ 한.글.이 원인이었습니다 ^^ 다 영어쓰자 힘들다~ ^^

분석

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

암튼 도메인주소?input=스위리 뭐 이렇게 쓰면 스위리쪽이 %EC%8A%A4%EC%9C%84%EB%A6%AC로 변환됨.

자 근데여~

위에 적어놓은 예시처럼 query parameter를 연결하기 위한 ? 문자가 쓰일 수도 있고. 얘네는 어떤 의미를 갖기 때문에 인코딩이 되면 안된단 말이지?

그러면 예외처리가 필요함. 이때 필요한게 addingPercentEncoding(withAllowedCharacters:) 인 것~ (근데 뭔가 예외처리라는 부정적 어감이 드는 말 보다 allowed characters라니까 포용하는 것 같다…)

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

Screen Shot 2022-06-22 at 11.32.15 AM.png

urlPathAllowedurlQueryAllowed를 많이 쓴다던데?

그러니까 query parameter를 쓰는데 urlPathAllowed로 인코딩을 해버리면 ?를 %3F 로 변환시켜버리는거임! 이러면 안되는거잖아!!!!ㅋㅋ 그러니 urlQueryAllowed를 통해 변환하면 되지롱!

해결