다음을 통해 공유


Xamarin.iOS의 파일 시스템 액세스

Xamarin.iOS 및 System.IO .NET BCL(기본 클래스 라이브러리)의 클래스를 사용하여 iOS 파일 시스템에 액세스할 수 있습니다. File 클래스를 사용하여 파일을 만들고, 삭제하고, 삭제할 수 있으며, Directory 클래스를 사용하여 디렉터리의 콘텐츠를 만들거나, 삭제하거나, 열거할 수 있습니다. 파일 작업(예: 파일 내의 압축 또는 위치 검색)에 대해 더 높은 수준의 제어를 제공할 수 있는 서브클래스를 사용할 Stream 수도 있습니다.

iOS는 애플리케이션의 데이터 보안을 유지하고 악성 앱으로부터 사용자를 보호하기 위해 애플리케이션이 파일 시스템으로 수행할 수 있는 작업을 몇 가지 제한합니다. 이러한 제한은 애플리케이션 샌드박스일부로서 파일, 기본 설정, 네트워크 리소스, 하드웨어 등에 대한 애플리케이션의 액세스를 제한하는 규칙 집합입니다. 애플리케이션은 홈 디렉터리(설치된 위치) 내에서 파일을 읽고 쓰는 것으로 제한됩니다. 다른 애플리케이션의 파일에 액세스할 수 없습니다.

iOS에는 몇 가지 파일 시스템 관련 기능이 있습니다. 특정 디렉터리는 백업 및 업그레이드와 관련하여 특별한 처리가 필요하며, 애플리케이션은 iTunes를 통해 파일과 파일 앱(iOS 11 이후)을 공유할 수도 있습니다.

이 문서에서는 iOS 파일 시스템의 기능 및 제한 사항에 대해 설명하고 Xamarin.iOS를 사용하여 몇 가지 간단한 파일 시스템 작업을 실행하는 방법을 보여 주는 샘플 애플리케이션을 포함합니다.

몇 가지 간단한 파일 시스템 작업을 실행하는 iOS 샘플

일반 파일 액세스

Xamarin.iOS를 사용하면 iOS에서 파일 시스템 작업에 .NET System.IO 클래스를 사용할 수 있습니다.

다음 코드 조각에서는 몇 가지 일반적인 파일 작업을 보여 줍니다. 이 문서의 샘플 애플리케이션에 있는 SampleCode.cs 파일에서 모두 아래에서 찾을 수 있습니다.

디렉터리 작업

이 코드는 애플리케이션 실행 파일의 위치인 현재 디렉터리("./" 매개 변수로 지정됨)의 하위 디렉터리를 열거합니다. 출력은 애플리케이션과 함께 배포된 모든 파일 및 폴더의 목록입니다(디버깅하는 동안 콘솔 창에 표시됨).

var directories = Directory.EnumerateDirectories("./");
foreach (var directory in directories) {
      Console.WriteLine(directory);
}

파일 읽기

텍스트 파일을 읽으려면 한 줄의 코드만 있으면 됩니다. 다음은 애플리케이션 출력 창에 텍스트 파일의 내용을 표시하는 예제입니다.

var text = File.ReadAllText("TestData/ReadMe.txt");
Console.WriteLine(text);

XML serialization

전체 System.Xml 네임스페이스로 작업하는 것은 이 문서의 범위를 벗어나지만 다음 코드 조각과 같은 StreamReader를 사용하여 파일 시스템에서 XML 문서를 쉽게 역직렬화할 수 있습니다.

using (TextReader reader = new StreamReader("./TestData/test.xml")) {
      XmlSerializer serializer = new XmlSerializer(typeof(MyObject));
      var xml = (MyObject)serializer.Deserialize(reader);
}

자세한 내용은 System.Xml 및 serialization에 대한 설명서를 참조하세요. 링커에서 Xamarin.iOS 설명서를 참조하세요. 직렬화하려는 클래스에 특성을 추가 [Preserve] 해야 하는 경우가 많습니다.

파일 및 디렉터리 만들기

이 샘플에서는 클래스를 Environment 사용하여 파일 및 디렉터리를 만들 수 있는 Documents 폴더에 액세스하는 방법을 보여줍니다.

var documents =
 Environment.GetFolderPath (Environment.SpecialFolder.MyDocuments);
var filename = Path.Combine (documents, "Write.txt");
File.WriteAllText(filename, "Write this text into a file");

디렉터리를 만드는 프로세스는 다음과 같습니다.

var documents =
 Environment.GetFolderPath (Environment.SpecialFolder.MyDocuments);
var directoryname = Path.Combine (documents, "NewDirectory");
Directory.CreateDirectory(directoryname);

자세한 내용은 System.IO API 참조를 참조하세요.

JSON 직렬화

Json.NET Xamarin.iOS에서 작동하며 NuGet에서 사용할 수 있는 고성능 JSON 프레임워크입니다. Mac용 Visual Studio NuGet 추가를 사용하여 애플리케이션 프로젝트에 NuGet 패키지를 추가합니다.

애플리케이션 프로젝트에 NuGet 패키지 추가

다음으로 serialization/deserialization을 위한 데이터 모델 역할을 하는 클래스를 추가합니다(이 경우 Account.cs).

using System;
using System.Collections.Generic;
using Foundation; // for Preserve attribute, which helps serialization with Linking enabled

namespace FileSystem
{
    [Preserve]
    public class Account
    {
        public string Email { get; set; }
        public bool Active { get; set; }
        public DateTime CreatedDate { get; set; }
        public List<string> Roles { get; set; }

        public Account() {
        }
    }
}

마지막으로 클래스의 인스턴스를 Account 만들고 json 데이터로 직렬화하여 파일에 씁니다.

// Create a new record
var account = new Account(){
    Email = "monkey@xamarin.com",
    Active = true,
    CreatedDate = new DateTime(2015, 5, 27, 0, 0, 0, DateTimeKind.Utc),
    Roles = new List<string> {"User", "Admin"}
};

// Serialize object
var json = JsonConvert.SerializeObject(account, Newtonsoft.Json.Formatting.Indented);

// Save to file
var documents = Environment.GetFolderPath (Environment.SpecialFolder.MyDocuments);
var filename = Path.Combine (documents, "account.json");
File.WriteAllText(filename, json);

.NET 애플리케이션에서 json 데이터 작업에 대한 자세한 내용은 Json.NET의 설명서를 참조하세요.

특별 고려 사항

Xamarin.iOS와 .NET 파일 작업 간의 유사성에도 불구하고 iOS 및 Xamarin.iOS는 몇 가지 중요한 방법으로 .NET과 다릅니다.

런타임에 액세스할 수 있는 프로젝트 파일 만들기

기본적으로 프로젝트에 파일을 추가하는 경우 최종 어셈블리에 포함되지 않으므로 애플리케이션에서 사용할 수 없습니다. 어셈블리에 파일을 포함하려면 Content라는 특수한 빌드 작업으로 표시해야 합니다.

포함할 파일을 표시하려면 파일을 마우스 오른쪽 단추로 클릭하고 Mac용 Visual Studio 빌드 작업 > 콘텐츠를 선택합니다. 파일의 속성 시트에서 빌드 작업을 변경할 수도 있습니다.

대/소문자 구분

iOS 파일 시스템은 대/소문자를 구분한다는 것을 이해하는 것이 중요합니다. 대/소문자 구분은 파일 및 디렉터리 이름이 정확히 일치해야 하며 README.txtreadme.txt 다른 파일 이름으로 간주됩니다.

이는 Windows 파일 시스템에 더 익숙한 .NET 개발자에게 혼동될 수 있습니다. 이는 대/소문자를 구분 하지 않습니다. 파일, 파일파일 은 모두 동일한 디렉터리를 참조합니다.

Warning

iOS 시뮬레이터는 대/소문자를 구분하지 않습니다. 파일 이름 대/소문자가 파일 자체와 코드의 참조 간에 다른 경우 코드는 시뮬레이터에서 계속 작동하지만 실제 디바이스에서는 실패합니다. 이는 iOS 개발 중에 실제 디바이스를 초기 및 자주 배포하고 테스트하는 것이 중요한 이유 중 하나입니다.

경로 구분 기호

iOS는 슬래시 '/'를 경로 구분 기호로 사용합니다(백슬래시 '\'를 사용하는 Windows와 다릅니다).

이러한 혼란스러운 차이로 인해 특정 경로 구분 기호를 하드 코딩하는 대신 현재 플랫폼에 맞게 조정되는 메서드를 사용하는 System.IO.Path.Combine 것이 좋습니다. 이는 코드를 다른 플랫폼에 더 이식 가능하게 만드는 간단한 단계입니다.

애플리케이션 샌드박스

파일 시스템(및 네트워크 및 하드웨어 기능과 같은 기타 리소스)에 대한 애플리케이션의 액세스는 보안상의 이유로 제한됩니다. 이 제한을 애플리케이션 샌드박스라고 합니다. 파일 시스템의 관점에서 애플리케이션은 홈 디렉터리에서 파일 및 디렉터리를 만들고 삭제하는 것으로 제한됩니다.

홈 디렉터리가 애플리케이션 및 모든 데이터가 저장되는 파일 시스템의 고유한 위치입니다. 애플리케이션에 대한 홈 디렉터리의 위치를 선택하거나 변경할 수 없습니다. 그러나 iOS 및 Xamarin.iOS는 내부 파일 및 디렉터리를 관리하는 속성과 메서드를 제공합니다.

애플리케이션 번들

애플리케이션 번들은 애플리케이션을 포함하는 폴더입니다. 디렉터리 이름에 .app 접미사를 추가하여 다른 폴더와 구별됩니다. 애플리케이션 번들에는 실행 파일과 프로젝트에 필요한 모든 콘텐츠(파일, 이미지 등)가 포함됩니다.

Mac OS에서 애플리케이션 번들로 이동하면 다른 디렉터리에서 볼 수 있는 것과 다른 아이콘이 표시되고 .app 접미사가 숨겨집니다. 그러나 운영 체제가 다르게 표시되는 일반 디렉터리일 뿐입니다.

샘플 코드에 대한 애플리케이션 번들을 보려면 Mac용 Visual Studio 프로젝트를 마우스 오른쪽 단추로 클릭하고 Finder에서 표시를 선택합니다. 그런 다음 애플리케이션 아이콘을 찾아야 하는 bin/ 디렉터리로 이동합니다(아래 스크린샷과 유사함).

bin 디렉터리를 탐색하여 이 스크린샷과 유사한 애플리케이션 아이콘을 찾습니다.

이 아이콘을 마우스 오른쪽 단추로 클릭하고 패키지 콘텐츠 표시를 선택하여 애플리케이션 번들 디렉터리의 콘텐츠를 찾습니다. 콘텐츠는 다음과 같이 일반 디렉터리의 내용처럼 표시됩니다.

앱 번들의 콘텐츠

애플리케이션 번들은 테스트 중에 시뮬레이터 또는 디바이스에 설치되며, 궁극적으로 앱 스토어에 포함하기 위해 Apple에 제출됩니다.

애플리케이션 디렉터리

애플리케이션이 디바이스에 설치되면 운영 체제는 애플리케이션에 대한 홈 디렉터리를 만들고 사용할 수 있는 애플리케이션 루트 디렉터리 내에 여러 디렉터리를 만듭니다. iOS 8부터는 사용자가 액세스할 수 있는 디렉터리를 애플리케이션 루트 내에 배치 하지 않으므로 사용자 디렉터리에서 애플리케이션 번들의 경로를 파생하거나 그 반대의 경우도 마찬가지입니다.

이러한 디렉터리, 경로를 확인하는 방법 및 용도는 다음과 같습니다.

 

디렉터리 설명
[ApplicationName].app/ iOS 7 이하ApplicationBundle에서는 애플리케이션 실행 파일이 저장되는 디렉터리입니다. 앱에서 만드는 디렉터리 구조는 이 디렉터리에 있습니다(예: Mac용 Visual Studio 프로젝트에서 리소스로 표시한 이미지 및 기타 파일 형식).

애플리케이션 번들 내의 콘텐츠 파일에 액세스해야 하는 경우 이 디렉터리의 경로를 속성을 통해 NSBundle.MainBundle.BundlePath 사용할 수 있습니다.
문서/ 이 디렉터리를 사용하여 사용자 문서 및 애플리케이션 데이터 파일을 저장합니다.

이 디렉터리의 내용은 iTunes 파일 공유를 통해 사용자에게 제공될 수 있습니다(기본적으로 사용하지 않도록 설정됨). UIFileSharingEnabled Info.plist 파일에 부울 키를 추가하여 사용자가 이러한 파일에 액세스할 수 있도록 합니다.

애플리케이션에서 파일 공유를 즉시 사용하도록 설정하지 않더라도 이 디렉터리의 사용자로부터 숨겨야 하는 파일(예: 공유하려는 경우가 아니면 데이터베이스 파일)을 배치하지 않아야 합니다. 중요한 파일이 숨겨져 있는 한, 이후 버전에서 파일 공유를 사용하도록 설정하면 이러한 파일이 노출되지 않고 iTunes에서 잠재적으로 이동, 수정 또는 삭제되지 않습니다.

이 메서드를 Environment.GetFolderPath (Environment.SpecialFolder.MyDocuments) 사용하여 애플리케이션의 문서 디렉터리에 대한 경로를 가져올 수 있습니다.

이 디렉터리의 내용은 iTunes에서 백업됩니다.
도서관/ 라이브러리 디렉터리가 데이터베이스 또는 다른 애플리케이션에서 생성된 파일과 같이 사용자가 직접 만들지 않은 파일을 저장하는 데 적합합니다. 이 디렉터리의 콘텐츠는 iTunes를 통해 사용자에게 노출되지 않습니다.

라이브러리에서 고유한 하위 디렉터리를 만들 수 있습니다. 그러나 기본 설정 및 캐시를 포함하여 알고 있어야 하는 일부 시스템 생성 디렉터리도 이미 있습니다.

이 디렉터리의 내용(캐시 하위 디렉터리 제외)은 iTunes에서 백업됩니다. 라이브러리에서 만드는 사용자 지정 디렉터리가 백업됩니다.
라이브러리/기본 설정/ 애플리케이션별 기본 설정 파일은 이 디렉터리에 저장됩니다. 이러한 파일을 직접 만들지 마세요. 대신 클래스를 NSUserDefaults 사용합니다.

이 디렉터리의 내용은 iTunes에서 백업됩니다.
라이브러리/캐시/ Caches 디렉터리에서는 애플리케이션을 실행하는 데 도움이 되지만 쉽게 다시 만들 수 있는 데이터 파일을 저장하는 데 적합합니다. 애플리케이션은 필요에 따라 이러한 파일을 만들고 삭제해야 하며 필요한 경우 이러한 파일을 다시 만들 수 있어야 합니다. iOS 5는 낮은 스토리지 상황에서도 이러한 파일을 삭제할 수 있지만 애플리케이션이 실행되는 동안에는 삭제되지 않습니다.

이 디렉터리의 콘텐츠는 iTunes에서 백업되지 않습니다. 즉, 사용자가 디바이스를 복원하는 경우 존재하지 않으며 업데이트된 버전의 애플리케이션이 설치된 후에는 존재하지 않을 수 있습니다.

예를 들어 애플리케이션이 네트워크에 연결할 수 없는 경우 캐시 디렉터리를 사용하여 데이터 또는 파일을 저장하여 좋은 오프라인 환경을 제공할 수 있습니다. 애플리케이션은 네트워크 응답을 기다리는 동안 이 데이터를 빠르게 저장하고 검색할 수 있지만 백업할 필요가 없으며 복원 또는 버전 업데이트 후에 쉽게 복구하거나 다시 만들 수 있습니다.
tmp/ 애플리케이션은 이 디렉터리에 짧은 기간 동안만 필요한 임시 파일을 저장할 수 있습니다. 공간을 절약하려면 파일이 더 이상 필요하지 않은 경우 삭제해야 합니다. 애플리케이션이 실행되고 있지 않을 때 운영 체제에서 이 디렉터리에서 파일을 삭제할 수도 있습니다.

이 디렉터리의 내용은 iTunes에서 백업되지 않습니다.

예를 들어 tmp 디렉터리를 사용하여 사용자에게 표시하기 위해 다운로드한 임시 파일(예: Twitter 아바타 또는 전자 메일 첨부 파일)을 저장할 수 있지만, 보기가 완료되면 삭제될 수 있습니다(나중에 필요한 경우 다시 다운로드).

이 스크린샷은 Finder 창의 디렉터리 구조를 보여줍니다.

이 스크린샷은 Finder 창의 디렉터리 구조를 보여줍니다.

프로그래밍 방식으로 다른 디렉터리 액세스

이전 디렉터리 및 파일 예제는 디렉터리에 액세스했습니다 Documents . 다른 디렉터리에 쓰려면 다음과 같이 ".." 구문을 사용하여 경로를 생성해야 합니다.

var documents = Environment.GetFolderPath (Environment.SpecialFolder.MyDocuments);
var library = Path.Combine (documents, "..", "Library");
var filename = Path.Combine (library, "WriteToLibrary.txt");
File.WriteAllText(filename, "Write this text into a file in Library");

디렉터리를 만드는 것은 다음과 유사합니다.

var documents = Environment.GetFolderPath (Environment.SpecialFolder.MyDocuments);
var library = Path.Combine (documents, "..", "Library");
var directoryname = Path.Combine (library, "NewLibraryDirectory");
Directory.CreateDirectory(directoryname);

다음과 같이 디렉터리 및 tmp 디렉터리에 대한 Caches 경로를 생성할 수 있습니다.

var documents = Environment.GetFolderPath (Environment.SpecialFolder.MyDocuments);
var cache = Path.Combine (documents, "..", "Library", "Caches");
var tmp = Path.Combine (documents, "..", "tmp");

파일 앱과 공유

iOS 11에서는 사용자가 iCloud에서 파일을 보고 상호 작용할 수 있고 이를 지원하는 모든 애플리케이션에서 저장할 수 있는 iOS용 파일 브라우저인 파일 앱을 도입했습니다. 사용자가 앱의 파일에 직접 액세스할 수 있도록 하려면 Info.plist 파일에 새 부울 키를 만들고 다음과 같이 설정합니다true.LSSupportsOpeningDocumentsInPlace

Info.plist에서 LSSupportsOpeningDocumentsInPlace 설정

이제 앱의 문서 디렉터리를 파일 앱에서 검색할 수 있습니다. 파일 앱에서 내 iPhone으로 이동하고 공유 파일이 있는 각 앱이 표시됩니다. 아래 스크린샷은 샘플 앱의 모양을 보여줍니다.

iOS 11 파일 앱 내 iPhone 파일 찾아보기 샘플 앱 파일

iTunes를 통해 사용자와 파일 공유

사용자는 다음과 같이 원본 보기에서 iTunes 공유(UIFileSharingEnabled) 항목을 지원하는 애플리케이션을 편집 Info.plist 하고 만들어 애플리케이션의 문서 디렉터리에 있는 파일에 액세스할 수 있습니다.

애플리케이션을 추가하면 iTunes 공유 속성이 지원됩니다.

디바이스가 연결되고 사용자가 탭을 선택하면 iTunes에서 이러한 파일에 액세스할 수 있습니다 Apps . 예를 들어 다음 스크린샷은 iTunes를 통해 공유된 선택한 앱의 파일을 보여줍니다.

이 스크린샷은 iTunes를 통해 공유된 선택한 앱의 파일을 보여줍니다.

사용자는 iTunes를 통해 이 디렉터리의 최상위 항목에만 액세스할 수 있습니다. 하위 디렉터리의 내용을 볼 수 없습니다(컴퓨터에 복사하거나 삭제할 수 있지만). 예를 들어 GoodReader를 사용하면 사용자가 iOS 디바이스에서 읽을 수 있도록 PDF 및 EPUB 파일을 애플리케이션과 공유할 수 있습니다.

문서 폴더의 내용을 수정하는 사용자는 주의하지 않으면 문제가 발생할 수 있습니다. 애플리케이션은 이를 고려하고 문서 폴더의 파괴적인 업데이트에 탄력적이어야 합니다.

이 문서의 샘플 코드는 문서 폴더(SampleCode.cs)에 파일과 폴더를 모두 만들고 Info.plist 파일에서 파일 공유를 사용하도록 설정합니다. 이 스크린샷은 iTunes에 표시되는 방법을 보여줍니다.

이 스크린샷은 파일이 iTunes에 표시되는 방식을 보여줍니다.

애플리케이션에 대한 아이콘을 설정하는 방법 및 사용자가 만든 사용자 지정 문서 형식에 대한 자세한 내용은 이미지 작업 문서를 참조하세요.

UIFileSharingEnabled 키가 false이거나 없는 경우 파일 공유는 기본적으로 사용하지 않도록 설정되며 사용자는 문서 디렉터리와 상호 작용할 수 없습니다.

백업 및 복원

iTunes에서 디바이스를 백업하면 다음 디렉터리를 제외하고 애플리케이션의 홈 디렉터리에 생성된 모든 디렉터리가 저장됩니다.

  • [ApplicationName].app – 서명되었으므로 설치 후 변경되지 않은 상태로 유지해야 하므로 이 디렉터리에 쓰지 마세요. 코드에서 액세스하는 리소스가 포함될 수 있지만 앱을 다시 다운로드하여 복원되므로 백업이 필요하지 않습니다.
  • 라이브러리/캐시 – 캐시 디렉터리 백업할 필요가 없는 작업 파일을 위한 것입니다.
  • tmp – 이 디렉터리가 더 이상 필요하지 않을 때 생성 및 삭제되는 임시 파일 또는 공간이 필요할 때 iOS에서 삭제하는 파일에 사용됩니다.

많은 양의 데이터를 백업하는 데 시간이 오래 걸릴 수 있습니다. 특정 문서 또는 데이터를 백업해야 하는 경우 애플리케이션에서 문서 및 라이브러리 폴더를 사용해야 합니다. 네트워크에서 쉽게 검색할 수 있는 임시 데이터 또는 파일의 경우 캐시 또는 tmp 디렉터리를 사용합니다.

참고 항목

iOS는 디바이스가 디스크 공간에서 매우 낮게 실행될 때 파일 시스템을 '정리'합니다. 이 프로세스는 현재 실행되고 있지 않은 애플리케이션의 라이브러리/캐시 및 tmp 폴더에서 모든 파일을 제거합니다.

iOS 5 iCloud 백업 제한 준수

참고 항목

이 정책은 iOS 5(오래 전처럼 보이는)로 처음 도입되었지만 이 지침은 오늘날에도 여전히 앱과 관련이 있습니다.

Apple은 iOS 5를 사용하여 iCloud Backup 기능을 도입했습니다. iCloud Backup을 사용하도록 설정하면 애플리케이션의 홈 디렉터리에 있는 모든 파일(일반적으로 백업되지 않는 디렉터리 제외(예: 앱 번들 Cachestmp)이 iCloud 서버에 백업됩니다. 이 기능은 디바이스가 손실되거나 도난당하거나 손상된 경우 사용자에게 전체 백업을 제공합니다.

iCloud는 각 사용자에게 5Gb의 여유 공간만 제공하고 불필요하게 대역폭을 사용하지 않도록 하기 때문에 Apple은 애플리케이션이 필수 사용자 생성 데이터만 백업할 것으로 예상합니다. iOS 데이터 스토리지 지침을 준수하려면 다음 항목을 준수하여 백업되는 데이터의 양을 제한해야 합니다.

  • 사용자 생성 데이터 또는 다시 만들 수 없는 데이터만 문서 디렉터리(백업됨)에 저장합니다.
  • 쉽게 다시 만들거나 다시 다운로드 Library/Caches tmp 할 수 있거나(백업되지 않고 '정리'될 수 있는) 다른 데이터를 저장합니다.
  • 또는 tmp 폴더에 Library/Caches 적합할 수 있지만 '정리'하지 않으려는 파일이 있는 경우 다른 곳에 저장하고(예: Library/YourData) '백업 안 함' 특성을 적용하여 파일이 iCloud Backup 대역폭 및 스토리지 공간을 사용하지 못하도록 합니다. 이 데이터는 여전히 디바이스의 공간을 사용하므로 신중하게 관리하고 가능한 경우 삭제해야 합니다.

클래스를 사용하여 '백업 안 함' 특성이 NSFileManager 설정됩니다. 클래스가 있는지 using Foundation 확인하고 다음과 같이 호출 SetSkipBackupAttribute 합니다.

var documents = Environment.GetFolderPath (Environment.SpecialFolder.MyDocuments);
var filename = Path.Combine (documents, "LocalOnly.txt");
File.WriteAllText(filename, "This file will never get backed-up. It would need to be re-created after a restore or re-install");
NSFileManager.SetSkipBackupAttribute (filename, true); // backup will be skipped for this file

SetSkipBackupAttribute true 파일이 저장되는 디렉터리(디렉터리)Documents에 관계없이 백업되지 않는 경우입니다. 메서드를 사용하여 GetSkipBackupAttribute 특성을 쿼리할 수 있으며 다음과 같이 메서드를 SetSkipBackupAttribute false호출하여 다시 설정할 수 있습니다.

NSFileManager.SetSkipBackupAttribute (filename, false); // file will be backed-up

iOS 앱과 앱 확장 간에 데이터 공유

앱 확장은 포함된 앱과 달리 호스트 애플리케이션의 일부로 실행되므로 데이터 공유가 자동으로 포함되지 않으므로 추가 작업이 필요합니다. 앱 그룹은 iOS에서 다양한 앱이 데이터를 공유할 수 있도록 허용하는 메커니즘입니다. 애플리케이션이 올바른 권한 및 프로비저닝으로 올바르게 구성된 경우 일반 iOS 샌드박스 외부의 공유 디렉터리에 액세스할 수 있습니다.

앱 그룹 구성

공유 위치는 iOS 개발자 센터 인증서, 식별자 및 프로필 섹션에 구성된 앱 그룹을 사용하여 구성됩니다. 이 값은 각 프로젝트의 Entitlements.plist에서도 참조되어야 합니다.

앱 그룹을 만들고 구성하는 방법에 대한 자세한 내용은 앱 그룹 기능 가이드를 참조하세요 .

Files

iOS 앱과 확장 프로그램은 일반적인 파일 경로를 사용하여 파일을 공유할 수도 있습니다(올바른 자격 및 프로비저닝으로 올바르게 구성된 경우).

var FileManager = new NSFileManager ();
var appGroupContainer =FileManager.GetContainerUrl ("group.com.xamarin.WatchSettings");
var appGroupContainerPath = appGroupContainer.Path

Console.WriteLine ("Group Path: " + appGroupContainerPath);

// use the path to create and update files
...

Important

반환된 그룹 경로가 있는 null경우 자격 및 프로비저닝 프로필의 구성을 확인하고 올바른지 확인합니다.

애플리케이션 버전 업데이트

새 버전의 애플리케이션을 다운로드하면 iOS에서 새 홈 디렉터리를 만들고 새 애플리케이션 번들을 저장합니다. 그런 다음 iOS는 이전 버전의 애플리케이션 번들에서 새 홈 디렉터리로 다음 폴더를 이동합니다.

  • 문서
  • 라이브러리

다른 디렉터리를 복사하여 새 홈 디렉터리 아래에 배치할 수도 있지만 복사가 보장되지 않으므로 애플리케이션이 이 시스템 동작에 의존해서는 안 됩니다.

요약

이 문서에서는 Xamarin.iOS를 사용하는 파일 시스템 작업이 다른 .NET 애플리케이션과 비슷하다는 것을 보여 줍니다. 또한 애플리케이션 샌드박스를 도입하고 이로 인해 발생하는 보안 영향을 조사했습니다. 다음으로, 애플리케이션 번들의 개념을 살펴보했습니다. 마지막으로 애플리케이션에서 사용할 수 있는 특수 디렉터리를 열거하고 애플리케이션 업그레이드 및 백업 중에 해당 역할을 설명했습니다.