프로젝트를 하고 있다. 토착 왜구 박멸을 위한 각시탈 프로젝트..! 내일중이면 배포할 수 있을까..?
해당 프로젝트에는 mail 보내기 기능이 있다. iOS에서 기본 메일 앱을 띄우고 사라지게 하는건 코드 몇 줄으로 가능한 간단한 작업이다. 그런데 갑자기 잘 되던 기능이 언젠가부터 안되기 시작했다.
이 글은 다시는 그런 삽질을 하지 않기 위한 자아 성찰의 글..
기본 환경
우선 메시지를 보내기 위한 protocol을 작성했다.
이제 아래와 같이 사용하면 된다
문제 발생
그런데 어느 순간부터 MFMailComposeViewControllerDelegate
의 아래 함수가 작동하지 않는 에러 발생하기 시작했다.
optional func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?)
연쇄적으로 해당 함수 안에 있는 controller.dismiss
가 동작을 안했고 메일앱은 뜨는데 당최 사라지질 않았다. 그야말로 대환장 파티..!
문제 해결 시도
우선 새로운 프로젝트를 생성해서 똑같은 코드로 돌려봤더니 제대로 동작하는걸 확인할 수 있었다. Xcode오류인가..? 이상한 데이터가 쌓여서 그런가..? 싶은 마음에 cmd+k
를 통해 프로젝트를 clean 시키고, DerivedData
를 삭제했다. 결과는? 같았다.
그 다음에는 git history를 따라가며 추적을 시작했다. 그리고 mail이 사라지지 않는 commit log를 찾았는데 도대체 왜 여기서부터…?라는 생각이 들었다.
커밋 메시지와 파일을 보면 알 수 있듯 메일과는 1도 관련없는 네트워크를 위한 구조를 작성한 부분이다.
근데 실행을 시킬때 그전 커밋에서는 안나타났던 에러를 발견할 수 있었다. 해당 작업은 메일과 전혀 관련 없어보이지만 그래도 새로운 에러를 보니 여기가 맞겠구나.. 확신할 수 있었다.
문제 해결
해당 커밋에 포함되는 모든 파일들에 주석을 치고 하나하나 해제가면서 이 에러가 어디 파일이 생길때 나타난건지 추적한 결과 NetworkResult.swift
이 원인이 된걸 알 수 있었다.
근데 여기서..대체..왜..! 메일관련..문제가..!
그러다가 enum Error
을 enum NetworkError
로 Rename을 했다. 그러니까 뜬금없이 위에서 등장했던 MFMailComposeViewControllerDelegate
의 함수에 변화가 생겼다. 바로 파라미터 error: Error?
부분이 error: NetworkError?
로 바뀌어 있던것..!
optional func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?)
그렇다. enum Error
을 커스텀하게 만든 순간부터 해당 함수의 error 타입은 swift에서 기본으로 정의된 타입이 아닌 나의 custom 타입으로 참조 되고, 따라서 기존의 delegate에서 정의된 함수가 아니라고 판단했던 것..!
결론
ㅂㄷㅂㄷ…. 이 하나로 엄청나게 많은 시간과…..정신과……..흑흑.. 그래도 git history 보면서 어디서부터 에러났는지, 원인이 무엇인지 찾아가는 과정이 재밌..었다!
결론은 이름 잘 짓자!