我可以使用以下AppleScript打开终端选项卡:
tell application "Terminal"
set myTab to do script "exec sleep 1"
get myTab
end tell
Run Code Online (Sandbox Code Playgroud)
这将返回一个字符串,如:tab 1 of window id 3263 of application "Terminal".这很好,我可以看到窗口ID 3263和标签号1(虽然我不知道如何查询myTab只获取这些值).
在Cocoa ScriptingBridge中,我可以这样做:
SBApplication *terminal;
SBObject *tab;
terminal = [SBApplication applicationWithBundleIdentifier:@"com.apple.terminal"]
tab = [terminal doScript:@"exec sleep 1" in:nil]
Run Code Online (Sandbox Code Playgroud)
如何从选项卡对象中获取窗口ID和选项卡编号?
编辑2009/4/27 - 为什么?
为了回答我为什么要这样做 - 我在终端窗口中打开一个命令(如上所述),然后我回到了tab对象.但是我想移动/调整此窗口的大小,因此我需要访问选项卡的"窗口"对象.
我正在使用Objective-C(实际上,从Perl桥接的Objective-C),并且希望坚持使用标准的OS组件,因此我相信我只能使用NSAppleScript和ScriptingBridge框架(所有perl applescript模块都打破了64位除碳).我会尝试NSAppleScript,但处理返回的值似乎是一个黑暗的艺术.
我目前的解决方案是获取选项卡对象的TTY(保证唯一)并枚举每个窗口的每个选项卡,直到找到包含选项卡的窗口.我认为这不是最好的方法(肯定不是很快!).
编辑2009/4/30 - 解决方案
根据下面" has " 的建议,我冒了一个NSAppleEventDescriptor API.最初,我只能通过NSAppleScript的executeAndReturnError()调用来实现这一目标.但是我发现NSAppleScript比ScriptingBridge慢得多.
使用后ClassDump提取一些更SBObject电话,我发现无证 …
在我的 Swift 项目中,我需要通过ScriptingBridge框架与 iTunes 通信。根据 Apple 文档,我使用 .createiTunes.h文件sdef /Applications/iTunes.app | sdp -fh --basename iTunes,然后将 ScriptingBridge.framework 链接到项目并使用#import "iTunes.h".
但是当我尝试获取任何 iTunes 应用程序属性时,例如
var iTunesApp: iTunesApplication? = SBApplication.applicationWithBundleIdentifier("com.apple.iTunes") as? iTunesApplication
let currentTrack: iTunesTrack? = iTunesApp?.currentTrack
Run Code Online (Sandbox Code Playgroud)
我收到链接器错误,例如
Undefined symbols for architecture x86_64:
"_OBJC_CLASS_$_iTunesApplication", referenced from:
__TFC5NowP_14iTunesWorker21fetchCurrentTrackInfofS0_FT_T_ in iTunesWorker.o
__TFC5NowP_14iTunesWorkercfMS0_FT_S0_ in iTunesWorker.o
_get_field_types_iTunesWorker in iTunesWorker.o
"_OBJC_CLASS_$_iTunesTrack", referenced from:
__TFC5NowP_14iTunesWorker21fetchCurrentTrackInfofS0_FT_T_ in iTunesWorker.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 …Run Code Online (Sandbox Code Playgroud) 有人能指出我介绍ScriptingBridge的一个非常简单的hello world类型的应用程序吗?你需要一步一步地创建一个可以从ruby/python/applescript等实例化的1类-1方法项目.
我很难绕过创建可编写脚本的cocoa应用程序所需的内容,但却找不到任何具体的示例或教程.
我是第一次尝试使用Scripting Bridge,但是遇到了SBElementArray根据包含FourCharCode枚举常量作为标准的NSPredicate 过滤a的问题.
我写了一个简单的程序来识别用户iTunes库中的"库"源,-filteredArrayUsingPredicate:用于过滤SBElementArray所有iTunes源.我期望得到一个SBElementArray,当评估时,会产生一个元素的数组,即库源.相反,当我调用-get返回时SBElementArray,我得到一个空数组.
令人困惑的,如果更改顺序,而是叫-get上SBElementArray的所有来源得到一个具体的NSArray,并呼吁-filteredArrayUsingPredicate:为在此之前阵列相同的谓词上,我得到了想要的结果.我不相信这应该是必要的,并且我已成功过滤SBElementArray使用其他NSPredicates(例如@"name=='Library'"工作正常).
代码片段如下.iTunesESrcLibrary是由Scripting Bridge生成的头文件中定义的FourCharCode常量.(iTunesESrcLibrary = 'kLib').我跑10.6.5.
iTunesApplication* iTunes = [[SBApplication alloc] initWithBundleIdentifier:@"com.apple.iTunes"];
NSPredicate* libraryPredicate = [NSPredicate predicateWithFormat:@"kind == %u", iTunesESrcLibrary];
SBElementArray* allSources_Attempt1 = [iTunes sources];
SBElementArray* allLibrarySources_Attempt1 = (SBElementArray*)[allSources_Attempt1 filteredArrayUsingPredicate:libraryPredicate];
NSLog(@"Attempt 1: %@", allLibrarySources_Attempt1);
NSLog(@"Attempt 1 (evaluated): %@", [allLibrarySources_Attempt1 get]);
NSArray* allSources_Attempt2 = [[iTunes sources] get];
NSArray* allLibrarySources_Attempt2 = …Run Code Online (Sandbox Code Playgroud) 我需要一点帮助,我现在有一个方法; 我的Mac OS X应用程序中的updateTrackInfo获取当前在iTunes中播放的艺术家名称,曲目名称和曲目的持续时间
但是,我希望应用程序监听分发的iTunes通知; com.apple.iTunes.playerInfo然后在iTunes分发通知时调用方法updateTrackInfo.请有人帮助我,我需要在标题和实现文件中写什么.
谢谢,萨米.
我创建了一个Objective-C框架,我想通过python脚本导入和访问它.我理解如何在Python中导入这些东西,但是我需要在obj-c方面做些什么来使该框架可导入?
谢谢
我今天正在更新Scripting Bridge粘贴文件(对于Mail.app),并注意到sdp(1)手册页显示:
您不需要创建相应的实现文件; Scripting Bridge将在运行时创建类实现.
这听起来很酷,但是我没有实现生成的类(如预期的那样):
Undefined symbols for architecture x86_64:
"_OBJC_CLASS_$_MailApplication", referenced from:
objc-class-ref in DMBugReportWindowController.o
"_OBJC_CLASS_$_MailAttachment", referenced from:
objc-class-ref in DMBugReportWindowController.o
[... more of the same ...]
ld: symbol(s) not found for architecture x86_64`
Run Code Online (Sandbox Code Playgroud)
我不想压制所有未定义的符号,因为这可能很容易掩盖合法的问题,所以我只是使用-U(根据ld(1)手册页):
指定symbol_name没有定义是可以的.使用-two_levelnamespace,结果符号将标记为dynamic_lookup,这意味着dyld将搜索所有已加载的图像.
(我必须使用-Xlinker -U -Xlinker _OBJC_CLASS_$_MailApplication那些标志来达到ld,否则clang会保留这些参数.)
显然制作它们dynamic_lookup是错误的,因为这会在启动时出现动态链接错误:
dyld: Symbol not found: _OBJC_CLASS_$_MailApplication
Referenced from: /Users/jonathon/Library/Developer/Xcode/...
Expected in: flat namespace
in /Users/jonathon/Library/Developer/Xcode/...
Run Code Online (Sandbox Code Playgroud)
如果我使用-force_flat_namespace -undefined suppress(我不想使用,如上所述),也会发生这种情况.该脚本桥接编程指南似乎在暗示我做是正确的事情("准备代码"一节),但没有提到这个问题.
我似乎无法弄清楚如何识别给定应用程序可用的权利密钥.如何查询应用程序的权利密钥?
示例:iTunes具有以下授权键:com.apple.iTunes.playerInfo,com.apple.iTunes.library.read-write,&com.apple.iTunes.playback
但如果我还不知道这一点,我怎么能从iTunes应用程序中检索这些键呢?那么第三方(非Apple)应用程序呢?如果有的话,哪里可以找到权利密钥?
提前致谢!
entitlements scripting-bridge applescript-objc appstore-sandbox
上下文:我正在开发Pharo/Smalltalk -> Objective-C 桥
场景:在以下 Objective-C ScriptingBridge 片段中:
iTunesApplication *iTunes = [SBApplication applicationWithBundleIdentifier:@"com.apple.iTunes"];
iTunesTrack *currentTrack = iTunes.currentTrack; //[1]
// This low level way works too
//iTunesTrack *currentTrack = [iTunes propertyWithCode: 'pTrk']; //[2]
[iTunes playpause]; //[3]
Run Code Online (Sandbox Code Playgroud)
问题:桥用于class_getInstanceMethod确定对象是否理解消息/选择器,但对于脚本消息,如playpause
问题#1
为什么class_getInstanceMethod像这样的脚本消息会返回 NULL playpause?同样的问题class_copyMethodList?脚本消息有什么特别之处,它们的行为与其他 Obj-C 消息不同(除非它们这样做!)?
问题 #2 [已解决 - 请参阅@Matt 的回答]
根据文档,SB 在“iTunes 应用程序的动态定义子类”中放置了“自动处理 Apple 事件发送的应用程序特定方法”?并且,鉴于class_getInstanceMethod无法找到这种行为(见下文),桥接器测试它的可靠方法是什么(即是否存在这样的方法/消息)?
Objective-C 运行时 API 报告的结果好坏参半。一方面,该类iTunesApplication似乎没有任何方法(或与此相关的属性):
class_copyMethodList([iTunes class]...返回零的方法class_getInstanceMethod桥接器用来查找和执行方法的 失败。另一方面,#playpause …
smalltalk objective-c objective-c-runtime pharo scripting-bridge
如何使用Python和Scripting Bridge创建播放列表?
到目前为止,我有:
from Foundation import *
from ScriptingBridge import *
iTunes = SBApplication.applicationWithBundleIdentifier_("com.apple.iTunes")
newPlaylist = iTunes.iTunesPlaylist()
Run Code Online (Sandbox Code Playgroud)
这显然不起作用.
我见过Ruby和Objective C的东西,但我真的不懂语言.
scripting-bridge ×10
objective-c ×7
cocoa ×5
itunes ×4
python ×2
appleevents ×1
applescript ×1
entitlements ×1
ld ×1
linker ×1
macos ×1
pharo ×1
smalltalk ×1
swift ×1
wrapper ×1
xcode ×1