无法通过 iOS 应用程序发布到 Facebook 的深层链接
Posted
技术标签:
【中文标题】无法通过 iOS 应用程序发布到 Facebook 的深层链接【英文标题】:Unable to post deep link to Facebook via iOS application 【发布时间】:2019-02-14 19:45:23 【问题描述】:我正在尝试使用 FBSDK,特别是 FBSDKShareKit,让用户从我的应用程序中发布指向他们墙的深层链接。我用 Facebook 开发者设置了我的应用程序(我知道这不是问题,因为我的应用程序用户使用 Facebook 登录没有问题)并且有一个与应用程序关联的方案后缀。
我的应用程序的 info.plist 具有相同的后缀集。我知道这很有效,因为当从 Safari 打开带有此后缀的 URL 时,它会导航到我的应用程序。
当打开一个 URL 时,我的应用程序委托会检查 URL 主机是否与某个字符串匹配,如果匹配,我会检查 URL 路径是否与某个字符串匹配。如果这两者都匹配,那么我会解析从 URL 传递的参数,创建一个自定义对象(在本例中为一个事件),实例化一个视图控制器,并使用自定义对象的属性填充该视图控制器。
func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool
if url.host != "www.mywebsite.app"
return false
else if url.path == "/sharedEvent"
if let parameters = url.queryParameters
//Get params from url
let name = parameters["name"]!
let description = parameters["description"]!
let lat = parameters["lat"]!.CGFloatValue()
let lng = parameters["lng"]!.CGFloatValue()
let startTime = Int(parameters["startTime"]!)!
let endTime = Int(parameters["endTime"]!)!
let categories = parameters["categories"]!
let priority = Int(parameters["priority"]!)!
let id = parameters["id"]!
let userId = parameters["userId"]!
let userName = parameters["userName"]!
let userEmail = parameters["userEmail"]!
let photoURLs = parameters["photoURLs"]!
let isVerified = Int(parameters["isVerified"]!)
//Create event from parameters
let sharedEvent = Event(name: name, description: description, lat: lat, long: lng, startTime: Date(timeIntervalSince1970: Double(startTime)), endTime: Date(timeIntervalSince1970: Double(endTime)), categories: [categories], priority: priority, id: id, userId: userId, userName: userName, userEmail: userEmail, photoURLs: [photoURLs], isVerified: isVerified!)
//Instantiate eventVC
let storyboard = UIStoryboard(name: "Main", bundle: .main)
let eventVC = storyboard.instantiateViewController(withIdentifier: "EventViewController") as! EventViewController
eventVC.event = sharedEvent
eventVC.userId = userId
eventVC.userEmail = userEmail
eventVC.userName = userName
DispatchQueue.main.async
self.window!.rootViewController!.presentedViewController?.present(eventVC, animated: true, completion: nil)
return true
我通过使用一些参数从另一个应用程序打开 URL 来测试此代码的工作原理,并在应用程序打开时显示相应的视图控制器。 URL 可能如下所示:
fb1068346896678533://www.hootevents.app/sharedEvent?name=Some%20Name&description=Some%20description&lat=38.7016&lng=-90.447&startTime=1548466210&endTime=1551058140&categories=lhw9bs31nr2twlx&priority=1&id=15510581401548012896PfZLZCzDUh&userId=f5qLpyu4XNWa4eJI17sBi71bIw23&userName=David%20Chopin&userEmail=chopindavidg@gmail.com&photoURLs=https://upload.wikimedia.org/wikipedia/commons/thumb/2/2f/Google_2015_logo.svg/1200px-Google_2015_logo.svg.png&isVerified=1
我的问题在于通过 Facebook 实际呈现深层链接。我尝试了两种方法:
通过将按钮的 shareContent 设置为 FBSDKShareLinkContent 使用 FBSDKShareKit 的 FBSDKShareButton,其内容 url 等于上面显示的 URL。这样做会导致 FBSDKShareButton 灰显,即禁用。将内容的 URL 更改为“www.google.com”之类的内容会启用该按钮,这意味着 Facebook 出于某种原因不喜欢我的 URL。
let button = FBSDKShareButton()
let shareContent = FBSDKShareLinkContent()
content.contentURL = URL(string: "fb1068346896678533://www.hootevents.app/sharedEvent?name=Some%20Name&description=Some%20description&lat=38.7016&lng=-90.447&startTime=1548466210&endTime=1551058140&categories=lhw9bs31nr2twlx&priority=1&id=15510581401548012896PfZLZCzDUh&userId=f5qLpyu4XNWa4eJI17sBi71bIw23&userName=David%20Chopin&userEmail=chopindavidg@gmail.com&photoURLs=https://upload.wikimedia.org/wikipedia/commons/thumb/2/2f/Google_2015_logo.svg/1200px-Google_2015_logo.svg.png&isVerified=1")
button.shareContent = content
使用 ios 的 Social 框架来实例化 SLComposeViewController,将所述视图控制器的 URL 设置为与上述相同的 URL,并呈现视图控制器。通过 Facebook 发布后,我收到错误消息“共享您的链接时出现问题”。同样,当用“www.google.com”替换有问题的 URL 时,帖子成功通过,再次表明 Facebook 不喜欢我提供的深层链接出于某种原因。
@IBAction func shareButtonPressed(_ sender: Any)
let vc = SLComposeViewController(forServiceType: SLServiceTypeFacebook)
vc?.add(loadedImages.first?.image)
vc!.add(URL(string: shareURL))
for photo in self.loadedImages
vc!.add(photo.image!)
present(vc!, animated: true, completion: nil)
因此,总而言之,我认为这里的问题在于 Facebook 不允许我发帖这一事实:
fb1068346896678533://www.hootevents.app/sharedEvent?name=Some%20Name&description=Some%20description&lat=38.7016&lng=-90.447&startTime=1548466210&endTime=1551058140&categories=lhw9bs31nr2twlx&priority=1&id=15510581401548012896PfZLZCzDUh&userId=f5qLpyu4XNWa4eJI17sBi71bIw23&userName=David%20Chopin&userEmail=chopindavidg@gmail.com&photoURLs=https://upload.wikimedia.org/wikipedia/commons/thumb/2/2f/Google_2015_logo.svg/1200px-Google_2015_logo.svg.png&isVerified=1
代表用户。如果是这种情况,我应该如何格式化我的深层链接,以便用户可以从我的应用程序将其发布到他们的墙上,有效地与他们的 Facebook 朋友分享活动,并在理想情况下为我的应用程序带来更多流量?
【问题讨论】:
【参考方案1】:看来我所要做的就是等待一段时间(我想链接开始工作可能需要长达 48 小时?)。
请注意,Facebook 应用不允许用户通过通用/深度链接导航到另一个应用。他们的应用内浏览器旨在不允许这种情况发生。有一些解决方法,最著名的是Branch.io,它允许用户通过 Facebook 使用他们的通用链接。
【讨论】:
以上是关于无法通过 iOS 应用程序发布到 Facebook 的深层链接的主要内容,如果未能解决你的问题,请参考以下文章
iOS 8 上的 Facebook 登录;登录切换后应用程序无法运行
ios 6 - 在应用程序中发布到 Facebook 无法在设备上运行
Facebook 登录问题 - iOS 应用程序的新用户无法通过 FB 连接登录