通过 ActivityViewController iOS swift 共享应用程序链接?

Posted

技术标签:

【中文标题】通过 ActivityViewController iOS swift 共享应用程序链接?【英文标题】:Share app link to by ActivityViewController iOS swift? 【发布时间】:2016-03-08 07:59:55 【问题描述】:

我的应用尚未上线。我从App Store Connect 获得了应用程序 ID。我想在社交媒体应用程序上分享应用程序链接。我用UIActivityViewController

let string1 = "itms-apps://itunes.apple.com/app/idXXXXXXX"
let url = NSURL(string: string1)

let shareItems = [UIApplication.sharedApplication().openURL(url!)]
    
let activityViewController = UIActivityViewController(activityItems: shareItems, applicationActivities: nil)
self.presentViewController(activityViewController, animated: true, completion: nil)

问题:它没有显示一些社交媒体应用,例如 WhatsApp。

【问题讨论】:

你有什么问题??什么应用没有显示或如何获取 xxx 码?? 在这个地方使用https://itunes.apple.com/us/app/myapp/idxxxxxxxx?ls=1&mt=8 那行不通。您正在尝试将调用函数 (VOID) 的结果放入数组中。您需要做的只是将非可选 URL 放入数组中。 【参考方案1】:

Swift 4 或更高版本的解决方案:

此解决方案也适用于 iPad(上述解决方案在 iPad 上崩溃):

if let urlStr = NSURL(string: "https://apps.apple.com/us/app/idxxxxxxxx?ls=1&mt=8") 
    let objectsToShare = [urlStr]
    let activityVC = UIActivityViewController(activityItems: objectsToShare, applicationActivities: nil)

    if UIDevice.current.userInterfaceIdiom == .pad 
        if let popup = activityVC.popoverPresentationController 
            popup.sourceView = self.view
            popup.sourceRect = CGRect(x: self.view.frame.size.width / 2, y: self.view.frame.size.height / 4, width: 0, height: 0)
        
    

    self.present(activityVC, animated: true, completion: nil)

【讨论】:

网址改为“apps.apple.com/us/app/id(yourapp id)” 如果不是在Viewcontroller中做,可以通过在函数中加入“vc:UIViewController”参数来使用vc,而不是使用self。我使用“activityVC”而不是 self :) 它不起作用,所以我正在写这篇评论。【参考方案2】:

这是用来打开网站的,不是用来分享应用的:

[UIApplication.sharedApplication().openURL(url!)]

改为这样做:

if let name = URL(string: "https://itunes.apple.com/us/app/myapp/idxxxxxxxx?ls=1&mt=8"), !name.absoluteString.isEmpty 
  let objectsToShare = [name]
  let activityVC = UIActivityViewController(activityItems: objectsToShare, applicationActivities: nil)
  self.present(activityVC, animated: true, completion: nil)
 else 
  // show alert for not available

样品见this

【讨论】:

我可以用“itms-apps://itunes.apple.com/app/idXXXXXXX”代替“itunes.apple.com/us/app/myapp/idxxxxxxxx?ls=1&mt=8”吗? 这个是回调方法,我们直接检查应用是否在我们的设备中可用,如果你使用这个`itunes.apple.com/us/app/myapp/idxxxxxxxx?ls=1&mt=8,它会直接重定向到safari 我看到 ?ls=1&mt=8 正在更改某些应用程序...我想直接从链接下载应用程序【参考方案3】:

这里的解决方案都很好,但值得考虑实现UIActivityItemSource 协议和LinkPresentation 框架。

我的解决方案实现了以下目标:

应用程序图标和标题显示在UIActivityViewController 的顶部 AirDrop 直接链接到 App Store ActivityType 消息和电子邮件的自定义文本,包括在需要时添加指向 Google Play 应用程序链接的机会 电子邮件主题 不使用LPMetaDataProvider 获取请求(如此WWDC 2019 262 视频中所述)加载速度如此之快

0。初始化UIActivityViewController:

将项目设置为self:

let activityVC = UIActivityViewController(activityItems: [self], applicationActivities: nil)

排除某些不适用的ActivityTypes:

activityVC.excludedActivityTypes = [.addToReadingList, .assignToContact, .markupAsPDF, .openInIBooks, .saveToCameraRoll]

对于 iPad,设置 popoverPresentationController.sourceView.barButtonItem(在 iPhone 上被忽略):

activityVC.popoverPresentationController?.sourceView = myButton

展示它:

present(activityVC, animated: true, completion: nil)

1。实现所需的UIActivityItemSource 方法

https://developer.apple.com/documentation/uikit/uiactivityitemsource

您必须根据文档实现占位符方法:

占位符对象不必包含任何真实数据,但应尽可能接近您打算提供的实际数据对象。

func activityViewControllerPlaceholderItem(_ activityViewController: UIActivityViewController) -> Any 
    return ""

以及实际数据,返回指向 AirDrop 应用的链接和其他所有内容的文本:

func activityViewController(_ activityViewController: UIActivityViewController, itemForActivityType activityType: UIActivity.ActivityType?) -> Any? 
    
    if activityType == .airDrop 
        return URL(string: "APP_STORE_URL")!
    
    
    return "Check out the APP_NAME on the App Store: APP_STORE_URL or on the Google Play Store: PLAY_STORE_URL"

2。实现主题方法

来自文档:

对于支持主题字段的活动,返回项目的主题。

func activityViewController(_ activityViewController: UIActivityViewController, subjectForActivityType activityType: UIActivity.ActivityType?) -> String 
    return "EMAIL_SUBJECT" // e.g. App name

3。实现LPLinkMetaData方法

来自文档:

返回元数据以显示在共享表的预览标题中。

@available(ios 13.0, *)
func activityViewControllerLinkMetadata(_ activityViewController: UIActivityViewController) -> LPLinkMetadata? 
    let metadata = LPLinkMetadata()
    metadata.title = "APP_NAME"
    return metadata

【讨论】:

我有一个疑问。如果我们正在共享链接,我们如何在我们的应用程序的共享表中获得 - 添加到阅读列表选项?使用共享表共享我的应用中的链接时,我无法获得该选项。 @SayaleePote 除了手动排除活动类型外,系统还将删除不兼容的活动类型。我不知道系统希望将什么样的数据添加到阅读列表中,我原以为链接会起作用,但它不起作用。 刚刚修好了。一个链接有效。我们需要确保占位符的返回类型是该选项出现的链接。最初是发送一个链接,但占位符的返回类型是一个导致问题的空字符串。【参考方案4】:

iPhone 解决方案适用于 Swift 5+

let url = URL(string: "https://apps.apple.com/us/app/id1535629801")!
let vc = UIActivityViewController(activityItems: [url], applicationActivities: nil)
present(vc, animated: true)

【讨论】:

以上是关于通过 ActivityViewController iOS swift 共享应用程序链接?的主要内容,如果未能解决你的问题,请参考以下文章

在 UIActivity:activityViewController 期间显示 UIAlertView

为啥 ActivityViewController 在控制台中显示自动约束错误?

为 ActivityViewController 提供的未知活动项

在 activityViewController 中更改 barTintColor

UIActivity activityViewController 没有在 iPad 上关闭

UIActivity 自定义 activityViewController 在 iPad 上崩溃