Swift 和 iOS9 中的 Facebook 登录问题

Facebook login issue in Swift and iOS9

我一直在尝试创建一个 Tinder 克隆应用程序。现在我必须登录到我的 Facebook 帐户,获取我的个人资料并显示我的显示图片。

我导入了最新的 FBSDK,正确配置了我的 plist (Plist screenshot) 并使用 graphRequest 函数拉取了我的个人资料图片,但我一直收到以下错误。

-canOpenURL: failed for URL: "fbauth2:/" - error: "(null)"

我清理了我的构建,重新启动了我的模拟器,重新启动了我的机器并完全注释掉了我的解析代码。

我取消了所有解析代码(我正在通过 Heroku 部署)的注释,以免简化代码。

我用 Google 搜索了这个问题并搜索了堆栈溢出和 github 超过 2 个星期,但还没有找到解决方案。

由于 Facebook 的 SDK 与 iOS9 的集成,我已经阅读了有关此问题如何成为转移注意力的评论。

我想知道我做错了什么。我是编码新手,需要一些帮助。我现在想要实现的是登录到我的 Facebook 帐户(我可以做到),授权我的应用程序(我也可以做到)并在 UiImageView 中查看我的个人资料图片(我不能做到)。这样我就可以在课程的同时继续构建应用程序。

    /**
* Copyright (c) 2015-present, Parse, LLC.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*/

//current project 02-04-16

import UIKit
import Parse
import Bolts
import FBSDKCoreKit
import FBSDKLoginKit
import ParseFacebookUtilsV4


// If you want to use any of the UI components, uncomment this line
// import ParseUI

// deleted parseFacebookUtils and added ParseFacebookUtilsV4 so that PFFacebookUtils.intializeFacebookWithLaunchOptions would work. Replace parseFacebookUtils if needed to go back to old code (19-04-16).

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    //--------------------------------------
    // MARK: - UIApplicationDelegate
    //--------------------------------------



    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        // Enable storing and querying data from Local Datastore.
        // Remove this line if you don't want to use Local Datastore features or want to use cachePolicy.

//        Parse.enableLocalDatastore()
//        
//        let parseConfiguration = ParseClientConfiguration(block: { (ParseMutableClientConfiguration) -> Void in
//            
//            ParseMutableClientConfiguration.applicationId = "tinder9121hughglass1234"
//            ParseMutableClientConfiguration.clientKey = "sam123456hibabina"
//            ParseMutableClientConfiguration.server = "https://tinder-sam2.herokuapp.com//parse"


            PFFacebookUtils.initializeFacebookWithApplicationLaunchOptions(launchOptions)



//            Uncomment these lines if you want to enable Parse 
//            PFUser.enableAutomaticUser()
//            
//
//            PFUser.logOut()

//            let defaultACL = PFACL();


            //this is the current project 23-03-16


//            PFUser.enableAutomaticUser()
//            Parse.setApplicationId("tinder9121hughglass1234", clientKey: "sam123456hibabina")



            //this code has been // temporarily 05-04-16 ***

//            
//            let fbLoginManager : FBSDKLoginManager = FBSDKLoginManager()
//            fbLoginManager.logInWithReadPermissions(["public_profile"], handler: { (result, error) in
//            
//                
//            })
//            
//            PFUser.enableAutomaticUser()
//            
//            

//        })

//          edited again here!
//        let PFObject = PFUser.currentUser()
//
//        PFUser.enableAutomaticUser()
//
//        let acl = PFACL()
//        acl.publicReadAccess = true
//        acl.publicWriteAccess = true
//        PFObject?.ACL = acl

//        let defaultACL = PFACL();

        // If you would like all objects to be private by default, remove this line.
//        defaultACL.publicReadAccess = true

//        PFACL.setDefaultACL(defaultACL, withAccessForCurrentUser: true)

        if application.applicationState != UIApplicationState.Background {
            // Track an app open here if we launch with a push, unless
            // "content_available" was used to trigger a background push (introduced in iOS 7).
            // In that case, we skip tracking here to avoid double counting the app-open.

            let preBackgroundPush = !application.respondsToSelector("backgroundRefreshStatus")
            let oldPushHandlerOnly = !self.respondsToSelector("application:didReceiveRemoteNotification:fetchCompletionHandler:")
            var noPushPayload = false;
            if let options = launchOptions {
                noPushPayload = options[UIApplicationLaunchOptionsRemoteNotificationKey] != nil;
            }
            if (preBackgroundPush || oldPushHandlerOnly || noPushPayload) {
                PFAnalytics.trackAppOpenedWithLaunchOptions(launchOptions)
            }
        }

        //
        //  Swift 1.2
        //
        //        if application.respondsToSelector("registerUserNotificationSettings:") {
        //            let userNotificationTypes = UIUserNotificationType.Alert | UIUserNotificationType.Badge | UIUserNotificationType.Sound
        //            let settings = UIUserNotificationSettings(forTypes: userNotificationTypes, categories: nil)
        //            application.registerUserNotificationSettings(settings)
        //            application.registerForRemoteNotifications()
        //        } else {
        //            let types = UIRemoteNotificationType.Badge | UIRemoteNotificationType.Alert | UIRemoteNotificationType.Sound
        //            application.registerForRemoteNotificationTypes(types)
        //        }

        //
        //  Swift 2.0
        //
        //        if #available(iOS 8.0, *) {
        //            let types: UIUserNotificationType = [.Alert, .Badge, .Sound]
        //            let settings = UIUserNotificationSettings(forTypes: types, categories: nil)
        //            application.registerUserNotificationSettings(settings)
        //            application.registerForRemoteNotifications()
        //        } else {
        //            let types: UIRemoteNotificationType = [.Alert, .Badge, .Sound]
        //            application.registerForRemoteNotificationTypes(types)
        //        }

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

    }

    //--------------------------------------
    // MARK: Push Notifications
    //--------------------------------------

    func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) {
        let installation = PFInstallation.currentInstallation()
        installation.setDeviceTokenFromData(deviceToken)
        installation.saveInBackground()

        PFPush.subscribeToChannelInBackground("") { (succeeded: Bool, error: NSError?) in
            if succeeded {
                print("ParseStarterProject successfully subscribed to push notifications on the broadcast channel.\n");
            } else {
                print("ParseStarterProject failed to subscribe to push notifications on the broadcast channel with error = %@.\n", error)
            }
        }
    }

    func application(application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: NSError) {
        if error.code == 3010 {
            print("Push notifications are not supported in the iOS Simulator.\n")
        } else {
            print("application:didFailToRegisterForRemoteNotificationsWithError: %@\n", error)
        }
    }

    func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) {
        PFPush.handlePush(userInfo)
        if application.applicationState == UIApplicationState.Inactive {
            PFAnalytics.trackAppOpenedWithRemoteNotificationPayload(userInfo)
        }
    }
    ///////////////////////////////////////////////////////////
    // Uncomment this method if you want to use Push Notifications with Background App Refresh
    ///////////////////////////////////////////////////////////
    // func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject], fetchCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) {
    //     if application.applicationState == UIApplicationState.Inactive {
    //         PFAnalytics.trackAppOpenedWithRemoteNotificationPayload(userInfo)
    //     }
    // }

    //--------------------------------------
    // MARK: Facebook SDK Integration
    //--------------------------------------

    ///////////////////////////////////////////////////////////
    // Uncomment this method if you are using Facebook
    ///////////////////////////////////////////////////////////
    // func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject?) -> Bool {
    //     return FBAppCall.handleOpenURL(url, sourceApplication:sourceApplication, session:PFFacebookUtils.session())
    // }

    func applicationDidBecomeActive(application: UIApplication) {

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

        return FBSDKApplicationDelegate.sharedInstance().application(application, openURL: url, sourceApplication: sourceApplication, annotation: annotation)

    }
}

尝试将此行添加到您的 Info.plist 中:<string>fbauth2</string>