iOS 13 では openURL で即時ファイルが開けなくなった
iOS 13 になって、ファイルの受け渡しがかなりシビアになっています。
- (BOOL)application🙁UIApplication *)app dataURL = inputURL; if (!inputURL.isFileURL) { return NO; } NSFileManager *fm = [NSFileManager defaultManager]; NSString *url2 = [inputURL absoluteString]; NSString *fileURL = [[[[url2 substringFromIndex:7] copy] stringByReplacingOccurrencesOfString:@"+" withString:@" "] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; NSError *error = nil; NSData *xdata = nil; if([fm isReadableFileAtPath:fileURL]) { if([inputURL startAccessingSecurityScopedResource]) { xdata = [NSData dataWithContentsOfURL:inputURL options:nil error:&error]; [inputURL stopAccessingSecurityScopedResource]; } else { xdata = [NSData dataWithContentsOfURL:inputURL options:nil error:&error]; } } else{ xdata = [NSData dataWithContentsOfFile:inputURL]; } |
例えばこんな実装にした場合。
ファイル共有で、データをこのアプリに受けわたすと
Error Domain=NSCocoaErrorDomain Code=257 |
の様になります。
しかし、この関数の中で
DocumentBrowserViewController *documentBrowserViewController = (DocumentBrowserViewController *)self.window.rootViewController;
[documentBrowserViewController revealDocumentAtURL:inputURL importIfNeeded:YES completion:^(NSURL * _Nullable revealedDocumentURL, NSError * _Nullable error) { if (error) { return; } [documentBrowserViewController presentDocumentAtURL:revealedDocumentURL]; }]; |
に渡せば、エラーにならずに処理することができます。
※しかし、revealedDocumentURLの対象を直接開こうとしてもエラーになります。
関数の呼び出し順序を調べてみたらこんな感じ(iOS 13.1.2)
viewDidLoad -> viewWillAppear ->openURL -> viewDidAppear
渡されたファイルの場所をopenURL 以前で開いてもエラーになるようだ。
iOS 12.3.1 で実行すると、関数の呼び出し順序は同じですが、appDelegate がreadable になっており、渡されたファイルが即時開けるのが分かります。
App unable to import files in iOS13 |Apple Developer Forums
情報がなくて 1週間試行錯誤してしまった ( ˘ω˘)
Comments