无法通过 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 连接登录

iOS Facebook 最新 SDK 无法通过原生 App 但浏览器登录

更新到 IOS 9 后无法登录 Facebook

iOS:通过自动登录获取 Facebook 访问令牌