我已经开发了一个屏幕保护程序,该屏幕保护程序用于使用MLMediaLibrary(具有一些其他功能)来显示存储在Photos.app中的照片。
现在,由于我已切换到Mojave,因此无法再访问照片。我怀疑问题是新的TCC功能。问题是我看不到用户如何为屏幕保护程序授予对照片的访问权限!我已经将NSPhotoLibraryUsageDescription键添加到该项目,但无济于事。
下面,您可以找到更多代码片段,这些片段显示了我如何使用MLMediaLibrary框架。
如果有人可以阐明这一点,向我指出正确的方向,提供示例代码或以其他任何方式提供帮助,我将不胜感激!
我也很乐意使用其他框架。我看过PhotoKit,但在macOS下似乎仅适用于Photos.app扩展。 AppleScript可能不是正确的方法,因为它运行缓慢,并且我需要在Photos.app中访问10,000张照片。但是,如果您可以指出其他框架,或者如果我错了,请更正我,我感到很高兴。
非常感谢。
下面是代码段。
在initWithFrame
方法中,我像这样获得媒体库的句柄:
NSDictionary *options = @{
MLMediaLoadSourceTypesKey: @(MLMediaSourceTypeImage),
MLMediaLoadIncludeSourcesKey: @[MLMediaSourcePhotosIdentifier]
};
mediaLibrary_ = [[MLMediaLibrary alloc] initWithOptions: options];
[self logMessage: [NSString stringWithFormat: @"mediaLibrary = %p", (void*)mediaLibrary_] asError: NO];
[mediaLibrary_ addObserver: self
forKeyPath: @"mediaSources"
options: 0
context: &MediaLibraryLoaded];
[mediaLibrary_.mediaSources objectForKey: MLMediaSourcePhotosIdentifier ];
这是KVO方法的开始:
- (void) observeValueForKeyPath: (NSString *) keyPath ofObject: (id) object
change: (NSDictionary *) change context: (void *) context
{
MLMediaSource * mediaSource = [mediaLibrary_.mediaSources objectForKey: MLMediaSourcePhotosIdentifier];
if ( ! mediaSource )
[self logMessage: @"mediasource = NULL!" asError: YES];
确实会调用KVO,但是mediaSource
始终是NULL
。
在日志文件中,我还可以看到(我认为)tccd发出的一些消息,表明访问被拒绝。
但是用户如何授予对第三方屏幕保护程序的访问权限?