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 方法,我会得到似乎与原始问题无关的链接器错误,所以我不会解决。