在 WatchKit OS2 中播放音频文件
Play Audio File in WatchKit OS2
正在从 phone 发送 MP3:
NSArray *pathArray = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES);
NSString *documentsDirectory = [pathArray objectAtIndex:0];
NSString *yourSoundPath = [documentsDirectory stringByAppendingPathComponent:@"MyMusic.mp3"];
NSURL *url = [NSURL fileURLWithPath:yourSoundPath isDirectory:NO];
[self.session transferFile:url metadata:nil];
我是如何尝试在手表上接收和播放文件的:
-(void)session:(WCSession *)session didReceiveFile:(WCSessionFile *)file {
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"URL%@" , file.fileURL.filePathURL);
NSDictionary *options = @{
WKMediaPlayerControllerOptionsAutoplayKey : @YES
};
[self presentMediaPlayerControllerWithURL:file.fileURL.filePathURL options:options completion:^(BOOL didPlayToEnd, NSTimeInterval endTime, NSError * __nullable error) {
if (!didPlayToEnd) {
NSLog(@"The player did not play all the way to the end. The player only played until time - %.2f.", endTime);
}
if (error) {
NSLog(@"There was an error with playback: %@.", error);
}
}];
});
}
此文件的 URL:
file:///var/mobile/Containers/Data/PluginKitPlugin/-------/Documents/Inbox/com.apple.watchconnectivity/------/Files/----/MyMusic.mp3
这是错误:
There was an error with playback: Error Domain=com.apple.watchkit.errors Code=4 "The requested URL was not found on this server." UserInfo={NSUnderlyingError=0x16d4fa10 {Error Domain=NSPOSIXErrorDomain Code=2 "No such file or directory"}, NSLocalizedDescription=The requested URL was not found on this server.}.
如何在 watchOS 2 中播放此文件?
要使手表应用能够播放音频文件,您必须将其移动到共享应用组容器。
您需要在 WatchKit
扩展程序和 WatchKit
应用程序之间启用共享应用程序组。
如果您没有将文件放在共享容器中,则预计音频播放会失败。在移动文件之前,您也不应离开回调队列,因为 WCSession 将在回调 returns.
时删除文件
这是 Apple 关于此主题的 tutorial that explains how to do it, and some information。
编辑:添加示例
一旦您为 WatchKit 应用程序和扩展程序启用了应用程序组容器,这样的事情应该会起作用:
- (void)session:(WCSession * __nonnull)session didReceiveFile:(WCSessionFile * __nonnull)file
{
NSLog(@"received file %@, metadata: %@", file, file.metadata);
NSFileManager *fm = [NSFileManager defaultManager];
NSError *error = nil;
NSURL *containerURL = [fm containerURLForSecurityApplicationGroupIdentifier:@"<YOUR APP GROUP HERE>"];
NSString *documentsPath = [containerURL path];
NSString *dateString = [[[NSDate date] description] stringByAppendingString:@"-"];
NSString *fileNameWithDate = [dateString stringByAppendingString:file.fileURL.lastPathComponent];
documentsPath = [documentsPath stringByAppendingPathComponent:fileNameWithDate];
if ([fm moveItemAtPath:[file.fileURL.path stringByExpandingTildeInPath] toPath:documentsPath error:&error]) {
if ([fm fileExistsAtPath:documentsPath isDirectory:nil]) {
NSLog(@"moved file %@ to %@", file.fileURL.path, documentsPath);
dispatch_async(dispatch_get_main_queue(), ^{
NSDictionary *options = @{ WKMediaPlayerControllerOptionsAutoplayKey : @YES };
[self presentMediaPlayerControllerWithURL:[NSURL fileURLWithPath:documentsPath] options:options completion:^(BOOL didPlayToEnd, NSTimeInterval endTime, NSError * __nullable playAudioError) {
if (!didPlayToEnd) {
NSLog(@"The player did not play all the way to the end. The player only played until time - %.2f.", endTime);
}
if (playAudioError) {
NSLog(@"There was an error with playback: %@.", playAudioError);
}
}];
});
} else {
NSLog(@"failed to confirm move of file %@ to %@ (%@)", file.fileURL.path, documentsPath, error);
}
} else {
NSLog(@"failed to move file %@ to %@ (%@)", file.fileURL.path, documentsPath, error);
}
}
正在从 phone 发送 MP3:
NSArray *pathArray = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES);
NSString *documentsDirectory = [pathArray objectAtIndex:0];
NSString *yourSoundPath = [documentsDirectory stringByAppendingPathComponent:@"MyMusic.mp3"];
NSURL *url = [NSURL fileURLWithPath:yourSoundPath isDirectory:NO];
[self.session transferFile:url metadata:nil];
我是如何尝试在手表上接收和播放文件的:
-(void)session:(WCSession *)session didReceiveFile:(WCSessionFile *)file {
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"URL%@" , file.fileURL.filePathURL);
NSDictionary *options = @{
WKMediaPlayerControllerOptionsAutoplayKey : @YES
};
[self presentMediaPlayerControllerWithURL:file.fileURL.filePathURL options:options completion:^(BOOL didPlayToEnd, NSTimeInterval endTime, NSError * __nullable error) {
if (!didPlayToEnd) {
NSLog(@"The player did not play all the way to the end. The player only played until time - %.2f.", endTime);
}
if (error) {
NSLog(@"There was an error with playback: %@.", error);
}
}];
});
}
此文件的 URL:
file:///var/mobile/Containers/Data/PluginKitPlugin/-------/Documents/Inbox/com.apple.watchconnectivity/------/Files/----/MyMusic.mp3
这是错误:
There was an error with playback: Error Domain=com.apple.watchkit.errors Code=4 "The requested URL was not found on this server." UserInfo={NSUnderlyingError=0x16d4fa10 {Error Domain=NSPOSIXErrorDomain Code=2 "No such file or directory"}, NSLocalizedDescription=The requested URL was not found on this server.}.
如何在 watchOS 2 中播放此文件?
要使手表应用能够播放音频文件,您必须将其移动到共享应用组容器。
您需要在 WatchKit
扩展程序和 WatchKit
应用程序之间启用共享应用程序组。
如果您没有将文件放在共享容器中,则预计音频播放会失败。在移动文件之前,您也不应离开回调队列,因为 WCSession 将在回调 returns.
时删除文件这是 Apple 关于此主题的 tutorial that explains how to do it, and some information。
编辑:添加示例
一旦您为 WatchKit 应用程序和扩展程序启用了应用程序组容器,这样的事情应该会起作用:
- (void)session:(WCSession * __nonnull)session didReceiveFile:(WCSessionFile * __nonnull)file
{
NSLog(@"received file %@, metadata: %@", file, file.metadata);
NSFileManager *fm = [NSFileManager defaultManager];
NSError *error = nil;
NSURL *containerURL = [fm containerURLForSecurityApplicationGroupIdentifier:@"<YOUR APP GROUP HERE>"];
NSString *documentsPath = [containerURL path];
NSString *dateString = [[[NSDate date] description] stringByAppendingString:@"-"];
NSString *fileNameWithDate = [dateString stringByAppendingString:file.fileURL.lastPathComponent];
documentsPath = [documentsPath stringByAppendingPathComponent:fileNameWithDate];
if ([fm moveItemAtPath:[file.fileURL.path stringByExpandingTildeInPath] toPath:documentsPath error:&error]) {
if ([fm fileExistsAtPath:documentsPath isDirectory:nil]) {
NSLog(@"moved file %@ to %@", file.fileURL.path, documentsPath);
dispatch_async(dispatch_get_main_queue(), ^{
NSDictionary *options = @{ WKMediaPlayerControllerOptionsAutoplayKey : @YES };
[self presentMediaPlayerControllerWithURL:[NSURL fileURLWithPath:documentsPath] options:options completion:^(BOOL didPlayToEnd, NSTimeInterval endTime, NSError * __nullable playAudioError) {
if (!didPlayToEnd) {
NSLog(@"The player did not play all the way to the end. The player only played until time - %.2f.", endTime);
}
if (playAudioError) {
NSLog(@"There was an error with playback: %@.", playAudioError);
}
}];
});
} else {
NSLog(@"failed to confirm move of file %@ to %@ (%@)", file.fileURL.path, documentsPath, error);
}
} else {
NSLog(@"failed to move file %@ to %@ (%@)", file.fileURL.path, documentsPath, error);
}
}