Swift iOS应用程序扩展-操作-自定义数据

Swift iOS应用程序扩展-操作-自定义数据,swift,ios8,ios-app-extension,Swift,Ios8,Ios App Extension,我正在开发一个应用程序扩展作为操作 主机应用程序将以正常方式使用我的扩展名:通过显示UIActivityViewController来包含一个activityItems数组,然后将其传递给我的扩展名 iOS将根据项目是否匹配扩展的info.plist设置来决定是否显示我的操作 此功能似乎用于内容和指向内容(图像、视频、文本、文件、URL)的指针 相反,我需要传递结构化数据并接收回结构化数据 我可以使用激活规则将我的itemType定义为文本nExtensionActivationSupports

我正在开发一个应用程序扩展作为
操作

主机应用程序将以正常方式使用我的扩展名:通过显示
UIActivityViewController
来包含一个
activityItems
数组,然后将其传递给我的扩展名

iOS将根据项目是否匹配扩展的
info.plist
设置来决定是否显示我的操作

此功能似乎用于内容和指向内容(图像、视频、文本、文件、URL)的指针

相反,我需要传递结构化数据并接收回结构化数据

我可以使用激活规则将我的
itemType
定义为文本
nExtensionActivationSupportsText
,然后只传递序列化的JSON。但是,我的操作将针对简单的纯文本。不太好

显然,在我的
NSExtensionActivationRule
设置中,有一种神秘的查询语言可用于定义
NSPredicate
,它允许某种定制

但我想不出来。所有示例都基于内容,而不是数据。如何将我的自定义
actionItem
定义为结构化数据,并让iOS知道我的操作何时真正合适

我能完成我想要的吗?怎么用?任何提示都将不胜感激

更新:我怀疑这个问题的关键是。然而,我仍然感到困惑,因为所有UTI定义的示例仍然是内容(文件和媒体),而不是结构化数据

确实是正确的方法

我还没有完成这个开发,但我设法让它以最低限度的工作。基本上,您可以定义一个自定义类型,如
com.company.app.myThing
,您可以将自定义对象作为哈希传递给您想要的任何数据结构。显然,消费者需要知道并遵循这个模式

以下是扩展名中的
info.plist
的相关部分:

<key>NSExtensionAttributes</key>
<dict>
  <key>NSExtensionActivationRule</key>
  <string>SUBQUERY(extensionItems, $extensionItem, SUBQUERY($extensionItem.attachments, $attachment, ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO &quot;com.company.app.myThing&quot;).@count == 1).@count == 1</string>
  <key>NSExtensionPointName</key>
  <string>com.apple.ui-services</string>
  <key>NSExtensionPointVersion</key>
  <string>1.0</string>
</dict>
let item = self.extensionContext.inputItems[0] as NSExtensionItem
let provider = (item.attachments as Array<NSItemProvider>)[0] as NSItemProvider
provider.loadItemForTypeIdentifier("com.company.app.myThing", options: nil, completionHandler: { msg, error in
    let my_thing = (msg as? NSDictionary) as Dictionary<String, AnyObject>
    // do stuff with my_thing
})
然后在主机应用程序中:

let my_thing = [
  "foo": "bar",
  "baz": 123
]
let item = NSExtensionItem()
let attachment = NSItemProvider(item: my_thing, typeIdentifier: "com.company.app.myThing")
item.attachments = [attachment]
let activityViewController = UIActivityViewController(activityItems: [item], applicationActivities: nil)
self.presentViewController(activityViewController, animated: true, completion: actionComplete)

<强>免责声明< /强>:请不要认为这是一个权威的命令,但我希望它能指向正确的方向。

为什么不建立自己的文件类型并使用文档提供程序扩展名?