iTunes Mp3 添加通过 ObjC 中的脚本桥返回 Nil 和 Swift 并且不导入
iTunes Mp3 Add Returning Nil Via Scripting Bridge In ObjC and Swift And Doesn't Import
我正在尝试将下载的 MP3 导入 iTunes。我的应用程序适用于使用 Swift 的 OSX,并且我已经尝试在 Swift 代码和使用互操作性的 ObjC 中执行此操作。我使用 sdef 和 sdp 生成了 iTunes.h。我将它导入到我的桥接 Header 中用于 Swift 尝试,并在我的 .m 文件中用于 ObjC 尝试。我已将 Scripting Bridge 添加到我的构建中。
这是我在 Swift 或 ObjC 中的第一个程序(我的经验是在 C# 中)所以这可能是一些简单的东西,我没有经验来实现。
这是我的 ObjC 代码:
NSString *filepath = "~/Music/test.mp3";
iTunesApplication *iTunes = [SBApplication applicationWithBundleIdentifier:@"com.apple.iTunes"];
iTunesPlaylist *pl;
for (iTunesSource *source in sources) {
if([source kind] == iTunesESrcLibrary) {
SBElementArray *libraries = [source libraryPlaylists];
pl = [libraries objectAtIndex:1];
break;
}
}
iTunesTrack *track = [iTunes add:[NSArray arrayWithObject:[NSURL fileURLWithPath:filepath]] to: pl];
一切都编译并运行,但 iTunes 添加 returns nil(更重要的是,不添加到 iTunes)。我尝试过使用库中的不同播放列表,以及不同的来源。我试过使用不同的 MP3 文件。正如我所说,我也在 Swift 中编写了它。都给我一样的结果。
很明显我错误地获取了 MyMusic 的路径。你不能只使用波浪号,你必须解决它:
NSString *musicDirectory = [NSSearchPathForDirectoriesInDomains(NSMusicDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *filepath = [musicDirectory stringByAppendingPathComponent:@"test.mp3"];
或 Swift:
let fileManager = NSFileManager.defaultManager()
let urls = fileManager.URLsForDirectory(.MusicDirectory, inDomains: .UserDomainMask)
let musicDirectory: NSURL = urls.first as? NSURL
let filepath = musicDirectory.URLByAppendingPathComponent("test.mp3")
在这一点上,我也不再需要搞乱任何来源搜索,我可以将 nil 作为播放列表传递:
iTunesTrack *track = [iTunes add:[NSArray arrayWithObject:[NSURL fileURLWithPath:filepath], nil] to: nil];
我仍然需要一个 Objective C 包装实际添加方法,但是,它通过桥接头连接到 Swift 编程。如果我尝试直接使用 Swift 中的 add 方法,我会得到似乎与原始问题无关的链接器错误,所以我不会解决。
我正在尝试将下载的 MP3 导入 iTunes。我的应用程序适用于使用 Swift 的 OSX,并且我已经尝试在 Swift 代码和使用互操作性的 ObjC 中执行此操作。我使用 sdef 和 sdp 生成了 iTunes.h。我将它导入到我的桥接 Header 中用于 Swift 尝试,并在我的 .m 文件中用于 ObjC 尝试。我已将 Scripting Bridge 添加到我的构建中。
这是我在 Swift 或 ObjC 中的第一个程序(我的经验是在 C# 中)所以这可能是一些简单的东西,我没有经验来实现。
这是我的 ObjC 代码:
NSString *filepath = "~/Music/test.mp3";
iTunesApplication *iTunes = [SBApplication applicationWithBundleIdentifier:@"com.apple.iTunes"];
iTunesPlaylist *pl;
for (iTunesSource *source in sources) {
if([source kind] == iTunesESrcLibrary) {
SBElementArray *libraries = [source libraryPlaylists];
pl = [libraries objectAtIndex:1];
break;
}
}
iTunesTrack *track = [iTunes add:[NSArray arrayWithObject:[NSURL fileURLWithPath:filepath]] to: pl];
一切都编译并运行,但 iTunes 添加 returns nil(更重要的是,不添加到 iTunes)。我尝试过使用库中的不同播放列表,以及不同的来源。我试过使用不同的 MP3 文件。正如我所说,我也在 Swift 中编写了它。都给我一样的结果。
很明显我错误地获取了 MyMusic 的路径。你不能只使用波浪号,你必须解决它:
NSString *musicDirectory = [NSSearchPathForDirectoriesInDomains(NSMusicDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *filepath = [musicDirectory stringByAppendingPathComponent:@"test.mp3"];
或 Swift:
let fileManager = NSFileManager.defaultManager()
let urls = fileManager.URLsForDirectory(.MusicDirectory, inDomains: .UserDomainMask)
let musicDirectory: NSURL = urls.first as? NSURL
let filepath = musicDirectory.URLByAppendingPathComponent("test.mp3")
在这一点上,我也不再需要搞乱任何来源搜索,我可以将 nil 作为播放列表传递:
iTunesTrack *track = [iTunes add:[NSArray arrayWithObject:[NSURL fileURLWithPath:filepath], nil] to: nil];
我仍然需要一个 Objective C 包装实际添加方法,但是,它通过桥接头连接到 Swift 编程。如果我尝试直接使用 Swift 中的 add 方法,我会得到似乎与原始问题无关的链接器错误,所以我不会解决。