swift – iOS应用扩展 – *** 作 – 自定义数据

swift – iOS应用扩展 –  *** 作 – 自定义数据,第1张

概述我正在开发一个app扩展作为Action. 主机应用程序将以正常方式使用我的扩展:通过呈现UIActivityViewController以包含一个activityItems数组,然后将其传递给我的扩展程序. iOS将根据项目是否与我在扩展的info.plist中定义的NSExtensionActivationRule设置相匹配来决定是否显示我的Action. 此功能似乎适用于内容和指向内容(图像 我正在开发一个app扩展作为Action.

主机应用程序将以正常方式使用我的扩展:通过呈现UIActivityVIEwController以包含一个activityItems数组,然后将其传递给我的扩展程序.

iOS将根据项目是否与我在扩展的info.pList中定义的NSExtensionActivationRule设置相匹配来决定是否显示我的Action.

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

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

我可以使用激活规则NSExtensionActivationSupportsText将我的itemType定义为文本,然后只传递序列化的JSON.但是,我的行动将提供简单的纯文本.不好.

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

但我无法弄明白.所有示例都基于内容,而不是数据.如何将自定义actionItem定义为结构化数据,让iOS知道我的 *** 作何时真正合适?

我能完成我想要的吗?怎么样?任何提示都表示赞赏.

更新:我怀疑这个问题的关键是custom Uniform Type Identifiers.但是,我仍然坚持,因为UTI定义的所有示例仍然是内容(文件和媒体),而不是结构化数据.

解决方法 Uniform Type Identifiers确实是这样做的正确方法.

我还没有完成这个,但我设法让它最低限度地工作.基本上,您定义了一个自定义类型,如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>

在扩展中的ActionVIEwController.vIEwDIDLoad中:

let item = self.extensionContext.inputItems[0] as NSExtensionItemlet provIDer = (item.attachments as Array<NSItemProvIDer>)[0] as NSItemProvIDerprovIDer.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)

免责声明:请不要认为这是一个权威的方法,但我希望它能指出你正确的方向.

总结

以上是内存溢出为你收集整理的swift – iOS应用扩展 – *** 作 – 自定义数据全部内容,希望文章能够帮你解决swift – iOS应用扩展 – *** 作 – 自定义数据所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1004488.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)

保存