0

使用适用于 iOS 的 Facebook 3.7,对 App 进行身份验证。它有 70% 的时间工作,其他 30% 的时间会崩溃。似乎与是否连接互联网无关。在下面的第一种方法 - populateUserDetails 中,我检查字典是否为 nil,我认为这会阻止这个问题,但它仍然会发生。

这是我的错误:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** setObjectForKey: object cannot be nil (key: 0_auth_logger_id)'

这是我的验证码:

- (void)populateUserDetails
{
if (FBSession.activeSession.isOpen) {
    [[FBRequest requestForMe] startWithCompletionHandler:
     ^(FBRequestConnection *connection,
       NSDictionary<FBGraphUser> *user,
       NSError *error) {
         if (!error || ![user isEqualToDictionary: nil]) {
             // if (!error) {
             self.userNameLabel.text = [user objectForKey:@"email"];
             email = [user objectForKey:@"email"];
             //      self.userProfileImage.profileID = user.id;

             if ([facebookUser isEqualToString:@"yes"]){
             [self appendAndSaveData];
             [self performSegueWithIdentifier:@"segueIntroScreenLogin" sender:self];
             }

         }
     }];
}
}

-(void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];

if (FBSession.activeSession.isOpen) {
[self populateUserDetails];
}
}

-(void)logoutButtonWasPressed:(id)sender {
[FBSession.activeSession closeAndClearTokenInformation];
}


- (IBAction)performLogin:(id)sender
{
 facebookUser = @"yes";
 NSLog(@"IntroScreen, email: %@", email);
 AppDelegate* appDelegate = [UIApplication sharedApplication].delegate;
 [appDelegate openSession];

    if([email length] >0){

     [self appendAndSaveData];
     [self performSegueWithIdentifier:@"segueIntroScreenLogin" sender:self];
 }

}

4

2 回答 2

0

尝试这个:

  1. 在您喜欢的编辑器中打开:

    [facebook_sdk_folder]/src/FBSession.m
    

在第 930-940 行附近,您会发现以下代码

if (permissions != nil) {
  NSString* scope = [permissions componentsJoinedByString:@","];
  [params setValue:scope forKey:@"scope"];
}

将其更改为

if (permissions != nil) {
  NSString* scope = [permissions componentsJoinedByString:@","];
  if( scope )  // << add this line
    [params setValue:scope forKey:@"scope"];
}

然后再次重建框架

[facebook_sdk_folder]/scripts/build_framework.sh

(确保 [facebook_sdk_folder]/build/FacebookSDK.framework 中新生成的框架是您的项目中包含的框架)

于 2013-09-18T22:49:22.017 回答
0

虽然您的代码中似乎没有引用在 NSMutableDictionary 中设置值,但终止消息可能是指您不能将 nil 作为键传递给 setObject:forKey: 方法的事实。发布堆栈跟踪会有所帮助,但在这种情况下,请查找对 setObject:forKey 的调用并验证 forKey 参数是否为非零。

于 2013-08-28T01:15:09.180 回答