8

私のアプリケーションには、多くの写真とビデオ ファイルを tmp フォルダーにダウンロードし、PHPhotoLibrary API を使用してカメラ ロールに保存する機能があります。

問題は、保存プロセスで時々 (確率は約 10%) 例外が発生することです。

コンソールのエラーメッセージは、

キャッチされていない例外 'NSInternalInconsistencyException' が原因でアプリを終了しています。

私のコードは以下のようなものです:

- (void)saveVideoFileInCameraRoll:(NSString *)videoFilePath
{
    NSURL *videoFileUrl = [NSURL fileURLWithPath:videoFilePath];

    photoLibrarySaveImageCompletion completion = ^(BOOL success, NSError *error) {
        NSLog(@"success=%@, error=%@", (success ? @"YES" : @"NO"), error);
    };

    NSLog(@"videoFileUrl=%@", videoFileUrl);

    [self saveVideoFile:videoFileUrl completion:completion];
}

- (void)saveVideoFile:(NSURL *)fileURL completion:(photoLibrarySaveImageCompletion)completion
{
    NSLog(@"fileURL=%@", fileURL);

    [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
        NSLog(@"fileURL=%@", fileURL);

        // Exception happens on this line as [SIGABRT]
        PHAssetChangeRequest *assetChangeRequest = [PHAssetChangeRequest creationRequestForAssetFromVideoAtFileURL:fileURL]; 

        if (_assetCollection) {
            PHAssetCollectionChangeRequest *assetCollectionChangeRequest =
                [PHAssetCollectionChangeRequest changeRequestForAssetCollection:self.assetCollection];
            [assetCollectionChangeRequest addAssets:@[ [assetChangeRequest placeholderForCreatedAsset] ]];
        }
        else {
            NSLog(@"### assetCollection is nil ###");
        }
    }

        completionHandler:^(BOOL success, NSError *_Nullable error) {
            NSLog(@"success=%@, error=%@", (success ? @"YES" : @"NO"), error);

            completion(success, error);
        }];
}

同様のケースを確認しました:

フォト フレームワークを使用してフォト ライブラリに画像を保存する

ケースは毎回クラッシュしますが、私のコードはめったにクラッシュしません。

そして、私が呼んでいる場合とは異なり

[PHAssetChangeRequest creationRequestForAssetFromVideoAtFileURL:]

'performChanges'ブロックで

また、NSLogでtmpフォルダ内の動画ファイルのfileURLを確認したところ、ブロック外でも'performChanges'ブロック内でもOKです。

fileURL=file:///private/var/mobile/Containers/Data/Application/C87F0F75-E128-4E9F-AE07-6B914939AC5D/tmp/video3.mp4

この問題の原因または解決策をお知らせいただければ幸いです。

4

0 に答える 0