SHcommit / LearnMoreSwiftInUdemy

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

[Clone/Instagram] 전체적인 기능 개선, 에러 수정 | 새롭게 알게 된 개념 #9

SHcommit opened this issue · comments

전체적인 기능개선

  • 회원가입버튼 클릭시 파이어베이스에 등록하는 과정 시간 좀 걸려서 인디케이터 처리 완료
  • 반복적으로 메인 탭컨트롤러의 subController들이 호출되는 것 한번으로 개선
  • 로그인 화면 앱이 시작될 경우 메인 탭 바의 FeedVC 인스턴스 등록 안되는 버그 개선
  • 로그인 상태에서 로그아웃 후 다른 계정으로 로그인 시에 파이어베이스의 currentUser가 잘 작동이 안되서 프로필 VC의 프로필이 앱을 껏다 켜야 하는 갱신되는 버그 고침. (Auth.auth().currentUser 믿지 말것,,)
  • 프로필 이미지 다운로드 하는 것을 초기 로그인 때부터 비동기로 받아와 프로필VC를 클릭했을 때 거의 바로 보여도록 개선
  • 상대적으로 크기가 큰 프로필 이미지는 다운이 안되는 버그 수정

구현 영상

에러 수정(겪은 점)

앱 삭제하고 맨 초기에 로그인화면에서 로그인 후 mainTab컨트롤러의 first subviewController FeedVC 안 들어가지는 에러 수정.

현재 앱 상태를 간단히 요약.

UIWindow의 루트뷰 컨트롤러 디폴트는 메인 홈 탭 컨트롤러이다. 초기 앱이 실행되면 메인 홈 탭컨트롤러 뷰 로드 과정에서 파이어베이스에 사용자가 로그인 되어 있을 경우를 확인한다. 해당 정보를 홈 탭 컨트롤러 프로퍼티 userVM에 초기화 하면서부터 앱이 시작된다. userVM이 초기화 되면 tabController의 viewControllers의 뷰들이 등록되고 첫번째 뷰인 FeedVC가 로드된다. 메인탭컨트롤러의 subViewController들은 userVM에 정말 의존적이다. userVM값이 초기화 되야 서브컨트롤러들이 등록되기 때문이다.(파이어스토어에서 다운받는 방식이 살짝 느려서 미리미리 최소한의 사용자 데이터를 준비하기기 위해 이렇게 정했다.)

근데 만약 앱에서 (파이어베이스)로그아웃을 한 다음에 앱 종료 -> 다시 앱을 시작할 때 현재 사용자 로그인 기록이 없기 때문에 메인 홈 탭컨트롤러의 서브tabVC들이 초기화 되지 않는다. userVM이 초기화 되지 않았기 때문. 메인 홈탭컨트롤러 viewLoad 시점에서 LoginVC로 이동된다. 여기서 메인 홈 탭컨트롤러는 완전히 뷰가 로드되지 않은 채로 로그인 뷰 컨트롤러로 을 할 때 경고 메세지가 발생됬다.

    • Unbalanced calls to begin/end appearance transitions for <Instagram.MainHomeTabController: 0x12d02ca00>

여기서 약간 애매하고 난감한 상황이 발생됬다. 반드시 userVM이 초기화 되어야 메인 홈컨트롤러의 서브VC들이 추가되면서 FeedVC가 로드된다는 점인데... userVM이 초기화되기 위해서는 사용자가 파이어베이스에 로그인 되어있는지 확인해야 한다. 뷰가 메모리에 로드되는 viewDidLoad 시점에 사용자의 로그인 검사를 하고 로그인 화면으로 넘어가자니 위와 같은 경고 메세지가 발생 되지만 사용자의 로그인 화면은 불러와진다. 다시 LoginVC를 dismiss했을 경우에 메인 홈탭컨트롤러가 이상하게 초기화되서 그런지 흰 화면이 뜬다. 뷰 계층 구도를 봐도 FeedVC가 안 불러와 진다.( userVM초기화 델리게이트를 LoginVC에서 사용자의 로그인 성공시에 등록해줬지만 안됬다. 위의 경고메시지처럼 UIWindow에 루트뷰컨트롤러 등록할 때 오류가 난 것 같다는 생각이,,) viewWillAppear시점에 로그인 컨트롤러 화면 전환을 해도 역시 위와 같은 경고 메세지가 발생된다.(viewWillAppear까지 함수가 완료되야 비로소 메모리에 뷰가 로드되는 것 같다..아닌가? 더 알아봐야겠다.)

메인 홈 뷰가 완벽하게 초기화 된 이후에 사용자 로그인 검사를 하고 나서 로그인VC를 초기화 해야하는데 방법이 떠오르지 않아서 다양한 시도를 했다. 계속 씨름하던 중 좋은 방법이 떠올랐다. 원래 내가 구현한 로그인 확인 코드는 파이어베이스에서 사용자의 current 정보가 없는 경우에 무조건 로그인 화면으로 present하라는 함수를 선언했었다. isLogin 변수를 추가해서 메인 홈탭컨트롤러의 메모리 로드시점에서 사용자 로그인에 대한 bool 정보를 담고 뷰 로드가 완벽하게 된 후를 알 수 있는 방법은 변수들이 초기화 된 시점인 didSet을 통해서 해결할 수 있었다.. (하하)

로그아웃 후 다른 계정으로 로그인 시 로그인된 사용자의 계정 정보 업데이트 안되는것 고침
로그아웃 후 로그인시 UserService.fetchCurrentUserInfo(completion:)에서 current user데이터를 받아온다. 이때 사용되는 파이어베이스의 도큐먼트 key값인 uid를 Auth.auth().currentUser로 받아온다. 근데 이게 바로 바로 업데이트가 되지 않는다.(왜 그런진 모르겠다. 앱을 종료하거 재접속해야만 비로소 반영이 된다.) 그래서 아이디와 비밀번호로 로그인 할 때 (handleIsLoginAccount) 바로 반환받는 결과는 따끈따끈하게 방금 로그인 된 사용자의 uid를 얻을 수 있다. 이점을 이용했다.

현재 에러

계속적으로 확인해본 바 x

새롭게 알게 된 개념

Error Domain=FIRAuthErrorDomain Code=17008

  • 파이어베이스에서 이메일, 비번 만든 거 등록할 때 이메일은 이메일의 규칙을 지켜야한다.

NSLocalizedFailureReason" : "Password should be at least 6 characters"

  • 비번 만들 때 사용자는 최소한 6자리 넘게 만들어야 한다.

  • 한가지 궁금한 점은 파이어베이스에서 등록된 로그인 성공시에 result는 바로 사용자의 account 반영이 되는데 왜 Auth.auth().currentUser는 앱을 재시작 하기 전까지 이전 로그인된 계정 정보를 담고 있는 것일까?