适用于Swift的Facebook SDK 4.1。单个按钮用于共享和登录

时间:2015-06-22 09:32:57

标签: ios facebook swift facebook-login facebook-sdk-4.0

我的应用中有一个YouTube播放器,我正在尝试在其上添加Facebook分享按钮,这样用户就可以分享YouTube视频了。

我正在使用Facebook SDK 4.1,并且我已成功实现了登录和共享功能。但是现在如果我需要首先登录并分享链接。

如何合并这两个进程,以便我只有Share按钮,如果用户没有登录则点击此按钮将显示登录视图,如果他有,则链接将被共享。所以我需要以某种方式在分享按钮中调用登录功能。但由于我是swift的新手,我无法看到这里的点击操作在哪里,或者如何在不点击登录按钮的情况下实现登录功能。

这是我的代码:

let contentURL = "https://www.youtube.com/watch?v=jBsPZV14I-k"
let contentURLImage = "http://img.youtube.com/vi/jBsPZV14I-k/0.jpg"
let contentTitle = "sdasfdfsa"
let contentDescription = "asdsadasdasd"

override func viewDidLoad() {
    super.viewDidLoad()

    if (FBSDKAccessToken.currentAccessToken() != nil)
    {   
        let loginView : FBSDKLoginButton = FBSDKLoginButton()
        self.view.addSubview(loginView)
        loginView.center = self.view.center
        loginView.readPermissions = ["public_profile", "email", "user_friends"]
        loginView.delegate = self
        self.returnUserData()
        self.showShareButtons()
    }
    else
    {
        let loginView : FBSDKLoginButton = FBSDKLoginButton()
        self.view.addSubview(loginView)
        loginView.center = self.view.center
        loginView.readPermissions = ["public_profile", "email", "user_friends"]
        loginView.delegate = self  
    }
}

func loginButton(loginButton: FBSDKLoginButton!, didCompleteWithResult result: FBSDKLoginManagerLoginResult!, error: NSError!) {
    println("User Logged In")

    if ((error) != nil)
    {
        // Process error
    }
    else if result.isCancelled {
        // Handle cancellations
    }
    else {
        if result.grantedPermissions.contains("email")
        {
            // Do work
        }
        self.returnUserData()
        self.showShareButtons()
    }  
}

func loginButtonDidLogOut(loginButton: FBSDKLoginButton!) {
    println("User Logged Out")
}

func returnUserData()
{
    let graphRequest : FBSDKGraphRequest = FBSDKGraphRequest(graphPath: "me", parameters: nil)
    graphRequest.startWithCompletionHandler({ (connection, result, error) -> Void in   
        if ((error) != nil)
        {
            // Process error
            println("Error: \(error)")
        }
        else
        {
            println("fetched user: \(result)")
            let userName : NSString = result.valueForKey("name") as! NSString
            println("User Name is: \(userName)")
            let userEmail : NSString = result.valueForKey("email") as! NSString
            println("User Email is: \(userEmail)")
        }
    })
}

func showShareButtons()
{
    self.showLinkButton()
}

func showLinkButton()
{
    let content : FBSDKShareLinkContent = FBSDKShareLinkContent()
    content.contentURL = NSURL(string: self.contentURL)
    content.contentTitle = self.contentTitle
    content.contentDescription = self.contentDescription
    content.imageURL = NSURL(string: self.contentURLImage)

    let button : FBSDKShareButton = FBSDKShareButton()
    button.shareContent = content
    button.frame = CGRectMake((UIScreen.mainScreen().bounds.width - 100) * 0.5, 50, 100, 25)
    self.view.addSubview(button) 
}

1 个答案:

答案 0 :(得分:0)

当用户未登录但我点击分享按钮时,我完成了这项工作。我加强了FBLogin窗口,当用户成功登录后,我使用此代码分享游戏分数。请注意,此功能仅适用一次(或重新登录后)。

这是FB Framework的委托方法。当用户登录状态发生变化时,它将得到响应。

- (void)sessionStateChanged:(FBSession *)session state:(FBSessionState) state error:(NSError *)error
{
    if (!error && state == FBSessionStateOpen)
    {
        //log in

        NSUserDefaults *def=[NSUserDefaults standardUserDefaults];
        NSArray *arr=[def objectForKey:@"fbShare"];
        if (arr.count>0)
        {
            int score=[[arr objectAtIndex:0]intValue];
            int hScore=[[arr objectAtIndex:1]intValue];
            int level=[[arr objectAtIndex:2]intValue];
            BOOL isArcade=[[arr objectAtIndex:3] boolValue];
            ShareScoreFB *share=[[ShareScoreFB alloc]init];
            [share shareToFacebookCurrentScore:score andHighScore:hScore forLevel:level forArcade:isArcade];
            [def removeObjectForKey:@"fbShare"];
            [def synchronize];
        }
        return;
    }
}