是否可以在Google Go中编写Mac OS X/Cocoa应用程序?
是否有Go-Obj-C桥?(在我看来,Obj-C的动态非常适合Golang的界面)
我至少可以将两者连接在一起,并通过普通的C函数让它们相互通信吗?
我正在使用Apple的ScriptingBridge框架,并为iTunes生成了一个包含以下几个enum的头文件:
typedef enum {
iTunesESrcLibrary = 'kLib',
iTunesESrcIPod = 'kPod',
iTunesESrcAudioCD = 'kACD',
iTunesESrcMP3CD = 'kMCD',
iTunesESrcDevice = 'kDev',
iTunesESrcRadioTuner = 'kTun',
iTunesESrcSharedLibrary = 'kShd',
iTunesESrcUnknown = 'kUnk'
} iTunesESrc;
Run Code Online (Sandbox Code Playgroud)
我的理解是,enum值必须是整数,但这个定义似乎违反了这个规则.此外,似乎将这些enum值视为整数(NSPredicate例如,在一个中)并不是正确的事情.
我将enum上面的声明添加到一个带有空main函数的C文件中,并使用它编译i686-apple-darwin9-gcc-4.0.1.因此,虽然这些类型的enums可能不符合C标准(正如Parappa在下面指出的那样),但它们至少被gcc 编译成某种类型.
那么,那种类型是什么,以及如何在格式字符串中使用它?
我在使用Python的脚本桥时遇到问题
我试图列出iTunes对象的属性
iTunes = SBApplication.applicationWithBundleIdentifier_("com.apple.iTunes")
Run Code Online (Sandbox Code Playgroud)
运用
>>> from pprint import pprint
>>> from Foundation import *
>>> from ScriptingBridge import *
>>> iTunes = SBApplication.applicationWithBundleIdentifier_("com.apple.iTunes")
>>> pprint (vars(iTunes))
Run Code Online (Sandbox Code Playgroud)
我回来了
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: vars() argument must have __dict__ attribute
Run Code Online (Sandbox Code Playgroud)
有谁知道怎么解决这个问题?
我正在尝试使用cocoa脚本桥创建一个新的用户播放列表,但似乎无法让它工作.我到目前为止:
iTunesApplication *iTunes = [SBApplication
applicationWithBundleIdentifier:@"com.apple.iTunes"];
SBElementArray *iSources = [iTunes sources];
iTunesSource *library = nil;
for (iTunesSource *source in iSources) {
if ([[source name] isEqualToString:@"Library"]) {
library = source;
break;
}
}
// could not find the itunes library
if (!library) {
NSLog(@"Could not connect to the iTunes library");
return;
}
// now look for our playlist
NSString *playlistName = @"new playlist";
SBElementArray *playlists = [library userPlaylists];
iTunesUserPlaylist *playlist = nil;
for (iTunesUserPlaylist *thisList in playlists) {
if ([[thisList name] …Run Code Online (Sandbox Code Playgroud) 我想使用Scripting Bridge将电影添加到iTunes.最好让我在"音乐视频"和"电影"之间进行选择.我知道Objective-C和AppleScript,所以我认为它不会那么难,但我无法弄明白.我知道如何使用NSAppleScript但是我的目标是10.5或更高版本,并且读取Scripting Bridge废弃了NSAppleScript.是对的吗?
我得到的只是
iTunesApplication *iTunes = [SBApplication applicationWithBundleIdentifier: @"com.apple.iTunes"];
Run Code Online (Sandbox Code Playgroud)
你可以看到,这根本不是什么.
我一直试图弄清楚如何使用脚本桥获取当前播放歌曲的iTunes艺术作品.我已经达到了适用于某些歌曲的程度,但对于其他人来说,我得到了一个SIGABRT.我不确定问题是什么,所以任何帮助都将不胜感激.这是我到目前为止:
iTunesApplication * iTunes = [SBApplication applicationWithBundleIdentifier:@"com.apple.iTunes"];
NSImage *songArtwork;
iTunesTrack *current = [iTunes currentTrack];
iTunesArtwork *artwork = (iTunesArtwork *)[[[current artworks] get] lastObject];
if(artwork != nil)
songArtwork = [artwork data];
else
songArtwork = [NSImage imageNamed:@"Image.tiff"];
NSMenuItem *artworkMenuItem = [[NSMenuItem alloc] initWithTitle:@"" action:NULL keyEquivalent:@""];
[songArtwork setSize:NSMakeSize(128, 128)];
[artworkMenuItem setImage:songArtwork];
[Menu insertItem:artworkMenuItem atIndex:0];
Run Code Online (Sandbox Code Playgroud)
我可以使用一些歌曲,并在菜单项中很好地显示艺术作品,但对于其他人我在线上获得了一个SIGABRT:
[songArtwork setSize:NSMakeSize(128, 128)];
Run Code Online (Sandbox Code Playgroud)
控制台的输出如下:
2011-08-12 23:13:20.094 SongViewer[2146:707] -[NSAppleEventDescriptor setSize:]: unrecognized selector sent to instance 0x102827f70
2011-08-12 23:13:20.095 SongViewer[2146:707] An uncaught exception was raised
2011-08-12 23:13:20.096 SongViewer[2146:707] -[NSAppleEventDescriptor setSize:]: unrecognized …Run Code Online (Sandbox Code Playgroud) 我正试图通过Mail.app从Cocoa应用程序发送html电子邮件.我想在Mail.app中打开新邮件,包括主题,收件人,并添加带有链接和其他内容的HTML Body.但找不到这样做的方法.我已经尝试过Scripting Bridge,但MailOutgoingMessage类没有内容类型我可以用纯文本添加内容.
尝试过AppleScript,如下所示:
set htmlContent to read "/Path/index.html"
set recipientList to {"mail@mail.com"}
tell application "Mail"
set newMessage to make new outgoing message with properties {subject:"qwerty", visible:true}
tell newMessage
make new to recipient at end of to recipients with properties {address:"mail@s.com"}
set html content to htmlContent
--send
end tell
end tell
Run Code Online (Sandbox Code Playgroud)
这段代码发送电子邮件与html,只有我正在改变 - 发送.但是我需要在用户做出一些更改之后发送信件.
我刚刚开始学习如何集成Python和Mac OS应用程序.(我想调用从Cocoa到Python的一些方法.)我遇到了这些术语 - 脚本桥,PyObjC和py2app.有什么不同?PyObjC是脚本桥的一个例子吗?py2app什么时候开始发挥作用?
我正在尝试编写一个Mac OS菜单额外的应用程序,当用户按下某个热键时,该应用程序显示包含当前活动应用程序菜单栏项的上下文菜单.显示上下文菜单我可以做得很好,但我似乎无法获得当前活动的应用程序的菜单栏项.目前我正在使用[[[NSWorkspace sharedWorkspace] runningApplications] filteredArrayUsingPredicate:]获取活动应用程序的名称,但NSRunningApplication似乎包含了很少的其他信息.有什么方法可以从外部应用程序获取有关应用程序菜单的信息吗?
更新:
使用ScriptingBridge框架似乎工作得相当好,如果你很高兴使用AppleScript:
SystemEventsApplication* sevApp = [SBApplication applicationWithBundleIdentifier:@"com.apple.systemevents"];
SystemEventsProcess* proc = [[sevApp applicationProcesses] objectWithName:appName];
for (SystemEventsMenuBar* menuBar in proc.menuBars) {
for (SystemEventsMenuBarItem* menuBaritem in menuBar.menuBarItems) {
NSLog(@"%@", menuBaritem.name);
}
}
Run Code Online (Sandbox Code Playgroud)
将打印出应用程序菜单栏中提供的菜单列表.还没有找到获取上下文菜单的方法,所以我暂不会回答这个问题...
我可以使用以下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电话,我发现无证 …
scripting-bridge ×10
cocoa ×6
objective-c ×4
itunes ×3
applescript ×2
python ×2
appleevents ×1
artwork ×1
c ×1
enums ×1
go ×1
macos ×1
menubar ×1
py2app ×1