【问题标题】:Creating a Facebook Open Graph object using Swift使用 Swift 创建 Facebook Open Graph 对象
【发布时间】:2015-01-20 06:08:52
【问题描述】:

我正在使用 Facebook iOS SDK 创建一个自定义故事,该应用程序是用 Swift 编写的。我的代码基于他们的文档示例https://developers.facebook.com/docs/ios/open-graph#createobject

一切顺利,直到我必须创建 FBGraphObject

NSMutableDictionary<FBOpenGraphObject> *object = [FBGraphObject openGraphObjectForPost];

在 Swift 中,我将这个块重写为:

var object = FBGraphObject.openGraphActionForPost()

// specify that this Open Graph object will be posted to Facebook
object.setObject(true, forKey: "provisionedForPost")

// for og:title
object.setObject(description["title"]!, forKey: "title")

// for og:type, this corresponds to the Namespace you've set for your app and the object type name
object.setObject("bppridereport:ride", forKey: "type")

// for og:description
object.setObject(description["description"]!, forKey: "description")

FBRequestConnection.startForPostOpenGraphObject(object, completionHandler: { (connection:FBRequestConnection!, result:AnyObject!, error:NSError!) -> Void in

    if error == nil {
        let objectId = result["id"]

      } else {
          NSLog("Error posting the Open Graph object to the Object API:", error);
      }

  })

这给了我一个错误:NSMutableDictionary 与 FBOpenGraphObject 不同,这有点道理,阅读文档 FBOpenGraphObject 只是一个修饰过的 NSMutableDictionary 所以我将对象转换为 FBOpenGraphObject 解决了错误

var object = FBGraphObject.openGraphActionForPost() as FBOpenGraphObject

问题是,当我现在编译它并运行应用程序时,它在这条线上崩溃了......我很困惑。很少有关于 Facebook SDK 的 Swift 实现的内容。任何想法为什么会发生这种情况?

【问题讨论】:

  • 崩溃时的错误信息是什么?
  • @Mike Taverne 它看起来像这样 -> Thread 1: Signal SIGABRT on var object = FBGraphObject.openGraphActionForPost() as FBOpenGraphObject error screengrab swift_dynamicCastObjCProtocolUnconditional error screengrab
  • 有什么想法@MikeTaverne?

标签: ios facebook facebook-graph-api swift facebook-opengraph


【解决方案1】:

我在对 Facebook 的调用中将类型转换为 FBGraphObject。

我在您的示例中使用了不同的调用,因为我已经使用 metadata 设置了 html 页面,但是您的示例的重构如下:

var object = FBGraphObject.openGraphActionForPost()

// Code to create object metadata omitted //

FBRequestConnection.startForPostOpenGraphObject(object as FBGraphObject, completionHandler: {
(connection:FBRequestConnection!, result:AnyObject!, error:NSError!) in
    if error == nil {
        let objectId = result["id"]
    } else {
       NSLog("Error posting the Open Graph object to the Object API:", error)
   }
})

我希望这会有所帮助。

【讨论】:

    【解决方案2】:

    我没有使用过 Facebook API,所以这充其量只是一个有根据的猜测:

     var object = FBGraphObject.openGraphActionForPost() as NSMutableDictionary<FBOpenGraphObject>
    

    【讨论】:

    • 非常感谢@Mike 的回复。我可以看到这有什么意义,但是,我收到“无法专门化非泛型类型'NSMutable Dictionary'”错误error screengrab
    • 对不起,丹,这就是我猜测的结果。今天我又看了一些,但我没有看到 Swift 中有一种方法可以做与他们希望你在 ObjC 中做的等效的事情。
    • 你不能这样做,因为 在 Swift 中意味着完全不同的东西。在 Objective C 中:NSMutableDictionary&lt;FBOpenGraphObject&gt; 将使字典符合 FBOpenGraphObject 协议。在 Swift 中,这意味着创建一个包含一组 FBOpenGraphObjects 的 NSMutableDictionary。
    • @ChrisHarrison 感谢您的澄清。我没有意识到 的含义不同。
    猜你喜欢
    • 2012-02-11
    • 1970-01-01
    • 1970-01-01
    • 2017-12-08
    • 1970-01-01
    • 1970-01-01
    • 2012-03-22
    • 2013-10-21
    • 2013-07-20
    相关资源
    最近更新 更多