Facebook ios注销方法不起作用

Mat*_*der 1 facebook ios

我在app中使用此方法登出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!");
}
Run Code Online (Sandbox Code Playgroud)

此方法已被调用,但当我重新启动应用程序时,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
Run Code Online (Sandbox Code Playgroud)

这是singleton 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
Run Code Online (Sandbox Code Playgroud)

在appDelegate我做下一个:

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

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

... (some other code)

}
Run Code Online (Sandbox Code Playgroud)

还将此代码添加到app delegate:

- (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];    
}
Run Code Online (Sandbox Code Playgroud)

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

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

也在plist中我添加了所需的url方案.

小智 5

修改Facebook.m代码到这个,这对我有用.

-(void)logout:(id)delegate {

    self.sessionDelegate = delegate;
    [_accessToken release];
    _accessToken = nil;
    [_expirationDate release];
    _expirationDate = nil;

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

    //Adds this one.
    for (NSHTTPCookie *_cookie in cookies.cookies){
        NSRange domainRange  = [[_cookie domain] rangeOfString:@"facebook"];
        if(domainRange.length > 0){
            [cookies deleteCookie:_cookie];
        }
    }

    if ([self.sessionDelegate respondsToSelector:@selector(fbDidLogout)]){
        [_sessionDelegate fbDidLogout];
    }
}