标签: scripting-bridge

如何通过ScriptingBridge使用AppleScript获取终端窗口的窗口ID和标签号?

我可以使用以下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电话,我发现无证 …

cocoa applescript appleevents scripting-bridge

5
推荐指数
1
解决办法
3516
查看次数

Swift 和 ScriptingBridge.framework

在我的 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)

macos itunes objective-c scripting-bridge swift

5
推荐指数
1
解决办法
978
查看次数

创建可编写脚本的Cocoa应用程序的简单教程(脚本桥)

有人能指出我介绍ScriptingBridge的一个非常简单的hello world类型的应用程序吗?你需要一步一步地创建一个可以从ruby/python/applescript等实例化的1类-1方法项目.

我很难绕过创建可编写脚本的cocoa应用程序所需的内容,但却找不到任何具体的示例或教程.

cocoa objective-c scripting-bridge cocoa-scripting

4
推荐指数
1
解决办法
1952
查看次数

脚本桥和使用NSPredicate和FourCharCodes过滤SBElementArrays

我是第一次尝试使用Scripting Bridge,但是遇到了SBElementArray根据包含FourCharCode枚举常量作为标准的NSPredicate 过滤a的问题.

我写了一个简单的程序来识别用户iTunes库中的"库"源,-filteredArrayUsingPredicate:用于过滤SBElementArray所有iTunes源.我期望得到一个SBElementArray,当评估时,会产生一个元素的数组,即库源.相反,当我调用-get返回时SBElementArray,我得到一个空数组.

令人困惑的,如果更改顺序,而是叫-getSBElementArray的所有来源得到一个具体的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)

cocoa itunes objective-c scripting-bridge

4
推荐指数
1
解决办法
1081
查看次数

Objective-C Mac OS X分布式通知iTunes

我需要一点帮助,我现在有一个方法; 我的Mac OS X应用程序中的updateTrackInfo获取当前在iTunes中播放的艺术家名称,曲目名称和曲目的持续时间

但是,我希望应用程序监听分发的iTunes通知; com.apple.iTunes.playerInfo然后在iTunes分发通知时调用方法updateTrackInfo.请有人帮助我,我需要在标题和实现文件中写什么.

谢谢,萨米.

xcode notifications itunes objective-c scripting-bridge

4
推荐指数
1
解决办法
3894
查看次数

如何包装Objective-C,从Python调用?

我创建了一个Objective-C框架,我想通过python脚本导入和访问它.我理解如何在Python中导入这些东西,但是我需要在obj-c方面做些什么来使该框架可导入?

谢谢

python objective-c wrapper scripting-bridge

4
推荐指数
2
解决办法
424
查看次数

如何让Scripting Bridge在运行时生成Objective-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(我不想使用,如上所述),也会发生这种情况.该脚本桥接编程指南似乎在暗示我做是正确的事情("准备代码"一节),但没有提到这个问题.

linker cocoa objective-c ld scripting-bridge

4
推荐指数
1
解决办法
618
查看次数

用于脚本目标的权利密钥/访问组

我似乎无法弄清楚如何识别给定应用程序可用的权利密钥.如何查询应用程序的权利密钥?

示例:iTunes具有以下授权键:com.apple.iTunes.playerInfo,com.apple.iTunes.library.read-write,&com.apple.iTunes.playback

但如果我还不知道这一点,我怎么能从iTunes应用程序中检索这些键呢?那么第三方(非Apple)应用程序呢?如果有的话,哪里可以找到权利密钥?

提前致谢!

entitlements scripting-bridge applescript-objc appstore-sandbox

4
推荐指数
1
解决办法
531
查看次数

ScriptingBridge - “幕后”如何工作

上下文:我正在开发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

4
推荐指数
1
解决办法
547
查看次数

使用Python和Scripting Bridge在iTunes中创建播放列表

如何使用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的东西,但我真的不懂语言.

python cocoa itunes scripting-bridge

3
推荐指数
1
解决办法
2042
查看次数