1

アプリでFacebookをログアウトするためにこの方法を使用しました

- (void)fbDidLogout {
    // Remove saved authorization information if it exists
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    if ([defaults objectForKey:@"FBAccessTokenKey"]) {
        [defaults removeObjectForKey:@"FBAccessTokenKey"];
        [defaults removeObjectForKey:@"FBExpirationDateKey"];
        [defaults synchronize];
    }
    NSLog(@"logout success!");
}

このメソッドが呼び出されましたが、アプリを再起動しても、Facebook は最新の認証を認識しています。

私の完全な実装

Facebook インスタンスのシングルトン オブジェクトを作成します。

これは私のマネージャーです.h

#import <Foundation/Foundation.h>
#import "FBConnect.h"

@interface FacebookManager : NSObject <FBSessionDelegate> {
    Facebook *facebook;
}
@property (nonatomic, strong) Facebook *facebook;

+ (FacebookManager *)sharedInstance;
- (void)initWithAppID:(NSString *)appID;

@end

これはシングルトン facebookmanager .m です

#import "FacebookManager.h"

@implementation FacebookManager
@synthesize facebook;

static FacebookManager *_sharedInstance = nil;

+ (FacebookManager *)sharedInstance {
    @synchronized(self) {
        if (!_sharedInstance) {
            _sharedInstance = [[FacebookManager alloc] init];
        }
    }
    return _sharedInstance;
}

- (void)initWithAppID:(NSString *)appID {
    facebook = [[Facebook alloc] initWithAppId:appID andDelegate:self];
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    if ([defaults objectForKey:@"FBAccessTokenKey"]
        && [defaults objectForKey:@"FBExpirationDateKey"]) {
        facebook.accessToken = [defaults objectForKey:@"FBAccessTokenKey"];
        facebook.expirationDate = [defaults objectForKey:@"FBExpirationDateKey"];
    }
    if (![facebook isSessionValid]) {
        [facebook authorize:nil];
    }
}

- (void)fbDidLogout {
    // Remove saved authorization information if it exists
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    if ([defaults objectForKey:@"FBAccessTokenKey"]) {
        [defaults removeObjectForKey:@"FBAccessTokenKey"];
        [defaults removeObjectForKey:@"FBExpirationDateKey"];
        [defaults synchronize];
    }
    NSLog(@"logout success!");
}

@end

appDelegate で次に作成します。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{

    fbManager = [FacebookManager sharedInstance];
    [fbManager initWithAppID:@"myappid"];

... (some other code)

}

また、このコードをアプリ デリゲートに追加します。

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {
    return [fbManager.facebook handleOpenURL:url]; 
}

- (void)fbDidLogin {
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setObject:[fbManager.facebook accessToken] forKey:@"FBAccessTokenKey"];
    [defaults setObject:[fbManager.facebook expirationDate] forKey:@"FBExpirationDateKey"];
    [defaults synchronize];    
}

他のView Controllerでは、ログアウトのためにこのメソッドを呼び出します:

- (IBAction)logoutFacebook:(id)sender {
    FacebookManager *fbManager = [FacebookManager sharedInstance];
    [fbManager.facebook logout];
}

plist にも、必要な URL スキームを追加しました。

4

5 に答える 5

5

Facebook.mコードをこれに変更すると、うまくいきます。

-(void)logout:(id)delegate {

    self.sessionDelegate = デリゲート;
    [_accessToken リリース];
    _accessToken = なし;
    [_expirationDateリリース];
    _expirationDate = nil;

    NSHTTPCookieStorage *cookies = [NSHTTPCookieStorage sharedHTTPCookieStorage];
    NSArray *facebookCookies = [cookies cookiesForURL:[NSURL URLWithString:@"http://login.facebook.com"]];
    for (NSHTTPCookie* facebookCookies の Cookie){
        [クッキーdeleteCookie:クッキー];
    }

    //これを追加します。
    for (NSHTTPCookie *_cookie in cookies.cookies){
        NSRange domainRange = [[_cookie ドメイン] rangeOfString:@"facebook"];
        if (ドメイン範囲の長さ > 0) {
            [Cookies deleteCookie:_cookie];
        }
    }

    if ([self.sessionDelegate RespondsToSelector:@selector(fbDidLogout)]){
        [_sessionDelegate fbDidLogout];
    }
}
于 2012-09-19T05:36:29.767 に答える
2

「アプリを再起動しても、Facebook は私の最新の承認についてまだ知っている」とはどういう意味ですか? これは、あなたの FB アクセストークンがまだ有効であることを意味しますか? まだ userdefaults の値が表示されていますか? 正確には?

FBログインを再度トリガーすると、自動的に再度ログインすることを意味する場合、iOSにFacebookアプリがインストールされている場合、ユーザーはFBアプリから手動でログアウトしてアカウントを切り替える必要があります.

FB アプリがインストールされていない場合、SSO は、ログアウトを開始した後にユーザーに再度ログインするように求める必要があります。

于 2012-04-28T23:24:25.857 に答える
1

私はこのコードを成功裏に試しました:

NSFileManager *fm = [NSFileManager defaultManager];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString *cachesDirectory = [paths objectAtIndex:0];
NSLog(@"cache dir %@", cachesDirectory);
NSError *error = nil;
for (NSString *file in [fm contentsOfDirectoryAtPath:cachesDirectory error:&error]) {
    BOOL success = [fm removeItemAtPath:[NSString stringWithFormat:@"%@/%@", cachesDirectory, file] error:&error];
    if (!success || error) {
        NSLog(@"Error delete file: %@, %@", file, error);
    } else {
        NSLog(@"Deleted file: %@", file);
    }
}
于 2012-06-14T13:44:57.013 に答える
1

Facebook.m に次のコードを追加して、m.facebook.com ドメインの Cookie を削除します。

- (void)invalidateSession {

   ...
    NSArray* facebookMCookies = [cookies cookiesForURL:
                                [NSURL URLWithString:@"https://m.facebook.com"]];

    for (NSHTTPCookie* cookie in facebookMCookies) {
        [cookies deleteCookie:cookie];
    }

  ...
}
于 2012-06-01T16:24:28.220 に答える
1

これは、sso/oauth 2.0 を使用した ios sdk api の動作のようです。トークンをクリアしても完全にログアウトできず、アプリからユーザーを切り替えることもできません。ユーザーを切り替えるには FB アプリに移動する必要があります

回避策として、Facebook.m の行を変更し、safariAuth を無効にします。

// [self authorizeWithFBAppAuth:YES safariAuth:YES];

 [self authorizeWithFBAppAuth:NO safariAuth:NO]

ただし、承認するたびにユーザー名とパスワードを入力する必要があります。

于 2012-05-01T10:05:09.263 に答える