83598


iOS 15.0.2 Xcode Version 13.1

UIDocumentPickerViewControllerを使ってiCloudドキュメント内にあるファイルを取得しようと試みています。
ファイルのURLは取得できるのですが、 そのURLからファイルを取り出そうとすると

[code]

    The file “example.txt” couldn’t be opened because you don’t have permission to view it.
    
[/code]

というエラーが出ます。

何かを許可すればできそうですが、何を許可すればいいのかなかなか調べてもわかりません。

[code]

    import UIKit
    import UniformTypeIdentifiers
    
    class ViewController: UIViewController,UIDocumentPickerDelegate{
    
        @IBOutlet weak var tv: UITextView!
        
        override func viewDidLoad() {
            super.viewDidLoad()
        }
        
        @IBAction func buttonAction(_ sender: Any) {
            var picker = UIDocumentPickerViewController(documentTypes: ["public.data"], in: .open)
            if #available(iOS 14.0, *) {
                picker = UIDocumentPickerViewController(forOpeningContentTypes: [UTType.text],asCopy: false)
            }
            picker.allowsMultipleSelection = true
            picker.delegate = self
            self.present(picker, animated: true, completion: nil)
            
        }
        
        func documentPickerWasCancelled(_ controller: UIDocumentPickerViewController) {
            print("cancelled")
            
        }
        
        func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentAt url: URL) {
    
            print(url)
            print(url.path)
    
            let urlString = url.path
            do {
                let t = try String(contentsOfFile: urlString)
                print(t)
                tv.text = t
            } catch{
                print("error ",error.localizedDescription)
            }
        }
    
    
[/code]

Info.Plistの画像  
[![Info.Plistの画像](https://i.stack.imgur.com/9GDix.png)](https://i.stack.imgur.com/9GDix.png)

Signing & capabilities image  
[![Signing & capabilities
image](https://i.stack.imgur.com/PJ6Zt.jpg)](https://i.stack.imgur.com/PJ6Zt.jpg)

ご回答いただけたら幸いですよろしくお願いします。


CC BY-SA 4.0
2021-11-12T23:08:53.477
83593
2021-11-13T07:22:45.053
43457
question
swift ios xcode icloud
UIDocumentPickerViewControllerでiCloudドキュメントにあるファイルが取得できない


> 何かを許可すればできそうですが、何を許可すればいいのかなかなか調べてもわかりません。

ご記載されたエラー`The file “...” couldn’t be opened because you don’t have permission
to view
it.`は非常に様々な原因で発生するので、許可絡みの設定を見直す必要もあるかもしれませんが、その前にSandBox外のファイルをアクセスする場合のお約束を守らないといけません。

[`UIDocumentPickerViewController`](https://developer.apple.com/documentation/uikit/uidocumentpickerviewcontroller)

> ### Working with External Documents
>
> ...
>
>   * The open and move operations provide security-scoped URLs for all
> external documents. Call the `startAccessingSecurityScopedResource()` method
> to access or bookmark these documents, and the
> `stopAccessingSecurityScopedResource()` method to release them. ...
>

ざっくり書くとこんな感じのコードになるでしょう。

(動作確認はしていませんので、必要に応じて細かい部分は描き直しが必要かもしれません。)

[code]

        func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentAt url: URL) {
    
            print(url)
    
            if url.startAccessingSecurityScopedResource() {
                defer {url.stopAccessingSecurityScopedResource()}
                do {
                    let t = try String(contentsOf: url) //*1 できるだけ`URL`型を直接使う
                    print(t)
                    tv.text = t
                } catch{
                    print("error ", error) //*2 `error.localizedDescription`よりも、単に`error`の方が情報量が多い
                }
            } else {
                print("startAccessingSecurityScopedResource() failed")
                //startAccessingSecurityScopedResource()が失敗した時の処理...
            }
        }
    
[/code]

このコード修正をしてもまだ何かしらのエラーが出るようでしたら、改めてInfo.plistの設定等調べてみる必要があるかもしれません。


CC BY-SA 4.0
2021-11-13T07:22:45.053
83598
2021-11-13T07:22:45.053
13972
83593
answer