主机应用程序将以正常方式使用我的扩展:通过呈现UIActivityViewController以包含一个activityItems数组,然后将其传递给我的扩展程序.
iOS将根据项目是否与我在扩展的info.plist中定义的NSExtensionActivationRule设置相匹配来决定是否显示我的Action.
此功能似乎适用于内容和指向内容(图像,视频,文本,文件,URL)的指针.
我可以使用激活规则NSExtensionActivationSupportsText将我的itemType定义为文本,然后只传递序列化的JSON.但是,我的行动将提供简单的纯文本.不好.
显然有一些神秘的查询语言可用于在我的NSExtensionActivationRule设置中定义nspredicate,它允许某种自定义.
但我无法弄明白.所有示例都基于内容,而不是数据.如何将自定义actionItem定义为结构化数据,让iOS知道我的操作何时真正合适?
我能完成我想要的吗?怎么样?任何提示都表示赞赏.
更新:我怀疑这个问题的关键是custom Uniform Type Identifiers.但是,我仍然坚持,因为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>
在扩展中的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 })
然后在主机应用程序中:
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)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。