ITLibrary只给我一个(null)

时间:2017-12-31 00:59:27

标签: objective-c macos ituneslibrary

我的程序使电台自动化。它和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?

1 个答案:

答案 0 :(得分:0)

让ItunesLibrary工作的秘诀似乎是在权利文件中。您需要添加键“com.apple.security.assets.music.read-only”,并将其设置为YES。我通过挖掘github.com上的一个项目得到了这个。

相关问题