国外社交平台分享总结

最近在做国际版项目,需要根据不同的分享平台来定制文案,所以无法使用系统的UIActivity来实现(其实系统的UIActivity真的是方便又好用。天真地以为集成各个平台就是无脑的按照文档copy + paste就可以了,结果被现实无情打脸,遇到各种问题,这里把集成过程中遇到的一些坑点经验记录下来。

Facebook

首先就是一步步按照官方文档集成 sdk,也没什么问题。差不多就是按照 facebook 官方给的实例代码来写

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import FacebookShare

func showShareDialog<Content: SharingContent>(
_ content: C,
mode: ShareDialog.Mode = .automatic
) {
let dialog = ShareDialog(
fromViewController: self,
content: content,
delegate: self
)
dialog.mode = mode
dialog.show()
}

但是产品希望我们分享出去的面板不仅仅带有一个链接,而是带有缩略图的。Facebook 最新的文档上写着 LinkShareContent 拥有 url,title,imageURL,description 这四个属性。真正使用的时候发现,这几个属性早已在v2.9版本的sdk中被声明为deprecate

facebook-linksharecontent

[facebook-changeLog-V2.9]https://developers.facebook.com/docs/graph-api/changelog/archive#gapi-deprecate-v2-9

最后这个功能只能由前端同学在h5页面里加上SEO信息来完成。

Messenger

Messenger 是 facebook 旗下的,所以 api 也基本一样

1
2
3
4
5
6
7
8
let content = ShareLinkContent()
content.contentURL = url
let dialog = MessageDialog (content: content, delegate: self)
guard dialog.canShow else {
//这里可以提示未安装messenger
return
}
dialog.show()

Twitter

Twitter 分享本来是要集成 sdk 的,但是由于公司在 twitter 平台上注册的应用迟迟没能审核通过,后来采用了 SLComposeViewController 来实现分享到 twitter 的功能,实现也很简单,代码如下。看到有资料说 SLComposeViewControler 在 iOS 11 之后就被 deprecated了,但是实际使用下来还是可以实现功能并上架的,但这也只是权宜之计,等到平台上的审核通过了肯定还是要接入 sdk的。

1
2
3
4
5
guard let composeVc = SLComposeViewController.init(forServiceType: SLServiceTypeTwitter) else {
return
}
composeVc.add(URL(string: url ?? ""))
composeVc.setInitialText(text)

国行版本的手机在 iOS 11 之后就不再支持分享到 facebook 或者 twitter

whatsApp

没有官方分享 sdk,通过 UIApplication.shared.openURL ,使用 whatsapp://send?text= 这个 scheme 来进行分享

需要在 info.plistLSApplicationQueriesSchemes 添加

1
<string>whatsapp</string>

Instagram

没有官方分享 sdk,通过 UIApplication.shared.openURL , 使用下列 url 可以跳转到 Instagram 应用并执行特定的操作。

需要在 info.plistLSApplicationQueriesSchemes 添加

1
<string>instagram</string>
URL 操作
intagram://app 启动 instagram
intagram://camera 启动 Instagram 并打开摄像头,没有摄像头的话会打开
intagram://media?id= 启动 Instagram 应用并加载与所提供编号值 (int) 相匹配的帖子
user?username= 启动 Instagram 应用并加载与所提供帐号值 (string) 相匹配的 Instagram 用户。
location?id= 启动 Instagram 应用并加载与所提供编号值 (int) 相匹配的位置信息库。
tag?name= 启动 Instagram 应用并加载与所提供名称值 (string) 相匹配的话题标签页面。

在分享过程中发现,如果分享的内容仅为一段文本,是无法打开 instagram 进行分享的,必须要有图片才可以。包括使用系统原生的 UIActivityController,仅文本时是不会有 Instagram 图标的。

Pinterest

Pinterest是有官方sdk的,但是没有swift版本的文档,不过问题不大。集成的时候除了需要 PinteestSDK还需要依赖一个SAMKeychain

1
2
pod 'SAMKeychain', :git => 'https://github.com/soffes/SAMKeychain.git'
pod 'PinterestSDK', :git => 'https://github.com/pinterest/ios-pdk.git'

其他的基本就是按照官方文档的来了,附上官方文档地址 https://developers.pinterest.com/docs/sdks/ios/

短信/邮件分享

国外使用短信和邮件的比例还是比较高的,这里分别是用 MFMessageComposeViewControllerMFMailComposeViewController 来实现相应功能,开发过程中发现有两个需要注意的点

  1. 如果用户的 iOS 默认邮件 app 没有登录邮箱,是无法被调起的
  2. messageComposeDelegatemailComposeDelegate 必须是 UIViewController,否则会发生 crash。