Facebook SDK 4.1 для Swift. Единая кнопка, которая будет использоваться для обмена и входа в систему

В моем приложении есть проигрыватель YouTube, и я пытаюсь добавить в него кнопку «Поделиться в Facebook», чтобы пользователи могли делиться видео с YouTube.

Я использую Facebook SDK 4.1 и успешно реализовал функции входа и обмена. Но пока, если мне нужно сначала войти в систему, а затем поделиться ссылкой.

Как я могу объединить эти два процесса, чтобы у меня была только кнопка «Поделиться», и при нажатии этой кнопки, если у пользователя нет входа в систему, будет отображаться представление входа в систему, если он есть, чем ссылка будет передана. Поэтому мне нужно как-то вызвать функцию входа в кнопку общего доступа. Но так как я новичок в 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) 
}

person Ilir V. Gruda    schedule 22.06.2015    source источник
comment
вы можете где-то хранить то, чем хотите поделиться. проверьте, успешно ли вы вошли в систему, а затем опубликуйте это событие.   -  person Blind Ninja    schedule 22.06.2015
comment
Я не уверен, как вы имеете в виду хранить то, что хотите, где-то, потому что ссылка хранится в переменной, если вы так думали.   -  person Ilir V. Gruda    schedule 22.06.2015
comment
это может быть что угодно, но вам нужно что-то для SHARE, и этот контент может принадлежать какой-то другой цели. Таким образом, сохранение его где-то (в виде файла или объекта) означало «хранить то, чем вы хотите поделиться» где-то (объект или файл). Здесь у вас есть это как строковый объект.   -  person Blind Ninja    schedule 22.06.2015
comment
просто проверьте, когда вы получите ответ, что пользователь успешно вошел в систему, извлеките свои данные, опубликуйте сообщение и поделитесь им.   -  person Blind Ninja    schedule 22.06.2015
comment
Итак, вы говорите использовать только кнопку входа в систему и с этой кнопкой, когда пользователи входят в систему, чтобы поделиться ссылкой? Но есть ли способ изменить внешний вид кнопки входа в систему (сделать ее кнопкой общего доступа), потому что я не могу найти способ сделать это. Я не знаю, где эта кнопка создана   -  person Ilir V. Gruda    schedule 22.06.2015
comment
Не нужно просто вызывать событие общего доступа (только один раз), когда пользователь успешно вошел в систему. Вам не нужно менять кнопку до следующей загрузки. Когда пользователь перезагружает страницу или по любому другому событию, сначала проверьте, вошел ли пользователь в систему или нет, если он или она уже вошел в систему, просто покажите кнопку «Поделиться».   -  person Blind Ninja    schedule 22.06.2015
comment
Вы можете внести эти изменения в код выше?   -  person Ilir V. Gruda    schedule 22.06.2015
comment
я не могу (нет быстрого знания). Но код публикации для Objective C.   -  person Blind Ninja    schedule 22.06.2015


Ответы (1)


Я сделал эту работу для обмена, когда пользователь не вошел в систему, но все же нажал кнопку «Поделиться». Я открыл окно 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;
    }
}
person Blind Ninja    schedule 22.06.2015
comment
Спасибо, но я ничего не знаю об Obj-C, а также, насколько я понимаю, я достиг чего-то подобного раньше. Мне нужно как-то скрыть кнопку входа и всегда иметь только кнопку общего доступа. И если вы вошли в систему, то кнопка «Поделиться» будет отображаться всегда, а не только один раз. Но еще раз спасибо - person Ilir V. Gruda; 22.06.2015
comment
здесь вы можете сохранить состояние флага входа в систему. Используйте этот флаг, когда вы устанавливаете кнопку общего доступа (или входа в систему). - person Blind Ninja; 22.06.2015