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];    
}

在其他视图控制器中,我将此方法称为注销:

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

同样在 plist 我添加了所需的 url 方案。

4

5 回答 5

5

将Facebook.m代码修改为此,这对我有用。

-(无效)注销:(id)委托{

    self.sessionDelegate = 委托;
    [_accessToken 释放];
    _accessToken = nil;
    [_expirationDate 发布];
    _expirationDate = 无;

    NSHTTPCookieStorage *cookies = [NSHTTPCookieStorage sharedHTTPCookieStorage];
    NSArray *facebookCookies = [cookies cookiesForURL:[NSURL URLWithString:@"http://login.facebook.com"]];
    对于(facebookCookies 中的 NSHTTPCookie* cookie){
        [cookies deleteCookie:cookie];
    }

    //添加这个。
    for (NSHTTPCookie *_cookie in cookies.cookies){
        NSRange domainRange = [[_cookie domain] rangeOfString:@"facebook"];
        如果(域范围。长度 > 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 APP,则用户必须手动退出 FB 应用程序才能切换帐户。

如果未安装 FB 应用程序,则 SSO 应在启动注销后提示用户再次登录。

于 2012-04-28T23:24:25.857 回答
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 回答
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

我已经成功尝试了这段代码:

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 回答