web-dev-qa-db-ja.com

Swift 3を使用したFBログインは、値を返さず、ログイン成功後にユーザーをアプリに戻さない

iOS 10を統合するためにSwift 3FB Loginを使用しています。 Facebookのドキュメントのすべての手順を実行しました。今問題は、ログインに成功した後、値を返さず、ユーザーをアプリに戻さないことです。

注:同じことがSwift 2でも完全に機能します。

12
Ragul

こんにちは私はこの問題をFacebook開発者サポートに提起しましたが、問題はiOS10の正しいデリゲートメソッドを実装していないことです。正しいデリゲートの実装を見つけることができます ここ

import UIKit
import CoreData

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

var window: UIWindow?


public func application(_ application: UIApplication,  didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey : Any]? = nil) -> Bool {
// Override point for customization after application launch.

return FBSDKApplicationDelegate.sharedInstance().application(application, didFinishLaunchingWithOptions: launchOptions)
}

 public func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {

return FBSDKApplicationDelegate.sharedInstance().application(
  app,
  open: url as URL!,
  sourceApplication: options[UIApplicationOpenURLOptionsKey.sourceApplication] as! String,
  annotation: options[UIApplicationOpenURLOptionsKey.annotation]
)
}

public func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {
return FBSDKApplicationDelegate.sharedInstance().application(
  application,
  open: url as URL!,
  sourceApplication: sourceApplication,
  annotation: annotation)
}
}
23
Ragul

私にとって、「FBSDKApplicationDelegate」は最新のFacebookでは機能しませんSwift SDKバージョンv0.2.0

ここでv0.2.2の実装を見つけることができます: https://Gist.github.com/mbecker/bdbd28cd11394085c01cf442aaa42c72

//
//  AppDelegate.Swift
//
//  Created by Mats Becker on 9/25/16.
//  Copyright © 2016 safari.digital. All rights reserved.
//

import UIKit
import FacebookCore

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?


    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.

        return SDKApplicationDelegate.shared.application(application, didFinishLaunchingWithOptions: launchOptions)
    }

    func applicationWillResignActive(_ application: UIApplication) {
        // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
        // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game.
    }

    func applicationDidEnterBackground(_ application: UIApplication) {
        // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
        // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
    }

    func applicationWillEnterForeground(_ application: UIApplication) {
        // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background.
    }

    func applicationDidBecomeActive(_ application: UIApplication) {
        // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.

        // Call the 'activate' method to log an app event for use
        // in analytics and advertising reporting.
        AppEventsLogger.activate(application)
    }

    func applicationWillTerminate(_ application: UIApplication) {
        // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
    }

    public func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {

        return SDKApplicationDelegate.shared.application(
            app,
            open: url as URL!,
            sourceApplication: options[UIApplicationOpenURLOptionsKey.sourceApplication] as! String,
            annotation: options[UIApplicationOpenURLOptionsKey.annotation]
        )
    }

    public func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {
        return SDKApplicationDelegate.shared.application(
            application,
            open: url as URL!,
            sourceApplication: sourceApplication,
            annotation: annotation
        )
    }


}
3
mbecker

キーチェーン共有プロジェクトのターゲットを設定することを忘れないでください->機能->キーチェーン共有->スイッチをオンに切り替え

Keychain Sharing status

あなたはこれに従うことができます http://ashishkakkad.com/2015/05/facebook-login-Swift-language-ios/

3
Jianjim

Evn:iOS 10、XCode 8.3.2、Swift 3、facebook-sdk-Swift-0.2.0テスト済みで動作しました。

上記の回答は非推奨のコードとして示されているため、構文を変更しました。

https://Gist.github.com/jgchoi/097b59d85d6b378a81925be93a62fef9

import UIKit
import FacebookCore

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

  var window: UIWindow?


  public func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey : Any]? = nil) -> Bool {
    // Override point for customization after application launch.

     return SDKApplicationDelegate.shared.application(application, didFinishLaunchingWithOptions: launchOptions)
  }

    public func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
    return SDKApplicationDelegate.shared.application(app, open: url, options: options)
  }

  public func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {
    return SDKApplicationDelegate.shared.application(application, open: url)
  }
}
}
2
Rob C

FacebookとTwitterの統合で同じ問題が発生しました。次のように解決しました。

func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {

    let appname:String = options.first?.value as! String
    print(appname)
    if appname == "com.facebook.Facebook" {
        return FBSDKApplicationDelegate.sharedInstance().application(
            app,
            open: url as URL!,
            sourceApplication: options[UIApplicationOpenURLOptionsKey.sourceApplication] as! String,
            annotation: options[UIApplicationOpenURLOptionsKey.annotation]
        )
    }
    return Twitter.sharedInstance().application(app, open: url, options: options)
}
1
Yakup Ad

どういうわけか、以下のコードは私にとってはうまくいきませんでした

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

だからそれをに変更する必要がありました

func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {
    let options = [UIApplication.OpenURLOptionsKey.sourceApplication: sourceApplication as Any,
                   UIApplication.OpenURLOptionsKey.annotation: annotation]
    return SDKApplicationDelegate.shared.application(application, open: url, options: options)
}
0
Mohit Padalia
public func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
    return SDKApplicationDelegate.shared.application(app, open: url, options: options)
  }

AppDelegateにあるものに加えてこれを追加します

0
Anup G Prasad