2013-12-17 7 views
1

Я интегрирую свое приложение iOS с Parse и Facebook. Он отлично работает на моем iPhone 4s - работает под управлением iOS 6 - но когда я пытаюсь выполнить тестовую учетную запись на моем симуляторе xCode 5, это терпит неудачу.PFFacebookUtils logInWithPermissions не работает на тренажере

Когда я нажимаю мой логин с помощью кнопки facebook Я представил с высказыванием экрана: Вы уже утвержденной Test999 Это происходит сразу, когда я звоню эту строку (имя моего приложения.):

[PFFacebookUtils logInWithPermissions:permissionsArray block:^(PFUser *user, NSError *error) 

Я нажимаю ОК. Он отправляет меня на экран «Вы должны войти в систему первым». Я ввел свое имя пользователя и пароль и нажимаю «Вход в систему» ​​- и я отправлен обратно в «Тебя уже уполномочил Test999». Я нажимаю OK - и мне представлен пустой вид с x в левом верхнем углу, чтобы закрыть его. Больше нечего делать, я нажимаю его, и меня отправляют обратно на экран «Вы должны войти первым».

Так что на самом деле нет способа войти в систему с симулятором. Я попытался «Сбросить содержимое и настройки», но это не поможет.

После ответа на подобную проблему я попытался добавить метод reconnectWithFb (ниже), а также обновил свой sdk Facebook до версии 3.9. Ничто не помогает.

Это из моего входа в систему с методом facebook:

[PFFacebookUtils logInWithPermissions:permissionsArray block:^(PFUser *user, NSError *error) { 

if (!user) { 
    if (!error) { 
     NSLog(@"Uh oh. The user cancelled the Facebook login."); 
     UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"User cancelled facebook login" message:@"Uh oh. The user cancelled the Facebook login." delegate:nil cancelButtonTitle:nil otherButtonTitles:@"Dismiss", nil]; 
     [alert show]; 
    } else { 
     NSLog(@"welcome screen loginWithFB: Uh oh. An error occurred: %@", error); 
     [self performSelector:@selector(reconnectWithFB) withObject:nil afterDelay:0.5]; 
    } 
} else if (user.isNew) { 
    NSLog(@"New user with facebook signed up and logged in!"); 
} else { 
    NSLog(@"User with facebook logged in!");   
    FBRequest *request = [FBRequest requestForMe]; 
    [request startWithCompletionHandler:^(FBRequestConnection *connection, id result, NSError *error) { 
     if (!error) { 
      NSString *facebookUsername = [result objectForKey:@"name"]; 
      [PFUser currentUser].username = facebookUsername; 
      [[PFUser currentUser] setObject:[result objectForKey:@"id"] forKey:@"facebookid"]; 
      [[PFUser currentUser] saveEventually]; 
      [[NSNotificationCenter defaultCenter] postNotificationName:kUsersToWatchNotification object:result]; 
     } else { 
      NSLog(@"Error getting the FB username %@", [error description]); 
     } 
    }]; 
} 

и мой reconnectWithFB (который на тренажере всегда пустой fbAccounts массив :)

-(void) reconnectWithFB { 
    NSLog(@"reconnectWithFB called"); 
    ACAccountStore *accountStore; 
    ACAccountType *accountTypeFB; 
    if ((accountStore = [[ACAccountStore alloc] init]) && (accountTypeFB = [accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook])){ 
    NSArray *fbAccounts = [accountStore accountsWithAccountType:accountTypeFB]; 

    NSLog(@"fbAccounts %@", fbAccounts); 

    id account; 
    if (fbAccounts && [fbAccounts count] > 0 && (account = [fbAccounts objectAtIndex:0])){ 
     [accountStore renewCredentialsForAccount:account completion:^(ACAccountCredentialRenewResult renewResult, NSError *error) { 
       //we don't actually need to inspect renewResult or error. 
       if (error){ 
        NSLog(@"error in reconnectWithFB %@", error); 
       } 
     }]; 
     } 
    } 
} 

Любая помощь с этим было бы значительно оценили.

+0

Важно "STUPID TIP" !!! Если у вас есть приложение, установленное на ** quit-on-exit ** ... это обычно бывает при разработке ... конечно, ничего не получится! Потраченные часы на это, хе-хе! Надеюсь, это поможет кому-то. – Fattie

ответ

5

Похоже, решение, чтобы добавить открытые методы URL-адрес в моем App Делегат:

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url { 
    return [PFFacebookUtils handleOpenURL:url]; 
} 

и

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url  sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { 
    return [PFFacebookUtils handleOpenURL:url]; 
} 
+0

Спасибо. Это сработало для меня –

1

Этот ответ, кажется, устаревшую, компилятор предупреждает устаревания.

Текущий метод должен быть:

- (BOOL) handleOpenURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { 
    return [FBAppCall handleOpenURL:url 
         sourceApplication:sourceApplication 
         withSession:[PFFacebookUtils session]]; 
} 
1

Обновленный способ:

В вашем AppDelegate.m поставить следующее:

- (BOOL)application:(UIApplication *)application 
      openURL:(NSURL *)url 
    sourceApplication:(NSString *)sourceApplication 
     annotation:(id)annotation { 
    return [FBAppCall handleOpenURL:url 
        sourceApplication:sourceApplication 
         withSession:[PFFacebookUtils session]]; 
} 

Затем убедитесь, что вы называете это:

- (void)applicationDidBecomeActive:(UIApplication *)application { 
    [FBAppCall handleDidBecomeActiveWithSession:[PFFacebookUtils session]]; 
     [FBAppEvents activateApp]; 
} 

Позже в кодировании убедитесь, что вы добавить один вкладыш:

- (void)applicationDidEnterBackground:(UIApplication *)application { 
    // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 
    // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 
    [[PFFacebookUtils session] close]; 
} 
+0

Ссылка: https://www.parse.com/tutorials/integrating-facebook-in-ios – LEO

Смежные вопросы