我的程序使电台自动化。它和iTunes之间有很多来回沟通。我用脚本桥编程了它。脚本桥遭受内存泄漏。每次调用脚本桥都会泄漏少量内存。向一个全天候运行的程序添加大量调用,并且我已经运行了不到24小时运行的软件,然后退出。
我首次尝试解决方案是尽量减少对脚本桥的调用。在研究这一目的时,我遇到了ItunesLibrary。它不适合我。
NSError *error = nil;
ITLibrary *library = [ITLibrary libraryWithAPIVersion:@"1.0" error:&error];
if (library)
{
NSArray *playlists = [[NSArray alloc]init];
playlists = library.allPlaylists;
NSArray *tracks = [[NSArray alloc]init];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"mediaKind == %d", ITLibMediaItemMediaKindSong];
tracks = [library.allMediaItems filteredArrayUsingPredicate:predicate];
NSLog(@"Playlists - %@",playlists);
NSLog(@"Tracks - %@",tracks);
}
这段代码几乎完全取决于Apple的文档。它应该工作 - 我想。
在我添加谓词之前,我获得了iTunes资料库中每个播客的一些信息。在nslog输出中,我的每个播放列表都会生成一个类似于“”的条目。我的每首歌都只显示(null)。
所有信息都在iTunes中。我可以用脚本桥来阅读它。我可以用AVAsset
读取它AVAsset *asset = [AVURLAsset URLAssetWithURL:myUrl options:nil];
NSArray *metadata = [asset commonMetadata];
for ( AVMetadataItem* item in metadata )
{
NSString *key = [item commonKey];
NSString *value = [item stringValue];
NSLog(@"key = %@, value = %@", key, value);
}
使用AVAsset我只能获得歌曲名称,专辑名称和艺术家姓名。我需要访问iTune的其他ID3标签。
我有什么打破ItunesLibrary?
答案 0 :(得分:0)
让ItunesLibrary工作的秘诀似乎是在权利文件中。您需要添加键“com.apple.security.assets.music.read-only”,并将其设置为YES。我通过挖掘github.com上的一个项目得到了这个。