通过swift集成新的facebook SDK

今天我试图将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]; } 

谢谢!

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

 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) } 

Swift 3与Swift的FacebookSDK

Podfile

 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(自定义login,请参阅默认文档/button实现)

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

 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)) } } } } 

Analytics(分析)

 // 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() ]) ) 

这已经在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 } 

在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 } 

在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]因为它不会接受零值。 你可以将其设置为一个空白string,应用程序应该在这之后与Facebook正常运行。

Swift 2.2文档:

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

在迅速3.0.1

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

因为我想支持iOS 8,所以我在Whitney Foster的答案中修改了函数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 } 

并实施了额外的后备function

 // 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) } 
 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) }