2016-10-03 39 views
1

這是完美的工作,直到swift 2.2和iOS 9,但在Swift 3.0中所做的更改後,我無法獲取姓名,電子郵件和fbid。這是因爲任何結果都會出現而無法從結果中提取數據。我的代碼是像下面的SWIFT 3.0如何從ios 10中的FBGraphApi的結果中提取數據

func signInWithFB(_ forVC:UIViewController , sucess:@escaping signInSuccessBlock , falure:@escaping SignInFailureBlock) 
     { 
      let obj_facebook = FBSDKLoginManager() 
      obj_facebook.loginBehavior = .native 
      obj_facebook.logIn(withReadPermissions: ["public_profile","email","user_friends"], from: forVC) { (result:FBSDKLoginManagerLoginResult?, error:Error?) -> Void in 
       if ((error) != nil) 
       { 
        falure(error as NSError?, false) 
       } 
       else if ((result?.isCancelled) == true) 
       { 
        falure(nil, true) 
       } 
       else 
       { 

        let dicLoginData = NSMutableDictionary() 
        let request = FBSDKGraphRequest(graphPath: "/me?fields=name,email,gender,hometown,education,location,first_name,last_name", parameters: nil) 
        let _ = 
        request?.start(completionHandler: { (Connection:FBSDKGraphRequestConnection?, result:Any!, error:Error?) -> Void in 

         if error == nil 
         { 

          dicLoginData.setValue((result as AnyObject).value(forKey: "name"), forKey: "name") 
          dicLoginData.setValue((result as AnyObject).value(forKey: "email"), forKey: "email") 
          dicLoginData.setValue((result as AnyObject).value(forKey: "gender"), forKey: "Gender") 
          dicLoginData.setValue((result as AnyObject).value(forKey: "last_name"), forKey: "lname") 
          dicLoginData.setValue((result as AnyObject).value(forKey: "first_name"), forKey: "fname") 
          let faceBookID:String = (result as AnyObject).value(forKey: "id") as! String 
          let proPicUrl = String(format:"https://graph.facebook.com/%@/picture?type=large", faceBookID) 
          dicLoginData.setValue(faceBookID, forKey: "facebookId") 
          dicLoginData.setValue(proPicUrl, forKey: "proPicURL") 
          //     dicLoginData.setValue(strLoaction?.first, forKey: "City") 


          sucess(dicLoginData) 
         } 
         else 
         { 
          falure(error as NSError?, false) 
         } 

        }) 

       } 
      } 
     } 

回答

1

轉換指定result對象的類型[String: Any]和而不是迅速使用標有Dictionaryresult["name"]使用value(forKey:)setValue(_:forKey),所以作出這樣的變化之後。

if let fbDic = result as? [String: Any] { 
    dicLoginData["name"] = fbDic["name"] 
    //and so on 
} 

注:在斯威夫特連擊,如果你使用雨燕的通用DictionaryArray對象,而不是NSDictionary/NSArray

+0

請檢查編輯的答案,我錯誤地使用了結果而不是fbDic裏面的if if塊。 –

相關問題