Notice
Recent Posts
Recent Comments
Link
관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - swift] 4. Login정보 저장하기 (로컬) UserDefaults, Property List 본문

iOS 실전 (swift)/데이터베이스

[iOS - swift] 4. Login정보 저장하기 (로컬) UserDefaults, Property List

jake-kim 2020. 5. 5. 20:26

* property list와 UserDefaults의 쓰임

  - property list : 데이터가 많아서 따로 그룹을 묶어서 저장하는 경우, 비슷한 형식의 데이터 그룹이 반복되는 경우

       (user1@naver.com, user2@naver.com. ... 이런 데이터들은 "키"값의 유형이 name, password와 같이 유사하므로 .plist에 key값을          

        저장해놓고 사용하면 편리), UserDefaults는 key가 중복되면 value값이 지워지므로

 

  - UserDefaults : 앱 전체에서 사용되는 공통 데이터, 데이터 양이 적은 경우

 

cf) 데이터가 대규모이면 SQLite, Realm, core data사용

 

1. DB 활용

DB구성

2. UI 구성

3. 구현 (가급적이면 Property List의 템플릿 사용 - 4번 참고)

1) Create :

 - UserDefaults : 여러 계정명

 - Property List : 개인 개정 정보

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
/// "add acount" 버튼의 터치 이벤트
@objc func addAccount(_ sender: Any) {
    guard let name = name.text else {return}
    
    //////////////  UserDefaults ///////////
    let obj = UserDefaults.standard
    /// nil의 가능성이 있기 때문에 '??'연산자 이용
    var savedAccountList = obj.array(forKey: "accountList") ?? [String]()
    savedAccountList.append(name)
    
    obj.set(name, forKey: "selectedAccount")
    obj.synchronize()
 
 
    //////////////  Property List ///////////
    /// 저장될 이름 : "계정.plist"
    let customPlist = "\(self.name.text!).plist"
    
    /// .plist는 sandbox내에 존재, sandbox에는 디렉토리 전용 및 파일 전용이 따로 존재
    /// 첫 번째 인수 : 디렉토리 전용, 두 번째 인수 : 애플리케이션 범위, 세 번째 인수 : 전체 경로(true)인지 디렉토리명만(false)인지
    let paths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)
    
    let path = paths[0as NSString
    let plist = path.strings(byAppendingPaths: [customPlist]).first!
    let data = NSMutableDictionary(contentsOfFile: plist) ?? NSMutableDictionary()
        
    data.setValue(self.id.text!, forKey: "id")
    data.setValue(self.pw.text!, forKey: "password")
    data.setValue(self.name.text!, forKey: "name")
    data.setValue(self.age.text!, forKey: "age")
    
    data.write(toFile: plist as String, atomically: true)
    
    
    /// .plist 파일 확인
    print("plist = \n\(plist)")
}
 
 
생성된 파일

2) Read : 

  - Create와 동일하며 데이터를 가져오는 방법만 다름

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// viewDidLoad()
//////// read - 마지막에 로그인 했던 사용자의 정보 불러오기 /////
//////////////  UserDefaults ///////////
let obj = UserDefaults.standard
if let name = obj.string(forKey: "selectedAccount") {
    self.name.text = name
    let customPlist = "\(name).plist" /// file name for the read data
    
    //////////////  Property List ///////////
    let paths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)
    let path = paths[0as NSString
    let plist = path.strings(byAppendingPaths: [customPlist]).first!
    let data = NSDictionary(contentsOfFile: plist)
    
    /// 앱을 다시 실행시키면 name부분과 age부분이 이전에 실행했던 정보 그대로 등록
    self.name.text = data?["name"asString
    self.age.text = data?["age"asString
}
 
 

종료한 후 다시 접속한 결과 : 밑에 두 TF가 자동으로 표시

 

* Full Source Code

 

JK0369 - Overview

* contact : imustang7@naver.com, * blog : https://ios-development.tistory.com - JK0369

github.com

 

4. 템플릿 사용 : Property List에서 데이터 타입 지정

- 템플릿이 없다면 각 계정마다 다른 속성이 존재할 수 있기 때문에 통일성을 위해서 일종의 틀(Model)을 사용

아래 링크의 4번 참고

https://ios-development.tistory.com/76

 

[iOS - swift] 2. 프로퍼티 리스트(Property List)

1. 프로퍼티 리스트 1) 개념 - 객체 직렬화*를 위한 XML포맷에 맞추어 key-value형식으로 저장 (xcode project에서 info.plist역시 프로퍼티 리스트) - 주로 앱의 공통 데이터나 주요 설정 정보를 저장하는데 사용..

ios-development.tistory.com

Comments