Swift - 如何像在 App Store 中一样共享应用程序链接

Nic*_*coC 5 app-store ios uiactivityviewcontroller swift ios13

我正在尝试使用共享我的应用程序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)
}
Run Code Online (Sandbox Code Playgroud)

if let popoverController = ...循环是为了防止使用 iPad 时发生崩溃。

我需要改变什么才能达到App Store的效果?(要有带有标题和副标题的图像)

此外,一旦我与例如共享应用程序Messages,这就是区别:

在此输入图像描述 在此输入图像描述

我怎样才能达到同样的效果?(带有标题和副标题的单个图像,作为奖励,一个视频)。我不确定这是否是 iOS 13 的问题,因为所有类似的问题都没有相同的应用程序共享弹出窗口。

Ste*_*fan 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
    }
}
Run Code Online (Sandbox Code Playgroud)

文档: https ://developer.apple.com/documentation/uikit/uiactivityitemsource/3144571-activityviewcontrollerlinkmetada

WWDC 演示: https://developer.apple.com/videos/play/wwdc2019/262/