0

我正在尝试使用 Facebook SDK 从我的应用程序登录到 FB。我虔诚地遵循了本教程https://developers.facebook.com/docs/mobile/ios/build/#implementsso !

我的问题 这就是我所做的(我的 iPhone 中没有安装 Facebook 应用程序) 1. 我第一次从“iPhone”中的应用程序登录到 Facebook 时,它打开了 Safari。我登录并授予了我的应用程序的权限。2. 我从我的 iPhone 中删除了我的应用程序并重新启动了我的 iPhone。3. 现在,当我再次尝试从我的应用程序登录到 FB 时,isSessionValid 调用返回“no”,并且我尝试打印访问令牌并返回 null。这可以。但是应用程序在执行 isSessionValid 时,应用程序然后调用(如教程中所示)[thisAppDelegate.facebook authorize:nil]; 它在 iPhone 中打开 Safari 并带我到一个 Facebook 页面,上面写着我已登录(怎么会,当 isSessionValid 返回 null 时?好的,假设这个应用程序' 尽管我已登录,但与 FB 的会话结束了)并且该应用程序已获得授权。我在下面的屏幕中单击“确定”,应用程序崩溃。

在此处输入图像描述

fbLogin 调用完成后,我得到一个 EXC_BAD_ACCESS(代码 1)。这似乎发生在第 2 行(“for”循环)的这个方法中的 FBURLConnection.m 中:

- (BOOL)isCDNURL:(NSURL *)url
{
    NSString* urlHost = url.host;
    for (NSString* host in _cdnHosts) {
        if ([urlHost hasSuffix:host]) {
            return YES;
        }
    }

    return NO;
}

打印“urlHost”的值给了我“graph.facebook.com”的值。

有人可以帮忙吗?

代码片段

AppDelegate.h

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

@interface com_AppDelegate : UIResponder <UIApplicationDelegate, FBSessionDelegate> {

    Facebook *facebook;
}

@property (strong, nonatomic) UIWindow *window;
@property (nonatomic, retain) Facebook *facebook;

@end

我的 AppDelegate.m

...
@synthesize facebook;


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.
    facebook = [[Facebook alloc] initWithAppId:kFBAppId andDelegate:self];


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

    return YES;
}

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {
    NSLog(@"AppDelegate.handleOpenURL");
    return [facebook handleOpenURL:url]; 
}

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url
  sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
    NSLog(@"AppDelegate.openURL");
    return [facebook handleOpenURL:url]; 
}

- (void)fbDidLogin {

    NSLog(@"AppDelegate.fbDidLogin");
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setObject:[facebook accessToken] forKey:@"FBAccessTokenKey"];
    [defaults setObject:[facebook expirationDate] forKey:@"FBExpirationDateKey"];
    [defaults synchronize];
    NSLog(@"Set the facebook accessToken to '%@' & expiry to '%@'", [facebook accessToken], [facebook expirationDate]);
}
...

我有一个 FBTalker 类,它将打开一个 FB 连接。

来自FBTalker.h

... @interface ViewController_FBTalker : UIViewController { id appDelegate; @property (非原子) com_AppDelegate *thisAppDelegate; ...

FBTalker.m

...
-(void) initializeView {

    appDelegate = [[UIApplication sharedApplication] delegate];
    thisAppDelegate = (com_AppDelegate *) appDelegate;

    /*
     Check for a valid session and if it is not valid call the authorize method which will both log the user in and prompt the user to authorize the app
     */
    NSLog(@"thisAppDelegate.facebook: access token - %@", [thisAppDelegate.facebook accessToken]);
    NSLog(@"thisAppDelegate.facebook: exp date - %@", [thisAppDelegate.facebook expirationDate]);

    if (![thisAppDelegate.facebook isSessionValid]) {
        [thisAppDelegate.facebook authorize:nil];
        NSLog(@"No valid FB Session yet");
        // Checks if the App has permission to publish to the user stream
        /* NSArray *permissions = [[NSArray alloc] initWithObjects:
                                @"publish_stream", 
                                nil];
        [thisAppDelegate.facebook authorize:permissions];
        */
    } else {
        NSLog(@"Valid FB Session exists");
    }

...

环境 XCode 4.3.3 Facebook iOS SDK(来自 Github 的最新版本)https://github.com/facebook/facebook-ios-sdk/ iOS 5 iPhone 4(未安装 Facebook 应用程序)

4

1 回答 1

1

我也遇到过类似的问题,一次。这是因为,通常在登录时,访问令牌保存在UIWebView的缓存存储中。如果您想一次又一次地登录,您需要从 web 视图中删除缓存。您可以使用此方法单独清除 facebook 域的缓存。

- (void) clearFBCache 
  {
   for(NSHTTPCookie *cookie in [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies]) {

    if([[cookie domain] isEqualToString:@"facebook"]) {

        [[NSHTTPCookieStorage sharedHTTPCookieStorage] deleteCookie:cookie];
    }
   }
  }

这种方法对我有用。希望这对你也有帮助。

于 2012-08-14T17:47:27.420 回答