2

我的程序使广播电台自动化。它和 iTunes 之间有很多来回的通信。我用脚本桥对其进行了编程。脚本桥受内存泄漏的影响。每次调用脚本桥都会泄漏少量内存。向 24/7 运行的程序添加大量调用,我的软件将运行不到 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?

4

1 回答 1

1

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

于 2018-01-16T18:32:07.640 回答