본문 바로가기
개린이 이야기

샌드박싱, NSCoder에 관하여

by iOS 개린이 2022. 6. 11.

1. 샌드박싱 : 미국에서 어린아이를 보호하기 위해 모래통에서만 놀도록 하는데서 유래한 보안 모델을 말한다. ios는 기본적으로 앱 마다 별도의 파일을 생성하여 공유되지 않도록 하고, 외부로부터 들어온 접근에 대해  보호되는 영역으로 시스템이 부정적으로 조작되는 것을 막는 보안 형태를 말한다.

 

-예시: a, b라는 두 개의 앱이 핸드폰에 깔려 있을 때 a에서 생긴 악성 소프트웨어가 b앱의 데이터들을 모두 망쳐놓으면 문제가 생기기 때문에 샌드박싱을 이용해 해결한다. 

 

1. nscoder :  공식문서에 따르면 "다른 개체의 보관 및 배포를 가능하게 하는 개체의 기초 역할을 하는 추상 클래스" 이다.

-개체의 보관은 "디스크에 개체 및 데이터 저장",

 개체의 배포는 "서로 다른 프로세스 또는 스레드 간의 개체 및 데이터 항목 복사" 이다.

 

2. nscoder를 통한 데이터 인코딩

-이전에 사용하던 NsUserDefaults는 표준 데이터만을 사용하여 데이터를 저장할 수 있었다. 하지만 우리가 저장하려는 데이터는 내가 custom한 사용자 정의 유형, 객체이기 때문에 NsUserDefaults를 사용할 수 없다.

 

-먼저 데이터들을 인코딩하여 저장할 파일 경로와 파일 네임을 정해준다. 

ex) let dataFilePath = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first?.appendingPathComponent("Items.plist")

 

-> 데이터를 encoding하여 Items.plist 파일에 저장할 수 있도록 하는 메서드를 만든다. 

ex) 

func saveItem() {

        let encoder = PropertyListEncoder()

        do{

            let data = try encoder.encode(itemArray).        //itemArray의 정보를  인코딩하여 저장하겠다.    
            try data.write(to : dataFilePath!)
            
        }catch{
            print("Error encoding item array, \(error)")
        }

        self.tableView.reloadData() //코드가 실행되는 시간 차 때문에 테이블 뷰의 셀을 다시 로딩.

    }

 

여기서 시뮬레이터를 돌려보면 Items.plist파일에 저장은 되지만 우리의 앱에서는 저장된 정보가 나오지 않기 때문에 인코딩하여 저장한 데이터들을 다시 디코딩하여 앱에 나올 수 있도록 하는 코드가 필요하다.

 

decoding을 위한 메서드를 만들고 viewdidload가 실행될 때 메서드를 실행하면 끝!

ex)

func loadItems() {

    if let data = try? Data(contentsOf: dataFilePath!){
           
         let decoder = PropertyListDecoder()
             do {
                itemArray = try decoder.decode([Item].self, from: data)

             }catch{
                print("Error decoding item array, \(error)")
             }

}

             

 

'개린이 이야기' 카테고리의 다른 글

모든 ios개발자가 알아야 할 중요한 사항  (0) 2022.08.13
Data base에 관하여  (0) 2022.06.11
수명주기에 관하여  (0) 2022.06.03
깃허브  (0) 2022.04.19
커맨드 라인  (0) 2022.04.14