【问题标题】:Swift - How to share app link as in the App StoreSwift - 如何像在 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 的问题,因为所有类似的问题都没有相同的应用共享弹出框。

【问题讨论】:

    标签: ios swift app-store ios13 uiactivityviewcontroller


    【解决方案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
    

    你可以用这个。

    【讨论】:

      猜你喜欢
      • 2022-08-12
      • 2011-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-23
      • 1970-01-01
      相关资源
      最近更新 更多