Day 26 개발일지 iOS - boostcamp-2020/Project03-A-TOTP GitHub Wiki

금요일 day 26

생체인증

생체인증 객체를 뷰의 프로퍼티로 선언했더니 뷰가 사라지기 전까지 계속 인증된 상태가 남아있게 되었다. 때에 따라서 프로퍼티로 가지고 있어야 할 필요가 있겠지만, 현재는 한번 이증된 결과가 남으면 안되기 때문에 프로퍼티로 갖고 있지 않는게 맞다. 그래서 객체를 생성하고 바로 함수를 호출하는 방식으로 바꾸어주었다.

그런데 좀 더 찾아보니 invalidate라는 함수가 있었다. 객체의 프로퍼티로 가지고 있어도 이 함수를 불러주면, 인증된 상태를 해제할 수 있는것이다. Apple Developer Documentation

앱의 라이프 사이클을 활용하여 인증 하기

inactive가 되면, 생체인증 검사를 할 수 있도록 백그라운드 뷰가 노출되는 로직을 실행한다. 그리고 다시 active가 되면 생체인증 검사 함수를 실행하여, 통과했을 때에만 다시 main로 돌아갈 수 있도록했다. 이 과정을 구현하여 앱의 라이프 사이클에 대해 더 깊은 이해를 할 수 있게 되었다.

이 때 root 뷰를 바꿔주는 방식을 사용했다. windowGroup에서 if문을 통해 현재 인증이 완료되었는지를 나타내는 상태값에 따라 다른 root뷰가 windowGroup에 반환되도록 했다.

Apple Developer Documentation

Deep Inside Views, State and Performance in SwiftUI

생체인증 후 이상한 토큰이 보이는 현상

생체인증을 하고 메인화면에 들어가 보니 이상한 토큰이 보이는 현상이 일어났다. 그래서 디버깅을 해보니, 메인 화면이 두 번 그려지는 것을 찾아내었다. 두 번 째 메인 화면이 그려질 때 이상한 값이 할당되어 그렇게 보이는 것 같았다.

StateObject

동현님이 저녁에 StateObject로 인해 무한 루프가 발생했다는 질문을 iOS 슬랙 질문 게시판에 올렸다. 우리와 상관없는 이야기였지만 한 번 StateObject와 ObservedObject의 차이점에 대해 공부해 보았다. 그런데 놀라운 사실을 알게 되었다. StateObject는 한번 뷰에 생성되면 그 후에는 다시는 생성되지 않는다. 하지만 ObservedObject는 뷰가 그려질 때 마다 다시 생성된다.

그래서 다시 한번 MainView를 살펴보았다. 놀랍게도 ObservedObject로 선언되어 있었다. 이것을 StateObject로 고쳤더니 메인 뷰 모델이 여러 번 생성되는 일이 더 이상 발생하지 않았다. 그리고 이상한 뷰가 보였던 버그도 고쳐졌다.

TokenCellView의 뷰모델을 StateObject로 선언했더니 아래처럼 이상한 메인뷰가 나오게 되었다. 이유는 진짜로 모르겠다.

image

키체인 저장 버그 발생

토큰 서비스에서 토큰 삭제 후, 남은 토큰이 0개가 아니라면 남은 토큰 중에 첫번째 토큰에 isMain을 true로 바꿔주는 로직이 있었다. 이를 로직을 실행하기 전에 남은 토큰의 개수가 0개인지 확인하고 0개면 이 로직을 실행하지 않고 return한다. 그런데 키체인 삭제 함수가 그 밑에 있어서, 0개 일 때에는 키체인에서 삭제가 되지 않았던 것이다. 위치만 바꾸어 주었더니 해결되었다.

HTTP Method Enum타입 추가

Alamofire에는 HTTPMethod가 enum타입으로 내장되어있는 점을 활용해 URLSession 로직에서도 enum을 추가해주어 간편하게 적용하였다. 그래서 Endpoint타입에는 .GET 과 같은 타입으로 지정해주어 아주 편리했다.

View에 네트워크 API 붙이기

아직 서버가 구축되어 있는 상황이 아니어서 API문서만으로 뷰에 API 붙이는 로직을 작성했다. 저번에 만들어놓았던 Requestable프로토콜을 채택해서 클래스를 만들었다.만약 세팅뷰라면 SettingNetworkManager라는 이름의 클래스로 작성했다. 여기에 받는 데이터를 지정하는것이 서버와의 커뮤니케이션이 아주 중요하다고 생각했다.그래서 message: 형식은 꼭 보내주는 것으로 결론지었다! 이로써 ResponseObject<String> 처럼 네트워크 데이터를 선언해주면 받는 데이터가 네트워크 오류로 인해 nil이더라도, message를 받을 수 있는 구조가 됐다.


개인 회고

(솔직히 쓰기 - 현재 파트너 또는 누군가가 본다고 생각하지 말고 미래의 내가 본다고 생각하며 쓰면 어떨까요??😏)

어진

  • 서버가 없는 채로 api를 붙인 경험은 처음이었다. 나는 항상 서버가 끝나야 내가 네트워킹 작업을 끝낼 수 있겠지 라는 생각으로 서버가 끝나기만을 내심 기다렸던 것 같다.
  • 이유는 서버의 api가 자꾸자꾸 바뀔 수가 있기 때문에 두 번 일해야 한다는 점 때문이었다. 그런데 이번에 붙이면서 바뀔 수 있을 것 같은 부분은 메모를 해 두며 개발했다.
  • 두 방법이 각각 장단점이 있겠지만, 어느정도 스스로는 구조를 머리속에 넣어놓고 있어야 바로 개발에 착수할 수 있다는 것이다!.. 천재 개발자가 되고싶다.

재명

  • 어떻게 해서든지 생체인증을 끝내고 싶어서 아침 해가 뜰 때까지 잠을 자지 못했다. 하지만 결국 실패했다.
  • 이런 상태에서 피어세션에 임하게 되었는데, 자꾸 버그들이 생각나고, 다른 팀들은 거의 구현이 끝나가는데 우리는 그러지 못한 것 같아서 불안한 마음이 커졌다. 그래서 피어세션에 집중도 못하고 계속 코드만 보고 있었다..!
  • 그렇게 우울한 마음으로 저녁을 먹고 누워서 쉬고 있었다. 그 와중에 핸드폰으로 슬랙을 보다가 동규님이 올려주신 질문을 보고 StateObject에 대해 공부해 보았다. 그런데 웬걸? 새벽까지 머리 싸매고 고민했던 버그가 이것 때문인 것 같았다. 그리고 바로 적용해보았고, 결국 해결했다.
⚠️ **GitHub.com Fallback** ⚠️