6

比較的問題の少ない別のプロジェクトでFacebookConnectを使用しましたが、現在のプロジェクトでは、呼び出し[facebook logout];てもユーザーの詳細が削除されないようです。その後、アプリを再起動すると、didFinishLaunchingWithOptions関数に次のようになります。

facebook = [[Facebook alloc] initWithAppId:@"XXXXXXXXXXXXX" andDelegate:self];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

if([defaults objectForKey:@"FBAccessTokenKey"]
   && [defaults objectForKey:@"FBExpirationDateKey"]){
    facebook.accessToken = [defaults objectForKey:@"FBAccessTokenKey"];
    facebook.expirationDate = [defaults objectForKey:@"FBExpirationDateKey"];

}

    NSLog(@"startup login");
    [self loginToFacebook];//attempt to login automatically on startup

私のloginToFacebook関数はこれです:

- (void)loginToFacebook
{
    NSLog(@"Logging into facebook");
    //set up facebook and login in automatically if possible
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

    if([defaults objectForKey:@"FBAccessTokenKey"]
       && [defaults objectForKey:@"FBExpirationDateKey"]){
        facebook.accessToken = [defaults objectForKey:@"FBAccessTokenKey"];
        facebook.expirationDate = [defaults objectForKey:@"FBExpirationDateKey"];

    }

    if (![facebook isSessionValid]){

        //get permissions that user will need to agree to us using
        NSArray *permissions = [[NSArray alloc] initWithObjects:
                                @"user_likes",@"read_friendlists",@"offline_access", @"publish_stream",
                            nil];
        //authorise our login
        [facebook authorize:permissions];
        [permissions release];
    }
    else
    {
        [facebook authorize:nil];
    }
}

私に関する限り、今回は自分の電子メールとパスワードを使用してログインするように求められるはずです。私は主にシミュレーターを使用しているので、Facebookアプリ自体は原因ではなく、Facebook.hクラスで変更しました

[self authorizeWithFBAppAuth:NO safariAuth:YES];

[self authorizeWithFBAppAuth:NO safariAuth:NO];

ただし、Facebookウィンドウが一時的に点滅して消えます。これは、すでにログインしているときに予想されるとおりです。次に、以前のログインの詳細からID、名前、友達リストなどが読み込まれます。ユーザーを変更することはできなくなりました。'logout'に応じて出力する次のコードがあることを追加する必要があります。

- (void)fbDidLogout{
    NSLog(@"Logged out of facebook");
}

...[facebooklogout]が呼び出されたときにコンソールに出力されます。また、正しいURLスキームを使用しているので、問題はありません。

私が言ったように、私はこれを別のアプリで動作させていますが、今回は見落としていたものがわかりません。ばかばかしいほど単純なものだと思うので、どんな提案も歓迎します。

編集:デバイスでテストしたところ、Facebookにログインしようとするとアプリがクラッシュします。「保存された」情報を使用してログインしようとしているためだと思われますが、デバイスにまだログインしていないため、この情報は存在しません。私はまだ調査中ですが、明らかな欠陥が見られる場合は、非常に感謝しています。

Edit2:セーフケースの例を使用してCookieを削除してみました。また、a)didFinishLaunchingWithOptionsおよびb)fbDidLogout中にすべてのCookieを印刷すると、次のようになります。

a) `2012-05-18 10:40:40.665 MyApp [15545:17003](" "、

"<NSHTTPCookie version:0 name:\"c_user\" value:\"634361620\" expiresDate:2012-06-17 09:34:33 +0000 created:2012-05-18 09:34:34 +0000 (3.59026e+08) sessionOnly:FALSE domain:\".facebook.com\" path:\"/\" isSecure:TRUE>",
"<NSHTTPCookie version:0 name:\"csm\" value:\"2\" expiresDate:2012-06-17 09:34:33 +0000 created:2012-05-18 09:34:34 +0000 (3.59026e+08) sessionOnly:FALSE domain:\".facebook.com\" path:\"/\" isSecure:FALSE>",
"<NSHTTPCookie version:0 name:\"datr\" value:\"gxe2T8ZyBzMGb5w3LS29Q0kJ\" expiresDate:2014-05-18 09:34:33 +0000 created:2012-05-18 09:34:34 +0000 (3.59026e+08) sessionOnly:FALSE domain:\".facebook.com\" path:\"/\" isSecure:FALSE>",
"<NSHTTPCookie version:0 name:\"locale\" value:\"en_US\" expiresDate:2012-05-25 09:36:43 +0000 created:2012-05-18 09:36:44 +0000 (3.59027e+08) sessionOnly:FALSE domain:\".facebook.com\" path:\"/\" isSecure:FALSE>",
"<NSHTTPCookie version:0 name:\"lu\" value:\"RgayA7CMIlsAl-lOD2-Y-O3g\" expiresDate:2014-05-18 09:34:33 +0000 created:2012-05-18 09:34:34 +0000 (3.59026e+08) sessionOnly:FALSE domain:\".facebook.com\" path:\"/\" isSecure:FALSE>",
"<NSHTTPCookie version:0 name:\"m_user\" value:\"0%3A0%3A0%3A0%3Av_1%2Cajax_1%2Cwidth_320%2Cpxr_1%2Cgps_1%3A1337333673%3A2\" expiresDate:2012-08-16 09:34:33 +0000 created:2012-05-18 09:34:34 +0000 (3.59026e+08) sessionOnly:FALSE domain:\".facebook.com\" path:\"/\" isSecure:FALSE>",
"<NSHTTPCookie version:0 name:\"s\" value:\"Aa4WdKU-oOFathmK\" expiresDate:2012-06-17 09:34:33 +0000 created:2012-05-18 09:34:34 +0000 (3.59026e+08) sessionOnly:FALSE domain:\".facebook.com\" path:\"/\" isSecure:TRUE>",
"<NSHTTPCookie version:0 name:\"xs\" value:\"125%3AFFIWXjAXDXUMmw%3A2%3A1337333673\" expiresDate:2012-06-17 09:34:33 +0000 created:2012-05-18 09:34:34 +0000 (3.59026e+08) sessionOnly:FALSE domain:\".facebook.com\" path:\"/\" isSecure:TRUE>"

)`

b) 2012-05-18 10:41:16.530 MyApp[15545:17003] ( )

空に変わるので削除されたと思います。しかし、アプリを再度開くと、それらはすべて再びそこにあります。

Edit3:これを回避する唯一の方法は、アプリケーションが開いたらすぐにすべてのCookieを削除することです。ただし、これは、ユーザーが最後にアプリを開いたときにログインしたままにした場合でも、毎回ログインする必要があることを意味します。これは今のところ一時的な修正ですが、なぜ正常に機能しないのかはまだわかりません。

4

4 に答える 4

19

ユーザーがログアウトをクリックし、Facebookのuserdefaultに保存されているすべてのキーを削除するときにこのメソッドを提供します

- (void)fbDidLogout
{
  NSLog(@"Logged out of facebook");
  NSHTTPCookie *cookie;
   NSHTTPCookieStorage *storage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
   for (cookie in [storage cookies])
   {
       NSString* domainName = [cookie domain];
       NSRange domainRange = [domainName rangeOfString:@"facebook"];
       if(domainRange.length > 0)
       {
           [storage deleteCookie:cookie];
       }
   }
}
于 2012-05-18T09:10:59.537 に答える
1

注:FBアプリはログイン情報を保存するだけでなく、名前NSUserDefaultsを使用してログイン情報も保存します。このレコードを削除するだけで、FBにログイン情報を再度要求させることができます。NSHTTPCookieStoragem_user

この情報がお役に立てば幸いです。

于 2012-05-18T09:25:44.750 に答える
0

[appDelegate.session closeAndClearTokenInformation];

そのコード行だけで、トークンをクリアするのに役立ちました。

于 2012-11-26T13:57:29.463 に答える
0
 [[NSUserDefaults standardUserDefaults] removeObjectForKey:@"FBAccessTokenKey"];

[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"FBExpirationDateKey"];
于 2014-11-25T08:19:27.590 に答える