我试图将下载的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中写过它。所有这些都给了我相同的结果。
答案 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方法,我会收到链接器错误,这些错误似乎与原始问题无关,所以我不会解决。