web-dev-qa-db-ja.com

UIDocumentInteractionController "無効なスキーム(null)"

UIDocumentInteractionControllerを使用してドキュメントをプレビューしようとしています。このドキュメントは、私のアプリがWebからダウンロードした.xlsファイルです。私はこのエラーを受け取り続けます:

'UIDocumentInteractionController: invalid scheme (null).  Only the file scheme is supported.'

次のコードを使用します:

- (void) webServiceController:(WebServiceController *)webServiceController returnedArray:(NSMutableArray *)array {
    if ([webServiceController.webRequest isEqualToString: @"generateExcelFileForEmployee"]) {
        // start previewing the document at the current section index
        NSString *link = [[NSString stringWithString:array[0]] stringByReplacingOccurrencesOfString:@"AdminFunctions.php" withString:@"AdminFunctions.xls"];
        link = [[[link stringByReplacingOccurrencesOfString:@"\\" withString:@""]stringByReplacingOccurrencesOfString:@"/public/sites/" withString:@"http://"]stringByReplacingOccurrencesOfString:@"\"\\\"" withString:@""];
        NSLog(@"%@", link);
        NSData *urlData = [NSData dataWithContentsOfURL:[NSURL URLWithString:link]];

        NSArray   *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString  *documentsDirectory = [paths objectAtIndex:0];

        NSString  *filePath = [NSString stringWithFormat:@"%@/%@", documentsDirectory,@"AdminFunctions.xls"];

        BOOL isWriteSuccess = [urlData writeToFile:filePath atomically:YES];
        NSLog(@"%@", filePath);

        if(isWriteSuccess) //success
        {
            file = [NSURL fileURLWithPath:filePath];

            self.fileView = [self setupControllerWithURL:file usingDelegate:self];

            [self.fileView presentPreviewAnimated:YES];
        }
        else
        {
           NSLog(@"file not written");
        }
    }
}

- (UIDocumentInteractionController *) setupControllerWithURL: (NSURL*) fileURL usingDelegate: (id <UIDocumentInteractionControllerDelegate>) interactionDelegate {

    UIDocumentInteractionController *interactionController =
    [UIDocumentInteractionController interactionControllerWithURL: fileURL];
    interactionController.delegate = interactionDelegate;

    return interactionController;
}

- (UIViewController *) documentInteractionControllerViewControllerForPreview: (UIDocumentInteractionController *) controller {
    return self;
}

どちらのメソッドも、プレビューを表示するビューコントローラーに実装されています。ブレークポイントを設定すると、コンソールに6144バイトが含まれていると表示されるため、urlDataオブジェクトのデータを取得していることがわかります。これは、ダウンロードするドキュメントのサイズとまったく同じです。

私はしばらく静かにこれを探していましたが、これを解決する方法がわからないようです。 documentInteractionControllerのソースとしてlinkオブジェクトを入れようとしましたが、エラーは次のように変わります。

'UIDocumentInteractionController: invalid scheme (http).  Only the file scheme is supported.'

この問題をどのように克服できるかについてのコメントをいただければ幸いです。

22
Joris416

使用してみてください

// objC
file = [NSURL fileURLWithPath:filePath];
// Swift
file = URL.init(fileURLWithPath: filePath)

の代わりに

//objC
file = [NSURL URLWithString:filePath];
// Swift
file = URL.init(string: filePath)
55
Che