Держите тот же сеанс FBSDKLoginKit, FBSDKShareKit 4.36 - PullRequest
0 голосов
/ 15 сентября 2018

Я использую FBSDKLoginKit и FBSDKShareKit для входа в систему и после совместного использования FBSDKShareOpenGraphContent.

У меня похожее поведение в Android, и оно отлично работает.

В скором времени я могу успешно войти в Facebook, но когда я вызываю FBSDKShareDialog.show (из: self, with: content, делегат: nil), чтобы поделиться своим FBSDKShareOpenGraphContent из детального viewcontroller, приложение SHOWS LOGIN FACEBOOK PAGE ОПЯТЬ в браузере! Я ожидал, что FBSDKShareOpenGraphContent был предоставлен напрямую, без необходимости входа снова!

Почему это происходит, если FBSDKAccessToken.currentAccessTokenIsActive () возвращает true? Как сохранить один и тот же сеанс между различными viewcontroller? Я прочитал миллиард сообщений об этом, но эти решения не решают мою проблему

Будьте осторожны, если я введу имя пользователя и пароль и повторно войду в систему во второй раз, FBSDKShareOpenGraphContent будет предоставлен правильно! Но это плохой пользовательский опыт, и я хочу, чтобы пользователь мог войти только 1 раз!

Пожалуйста, ПОМОГИТЕ Вот мой код:

//APPDELEGATE

      func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
                // Override point for customization after application launch.

                FBSDKApplicationDelegate.sharedInstance().application(application, didFinishLaunchingWithOptions: launchOptions)
                          return true
            }

            private func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
                // Override point for customization after application launch.
                return FBSDKApplicationDelegate.sharedInstance().application(application, didFinishLaunchingWithOptions: launchOptions)
            }

            private func application(application: UIApplication, openURL url: URL, sourceApplication: String?, annotation: Any?) -> Bool {
                return FBSDKApplicationDelegate.sharedInstance().application(
                    application,
                    open: url as URL?,
                    sourceApplication: sourceApplication,
                    annotation: annotation)
            }
    func applicationDidBecomeActive(_ application: UIApplication) {
            // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
            FBSDKAppEvents.activateApp()
        }

    ----

// КОНТРОЛЛЕР ЛОГИНА @ IBAction

    @IBAction func fbLoginButtonTapped(_ sender: UIButton) {
            let fbLoginManager : FBSDKLoginManager = FBSDKLoginManager()
            fbLoginManager.logIn(withReadPermissions: ["public_profile"], from: self) { (result, error) -> Void in
                if (error == nil) {

                    let fbloginresult : FBSDKLoginManagerLoginResult = result!
                    // if user cancel the login
                    if (result?.isCancelled)! {
                        print("LOGIN FB CANCELLED")
                        return
                    }
                    if(fbloginresult.grantedPermissions.contains("public_profile")) {
                        print("LOGIN FB SUCCESS")
                        /* DO MY STUFF */   
                    }
                } else {
                    print("LOGIN FB ERROR")
                }
            }
        }

   //Page Detail ViewController with share button @IBAction

     @IBAction func facebookButtonTapped(_ sender: UIButton) {
                if (FBSDKAccessToken.currentAccessTokenIsActive() == true) {
//THIS RETURNS TRUE AS USER IS ALWAYS LOGGED

                    let properties = ["og:type": "article",
                                      "og:title": "\(self.post?.title ?? "")",
                        "og:image": "\(self.post?.image ?? "")",
                        "og:description": "\(self.post?.content ?? "")"]

                    let object: FBSDKShareOpenGraphObject = FBSDKShareOpenGraphObject(properties: properties)

                    let action: FBSDKShareOpenGraphAction = FBSDKShareOpenGraphAction(type: "news.reads", object: object, key: "article")
                    let content: FBSDKShareOpenGraphContent = FBSDKShareOpenGraphContent()
                    content.action = action
                    content.previewPropertyName = "article"
                    FBSDKShareDialog.show(from: self, with: content, delegate: nil)
                }
        }

Info.plist для интеграции с Facebook

 <!-- FBSDK INTEGRATION -->
    <key>CFBundleURLTypes</key>
    <array>
        <dict>
            <key>CFBundleURLSchemes</key>
            <array>
                <string>fb************</string>
            </array>
        </dict>
    </array>
    <key>FacebookAppID</key>
    <string>**************</string>
    <key>FacebookDisplayName</key>
    <string>*********</string>

    <key>LSApplicationQueriesSchemes</key>
    <array>
        <string>fbapi</string>
        <string>fb-messenger-api</string>
        <string>fbauth2</string>
        <string>fbshareextension</string>
    </array>

Первая страница входа отображается после нажатия кнопки входа:

Страница входа снова при нажатии кнопки «Поделиться» после первого успешного входа в систему

1 Ответ

0 голосов
/ 15 октября 2018

Я решил эту проблему с помощью следующего кода:

 let shareDialog = FBSDKShareDialog()
 shareDialog.delegate = self
shareDialog.shareContent = content

if (UIApplication.shared.canOpenURL( URL(string: "fbauth2:/")!) ) {
    shareDialog.mode = .native
} else {
    shareDialog.mode = .web
}

shareDialog.show()

ранее я использовал

shareDialog.mode = .auto

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

С режимами .native и .web я могу обрабатывать случаи, когда установлено или нет встроенное приложение, сохраняя активный сеанс.

...