gpt4 book ai didi

ios - 保持相同的 session FBSDKLoginKit, FBSDKShareKit 4.36

转载 作者:可可西里 更新时间:2023-11-01 01:56:49 24 4
gpt4 key购买 nike

我正在使用 FBSDKLoginKit 和 FBSDKShareKit 进行登录,然后共享 FBSDKShareOpenGraphContent。

我在 android 中有类似的行为,它工作正常。

我很快就能在 Facebook 上成功登录,但是当我调用 FBSDKShareDialog.show(from: self, with: content, delegate: nil) 从详细 View Controller 共享我的 FBSDKShareOpenGraphContent 时,应用程序显示登录 FACEBOOK 页面再次在浏览器中!我还以为FBSDKShareOpenGraphContent是直接分享的,不需要重新登录!

如果 FBSDKAccessToken.currentAccessTokenIsActive() 返回 true,为什么会有这种行为?如何在不同的 View Controller 之间保持相同的 session ?我阅读了十亿篇关于它的帖子,但这些解决方案并没有解决我的问题

请注意,如果我第二次输入用户名和密码并重新登录,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()
}

----

//登录 VIEWCONTROLLER @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)
}
}

用于 Facebook 集成的 Info.plist

 <!-- 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>

First Login page shown after login button tapped:

Login page again on share button tapped, after first login success

最佳答案

我用下面的代码解决了这个问题:

 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

但是,如果它无法选择合适的操作或由于某种原因而失败,则似乎在不保持事件 session 的情况下重新实例化网络浏览器。

使用 .native 和 .web 模式,我可以处理安装或未安装 native 应用程序的情况,保持事件 session 。

关于ios - 保持相同的 session FBSDKLoginKit, FBSDKShareKit 4.36,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52343898/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com