4

我有一个从 iTunes 获取 audioCDPlayList 的应用程序。此应用程序在 macOS High Sierra 上运行良好,但在 macOS Mojave Beta 3 (18A326h)上无法正常运行。

我调查了原因,然后发现以下奇怪的行为:

GetAudioCDInfoFromiTunes.h

#import <Foundation/Foundation.h>
#import <ScriptingBridge/ScriptingBridge.h>
#import "iTunes.h"

@interface GetAudioCDInfoFromiTunes : NSObject

   - (NSMutableDictionary *)getAudioCDInfoFromiTunes;

@end

GetAudioCDInfoFromiTunes.m

- (NSMutableDictionary *)getAudioCDInfoFromiTunes {

    // Declear iTunes scripting bridge variable
    iTunesApplication *iTunesApp = [SBApplication applicationWithBundleIdentifier:@"com.apple.iTunes"];

    SBElementArray *sources = [iTunesApp sources];
    NSLog(@"sources=%@", sources);
    NSLog(@"count=%ld", [sources count]);

    iTunesPlaylist *aAudioCDPlayList = nil;

    for (iTunesSource *src in sources) {

        NSLog(@"src=%@", src);

        SBElementArray *playlists = [src audioCDPlaylists];

        NSLog(@"playlists=%@", playlists);

        for (iTunesPlaylist *aPlaylist in playlists) {

            NSLog(@"aplaylist=%@", aPlaylist);

            if ([aPlaylist isKindOfClass:[NSClassFromString(@"ITunesAudioCDPlaylist") class]]) {

                aAudioCDPlayList = [aPlaylist get];

                break;
           }
       }
   }

... SNIP ...

}

执行上述代码,Line.8count的NSLogsources为 0。因此forLine.12 的循环不起作用。然后结果[aPlaylist get]为空。

有谁知道countofsources为0的原因?

请让我知道如何在 Mojave Beta 上运行我的 ScriptingBridge 代码...

4

1 回答 1

4

Mojave 加强了数据安全和隐私,其中包括脚本。请参阅WWDC 2018 会议 702

当您的应用程序第一次尝试控制 iTunes 时,Mojave 将提示您确认是否允许。它会记住您的选择,因此不再询问。

我想你一定曾经拒绝过它的许可。在那之后,它总是阻止你的应用程序控制 iTunes。

由于开发人员需要在显示此提示时测试他们的应用程序的行为,当权限被拒绝以及被授予时,Apple 包含了一个命令行实用程序tccutil,用于重置记住的用户选择。重置有关哪些应用程序可以控制其他应用程序的权限的命令是tccutil reset AppleEvents.

于 2018-07-15T17:01:38.417 回答