私のアプリケーションには、多くの写真とビデオ ファイルを 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
この問題の原因または解決策をお知らせいただければ幸いです。