2014-12-31 4 views
1

Я хочу поделиться изображением на Facebook с помощью быстрого языка. Я могу поделиться изображение с помощью Objective C. Я попытался с помощьюКак обмениваться имиджем на Facebook с помощью Swift в IOS

1) How to Share image + text with facebook in swift iOS?

, но не работает, то я попытался с помощью других вариантов, но не в состоянии разделить изображение, используя быстрый язык. Затем я попытался это

2) https://github.com/rajeshsegu/facebook-ios-swift/tree/master/FBApp

Я скопировал Facebook.swift и написать еще одну функцию для акций изображения мой код для Facebook.swift

import Foundation 
import Social 

let FB = Facebook(); 

class Facebook { 

    var fbSession:FBSession? 

    init(){ 
     self.fbSession = FBSession.activeSession(); 
    } 

    func hasActiveSession() -> Bool{ 
     let fbsessionState = FBSession.activeSession().state; 
     if (fbsessionState == FBSessionState.Open 
      || fbsessionState == FBSessionState.OpenTokenExtended){ 
       self.fbSession = FBSession.activeSession(); 
       return true; 
     } 
     return false; 
    } 

    func login(callback:() -> Void){ 

     let permission = ["publish_actions","email","user_location","user_birthday","user_hometown","user_photos","user_about_me"]; 
     let activeSession = FBSession.activeSession(); 
     let fbsessionState = activeSession.state; 
     var showLoginUI = true; 

     if(fbsessionState == FBSessionState.CreatedTokenLoaded){ 
      showLoginUI = false; 
     } 

     if(fbsessionState != FBSessionState.Open 
      && fbsessionState != FBSessionState.OpenTokenExtended){ 

       FBSession.openActiveSessionWithPublishPermissions(permission, defaultAudience: FBSessionDefaultAudience.Friends, allowLoginUI: showLoginUI, completionHandler: { (session:FBSession!, state:FBSessionState, error:NSError!) -> Void in 

        if(error != nil){ 
         println("Session Error: \(error)"); 
        } 
        self.fbSession = session; 
        // println("Session : \(self.fbSession?.permissions)"); 
        callback(); 

       }) 

//    FBSession.openActiveSessionWithReadPermissions(
//     permission, 
//     allowLoginUI: showLoginUI, 
//     completionHandler: { (session:FBSession!, state:FBSessionState, error:NSError!) in 
// 
//      if(error != nil){ 
//       println("Session Error: \(error)"); 
//      } 
//      self.fbSession = session; 
//      println("Session : \(self.fbSession?.permissions)"); 
//      callback(); 
//       
//     } 
//    ); 
       return; 
     } 

     callback(); 

    } 

    func logout(){ 
     self.fbSession?.closeAndClearTokenInformation(); 
     self.fbSession?.close(); 
    } 

    func getInfo(){ 
     FBRequest.requestForMe()?.startWithCompletionHandler({(connection:FBRequestConnection!, result:AnyObject!, error:NSError!) in 

      if(error != nil){ 
       println("Error Getting ME: \(error)"); 
      } 

      println("\(result)"); 
      var dictData:NSDictionary!=result as? NSDictionary 
     }); 
    } 

    func handleDidBecomeActive(){ 
     FBAppCall.handleDidBecomeActive(); 
    } 

    func shareImage (imageName:UIImageView){ 
     let fbsessionState = FBSession.activeSession().state; 
     if(fbsessionState == FBSessionState.Open) 
     { 
      //var arr : NSArray=NSArray(array: ["publish_actions"]) 
      self.fbSession?.requestNewPublishPermissions(["publish_actions"], defaultAudience:FBSessionDefaultAudience.Friends, completionHandler: { (session:FBSession!, error:NSError!) -> Void in 
       if(error == nil){ 
        var requestConneciton:FBRequestConnection=FBRequestConnection() 
        requestConneciton.errorBehavior=FBRequestConnectionErrorBehavior.None 

        requestConneciton.addRequest(FBRequest(forUploadPhoto:imageName.image)) { (connection:FBRequestConnection!, result:AnyObject!, error:NSError!) -> Void in 
         println("\(error)"); 
         println("\(result)"); 
         //[self showAlert:@"Photo Post" result:result error:error]; 
        } 
        requestConneciton.start() 

       } 
       else if(error.fberrorCategory == FBErrorCategory.UserCancelled){ 
        var alt:UIAlertView!=UIAlertView(title:"Permission denied", message:"Unable to get permission to post", delegate:nil, cancelButtonTitle:"Ok") 
        alt.show() 
       } 

      }) 
     } 
    } 

    func showAlert(msg:NSString!,result:AnyObject,error:NSError!) { 
     var alertTitle:NSString! 
     var alertMsg:NSString!; 
     if (error == nil) { 
      if((error.fberrorUserMessage != nil && FBSession.activeSession().isOpen)) { 
       alertTitle = ""; 
      } 
      else{ 
       // Otherwise, use a general "connection problem" message. 
       alertMsg = "Operation failed due to a connection problem, retry later."; 
      } 
     } 
     else { 
      //var dictResult:NSDictonary = result as NSDictionary 
      alertMsg="Successfully posted " 
      var alertObj:UIAlertView!=UIAlertView(title:"Demo App", message:alertMsg, delegate:nil, cancelButtonTitle:"Ok"); 
      alertObj.show(); 
     } 
    } 

    func performPublishAction(action:() -> Void){ 

     var arrP:NSArray!=NSArray(array: ["publish_actions"]); 

     fbSession?.requestNewPublishPermissions(arrP, defaultAudience:FBSessionDefaultAudience.Friends, completionHandler: { (session:FBSession!, error:NSError!) -> Void in 

      if(error == nil){ 
       action() 
      } 
      else if(error.fberrorCategory == FBErrorCategory.UserCancelled){ 
       var alt:UIAlertView!=UIAlertView(title:"Permission denied", message:"Unable to get permission to post", delegate:nil, cancelButtonTitle:"Ok") 
       alt.show() 
      } 

     }) 
    } 
} 

и В ViewController.swift

import UIKit 

class ViewController: UIViewController,FBLoginViewDelegate { 

    @IBOutlet var imageObj:UIImageView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    @IBAction func btnFBLoginClick(sender: UIButton) { 
     FB.login(self.handleLogin); 
    } 

    func handleLogin(){ 
     println("SUCCESS"); 
     FB.getInfo(); 
    } 

    @IBAction func btnShareclick(sender: UIButton) { 
     FB.shareImage(imageObj) 
    } 

} 

Кнопка входа в систему работает отлично, и она может извлекать все данные пользователя входа, но когда я обмениваюсь изображением с помощью FB.shareImae(imageObj), ошибка разрешения, я работаю над этим пунктом за последние 2 дня, теперь я застрял. если я пишу тот же код в Objective C, что он работает нормально.

EROR:

permissions:(
    "public_profile", 
    email, 
    "user_friends" 
)>, com.facebook.sdk:ParsedJSONResponseKey={ 
    body =  { 
     error =   { 
      code = 200; 
      message = "(#200) Permissions error"; 
      type = OAuthException; 
     }; 
    }; 
    code = 403; 
}} 

Может ли один помочь мне? чтобы выяснить эту проблему ...

Я не хочу использовать SLComposeViewController, я хочу использовать фреймворк Facebook.

Спасибо заранее!

+0

У меня такая же проблема, мой запрос работает только в первый раз. У меня есть ошибка 5 в SDK для Facebook: «Ошибка для запроса конечной точке»/me/permissions »: для вызовов этой конечной точки должна быть указана открытая FBSession. Ошибка: операция не может быть выполнена. (Com.facebook. sdk error 5) ". Я использовал ту же структуру, что и ваш, проект github. Вход в систему работает, но я не могу поделиться ссылкой на Facebook. Вы решили это? –

+0

@MarieDm Я еще не могу решить это :(, но я искал это, если бы нашел что-нибудь, то я поделюсь ... –

ответ

2

Это код, который я создал в старом проекте. Дайте ему попробовать;)

@IBAction func btn_Share(sender: AnyObject) { 

    let facebookPost = SLComposeViewController(forServiceType: SLServiceTypeFacebook) 
    facebookPost.completionHandler = { 
     result in 
     switch result { 
     case SLComposeViewControllerResult.Cancelled: 
      //Code to deal with it being cancelled 
      break 

     case SLComposeViewControllerResult.Done: 
      //Code here to deal with it being completed 
      break 
     } 
    } 

    facebookPost.setInitialText("Test Facebook") //The default text in the tweet 
    facebookPost.addImage(masked_image) //Add an image 
    facebookPost.addURL(NSURL(string: "http://facebook.com")) //A url which takes you into safari if tapped on 

    self.presentViewController(facebookPost, animated: false, completion: { 
     //Optional completion statement 
    }) 
    }` 
+0

Спасибо за ответ, я не хочу использовать SLComposeViewController. Я хочу использовать Facebook .framework –

0

Вы должны запросить в вашем facebook приложение на "publish_actions" разрешения.

+0

Спасибо за ваш ответ, я уже даю это разрешение –

+0

@SAMIRRATHOD Я только что пробовал свой код с моим приложением, и он работает! –

+0

такой же код? действительно работает? –

1

Я решил свою проблему (я поставил свой комментарий здесь, потому что у меня недостаточно места для объяснения). Поэтому я пытался поделиться ссылкой на Facebook. Во-первых, я был неправ с Params, я писал

var params=["http://www.google.com":"link"] 

и правильный путь является

var params=["link":"http://www.google.com"] 

(Из-за того, как это написано в Obj-C на dev.facebook.com я получил смущенный).

Во-вторых, если я следовать логике оригинального проекта GitHub, я называю свою функцию следующим образом:

FB.performPublishAction(self.shareLinkOnFB) 

где performPublishAction (в классе Facebook) просить новых публикующих разрешений:

func performPublishAction(action:() -> Void){ 
fbSession?.requestNewPublishPermissions(fbSettings.publishPermissions, defaultAudience: fbSettings.publishAudience, completionHandler: {(session:FBSession!, error:NSError!)->Void in 
      if error==nil { 
       println("perform publish action/no error") 
       action() 
      }else{ 
       println("perform publish action/error: \(error.localizedDescription)") 
       println(error) 
      } 
     }) 

и shareLinkOnFb вызовы функций FB.requestToShareLink():

func shareLinkOnFB(){ 
    FB.requestToShareLink() 
} 

func requestToShareLink(){ 
var params=["link":"\(self.link)", "message":"\(self.message)"] 
FBRequestConnection.startWithGraphPath("/me/feed", parameters:params, HTTPMethod: "POST", completionHandler: { (connection:FBRequestConnection!, result:AnyObject!, error:NSError!) in 
    if error != nil { 
     println("Request to share link/An error occurred: \(error.localizedDescription)") 
     println(error) 
     //handle error 
    }else{ 
     println("link successfully posted: \(result)") 
    } 
    }) 
} 

Я не уверен, что у вас такая же проблема, но я надеюсь, что это может вам помочь.

0

У меня была такая же проблема. Я решил это, написав такой код. Если у вас активная сессия Facebook, этот код отлично работает.

func performPublishAction(callBack:() -> Void){ 
     self.fbSession?.requestNewPublishPermissions(["publish_actions"], defaultAudience: FBSessionDefaultAudience.Friends, completionHandler: {(session:FBSession!, error:NSError!)->Void in 
      if error == nil { 

       callBack() 
      }else{ 
       println(error) 
      } 
     }) 
    } 




    func shareImage (imageName:UIImage){ 
      var requestConneciton:FBRequestConnection=FBRequestConnection() 
      requestConneciton.errorBehavior=FBRequestConnectionErrorBehavior.None 

      requestConneciton.addRequest(FBRequest(forUploadPhoto:imageName)) { (connection:FBRequestConnection!, result:AnyObject!, error:NSError!) -> Void in 
       println("\(error)"); 
       println("\(result)"); 

      } 
      requestConneciton.start() 
     } 

использование этих методов будет как:

facebookHelper.performPublishAction {() -> Void in 
     facebookHelper.shareImage(self.itemImage) 
     //NkCommonClass.displayToast("Posted successfully on your wall.") 
    } 
+0

FacebookHelper - это класс, который содержит выше двух методов: performPublishAction и shareImage. Чтобы поделиться имиджем, я попробовал: facebookH elper.performPublishAction {() -> Void in facebookHelper.shareImage (itemImage) //NkCommonClass.displayToast("Поставлено успешно на вашей стене. ") } и успешно разместите на стене. –

Смежные вопросы