【发布时间】:2019-04-26 11:42:47
【问题描述】:
为了在我的可编写脚本的 Mac 应用程序中支持二进制数据交换,如果可能的话,我希望使用 AS-ObjC 桥接器以 NSData 的形式接收和传递数据。
例如,我喜欢在 AppleScript 中实现这段代码:
use framework "Foundation"
set theData to current application's NSData's dataWithContentsOfFile:"/some/binary/file"
tell application "MyApp"
set raw value to theData
end tell
sdef 包含一个值类型和属性:
<suite name="My Suite" code="Demo">
<value-type name="ObjCNSData" code="NSDa">
<cocoa class="NSData"/>
</value-type>
<class name="application" code="capp">
<property name="raw data" code="rawD" type="ObjCNSData">
<cocoa key="rawData"/>
</property>
然后我将转换处理程序实现为NSData 的扩展,类似于 Sketch 示例如何将 NSColor 转换为值类型“RGB Color”:
@implementation NSData(DemoScripting)
+ (NSData *)scriptingObjCNSDataWithDescriptor:(NSAppleEventDescriptor *)desc {
id res = [desc coerceToDescriptorType:'NSDa'];
// -> res is NULL, which is not getting me any further
}
描述的描述是:
<NSAppleEventDescriptor: 'obj '{
'form':'ID ',
'want':'ocid',
'seld':'optr'($E0A8430080600000$),
'from':null()
}>
同样,调用 [NSScriptObjectSpecifier _scriptingSpecifierWithDescriptor:descriptor] 也会返回 NULL。
那么,如何在我的应用代码中获取实际的 NSData 对象?
以及如何将 NSData 对象返回给 AppleScript?
【问题讨论】:
-
NSData和 AppleScriptdata不可互换。但是with data参数的类型不一定是二进制数据。您可以在 sdef 文件中添加value-type条目,以将NSData转换为MyAppType预期的 AS 类型。在您的代码中,theData清楚地表示 UTF8 编码的字符串。从make命令返回的NSAppleEventDescriptor包含指向NSData实例的指针('optr')。我建议直接询问来自 LateNightSoftware 或 Shane Stanley 的 ASOC 专家 Mark Alldritt -
所以你的意思是我应该自己评估“optr”而不是寻找可以为我做的框架函数?我能做到。但这仍然留下了如何返回 NSData 对象的问题。
标签: macos applescript-objc cocoa-scripting