[iOS] UIDocumentInteractionControllerで"Could not instantiate class NSURL."とか言われたしまった時

iOSの環境でUIDocumentInteractionControllerでファイルをシェアしようとした時にシェア用の画面は出るけど、その後エラーになってしまい保存できない問題がありました。

Could not instantiate class NSURL. Error: Error Domain=NSCocoaErrorDomain Code=4864 "The URL archive of type “public.url” contains invalid data." UserInfo={NSDebugDescription=The URL archive of type “public.url” contains invalid data.}

上記のエラーがでた原因がよく分からなくて悩んだので解決先です。

解決策

  • UIDocumentInteractionControllerのインスタンスはクラス変数で保持しておく

上記の事をしていないと、作成したUIDocumentInteractionControllerのインスタンスが開放されるのかうまく動作しません。
Googleで検索したサンプルコードをそのまま使うと、上記のパターンになっていてNGになる事があるので注意してください。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
class ViewController: UIViewController {
 
    var controller: UIDocumentInteractionController?
 
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }
 
 
    @IBAction func onTapButton(_ sender: UIButton) {
        showShareView(sender)
    }
 
    func showShareView(_ sender: UIView) {
        guard let image = UIImage(named: "start") else {
            print("画像ファイルを読み込めません")
            return
        }
        let data = image.pngData()
 
        // ファイル一時保存してNSURLを取得
        guard let url = NSURL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent("tmp.png") else {
            print("URLを作成できません")
            return
        }
        try! data?.write(to: url, options: .atomic)
 
        // UIDocumentInteractionControllerはクラスインスタンスで保持しておく
        controller = UIDocumentInteractionController(url: url)
 
        if !(controller!.presentOpenInMenu(from: sender.frame, in: view, animated: true)) {
            print("ファイルに対応するアプリがありません")
        }
    }
}

参考URL

0 件のコメント :

コメントを投稿