iOS 13 では openURL で即時ファイルが開けなくなった

iOS 13 になって、ファイルの受け渡しがかなりシビアになっています。

- (BOOL)application🙁UIApplication *)app
  openURL🙁NSURL *)inputURL
  options🙁NSDictionary<UIApplicationOpenURLOptionsKey, id> *)options {

    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
"The file “sample.txt” couldn’t be opened because you don’t have permission to view it."
UserInfo={NSFilePath=/private/var/mobile/Library/Mobile Documents/com~apple~CloudDocs/Downloads/sample.txt,
NSUnderlyingError=0x28195c720 {Error Domain=NSPOSIXErrorDomain Code=1
"Operation not permitted"}}

の様になります。

しかし、この関数の中で

   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の対象を直接開こうとしてもエラーになります。

scr1019-1056
関数の呼び出し順序を調べてみたらこんな感じ(iOS 13.1.2)

viewDidLoad -> viewWillAppear ->openURL -> viewDidAppear
渡されたファイルの場所をopenURL 以前で開いてもエラーになるようだ。
 
scr1019-1111
iOS 12.3.1 で実行すると、関数の呼び出し順序は同じですが、appDelegate がreadable になっており、渡されたファイルが即時開けるのが分かります。

App unable to import files in iOS13 |Apple Developer Forums
情報がなくて 1週間試行錯誤してしまった ( ˘ω˘)
 

おすすめ

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です