通过 ScriptingBridge 获取 audioCDPlaylist 不适用于 macOS Mojave Beta
Grab audioCDPlaylist via ScriptingBridge does not work with macOS Mojave Beta
我有一个从 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.8的NSLog,sources
的count
为0,所以Line.12的for
循环不起作用。那么结果[aPlaylist get]
为null。
有谁知道sources
的count
是0的原因吗?
请告诉我如何 运行 我在 Mojave Beta 上的 ScriptingBridge 代码...
Mojave 加强了数据安全和隐私,其中包括脚本。参见 WWDC 2018 session 702。
当您的应用第一次尝试控制 iTunes 时,Mojave 会提示您确认是否允许。它会记住您的选择,因此不会再询问。
我猜你一定拒绝过一次。在那之后,它总是阻止您的应用程序控制 iTunes。
由于开发人员需要在显示此提示时测试他们的应用程序的行为,当权限被拒绝时,当权限被授予时,Apple 包含了一个命令行实用程序,tccutil
,以重置记住的用户选择.重置关于哪些应用可以控制其他应用的权限的命令是 tccutil reset AppleEvents
。
我有一个从 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.8的NSLog,sources
的count
为0,所以Line.12的for
循环不起作用。那么结果[aPlaylist get]
为null。
有谁知道sources
的count
是0的原因吗?
请告诉我如何 运行 我在 Mojave Beta 上的 ScriptingBridge 代码...
Mojave 加强了数据安全和隐私,其中包括脚本。参见 WWDC 2018 session 702。
当您的应用第一次尝试控制 iTunes 时,Mojave 会提示您确认是否允许。它会记住您的选择,因此不会再询问。
我猜你一定拒绝过一次。在那之后,它总是阻止您的应用程序控制 iTunes。
由于开发人员需要在显示此提示时测试他们的应用程序的行为,当权限被拒绝时,当权限被授予时,Apple 包含了一个命令行实用程序,tccutil
,以重置记住的用户选择.重置关于哪些应用可以控制其他应用的权限的命令是 tccutil reset AppleEvents
。