Notice
Recent Posts
Recent Comments
Link
관리 메뉴

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

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

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

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

jake-kim 2020. 5. 5. 19:18

1. 프로퍼티 리스트

1) 개념

- 객체 직렬화*를 위한 XML포맷에 맞추어 key-value형식으로 저장

 (xcode project에서 info.plist역시 프로퍼티 리스트)

 

- 주로 앱의 공통 데이터나 주요 설정 정보를 저장하는데 사용

 

* 객체 직렬화 : 객체의 내용을 바이트 단위로 변환하여 파일에 기록하거나 네트워크를 통해 전달이 가능하도록 하는 것

 

2) 특성

 - 중복된 키를 사용하면 기존의 데이터는 지워지고 덮어쓰게 됨

 - 프로퍼티 리스트는 데이터 타입을 추상화하여 저장 : string은 추상화 데이터 타입 / String, NSString, CFSgtring은 구체화 데이터 타입

 

3) 저장 타입 (추상형을 사용하기 때문에 범용성 존재)

 - 문자열 : <string>

 - 숫자 : <integer>

 - 실수 : <real>

 - 배열 : <array>

 - 딕셔너리 : <dict>

 - 날짜, Base64* : <data>

 

* Base64 : 8bit로 된 바이너리 데이터 -> 아스키 코드

 

2. 프로퍼티 파일 생성(클릭으로 생성하는 방법)

1) 프로퍼티 리스트 파일 생성: cmd + N

2) key-value입력

key, value입력
xml 코드 확인 방법
xml확인

* 이렇게 정의한 프로퍼티 리스트파일들이 저장되는 공간의 영역은 App Bundle영역

 App Bundle영역은 Sandbox에 저장

 - iOS의 보안정책상 애플리케이션을 쓰고 읽을 수 있는 곳은 샌드박스(sandbox), 샌드박스는 보통 애플리케이션 영역 내부에 지정

3. 프로퍼티 파일 생성(programmatically) 및 사용

1) 생성 및 저장

디렉토리 직접 접근 (선호 : .plist파일을 새로 생성할 수 있기 때문)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 
        /// 저장될 이름 : "계정.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) 파일 확인

디렉토리 확인 : .plist파일 전까지 복사

 

cd 경로명 후 ls- al로 데이터 확인


생성된 파일 확인


내용확인 : cat 파일명


XML형식으로 만들어진 것을 확인


2) 데이터 read

// get path
let paths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true) 
let path = paths[0] as NSString 
let plist = path.strings(byAppendingPaths: ["data.plist"])[0] 
let data = NSmutableDictionary(contentsOfFile: plist)

// read
let name = data?.value(forKey: "이름") as? String 
let age = data?.value(forKey: "나이") as? Int 


출처: https://effectivecode.tistory.com/615 [Mr.후]

 

4. 사용 (Bundle.main으로 접근 - 템플릿에 접근하는 방법) 

- Property List에서 데이터 타입을 지정(Model)하여 이 템플릿을 사용하는 방법

1) 템플릿 정의

 

2) User.plist파일 참조, read

 - plist파일이 저장되는 곳인 Bundle영역 접근, 3번라인

1
2
3
4
5
6
7
8
9
10
11
12
/// Property List Template Method
self.defaultPlist = NSDictionary() /// var defaultPlist: NSDictionary!
if let defaultPlistsPath = Bundle.main.path(forResource: "User", ofType: "plist") {
    
    self.defaultPlist = NSDictionary(contentsOfFile: defaultPlistsPath)
    
    /// 최초로 받을 땐 NSDictionary, 새로운 객체는 수정이 가능하게끔하기 위해 Mutable사용
    let data = NSMutableDictionary(contentsOfFile: defaultPlistsPath) ?? NSMutableDictionary(dictionary: self.defaultPlist)
    
    // data.setValue(...)
    // data.write(toFile: defaultPlistsPath, atomically: true)
}
 
 
 

 

Comments