2016-08-28 6 views
0

FBSDKAccessToken currentAccessToken nil after quitting appios9:FBSDK currentAccessToken

nilを私は多くの関連スレッドを見て、私の場合は解決策はまだ聞き取りにくいです。

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 

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

    if let accessToken = FBSDKAccessToken.currentAccessToken(){ 
    print(accessToken) 
    }else{ 
    print("Not logged In.") 
    } 

    return true 
} 

    func application(application: UIApplication, 
       openURL url: NSURL, options: [String: AnyObject]) -> Bool { 


return GIDSignIn.sharedInstance().handleURL(url, 
              sourceApplication: options[UIApplicationOpenURLOptionsSourceApplicationKey] as? String, 
              annotation: options[UIApplicationOpenURLOptionsAnnotationKey]) 


} 


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

だから、右のアプリのaccessTokennilで起動します。ここでは

は私のAppDelegate.swiftファイルです。

アクセストークンをリフレッシュしようとすると、nilユーザーアクセストークンをリフレッシュできないため、アクセストークンがリフレッシュされません。私はおそらく期限切れのユーザートークンをキャッシュすると思います。期限が切れていても、現在のユーザトークンを返すFBSDKを呼び出すので、それはまだ変です。私の場合はnilを返します。ここで

は、私は今後の参考のために私のcurrentAccessToken

func fetchFBInfoForLogin(){ 
let parameters = ["fields": "email, first_name, last_name"] 

if (FBSDKAccessToken.currentAccessToken() != nil) { 
    print("current access token is not nil") 
    // User is logged in, do work such as go to next view controller. 
    let graphRequest : FBSDKGraphRequest = FBSDKGraphRequest(graphPath: "me", parameters: nil) 
    graphRequest.startWithCompletionHandler({ (connection, result, error) -> Void in 

    if ((error) != nil) 
    { 
     // Process error 
     print("Error: \(error)") 
    } 
    else 
    { 
     print(result.valueForKey("id") as? String) 
     print(result.valueForKey("name") as? String) 
     print(result.valueForKey("email") as? String) 

    } 
    }) 

} else { 

    //refresh 

    FBSDKAccessToken.refreshCurrentAccessToken{ (connection, result, error) -> Void in 
    if error != nil { 
     print(error) 
     return 
    } 
    print(FBSDKAccessToken.currentAccessToken()) 
    print("refresh doesn't work?") 
    let parameters = ["fields": "email, first_name, last_name"] 
    let graphRequest : FBSDKGraphRequest = FBSDKGraphRequest(graphPath: "me", parameters: parameters) 
    graphRequest.startWithCompletionHandler({ (connection, result, error) -> Void in 

     if ((error) != nil) 
     { 
     // Process error 
     print("Error: \(error)") 
     } 
     else 
     { 
     print(result.valueForKey("id") as? String) 
     print(result.valueForKey("name") as? String) 
     print(result.valueForKey("email") as? String) 

     } 
    }) 

    } 
} 
} 

を使用しようとする方法である: 私はこれがSOポストラà右AppDelegate方法で私のFBSDKデリゲートの呼び出しを入れていませんでした。Facebook SDK login never calls back my application on iOS 9

だから私は手動でFBログインをクローズしなければならなかったので、コールバックの結果はresult.isCancelledになり、なぜユーザートークンが得られなかったのですか?

答えて

1

login-およびlogout-eventsからの通知にFBSDKLoginButtonDelegateプロトコルを実装したい場合。

class FirstViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, FBSDKLoginButtonDelegate { 

    func loginButton(loginButton: FBSDKLoginButton!, didCompleteWithResult result: FBSDKLoginManagerLoginResult!, error: NSError!) { 
     if ((error) != nil) { 
      // Process error 
     } else if result.isCancelled { 
      // Handle cancellations 
     } else { 
      let graphRequest : FBSDKGraphRequest = FBSDKGraphRequest(graphPath: "me", parameters: ["fields" : "id, email, name"]) 
      graphRequest.startWithCompletionHandler({ (connection, result, error) -> Void in 
       if ((error) != nil) { 
        //print("Error: \(error)") 
       } else { 
        if let user : NSString = result!.valueForKey("name") as? NSString { 
         print("user: \(user)") 
        } 
        if let id : NSString = result!.valueForKey("id") as? NSString { 
         print("id: \(id)") 
        } 
        if let email : NSString = result!.value(forKey: "email") as? NSString { 
         print("email: \(email)") 
        } 
       } 
      }) 
     } 
    } 
} 

HTH。

+0

私は 'result.isCancelled'のケースを処理していませんでした。これは、FBSDKデリゲートメソッドハンドラによって返されているものです。どういう意味ですか? – Thalatta

+1

私は正直であるか分からない。 :-)私はコードがどこから来たのかを覚えていないでしょう。おそらくSOを2に変更しました。そして、通常はエラーかOKか、ほとんどの場合OKです。 – kometen

関連する問題