Aujourd'hui, j'ai essayé d'intégrer le SDK de facebook à mon application Swift, mais la page de guide de démarrage rapide sur Facebook diffère quelque peu de mon ancien code ... Comment puis-je convertir le code OBJ-C ci-dessous en 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];
}
Merci!
C'est à peu près la même chose, sauf qu'au lieu d'utiliser des crochets, vous utilisez des points.
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)
}
pod 'FacebookCore'
pod 'FacebookLogin'
aucun changement de l'ancien 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>
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
}
...
contient du code personnalisé mais vous obtenez le point
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()
])
)
Cela a été déprécié dans iOS 10
.
func application(application: UIApplication, openURL url: NSURL, sourceApplication: String, annotation: AnyObject?) -> Bool {
Pour Swift 3.0
, vous pouvez utiliser:
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
}
Je sais que la question est assez ancienne, mais il semble que cela ne sera jamais obsolète, car Facebook n'a pas mis à jour son guide de démarrage rapide depuis longtemps.
Voici donc la solution pour Swift 4.x.
Dans didFinishLaunching:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
FBSDKApplicationDelegate.sharedInstance()?.application(application, didFinishLaunchingWithOptions: launchOptions)
return true
}
En url ouverte:
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
}
Dans iOS 9, j'utilise:
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
}
Sur iOS 9, vous devriez utiliser:
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])
}
J'ai découvert que le délégué d'application pouvait rompre dans iOS 9 avec l'annotation suivante: options[UIApplicationOpenURLOptionsAnnotationKey]
, car il n'accepterait pas les valeurs nil. Vous pouvez définir ceci sur une chaîne vide et l'application devrait fonctionner correctement avec facebook après cela.
Swift 2.2 docs:
Vous spécifiez un chaînage facultatif en plaçant un point d'interrogation (?) Après la valeur facultative sur laquelle vous souhaitez appeler une propriété, une méthode ou un indice si la valeur facultative est non-nil. Cela ressemble beaucoup à placer un point d'exclamation (!) Après une valeur facultative pour forcer le décompression de sa valeur. La principale différence réside dans le fait que l'enchaînement facultatif échoue normalement lorsque l'option est nul, alors que le déballage forcé déclenche une erreur d'exécution lorsque l'option est nul.
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)
}
Depuis que je veux supporter iOS 8, j'ai modifié la fonction application(_:open:options:)
dans réponse de Whitney Foster à
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
}
et mis en œuvre une fonction de secours supplémentaire
// 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)
}
Dans Swift 3.0.1
return GIDSignIn.sharedInstance().handle(url, sourceApplication:
options[UIApplicationOpenURLOptionsKey.sourceApplication] as! String, annotation:
options[UIApplicationOpenURLOptionsKey.annotation])