从 iOS 13 开始,您可以创建一个UIActivityViewController
用一个UIActivityItemsConfiguration
。那有一个perItemMetadataProvider
允许您提供标题和消息正文的回调。完成所有设置后,如果您选择标准活动(例如消息或邮件),则提供的消息正文将用作初始文本消息或电子邮件。如果您选择“邮件”,电子邮件主题将由提供的标题填充。
我已经实现了我自己的自定义UIActivity
。它与其他选项一起显示在活动视图中。我想访问我的自定义中提供的标题和消息正文元数据UIActivity
.
到目前为止,我发现消息正文已附加到正在共享的项目列表中。所以在呼吁中canPerform(withActivityItems:)
and prepare(withActivityItems:)
您可以访问活动项目以及为消息正文设置的值。
但到目前为止我还没有找到任何获得称号的方法。它不会添加到活动项目中。没有公共 APIUIActivity
访问此元数据。我尝试添加一个title
(and subject
) 符合我的习惯的财产UIActivity
希望它会被设定 - 但事实并非如此。
有谁有办法获得这个称号吗?
这是我的代码的相关部分,用于设置和创建UIActivityViewController
:
let config = UIActivityItemsConfiguration(objects: items)
config.applicationActivitiesProvider = {
return [ MyCustomActivity() ]
}
config.perItemMetadataProvider = { (index, key) in
if key == .title {
return "Some Title" // How do I get this in my activity?
} else if key == .messageBody {
// This gets added to the activity items
return NSAttributedString(string: "Some crazy message that does stuff")
} else if key == .linkPresentationMetadata {
// Used at the top of the activity view controller if set
}
return nil
}
let vc = UIActivityViewController(activityItemsConfiguration: config)
我知道我可以在创建自定义活动时直接为其设置主题,但这看起来像是作弊。如果使用我没有代码的自定义活动(例如来自库),它可能不起作用。这篇文章的重点是找到一种使用提供的 API 来完成此操作的“正确”方法。
仅供参考 - 这将是唯一的帖子(截至撰写本文时)UIActivityItemsConfiguration
就在这里。显然它没有被太多使用。
与此相关的是activityViewController(_:subjectForActivityType:)
的方法UIActivityItemSource
协议。这基本上是提供主题的另一种方式UIActivityItemsConfiguration
。然而,该方法的文档指出:
当发布项目时,服务可以提供单独的主题字段和数据字段,例如电子邮件消息。如果您希望为支持某个主题的服务提供主题字段,请实现此方法。
但同样,没有与此相关的 API 记录在案UIActivity
为了获得这个主题。
更新:使用调试器并在我的项目配置返回标题的行上放置一个断点,我发现在点击活动视图中的邮件图标后到达了断点。有一个UIMailActivity
这是调用一个名为的私有方法_subjectForActivityItem:
on UIActivity
。因此,Apple 似乎不厌其烦地添加了公共 API 来提供主题,但只有 Apple 提供的活动才能调用私有方法来访问该主题。啊!