无法在我的屏幕保护程序中使用MLMediaLibrary在macOS Mojave下访问照片

时间:2019-03-14 21:46:45

标签: macos-mojave photosframework

我已经开发了一个屏幕保护程序,该屏幕保护程序用于使用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发出的一些消息,表明访问被拒绝。

但是用户如何授予对第三方屏幕保护程序的访问权限?

0 个答案:

没有答案