你可以在脚本桥上使用KVO吗?
我想知道我是否可以为我的应用程序创建一个Scripting Bridge接口,并允许通过观察我的应用程序的一个SB命令返回的对象来通知客户端应用程序.
这可能吗?如果没有,还有什么选择?
我正在构建一个Mac OS应用程序,需要将一个mp3文件导入iTunes ...
似乎找不到任何可以帮助我实现这一目标的框架.我能想到的唯一方法就是修改"iTunes Music Library.xml".
我希望你们中的一个能指出我一个更好,更清洁的解决方案.
先感谢您.
我已经制作了一个非常简单的AppleScript来关闭Safari中的标签.问题是,它有效,但不完全.只关闭了几个标签.这是代码:
tell application "Safari"
repeat with aWindow in windows
repeat with aTab in tabs of aWindow
if [some condition is encountered] then
aTab close
end if
end repeat
end repeat
end tell
Run Code Online (Sandbox Code Playgroud)
我也试过这个脚本:
tell application "Safari"
repeat with i from 0 to the number of items in windows
set aWindow to item i of windows
repeat with j from 0 to the number of tabs in aWindow
set aTab to item j of tabs of aWindow
if [some …Run Code Online (Sandbox Code Playgroud) 我正在编写一个使用脚本桥来控制iTunes的mac应用程序.我已经生成了头文件iTunes.h,而SBApplication对象可以告诉我各种奇妙的东西.
但是,这些命令似乎非常有限.有一个'playpause'功能,但我认为没办法这样做
// iTunes是我的SBApplication对象[iTunes play:@"Smoke On The Water"];
这样做的Applescript相当简单
告诉iTunes播放songName
这个Scripting桥应该是我在Objective C中控制脚本化对象的超酷和强大的方式,所以我在这里缺少什么?
我正在更新我的OS X程序以接受iTunes drop,修改文件中的元数据,然后刷新(获取信息)删除的文件,以便iTunes可以更新其'元数据库.
我有一些工作,它提供了一些关于文件的misc信息的字典,包括轨道ID,持久ID和位置.我现在需要通过文件位置或删除信息提供的持久ID来获取特定轨道,因此我可以调用其上的刷新方法以强制iTunes重新检查文件并更新更改到元数据.
我已经导入了iTunes头文件并创建了SBApplication对象,我现在非常坚持以有效的方式获得正确的轨道.
根据 Apple关于 Scripting Bridge performance的文档,我们应该努力在 上使用批处理操作SBElementArrays,因为 Apple 事件调用很昂贵。
...只要有可能,您应该始终使用“批处理操作”数组方法之一,而不是枚举数组。这些方法避免了枚举的低效率,因为它们发送单个 Apple 事件而不是数组中的每个项目一个 Apple 事件。
我正在将 Scripting Bridge 与 System Events 应用程序一起使用,并且能够成功地从菜单中获取菜单项。它比我以前使用的 NSAppleScript 方法快得多。
我想要做的是将几个 SBElementArrays 组合在一起,每个 SBElementArrays 都包含来自不同菜单的菜单项。计划是然后运行批处理操作一次,而不是对每个菜单单独执行。
在我看来,这不应该那么复杂,尽管显然我在这方面的知识充其量是有限的。不幸的是,我遇到了严重的错误。
第一次尝试
如果我尝试创建一个空的 SBElementArray 元素,然后循环添加每组菜单项的菜单项,如下所示:
SBElementArray* menuItemCombinedArray = [[SBElementArray alloc] init];
for (SystemEventsMenuBarItem* menu in menuBar.menus) {
menuItemCombinedArray = [[menuItemCombinedArray arrayByAddingObjectsFromArray:menu.menuItems] mutableCopy];
}
NSArray* menuItemNameArray = [menuItemCombinedArray arrayByApplyingSelector:@selector(name)];
Run Code Online (Sandbox Code Playgroud)
我收到一条错误消息[SBElementArray init] should never be used,这有点奇怪,因为 SBElementArray 是 NSMutableArray 的子类。
第二次尝试
接下来,我尝试了一种更黑客的方法,我为第一个菜单单独创建了 SBElementArray,然后循环遍历剩余的菜单并一次添加那些 SBObjects,如下所示:
SBElementArray* menus = …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用ScriptingBridge阅读iTunes当前正在播放的曲目。我在这里找到了其他两个线程,但似乎没有一个对我有用(macOS Mojave和iTunes 12.9.4)。
我使用以下命令创建了iTunes.h文件:
sdef /Applications/iTunes.app | sdp -fh --basename "iTunes"
Run Code Online (Sandbox Code Playgroud)
我正在创建脚本桥的实例,如下所示:
if let itunes: AnyObject = SBApplication(bundleIdentifier: "com.apple.iTunes")
{
if itunes.isRunning
{
Swift.print("iTunes is running...")
}
Swift.print(itunes.currentTrack?.name)
Swift.print(itunes.currentTrack?.album)
}
Run Code Online (Sandbox Code Playgroud)
该代码可以正常编译。运行代码时,得到以下输出:
iTunes is running...
nil
nil
Run Code Online (Sandbox Code Playgroud)
currentTrack为零,但iTunes正在播放歌曲。我在这里想念什么?我已经尝试禁用沙箱,但无济于事。我正在使用macOS Mojave,Xcode 10.2和iTunes 12.9.4。另外,当iTunes未运行时,它将启动吗?为什么?
是否会有另一种方法来获取iTunes当前播放的歌曲?
我想按照这里的说明操作:
每当我尝试使用"sdef"命令时,我都会收到"未找到命令"错误.这在10.7下工作正常.我试图在10.8下使用它,它不再起作用了.
是否在10.8中删除了sdef命令?我应该用什么呢?
有人可以给我看一些代码,将用户音乐库中的所有歌曲名称放入数组吗?然后告诉我如何将歌曲名称更改为艺术家,专辑等.
我正在尝试在我的Mac OS应用程序中使用Scripting Bridge,但实施起来很困难.我已经包含了框架,我打算将它与Finder一起使用,所以我在我的应用程序中也包含了一个Finder.h文件.
IE
#import <ScriptingBridge/ScriptingBridge.h>
#import "Finder.h"
Run Code Online (Sandbox Code Playgroud)
但是,每当我打电话:
FinderApplication *finder = [SBApplication applicationWithBundleIdentifier:@"com.apple.Finder"];
Run Code Online (Sandbox Code Playgroud)
我收到了错误
'FinderApplication'未声明(首次使用此功能)
为了让它正常工作,我还需要做些什么吗?
谢谢.
我正在尝试使用cocoa脚本桥创建一个新的电子邮件,但似乎无法让它工作.我到目前为止:
MailApplication *mail = [SBApplication applicationWithBundleIdentifier:@"com.apple.Mail"];
MailOutgoingMessage *emailMessage = [[[[mail classForScriptingClass:@"outgoing message"] alloc] initWithProperties:[NSDictionary dictionaryWithObjectsAndKeys: [saveFileName substringToIndex:[saveFileName length]-4], @"subject", @"something about app.", @"content", nil]] autorelease];
// add the object to the mail app
[[mail outgoingMessages] addObject: emailMessage];
emailMessage.visible = YES;
if ( [FileFullName length] > 0 ) {
MailAttachment *theAttachment =
[[[mail classForScriptingClass:@"attachment"] alloc]
initWithProperties:[NSDictionary dictionaryWithObjectsAndKeys:
FileFullName, @"fileName",nil]];
// add it to the list of attachments
[[emailMessage.content attachments] addObject: theAttachment];
[theAttachment release];
}
Run Code Online (Sandbox Code Playgroud)
当我尝试设置visible属性时,我收到了错误消息:
-[SBProxyByClass setVisible:]: object has not been …Run Code Online (Sandbox Code Playgroud) scripting-bridge ×11
cocoa ×6
macos ×6
objective-c ×4
itunes ×3
applescript ×2
email ×1
file ×1
safari ×1
scripting ×1
select ×1
swift ×1