首页 > 解决方案 > Swift - 如何像在 App Store 中一样共享应用链接

问题描述

我正在尝试使用共享我的应用程序,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 的问题,因为所有类似的问题都没有相同的应用共享弹出框。

标签: iosswiftapp-storeios13uiactivityviewcontroller

解决方案


您必须使用新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/


推荐阅读