iOSの環境でUIDocumentInteractionControllerでファイルをシェアしようとした時にシェア用の画面は出るけど、その後エラーになってしまい保存できない問題がありました。
```text
`gutter:false;
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になる事があるので注意してください。
```objc
`gutter:true;
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
- [アプリ間のファイル連携について](https://dev.classmethod.jp/articles/ui_documentinteraction_controller/)
- [サンプルコード](https://github.com/k28/ios-sample/tree/master/UIDocumentInteractionController-sample)
0 件のコメント :
コメントを投稿