Programming/iOS

[iOS/Swift] Auto Login 기능 구현(자동 로그인, UserDefaults 사용)

devssun 2017. 8. 5. 10:00
728x90
반응형


Swift Auto Login 기능 만들기

  • 지난번엔 로그인 기능을 해봤으니 이번에는 저장된 데이터로 자동로그인을 하는 기능을 구현해보자


To-do List

  1. Checkbox 버튼 만들기
  2. auto login 버튼 체크 후 로그인 성공 시 id, pwd 저장하기
  3. Logout 버튼 클릭 시 로그인화면 이동 & 저장된 id, pwd 삭제
  4. App 완전 종료 후 다시 켰을 때 리스트 화면으로 이동하기
    • 저장된 id가 있다면 리스트 화면으로 이동
    • 없다면 로그인 화면 띄우기

1. Button으로 체크박스 흉내내기

안드로이드에서는 따로 CheckBox라는 widget이 제공되어 편리했는데 xcode에서는 checkbox는 없고 button밖에 안보인다..

찾아보니 button을 커스텀하여 만들어야하는데 stackoverflow에서 조금 간단히 체크박스같은 버튼을 만들 수 있는 방법을 제시했다 (https://stackoverflow.com/questions/41344895/the-best-way-to-use-checkbox-ios-swift)


  • StoryBoard에서 설정하기
    • StoryBoard의 Button을 클릭한 후 Attribute inspector 메뉴로 이동
    • State Config > selected로 변경한 후 image항목에 적절한 이미지를 삽입한다
    • State Config > default로 변경한 후 이미지를 넣거나 배경 색상을 변경하는 식으로 버튼을 표시한다
  • 코드로 설정하기
    • btn_box.setBackgroundImage(UIImage(named: "box"), for: .normal)
    • btn_box.setBackgroundImage(UIImage(named: "checkBox"), for: .selected)
  • 버튼 클릭 시 선택된 상태 가져오기
    • 아래 코드는 storyboard와 viewcontroller에서 button을 연결한다
      @IBAction func autoLoginAction(_ sender: UIButton) {
          // auto login 선택 여부
          sender.isSelected = !sender.isSelected
          if sender.isSelected == true{
              isAutoLogin = true
          }else{
              isAutoLogin = false
          }
      }


2. auto login 버튼 체크 후 로그인 성공 시 id, pwd 저장하기 (UserDefaults 사용)

로그인에 성공한 id와 pwd를 저장해야하기 때문에 디바이스에 간단한 정보를 저장할 수 있는 UserDefaults를 사용하게 되었다

이 클래스는 안드로이드에서 SharedPreference와 비슷하다고 볼 수 있다


  • standard : Returns the shared defaults object. (공유할 기본 객체 리턴)
  • 데이터를 저장할 때는 func set(Any?, forKey: String)
  • 데이터를 가져올 때는 func data_type(forKey: String) 함수를 사용한다


  • auto login버튼이 체크된 상태에서 로그인까지 성공했다면 아이디와 비밀번호를 저장하도록 한다

    • set(저장할 데이터, 키값)
      if self.isAutoLogin{
        print("Auto Login")
        // 자동 로그인 선택 시 로그인 하면서 uid, pwd 저장
        UserDefaults.standard.set(self.id, forKey: "id")
        UserDefaults.standard.set(self.pwd, forKey: "pwd")
      }
    • 이제 아이디와 비밀번호는 공유 객체에 저장되어있다
  • 자동로그인을 위해 UserDefaults에 저장된 값 가져오기

    • id 키 값에 값이 있는 경우 전역변수 uid에 저장하여 parameter로 넘긴다 ()
      // UserDefaults에 값이 있는 경우 가져와서 parameter로 넘김
            if let userId = UserDefaults.standard.string(forKey: "id"){
                self.uid = userId
                self.pwd = UserDefaults.standard.string(forKey: "pwd")!
            }


3. Logout 버튼 클릭 시 로그인화면 이동 & 저장된 id, pwd 삭제

  @IBAction func logoutActionButton(_ sender: Any) {
        print("delete id, pwd")
        UserDefaults.standard.removeObject(forKey: "id")
        UserDefaults.standard.removeObject(forKey: "pwd")
    }


4. App 완전 종료 후 다시 켰을 때 바로 리스트 화면으로 이동하기

  • 마지막 단계, App을 완전 종료한 후 저장된 데이터를 가지고 로그인화면에서 다음화면으로 바로 이동하는 부분은 위에서 봤던 parameter로 uid와 pwd를 넘기는 과정과 유사하다

    • 화면이 로드됨과 동시에 확인하는 과정이 필요하므로 viewDidLoad()함수에 작성한다
    • id키 값이 있는 경우 로그인 콜백 메소드를 실행한다
    • getLogin() 함수에는 화면 전환을 위한 소스가 있다

      참고 : http://hyesunzzang.tistory.com/49

    override func viewDidLoad() {
          super.viewDidLoad()
          // Do any additional setup after loading the view, typically from a nib.
     
          // 값이 저장되어있다면 자동 로그인
          if let userId = UserDefaults.standard.string(forKey: "id"){
              getUserData { (success, response, error) in
                      self.getLogin(success: success, response: response, error: error)
              }
          }
      }
  • 지난번 HTTP 통신 예제에서는 loginAction에 데이터를 파싱하여 로그인 성공 시 화면 전환하는 소스를 통째로 넣었었다

  • 이번에 자동로그인을 하면서 viewDidLoad()안에도 긴 소스를 넣었는데 두 소스가 동일한 기능을 하기 때문에 따로 함수로 묶어두었다(getLogin())

완성!


반응형