繁体   English   中英

如何在 IOS 中使用 Swift 在 Facebook 上共享图像

[英]how to share Image on Facebook using Swift in IOS

我想使用 swift 语言在 Facebook 上分享图像。 我可以使用 Objective C 共享图像。我尝试使用

1) 如何在 swift iOS 中与 facebook 共享图像 + 文本?

但不起作用,然后我尝试使用其他选项但无法使用 swift 语言共享图像。 然后我尝试了这个

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 中编写相同的代码,它工作正常。

错误:

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

谁能帮我? 找出这个问题...

我不想使用 SLComposeViewController,我想使用 Facebook 框架。

先感谢您!

这是我在旧项目中创建的代码。 试一试 ;)

  @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
    })
    }`

我解决了我的问题(我把我的评论放在这里,因为我没有足够的地方来解释)。 所以我试图在 Facebook 上分享一个链接。 首先我错了参数,我在写

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

正确的方法是

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

(由于它在 dev.facebook.com 上用 Obj-C 编写的方式,我感到困惑)。

其次,如果我按照原 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)")
    }
    })
}

我不确定你是否有同样的问题,但我希望它可以帮助你。

检查这个人的答案https://stackoverflow.com/a/58481784/12250012

现在 facebook 也不允许以编程方式。

您必须在您的 facebook 应用程序中请求"publish_actions"权限。

我有同样的问题。 我已经通过编写这样的代码解决了它。 如果您有一个活跃的 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.")
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM