我目前正在尝试将视频文件保存到 iCloud。我正在使用 Core Data 为每个视频保存文件名字符串 (filename.MOV),然后从 ubiquity 容器中检索它们。这一切都在本地工作(文件保存,并且可以从他们的 URL 访问),但我正在努力通过 iCloud 获取视频。核心数据同步,所以我可以访问文件名,但是当我尝试从 URL 获取视频时,我无法。
这是我从 UIImagePicker 获取其 url(下面的 videoURL)并从当前日期创建一个唯一字符串后保存视频的方式:
NSString *videoFileName = [stringFromDate stringByAppendingPathExtension:@"MOV"];
NSURL *ubiquityContainer = [[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:nil];
NSURL *saveToURL = [ubiquityContainer URLByAppendingPathComponent:videoFileName];
BOOL ok;
ok = [[NSFileManager defaultManager] setUbiquitous:YES itemAtURL:videoURL destinationURL:saveToURL error:nil];
if (!ok) NSLog(@"error saving");
然后我有一个核心数据表视图来列出所有视频。在这里,我观察到核心数据与 iCloud 同步并重新加载的变化(这一切仍然正常):
- (void)viewDidLoad {
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(reloadFetchedResults:)
name:@"SomethingChanged"
object:[[UIApplication sharedApplication] delegate]];
}
- (void)reloadFetchedResults:(NSNotification*)note {
[self performFetch];
}
此时,我希望 ubiquity 容器更新,这样当我选择一个视频,并转到视图控制器观看它时,可以找到视频文件。(self.video 是我的核心数据视频实体)(资产是视频资产,我可以播放)
NSURL *ubiquityContainer = [[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:nil];
ubiquityContainer = [ubiquityContainer URLByAppendingPathComponent:self.video.url];
AVURLAsset *asset = [AVURLAsset URLAssetWithURL:ubiquityContainer options:[NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:AVURLAssetPreferPreciseDurationAndTimingKey]];
AVAssetTrack *videoTrack = [[asset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0];
这就是我遇到麻烦的地方。在我拍摄视频的设备上它可以工作,但在另一台设备上,找不到文件(objectAtIndex:0 超出范围)。
这是我在视图中调用的元数据查询确实加载了:
NSMetadataQuery * query = [[NSMetadataQuery alloc] init];
NSString * filePattern = [NSString stringWithFormat:@"%@", self.video.url];
[query setPredicate:[NSPredicate predicateWithFormat:@"%K LIKE %@",
NSMetadataItemFSNameKey, filePattern]];
[query startQuery];
我的元数据查询可能有问题,或者可能有更多问题。任何帮助将不胜感激!