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