Tim*_*ott 4 swift ios8 ios-app-extension
我正在开发一个应用扩展程序Action.
主机应用程序将以正常方式使用我的扩展程序:通过显示UIActivityViewController包含一个数组,activityItems然后将其传递给我的扩展程序.
iOS将根据项目是否与NSExtensionActivationRule我info.plist在扩展中定义的设置相匹配来决定是否显示我的操作.
此功能似乎适用于内容和指向内容(图像,视频,文本,文件,URL)的指针.
相反,我需要传递结构化数据并接收结构化数据.
我可以itemType使用激活规则将我的文本定义为文本NSExtensionActivationSupportsText,然后只传递序列化的JSON.但是,我的行动将提供简单的纯文本.不好.
显然有一些神秘的查询语言可用于NSPredicate在我的NSExtensionActivationRule设置中定义,允许某种自定义.
但我无法弄明白.所有示例都基于内容,而不是数据.如何将自定义定义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 "com.company.app.myThing").@count == 1).@count == 1</string>
<key>NSExtensionPointName</key>
<string>com.apple.ui-services</string>
<key>NSExtensionPointVersion</key>
<string>1.0</string>
</dict>
Run Code Online (Sandbox Code Playgroud)
在ActionViewController.viewDidLoad扩展中:
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
})
Run Code Online (Sandbox Code Playgroud)
然后在主机应用程序中:
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)
Run Code Online (Sandbox Code Playgroud)
免责声明:请不要认为这是一个权威的方法,但我希望它可以指出你正确的方向.
| 归档时间: |
|
| 查看次数: |
1641 次 |
| 最近记录: |