Swift - 如何像在 App Store 中一样共享应用链接
Posted
技术标签:
【中文标题】Swift - 如何像在 App Store 中一样共享应用链接【英文标题】:Swift - How to share app link as in the App Store 【发布时间】:2020-04-03 16:22:02 【问题描述】:我正在尝试使用 UIActivityViewController
共享我的应用,但无法重现与从 App Store 共享应用时相同的效果,这意味着:
当我点击 App Store 中的分享按钮时,我看到的内容如下所示:
但是当我尝试分享我的应用时,我有这个:
我使用的代码是:
if let logo = UIImage(named: "myLogo"), let websiteURL = URL(string: "https://itunes.apple.com/app/idxxxxxxxxxx")
let objectsToShare = ["My App Name", websiteURL, logo] as [Any]
let activityVC = UIActivityViewController(activityItems: objectsToShare, applicationActivities: [])
if let popoverController = activityVC.popoverPresentationController
popoverController.sourceView = self.view
popoverController.permittedArrowDirections = UIPopoverArrowDirection(rawValue: 0)
present(activityVC, animated: true)
if let popoverController = ...
循环用于防止在使用 iPad 时崩溃。
我必须进行哪些更改才能发挥 App Store 的效果? (要有一个带有标题和副标题的图像)
此外,例如,一旦我与Messages
共享应用程序,这就是区别:
我怎样才能有同样的效果? (带有标题和副标题的单个图像,作为奖励,视频)。我不确定这是否是 ios 13 的问题,因为所有类似的问题都没有相同的应用共享弹出框。
【问题讨论】:
【参考方案1】:您必须使用新的LinkPresentation
框架。
这基本上涉及 UIActivityItemSource 一致性,然后检索将包含活动视图和您正在共享的数据的元数据。数据可以在本地检索或下载。
ExampleController: UIViewController
var metadata: LPLinkMetadata?
func share()
let activityView = UIActivityViewController(activityItems: [self], applicationActivities: nil)
present(activityView, animated: true)
...
extension ExampleController: UIActivityItemSource
func activityViewControllerPlaceholderItem(_ activityViewController: UIActivityViewController) -> Any
return metadata
func activityViewController(_ activityViewController: UIActivityViewController, itemForActivityType activityType: UIActivity.ActivityType?) -> Any?
return metadata
func activityViewControllerLinkMetadata(_: UIActivityViewController) -> LPLinkMetadata?
metadata = LPLinkMetadata()
metadata.title = "Title"
metadata.originalURL = URL(string: "Description")
metadata.url = metadata.originalURL
// Using a locally stored item
metadata.iconProvider = NSItemProvider(object: UIImage(named: "image")!)
metadata.imageProvider = NSItemProvider.init(contentsOf:
Bundle.main.url(forResource: "image", withExtension: "JPG"))
return metadata
文档: https://developer.apple.com/documentation/uikit/uiactivityitemsource/3144571-activityviewcontrollerlinkmetada
WWDC 介绍: https://developer.apple.com/videos/play/wwdc2019/262/
【讨论】:
感谢您的回答。我尝试了你的实现,我可以看到模态演示中出现的图像和标题,但是活动类型是空白的,即我无法共享应用程序(iMessages、Airdrop 等。不在这里)。也许是因为我确实修改了一点你的代码。我必须在activityViewControllerLinkMetadata
中使用可选绑定,我在activityViewControllerPlaceholderItem
中确实有Expression implicitly coerced from 'LPLinkMetadata?' to 'Any'
但这仅适用于 iMessage,对吧?不在例如WhatsApp、Slack?【参考方案2】:
activityViewController.popoverPresentationController?.sourceView = self.view // so that iPads won't crash
你可以用这个。
【讨论】:
以上是关于Swift - 如何像在 App Store 中一样共享应用链接的主要内容,如果未能解决你的问题,请参考以下文章
App Store 提交的最低 Xcode/swift 版本
Swift 2.3 应用程序会在 App Store 上接受多长时间?
将 iOS 应用程序提交到内置于 swift 1.2 中的 App Store