it-swarm.com.de

Integration des neuen Facebook SDK von swift

Heute habe ich versucht, das Facebook SDK in meine Swift-App zu integrieren, aber in der Schnellstartanleitung für Facebook sieht es etwas anders aus als in meinem alten Code .. Wie kann ich OBJ-C-Code in Swift konvertieren?

- (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];
}

Vielen Dank!

27

Es ist ziemlich dasselbe, außer dass Sie anstelle von Klammern Punkte verwenden.

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

Swift 3 mit Swift FacebookSDK

Poddatei

pod 'FacebookCore'
pod 'FacebookLogin'

info.plist

keine Änderungen gegenüber der alten 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 (Benutzerdefiniertes Login, siehe Dokumentation für die Implementierung von Standard-/Schaltflächen)

enthält benutzerdefinierten Code, aber Sie erhalten den Punkt

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()
        ])
)
24
Whitney Foster

Dies wurde in iOS 10 verunglimpft. 

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

Für Swift 3.0 können Sie Folgendes verwenden:

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
}
21
Tal Zion

Ich weiß, dass dies eine ziemlich alte Frage ist, aber es scheint, dass sie niemals veraltet sein wird, da Facebook seinen QuickStart-Guide schon lange nicht aktualisiert hat. 

Hier ist also die Lösung für Swift 4.x.

In didFinishLaunching:

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

    FBSDKApplicationDelegate.sharedInstance()?.application(application, didFinishLaunchingWithOptions: launchOptions)

    return true
}

In offener URL:

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
}
5
Tomte

In iOS 9 verwende ich:

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
}
3
Pavel Z.

Unter iOS 9 sollten Sie Folgendes verwenden: 

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

Ich habe das Potenzial für den Anwendungsdelegierten gefunden, in iOS 9 mit der Anmerkung zu brechen: options[UIApplicationOpenURLOptionsAnnotationKey], da er keine Nullwerte akzeptiert. Sie können dies als leere Zeichenfolge festlegen und die Anwendung sollte danach mit Facebook einwandfrei laufen.

Swift 2.2 Dokumente:

Sie geben die optionale Verkettung an, indem Sie ein Fragezeichen (?) Nach dem optionalen Wert setzen, für den Sie eine Eigenschaft, eine Methode oder einen Index aufrufen möchten, wenn der optionale Wert nicht null ist. Dies ähnelt sehr dem Einfügen eines Ausrufezeichens (!) Nach einem optionalen Wert, um das Auspacken des Werts zu erzwingen. Der Hauptunterschied besteht darin, dass die optionale Verkettung ordnungsgemäß fehlschlägt, wenn die Option null ist, während das erzwungene Auspacken einen Laufzeitfehler auslöst, wenn die Option null ist.

2
H2wk
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)
}
1
Svitlana

Da ich iOS 8 unterstützen möchte, habe ich die Funktion application(_:open:options:) in Whitney Fosters Antwort to geändert

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
}

und implementierte zusätzliche Fallback-Funktion

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

In Swift 3.0.1 

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

Swift 5 mit FBSDKCoreKit (5.3.0)

Importieren Sie FBSDKCoreKit in appdelegate

In didFinishLaunching:

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

In der offenen URL:

  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
}
0
Ranjani

Für Swift 5 mit aktuellem FBSDK (FBSDKCoreKit 5.2.1)

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

        return handled
    }
0
Hardik Thakkar