将应用 link 分享给 ActivityViewController iOS swift?
Share app link to by ActivityViewController iOS swift?
我的应用程序尚未上线。我从 App Store Connect
获得了应用程序 ID。我想在社交媒体应用程序上分享应用程序 link。我使用了 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 等社交媒体应用程序。
这是用来打开网站的,不是用来分享应用的:
[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
Swift4 或更好的解决方案:
此解决方案也适用于 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)
}
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)
这里的解决方案都很好,但值得考虑实施 UIActivityItemSource
协议和 LinkPresentation
框架。
我的解决方案实现了以下目标:
- 应用程序图标和标题显示在
UIActivityViewController
- 直接 link 到 App Store 进行 AirDrop
ActivityType
- 消息和电子邮件的自定义文本,包括在 Google 上向应用添加 link 的机会 如果需要,请播放
- 电子邮件的主题
- 不使用
LPMetaDataProvider
提取请求(如本 WWDC 2019 262 视频中所述),因此加载速度更快
0。初始化 UIActivityViewController
:
将项目设置为 self
:
let activityVC = UIActivityViewController(activityItems: [self], applicationActivities: nil)
排除某些不适用的 ActivityType
:
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
您必须根据文档实现占位符方法:
Placeholder objects do not have to contain any real data but should be configured as closely as possible to the actual data object you intend to provide.
func activityViewControllerPlaceholderItem(_ activityViewController: UIActivityViewController) -> Any {
return ""
}
以及实际数据,将 link 返回给 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。实现主题方法
来自文档:
For activities that support a subject field, returns the subject for the item.
func activityViewController(_ activityViewController: UIActivityViewController, subjectForActivityType activityType: UIActivity.ActivityType?) -> String {
return "EMAIL_SUBJECT" // e.g. App name
}
3。实施LPLinkMetaData
方法
来自文档:
Returns metadata to display in the preview header of the share sheet.
@available(iOS 13.0, *)
func activityViewControllerLinkMetadata(_ activityViewController: UIActivityViewController) -> LPLinkMetadata? {
let metadata = LPLinkMetadata()
metadata.title = "APP_NAME"
return metadata
}
我的应用程序尚未上线。我从 App Store Connect
获得了应用程序 ID。我想在社交媒体应用程序上分享应用程序 link。我使用了 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 等社交媒体应用程序。
这是用来打开网站的,不是用来分享应用的:
[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
Swift4 或更好的解决方案:
此解决方案也适用于 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)
}
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)
这里的解决方案都很好,但值得考虑实施 UIActivityItemSource
协议和 LinkPresentation
框架。
我的解决方案实现了以下目标:
- 应用程序图标和标题显示在
UIActivityViewController
- 直接 link 到 App Store 进行 AirDrop
ActivityType
- 消息和电子邮件的自定义文本,包括在 Google 上向应用添加 link 的机会 如果需要,请播放
- 电子邮件的主题
- 不使用
LPMetaDataProvider
提取请求(如本 WWDC 2019 262 视频中所述),因此加载速度更快
0。初始化 UIActivityViewController
:
将项目设置为 self
:
let activityVC = UIActivityViewController(activityItems: [self], applicationActivities: nil)
排除某些不适用的 ActivityType
:
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
您必须根据文档实现占位符方法:
Placeholder objects do not have to contain any real data but should be configured as closely as possible to the actual data object you intend to provide.
func activityViewControllerPlaceholderItem(_ activityViewController: UIActivityViewController) -> Any {
return ""
}
以及实际数据,将 link 返回给 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。实现主题方法
来自文档:
For activities that support a subject field, returns the subject for the item.
func activityViewController(_ activityViewController: UIActivityViewController, subjectForActivityType activityType: UIActivity.ActivityType?) -> String {
return "EMAIL_SUBJECT" // e.g. App name
}
3。实施LPLinkMetaData
方法
来自文档:
Returns metadata to display in the preview header of the share sheet.
@available(iOS 13.0, *)
func activityViewControllerLinkMetadata(_ activityViewController: UIActivityViewController) -> LPLinkMetadata? {
let metadata = LPLinkMetadata()
metadata.title = "APP_NAME"
return metadata
}