我正在尝试使用 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 等于上面显示的内容。这样做会导致 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 朋友分享活动,并在理想情况下为我的应用程序带来更多流量?