无法通过 iOS 应用程序 post 深入 link 到 Facebook
Unable to post deep link to Facebook via iOS application
我正在尝试使用 FBSDK,特别是 FBSDKShareKit 让用户 post 从我的应用程序到他们的墙 link。我已经通过 Facebook Developers 设置了我的应用程序(我知道这不是问题,因为我的应用程序用户使用 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 实际呈现深度 link。我尝试了两种方法:
使用 FBSDKShareKit 的 FBSDKShareButton,方法是将按钮的 shareContent 设置为 FBSDKShareLinkContent,其内容 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 framework实例化一个SLComposeViewController,将上述view controller的URL设置为与上面相同的,并呈现view controller。 post 通过 Facebook 时,我收到错误消息提示 "There was a problem sharing your link." 同样,当用 "www.google.com," 替换有问题的 URL 时,post 成功通过,再次表明 Facebook 出于某种原因不喜欢我提供的深度 link。
@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 不允许我 post:
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
代表用户。如果是这种情况,我应该如何格式化我的深度 link 以便用户可以 post 从我的应用程序到他们的墙,有效地与他们的 Facebook 朋友分享事件,理想情况下,增加流量到我的应用程序?
看来我所要做的就是等待一段时间(我猜 link 可能需要长达 48 小时才能开始工作?)。
请注意,Facebook 应用不允许用户通过 universal/deep linking 导航到另一个应用。 他们的应用内浏览器旨在不允许这种情况发生。有一些解决方法,最著名的是 Branch.io,它允许用户通过 Facebook 使用他们的通用 links。
我正在尝试使用 FBSDK,特别是 FBSDKShareKit 让用户 post 从我的应用程序到他们的墙 link。我已经通过 Facebook Developers 设置了我的应用程序(我知道这不是问题,因为我的应用程序用户使用 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 实际呈现深度 link。我尝试了两种方法:
使用 FBSDKShareKit 的 FBSDKShareButton,方法是将按钮的 shareContent 设置为 FBSDKShareLinkContent,其内容 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 framework实例化一个SLComposeViewController,将上述view controller的URL设置为与上面相同的,并呈现view controller。 post 通过 Facebook 时,我收到错误消息提示 "There was a problem sharing your link." 同样,当用 "www.google.com," 替换有问题的 URL 时,post 成功通过,再次表明 Facebook 出于某种原因不喜欢我提供的深度 link。
@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 不允许我 post:
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
代表用户。如果是这种情况,我应该如何格式化我的深度 link 以便用户可以 post 从我的应用程序到他们的墙,有效地与他们的 Facebook 朋友分享事件,理想情况下,增加流量到我的应用程序?
看来我所要做的就是等待一段时间(我猜 link 可能需要长达 48 小时才能开始工作?)。
请注意,Facebook 应用不允许用户通过 universal/deep linking 导航到另一个应用。 他们的应用内浏览器旨在不允许这种情况发生。有一些解决方法,最著名的是 Branch.io,它允许用户通过 Facebook 使用他们的通用 links。