iTunes Mp3在ObjC和Swift中通过脚本桥添加返回Nil并且不导入

时间:2015-02-25 18:07:41

标签: objective-c swift itunes scripting-bridge

我试图将下载的MP3导入iTunes。我的应用程序是使用Swift的OSX,我已尝试使用互操作性在Swift代码和ObjC中执行此操作。我使用sdef和sdp生成了iTunes.h.我在我的Bridging 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];

Everything编译并运行,但iTunes添加返回nil(更重要的是,不会添加到iTunes)。我尝试过使用图书馆中的不同播放列表,以及不同的来源。我尝试过使用其他MP3文件。正如我所说,我也在Swift中写过它。所有这些都给了我相同的结果。

1 个答案:

答案 0 :(得分:0)

显然,我正在错误地获取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];

我仍然需要一个围绕实际add方法的Objective C包装器,然而,它通过Bridging Header连接到Swift编程。如果我尝试直接在Swift中使用add方法,我会收到链接器错误,这些错误似乎与原始问题无关,所以我不会解决。