Swift iCloud上のファイルURLをUserDefaultsに保存

概要

SceneDelegate.scene(_:openURLContexts:)、UIDocumentPickerViewControllerで取得したURLを次回使用したい。

やってしまった誤り

URL自体をUserDefaultsで保存。
読み出し後、ファイルのアクセス許可が取得出来ない。

対応

Apple Development Document

Providing Access to Directories
Save the URL as a Bookmarkに記載されいる。

Example

保存

1
2
3
4
5
6
7
8
9
do {
    let url = ★URL SceneDelegate.scene(_:openURLContexts:)で取得、UIDocumentPickerViewControllerで取得等★
    let bookmarkData = try url.bookmarkData(options: .minimalBookmark, includingResourceValuesForKeys: nil, relativeTo: nil)
    Log.info(bookmarkData.description)
    UserDefaults.standard.set(bookmarkData, forKey: "url")
}
catch let error {
    print(error.localizedDescription)
}

読み出し

1
2
3
4
5
6
7
8
9
10
11
12
13
if let urlData = UserDefaults.standard.data(forKey: "url") {
    do {
        var isStale = false
        let url = try URL(resolvingBookmarkData: urlData, bookmarkDataIsStale: &isStale)
        if isStale == true {
            ★異常処理 guardで抜けるとか★
        }
        print("UserDefaults:\(url)")
    }
    catch let error {
        print(error.localizedDescription)
    }
}

Swift

Posted by shi-n