본문 바로가기

IOS

Property List(.plist) 1

최근에 회사 일과 관련한 문서 확인과 테스트, 그리고 실제 프로젝트에 반영을 해나가는 과정에서 관련 개체의 프로퍼티 또는 property list를 통해서 static key값을 set할 일이 있었고 plist를 다음과 같이 Source Code로 열어서 

Plist > Open As > Source Code

dict안에 key와 value type을 적고 해당 값을 넣어주는 형태로 값을 추가해보는 경험을 해봤습니다.

Source Code로 Open한 .plist file

 

일전에 바코드 인식을 위한 코드 작성시 카메라 접근에 관한 문구 안내도, http를 사용하기 위한 설정 값 등 앱을 만들면서 plist파일에서 별도로 Source Code로 열지 않고 Apple에서 제공하는 key에 사용할 value를 입력해서 사용을 했었는데 Source Code로 뭔가 커스텀한 key와 value를 set해보는 경험을 해보면서 'set이 되니 get도?'에서 Property list를 get set하기위한 방법에 대해 알아보게 됐습니다.

 

1. 

property list는 다음과 같이 Abstract type, Foundation framework class, Core Foundation type, XML element를 확인할 수 있습니다.

* Core Foundation type은 Xcode에서는 보여지지 않는 내용이라 관련한 것을 접하게 되면 관련 내용을 공부하고 추가하기로 하고 넘어가겠습니다.

* Abstract type은 Xcode의 .plist파일을 열었을 때 Type Column에 선택 가능한 목록과 일치합니다.

 

2.

property list는 Xcode에서 .plist라는 확장자의 파일이고, 프로젝트 생성시 Info.plist라는 파일이 같이 생성됩니다.

이 property list는 Info.plist외에도 별도로 다음과 같이 추가도 가능합니다.

 

3. 

코드로 프로젝트의 리소스에 접근은 Bundle을 통해 접근가능하고, 아래의 메서드들을 통해 파일의 URL을 얻어올 수 있습니다.

* Bundle에 대한 내용은 다른 글에서 다뤄보도록 하겠습니다.

 

 

4. 

여기서는 url(forResource:withExtension)을 통해 파일의 URL을 얻어와보도록 하겠습니다. 

파라미터는 아래와 같이 resource 파일의 이름과, 확장자 입니다.

 

5. 

기본적으로 생성되어 있는 Info.plist외에 새로운 property list파일을 2번과 같이 생성하는데 파일명은 testData로 하겠습니다.

* 저는 확장자를 숨기는게 기본인 세팅으로 되어있어서 확장자가 hidden처리되어있습니다. 관련 내용은 조금 검색해보시면 나옵니다.

 

6.

property list파일을 생성하면 다음과 Root, Type, Value가 보입니다.

 

7.

Root에 +를 누르면 다음과 같이 Root 아래로 입력할 수 있는 형태가 나타납니다.

testData > Open As > Source Code로 열어보면 다음과 같습니다.

 

여기서 공통적으로 보이는 것은 Property list Type Column의 Dictionary, String과 XML의 dict, key, string 입니다.

 

Property list에서 Column의 Type을 눌러보면 크게 Dictionary, Array 그리고 type들이 있는데 선택을 해봤을 때 변하는 것은 Typed을 Dictionary를 선택했을 때와 Array를 선택했을 때로 나뉩니다. 

 

위의 이미지는 Dictionary를 선택했을 때이고, Array를 선택하면 다음과 같습니다.

이는 Root의 Type 컬럼을 바꿨을 때의 예시이지만 Root의 타입을 선택하고, Root아래의 Item들도 Type을 Dictionary, Array 외 다른 타입으로 선택이 가능함을 확인할 수 있습니다.

 

여기서는 Root의 Type은 Dictionary 선택, Item은 String으로 해서 property list의 값을 get, set 해보도록 하겠습니다.

 

8.

다음과 같이 Root Type이 Dictionary인 경우 우리가 알고 있는 Dictionary가 key, value로 구성되어 있듯이 key, value를 set해줍니다.

 

9. 

loadFromBundle(_:)메서드를 만들고, 해당 메서드를 호출 시 다음과 같이 Bundle에서 파일의 url을 얻어오고, 해당 url을 통해 타입에 맞는 생성자를 통해 값을 얻어오도록 해보겠습니다.

 

func loadFromBundle() {
    guard let url = Bundle.main.url(forResource: "testData", withExtension: "plist") else { return }

    if let dictionary = try? NSDictionary(contentsOf: url, error: ()), let value = dictionary["testKey"] as? String {
        textLabel.text = value
    }
}

 

위의 메서드가 실행되면 다음과 같이 8번에서 property list에서 set한 값을 get해온 값이 label에 set됩니다.

* 이때, Property list에 보이는 Type은 1.번 내용에서 봤듯 Abstract Type이고, 관련한 타입은 NS로 시작하는 클래스 타입임에 주의해야합니다.

* 구조체인 String 타입을 포함해 Type Column에 있는 다른 타입 모두 관련한 타입의 생성자를 보면 url로 로드할 수 있는 생성자도 없음을 확인할 수 있습니다.

 

 

 

참고: 

Property list 공식문서

https://swieeft.github.io/2021/09/07/PropertyListRead.html

Kxcoding

 

'IOS' 카테고리의 다른 글

DispatchworkItem  (0) 2023.08.17
Property List(.plist) 2  (0) 2023.08.10