** 로그인 & 로그아웃 구현
=> 모바일이나 PC에서는 Web하고는 조금 다르게 구현
=> Web의 경우는 Session을 이용해서 로그인을 유지하는 경우가 많다.
모바일이나 PC용 애플리케이션은 Session이 없다.
로컬의 파일이나 데이터베이스를 이용해서 로그인 정보를 저장한다.
로그인을 할 때 로그인 정보를 파일이나 데이터베이스에 저장하고 로그아웃할 때 파일이나 데이터베이스의 데이터를 삭제하는 방식을 이용
=> 네비게이션 바의 오른쪽에 바 버튼을 만들어서 로그인 되어있으면 로그아웃 그리고 로그인되어 있지 않으면 로그인으로 출력하고 버튼을 누를 때 기능을 수행
로그인 정보를 login.txt 파일에 저장
1. ItemListVC.swift 파일에 바버튼 아이템을 눌렀을 때 호출될 메소드를 생성
//네비게이션 바의 버튼을 눌렀을 대 호출될 메소드
//sender는 이벤트가 발생한 객체 - 원래의 자료형으로 형변환해서 사용
@objc func login(_ sender:Any){
//로그인 여부를 저장할 파일의 경로를 생성
//도큐먼트 디렉토리 경로 만들기
let fileMgr = FileManager.default
let docPathURL = fileMgr.urls(for: .documentDirectory, in: .userDomainMask).first!
//파일 경로 만들기
let loginPath = docPathURL.appendingPathComponent("login.txt").path
//이벤트가 발생한 객체를 찾기
let barButtonItem = sender as! UIBarButtonItem
if barButtonItem.title == "로그인"{
//로그인 대화상자 만들어서 출력
let alert = UIAlertController(title: "로그인", message: "이메일과 비밀번호를 입력하세요!", preferredStyle: .alert)
//입력 부분 만들기
alert.addTextField(configurationHandler: {(tf) -> Void in tf.placeholder = "이메일을 입력하세요!!"})
alert.addTextField(){(tf) -> Void in
tf.placeholder = "비밀번호를 입력하세요!!"
tf.isSecureTextEntry = true
}
//버튼 추가
alert.addAction(UIAlertAction(title: "로그인", style: .default, handler: {(UIAlertAction) -> Void in
//입력한 내용 가져오기
let email = alert.textFields?[0].text
let pw = alert.textFields?[1].text
//POST 방식을 전송할 파라미터 만들기
let parameters = ["email":email!, "pw":pw!]
//파일 업로드가 없는 POST 방식 요청
let request = AF.request("http://cyberadam.cafe24.com/member/login", method: .post, parameters: parameters, encoding: URLEncoding.httpBody, headers: [:])
request.responseJSON{
response in
if let jsonObject = response.value as? [String:Any]{
NSLog(jsonObject.description)
}
}
}))
alert.addAction(UIAlertAction(title: "취소", style: .cancel))
self.present(alert, animated: true)
}else{
}
}
2. ItemListVC.swift 파일의 viewDidLoad 메소드에 바버튼 아이템을 추가하는 코드를 작성
//로그인 버튼을 배치
//로그인 저장 여부가 저장된 파일의 경로 만들기
let loginPath = docPath.appendingPathComponent("login.txt").path
//파일의 존재 여부로 버튼의 타이틀 설정
var buttonTitle : String!
if fileMgr.fileExists(atPath: loginPath) == true{
buttonTitle = "로그아웃"
//로그인 되어 있는 경우는 닉네님을 타이틀로 설정
let databuffer = fileMgr.contents(atPath: loginPath)
let loginText = String(bytes: databuffer!, encoding: .utf8)
//:을 기준으로 분할
let ar = loginText?.components(separatedBy: ":")
//두번째 문자열을 타이를로 ㅓㄹ정
self.title = ar![1]
}else{
buttonTitle = "로그인"
}