[iOS] ファイルのsecurity scopeについて

iOSのアプリはSandboxの中で動作しているため、自らのSandboxの外にあるファイルには通常アクセスできない。
この制限を超えるにはUIDocumentPickerViewControllerUIDocumentBrowserViewControllerから返されるURLを利用する必要がある。
このURLにはシステムからファイルへの一時アクセス許可が付与されており、url.startAccessingSecurityScopedResource()url.stopAccessingSecurityScopedResource()を用いてurlのデータにアクセスすることができる。

ファイルへのアクセス許可はアプリを再起動すると失われるため、URLへ永続的にアクセスするにはurl.bookmarkData()を用いてData型のsecurity scoped bookmarkを取得しておく必要がある。

以下サンプルコード(WWDC2018 Managing Documents In Your iOS Appsより抜粋)

let bookmarkdata = try? url.bookmarkData()

var bookmarkdataisstale = false
var documentURL = try? URL(resolvingBookmarkData: bookmarkData,
                           bookmarkDataIsStale: &bookmarkDataIsStale)

参考文献