Czy zestaw SDK Facebook iOS wymaga od użytkownika uwierzytelniania za każdym razem, gdy korzysta z aplikacji?

Facebook-Facebook-iOS-sdk, my app calls Facebook#authorize: delegate: before performing any API calls.

Ta metoda wymaga uwierzytelnienia użytkownika (w aplikacji Facebook lub w Safari), a następnie upuszcza kontrolę z powrotem do aplikacji my iPhone. Problem polega na tym, że prosi użytkownika o uwierzytelnienie za każdym razem, gdy wywołuję metodę. Jeśli aplikacja została już autoryzowana, zostanie wyświetlony komunikat informujący, że aplikacja jest już autoryzowana i musi nacisnąć przycisk OK, aby wróć do mojej aplikacji. Nie wygląda to zbyt profesjonalnie.

Więc mam dwa pytania:

  1. Czy użytkownik zawsze musi dokonać ponownej autoryzacji, aby wykonywać połączenia na Facebook ' u? Zawsze myślałem, że gdzieś zapisze token dostępu, może w domyślnych ustawieniach użytkownika, abyś nie musiał ponownie autoryzować.

  2. Jeśli użytkownik nie musi ponownie autoryzować za każdym razem, czy istnieje sposób, aby sprawdzić, czy moja aplikacja ma już uprawnienia, więc użytkownik nie musi zobaczyć tej wiadomości i naciśnij dobrze?

Author: JasonMArcher, 2011-04-06

5 answers

Szkoda, że Facebook SDK nie obsługuje go automatycznie za nas. Poza samodzielnym wbudowaniem go w SDK, najprostszym sposobem jest:

Za każdym razem, gdy przydzielasz _facebook:

_facebook = [[Facebook alloc] initWithAppId:@"SuperDuperAppID"];
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
NSString *accessToken = [prefs stringForKey:@"facebook-accessToken"];
NSString *expirationDate = [prefs stringForKey:@"facebook-expirationDate"];
_facebook.accessToken = accessToken;
_facebook.expirationDate = expirationDate;

Jeśli nigdy nie zapisałeś niczego w NSUserDefaults, wtedy zostaną ustawione wartości zerowe. Nic się nie stało. W przeciwnym razie zostaną ustawione wartości true, a {[3] } zwróci TRUE, wskazując dobre wartości. Śmiało i wykonuj połączenia Facebook SDK tak, jakby były zalogowane (którymi są). Jeśli false, then call

[facebook authorize:permissions delegate:self]; 
Jak zwykle.

Następnie upewnij się, że wspierasz następującą metodę delegowania Facebook:

- (void)fbDidLogin {
NSString *accessToken = _facebook.accessToken;
NSString *expirationDate = _facebook.expirationDate;
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
[prefs setObject:accessToken forKey:@"facebook-accessToken"];
[prefs expirationDate forKey:@"facebook-expirationDate"];
[prefs synchronize];
}

Używam tego kodu w mojej aplikacji i działa idealnie. Zrobiłem to z pamięci, więc przepraszam, jeśli nie działa na kopiuj i wklej. Gdzieś może być błąd, plus niewłaściwe zarządzanie pamięcią. Nie zapominaj, że tokeny dostępu wygasają, chyba że uzyskasz pozwolenie offline. W każdym razie powyższy kod obsługuje wszystko.

 23
Author: Daniel Amitay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-02 20:27:15

Problem polega na tym, że prosi użytkownika o / align = "left" / metoda. Jeśli już przyznali pozwolenie na moją aplikację, dostają komunikat informujący, że aplikacja jest już autoryzowane i muszą nacisnąć OK aby wrócić do mojej aplikacji.

1) czy użytkownik zawsze musi Zmień autoryzację, aby Facebook telefony? Zawsze myślałem, że to uratuje token dostępu gdzieś, może w domyślne ustawienia użytkownika, dzięki czemu można nie musiałbym / align = "left" /

Facebook SDK nie zapisuje tokena dostępu w sposób trwały, ponieważ po pomyślnym podpisaniu się za pierwszym razem, Facebook SDK nie zapisuje tokena dostępu w sposób trwały.

2) Jeśli Użytkownik nie musi reautoryzować za każdym razem, czy istnieje sposób aby sprawdzić, czy moja aplikacja ma już uprawnień, więc użytkownik nie ma żeby zobaczyć tę wiadomość i nacisnąć OK?

Fakt, że Facebook SDK nie zapisuje token dostępu nie oznacza, że nie możesz tego zrobić sam. Poniższy kod ilustruje, jak zapisać / pobrać token dostępu z NSUserDefaults.

-(void)login {
    // on login, use the stored access token and see if it still works
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    facebook.accessToken = [defaults objectForKey:ACCESS_TOKEN_KEY];
    facebook.expirationDate = [defaults objectForKey:EXPIRATION_DATE_KEY];

    // only authorize if the access token isn't valid
    // if it *is* valid, no need to authenticate. just move on
    if (![facebook isSessionValid]) {
        NSArray * permissions = [NSArray arrayWithObjects:@"read_stream", @"offline_access", @"email", nil];
        [facebook authorize:permissions delegate:self];
    }
}

/**
 * Called when the user has logged in successfully.
 */
- (void)fbDidLogin {
    // store the access token and expiration date to the user defaults
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setObject:facebook.accessToken forKey:ACCESS_TOKEN_KEY];
    [defaults setObject:facebook.expirationDate forKey:EXPIRATION_DATE_KEY];
    [defaults synchronize];
}
 6
Author: albertamg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-21 20:53:25

Gdy użytkownik się zaloguje, otrzymasz token dostępu i datę wygaśnięcia. Zapisz token dostępu i możesz go ponownie użyć, dopóki nie osiągniesz jeszcze daty wygaśnięcia. Facebook SDK ma metodę, aby to sprawdzić :[ fbconnect isSessionValid] ale wydaje się, że czasami daje fałszywe alarmy, więc mam zalogowanego użytkownika, jeśli żądanie nie powiedzie się.

 4
Author: Christina,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-06 19:37:53

1) nie, musiałem zrobić Facebook *fbConnect = [[Facebook alloc] init]; [fbConnect logout:self]; aby odsunąć sesję użytkownika

2) przypuszczam, że możesz zadzwonić do accestoken w Facebook.m, aby sprawdzić, że

 2
Author: Stian Storrvik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-06 19:32:56

Oto bardziej rzeczywiste podejście @ Daniel Amitay odpowiedź:
W kontrolerze widoku z przyciskiem logowania piszesz

//saving user data to user defaults in order to support Facebook SSO
let token = FBSDKAccessToken.currentAccessToken()
let prefs = NSUserDefaults.standardUserDefaults()
let nsdataToken = NSKeyedArchiver.archivedDataWithRootObject(token)
prefs.setObject(nsdataToken, forKey: "facebook-AccessToken")
prefs.synchronize()

W pliku AppDelegate func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool piszesz po

//restoring Facebook SSO session from user defaults
let prefs = NSUserDefaults.standardUserDefaults()
if let nsdataToken = prefs.valueForKey("facebook-AccessToken") as? NSData {
    let token = NSKeyedUnarchiver.unarchiveObjectWithData(nsdataToken) as! FBSDKAccessToken
    FBSDKAccessToken.setCurrentAccessToken(token)
}
 0
Author: drewpts,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-15 10:55:52