ios - Facebook ios注销方法不起作用

标签 ios facebook

我已经使用这种方法在应用程序中注销 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)

}

还将此代码添加到应用委托(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];    
}

在其他 View Controller 中,我将此方法称为注销:
- (IBAction)logoutFacebook:(id)sender {
    FacebookManager *fbManager = [FacebookManager sharedInstance];
    [fbManager.facebook logout];
}

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

最佳答案

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

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

self.sessionDelegate = 委托(delegate);
[_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];
}
}

关于ios - Facebook ios注销方法不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10367964/

相关文章:

ios - 自从升级到 Xcode 10.2 我不能再通过 cli 运行 react-native run-ios

ios - 苹果健康 : export health data automatically

android - 从 Android 应用程序登录 Facebook

iphone - Samsung Smart TV 与 iOS 应用程序之间的连接

iphone - 让委托(delegate)在两个 View Controller 之间工作

ios - 什么是 malloc : recording malloc (but not VM allocation) stacks using lite mode

facebook - 如何通过 Facebook API 检索用户的完整新闻源?

ios - 发布 Facebook 状态,包括 Facebook 上已有照片的链接

xcode - iOS模拟器上的YouTube

java - 使用 Java 的 Facebook OAuth 登录(仅限桌面)