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 中一样共享应用链接的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 中从 App 启动 App Store

App Store 提交的最低 Xcode/swift 版本

Swift 2.3 应用程序会在 App Store 上接受多长时间?

将 iOS 应用程序提交到内置于 swift 1.2 中的 App Store

《互动教程 for Xcode7 & Swift2》已成功发布在App Store

iPad,类似 App Store 的界面,管理项目的建议