【问题标题】:Integration new facebook SDK by swift通过 swift 集成新的 facebook SDK
【发布时间】:2015-05-30 09:53:47
【问题描述】:

今天我尝试将 facebook SDK 集成到我的 Swift 应用程序中,但在 facebook 指南页面的快速启动中看起来与我的旧代码有点不同。 如何将下面的 OBJ-C 代码转换为 swift?

- (void)applicationDidBecomeActive:(UIApplication *)application {
  [FBSDKAppEvents activateApp];
}

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
  return [[FBSDKApplicationDelegate sharedInstance] application:application
                                    didFinishLaunchingWithOptions:launchOptions];
}

- (BOOL)application:(UIApplication *)application
            openURL:(NSURL *)url
  sourceApplication:(NSString *)sourceApplication
         annotation:(id)annotation {
  return [[FBSDKApplicationDelegate sharedInstance] application:application
                                                         openURL:url
                                               sourceApplication:sourceApplication
                                                      annotation:annotation];
}

谢谢!

【问题讨论】:

    标签: ios objective-c iphone facebook swift


    【解决方案1】:

    看起来 Facebook 放弃了 Apple,并且多年来一直停止更新他们的文档。

    截至 2021 年,这对我来说适用于 FBSDKCoreKit 9.0.0 和 Swift 5。

    1. 要使用的 pod 是 FBSDKCoreKit/Core(没有 Core,它只是基础,会缺少 AppDelegate 等类)。

    2. 导入FBSDKCoreKit 并使用ApplicationDelegate.shared.application(application, didFinishLaunchingWithOptions: launchOptions) 进行设置。

    【讨论】:

      【解决方案2】:

      带有 FBSDKCoreKit (5.3.0) 的 Swift 5

      在 appdelegate 中导入 FBSDKCoreKit

      在 didFinishLaunching 中:

      func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
          FBSDKCoreKit.ApplicationDelegate.shared.application(application, didFinishLaunchingWithOptions: launchOptions)
          return true
      }
      

      在打开的网址中:

        func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
          let handled = FBSDKCoreKit.ApplicationDelegate.shared.application(app, open: url, options: options)
          return handled
      }
      

      【讨论】:

        【解决方案3】:

        适用于带有最新 FBSDK (FBSDKCoreKit 5.2.1) 的 swift 5

        func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
                let handled = ApplicationDelegate.shared.application(app, open: url, options: options)
        
                return handled
            }
        

        【讨论】:

          【解决方案4】:

          我知道这是一个很老的问题,但它似乎永远不会过时,因为 Facebook 很长时间没有更新他们的快速入门指南。

          这里是 Swift 4.x 的解决方案。

          在 didFinishLaunching 中:

          func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
          
              FBSDKApplicationDelegate.sharedInstance()?.application(application, didFinishLaunchingWithOptions: launchOptions)
          
              return true
          }
          

          在打开的网址中:

          func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
          
              let handled = FBSDKApplicationDelegate.sharedInstance().application(app, open: url, sourceApplication: options[.sourceApplication] as? String, annotation: options[.annotation])
              return handled
          }
          

          【讨论】:

          • 对于新的 sdk(5.0.0) 确实完成了代码:ApplicationDelegate.shared.application(application, didFinishLaunchingWithOptions:launchOptions) 和打开 URL:让处理 = ApplicationDelegate.shared.application(app, open: url, sourceApplication: options[.sourceApplication] as?String, annotation: options[.annotation])
          【解决方案5】:
          if let fbSDKAppId = FBSDKSettings.appID(),
                      url.scheme!.hasPrefix("fb\(fbSDKAppId)"),
                      url.host == "authorize" { // facebook
                      return FBSDKApplicationDelegate.sharedInstance().application(application,
                                                                                   open: url,
                                                                                   sourceApplication: sourceApplication,
                                                                                   annotation: annotation)
          }
          

          【讨论】:

            【解决方案6】:

            由于要支持iOS 8,所以将Whitney Foster's answer中的函数application(_:open:options:)修改为

            func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
                let appId = SDKSettings.appId
                if url.scheme != nil && url.scheme!.hasPrefix("fb\(appId)") && url.host ==  "authorize" { // facebook
                    if #available(iOS 9.0, *) {
                        return SDKApplicationDelegate.shared.application(app, open: url, options: options)
                    }
                }
                return false
            }
            

            并实现了额外的后备功能

            // Fallback on earlier versions
            func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {
                return SDKApplicationDelegate.shared.application(application, open: url, sourceApplication: sourceApplication, annotation: annotation)
            }
            

            【讨论】:

              【解决方案7】:

              带有 Swift FacebookSDK 的 Swift 3

              播客文件

              pod 'FacebookCore'
              pod 'FacebookLogin'
              

              info.plist

              与旧 sdk 没有任何变化

              <key>CFBundleURLTypes</key>
              <array>
                  <dict>
                      <key>CFBundleURLSchemes</key>
                      <array>
                          <string>fb$(YOUR_FB_APP_ID)</string>
                      </array>
                  </dict>
              </array>
              <key>LSApplicationQueriesSchemes</key>
              <array>
                  <string>fbapi</string>
                  <string>fb-messenger-api</string>
                  <string>fbauth2</string>
                  <string>fbshareextension</string>
              </array>
              <key>FacebookAppID</key>
              <string>$(YOUR_FB_APP_ID)</string>
              <key>FacebookDisplayName</key>
              <string>$(YOUR_APP_NAME)</string>
              

              AppDelegate.swift

              func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
                  SDKApplicationDelegate.shared.application(application, didFinishLaunchingWithOptions: launchOptions)
                  ...
              }
              
              func applicationDidBecomeActive(_ application: UIApplication) {
                  AppEventsLogger.activate(application)
              }
              
              func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
                  let appId = SDKSettings.appId
                  if url.scheme != nil && url.scheme!.hasPrefix("fb\(appId)") && url.host ==  "authorize" { // facebook
                      return SDKApplicationDelegate.shared.application(app, open: url, options: options)
                  }
                  return false
              }
              
              ...
              

              LoginManager(自定义登录,默认/按钮实现见文档)

              包含自定义代码,但你明白了

              let facebookManager = LoginManager(loginBehavior: .systemAccount, defaultAudience: .everyone)
              func loginWithFacebook() {
                  self.facebookManager.logIn(HAAccountManager.shared.facebookPermissions, viewController: self) { (result) in
                      switch result {
                      case .failed(let error):
                          self.showAlert(forError: error as NSError)
                      case .cancelled:
                          print("FB login cancelled")
                      case .success(let grantedPermissions, let deniedPermissions, let accessToken):
                          if grantedPermissions.contains(Permission(name: "email")) == true {
                              ApiClient.shared.facebookSignIn(authToken: accessToken.authenticationToken, completion: { (err, user) in
                                  if err == nil {
                                      // success
                                  }
                                  else {
                                      self.showAlert(forError: err!)
                                  }
                              })
                          }
                          else {
                              self.showAlert(forError: HAError(title: String(format: String.somethingError, String.signIn), message: grantedPermissions.contains(Permission(name: "email")) == true ? String.noAccountFound : String.missingEmailForSignUp))
                          }
                      }
                  }
              }
              

              分析

              // custom ex
              AppEventsLogger.log(AppEvent(name: "open_app", parameters: ["logged_in": NSNumber(value: HAAccountManager.shared.isUserLoggedIn())], valueToSum: nil))
              
              // purchase ex
              AppEventsLogger.log(
                  AppEvent.purchased(
                      amount: Double(revenue),
                      currency: currency,
                      extraParameters: [
                          AppEventParameterName.contentId : orderId,
                          AppEventParameterName.itemCount : order.orderItems.count.nsNumber()
                      ])
              )
              

              【讨论】:

              • 它有效。但似乎与官方文档不同:developers.facebook.com/quickstarts/873570042741264/… - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
              • 是的,检查“fb”是为了支持其他框架(我的应用程序的braintree和分支)@User9527
              【解决方案8】:

              在 swift 3.0.1 中

              return GIDSignIn.sharedInstance().handle(url, sourceApplication:    
              options[UIApplicationOpenURLOptionsKey.sourceApplication] as! String, annotation:     
              options[UIApplicationOpenURLOptionsKey.annotation])
              

              【讨论】:

                【解决方案9】:

                这已在 iOS 10 中被弃用。

                func application(application: UIApplication, openURL url: NSURL, sourceApplication: String, annotation: AnyObject?) -> Bool {
                

                对于Swift 3.0,您可以使用:

                Swift 3.0

                func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
                    let isHandled = FBSDKApplicationDelegate.sharedInstance().application(app, open: url, sourceApplication: options[.sourceApplication] as! String!, annotation: options[.annotation])
                    return isHandled
                }
                

                【讨论】:

                • 谢谢。 Facebook 的某个人应该每个月都必须查看他们自己的快速入门文档,看看他们是否已经过时了
                • 非常感谢,你是救命稻草
                【解决方案10】:

                在 iOS 9 上,您应该使用:

                func application(application: UIApplication,openURL url: NSURL, options: [String: AnyObject]) -> Bool {
                   return ApplicationDelegate.shared.application(application, openURL: url, sourceApplication: options[UIApplicationOpenURLOptionsSourceApplicationKey] as? String, annotation: annotation: options[UIApplicationOpenURLOptionsAnnotationKey])
                }
                

                我发现应用程序委托可能会在 iOS 9 中使用注释:options[UIApplicationOpenURLOptionsAnnotationKey] 中断,因为它不会接受 nil 值。您可以将其设置为空白字符串,之后应用程序应该可以在 facebook 上正常运行。

                Swift 2.2 文档:

                如果可选值非 nil,则通过在希望调用属性、方法或下标的可选值后放置问号 (?) 来指定可选链接。这与在可选值后放置感叹号 (!) 以强制展开其值非常相似。主要区别在于,当可选项为 nil 时,可选项链接会优雅地失败,而当可选项为 nil 时,强制解包会触发运行时错误。

                【讨论】:

                  【解决方案11】:

                  在 iOS 9 中我使用:

                  func application(app: UIApplication, openURL url: NSURL, options: [String : AnyObject]) -> Bool
                  {   
                      FBSDKApplicationDelegate.sharedInstance().application(app, openURL: url, sourceApplication: options["UIApplicationOpenURLOptionsSourceApplicationKey"] as! String, annotation: options["UIApplicationOpenURLOptionsAnnotationKey"])
                      return true
                  }
                  

                  【讨论】:

                    【解决方案12】:

                    这几乎是一样的,除了不使用括号,你使用点。

                    func applicationDidBecomeActive(application: UIApplication!) {
                        FBSDKAppEvents.activateApp()
                    }
                    
                    func application(application: UIApplication!, didFinishLaunchingWithOptions launchOptions: NSDictionary!) -> Bool {
                        return FBSDKApplicationDelegate.sharedInstance().application(application, didFinishLaunchingWithOptions: launchOptions)
                    }
                    
                    func application(application: UIApplication, openURL url: NSURL, sourceApplication: String, annotation: AnyObject?) -> Bool {
                        return FBSDKApplicationDelegate.sharedInstance().application(application, openURL: url, sourceApplication: sourceApplication, annotation: annotation)
                    }
                    

                    【讨论】:

                    • 这对我很有帮助,但如果有人能快速编写一个使用新 sdk 登录 facebook 的教程,那就太好了。我已经得到了要渲染的按钮。
                    • 这里有非常清晰的教程和示例:brianjcoleman.com/…
                    • 请注意,openURL:sourceApplication:annotation 在 iOS 9 (stackoverflow.com/questions/33737403/…) 中已弃用。而是使用return FBAppCall.handleOpenURL(url, sourceApplication: options["UIApplicationOpenURLOptionsSourceApplicationKey"] as! String
                    • return FBSDKApplicationDelegate.sharedInstance().application(application, openURL: url, sourceApplication: sourceApplication, annotation: annotation) 行失败,说明使用未解析的标识符 sourceApplication 和注释相同。
                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2012-06-21
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2014-08-27
                    • 1970-01-01
                    相关资源
                    最近更新 更多