2011-01-27 8 views
8

In Facebook SDK per iOS, posso chiedere domande come questa:Come passare alla pagina successiva nella risposta JSON di Facebook utilizzando l'SDK di iOS?

[_facebook requestWithGraphPath:@"me/feed" andDelegate:self]; 

Ma spesso Facebook darò una risposta limitata JSON con un URL da utilizzare per richiedere di trasferirsi a date precedenti, per esempio. Quindi nella risposta JSON, avrò:

data =  (/*things here... status updates, photos, etc...*/ 
    ); 
paging =  { 
     next = "https://graph.facebook.com/me/feed?sdk=ios&sdk_version=2&access_token= <something>&until=2010-12-04"; 
     previous = "https://graph.facebook.com/me/feed?sdk=ios&sdk_version=2&access_token=<something>&since=<something>"; 
    }; 

Quello che mi chiedo è ... Come posso passare all'URL precedente? SDK fornisce un'interfaccia per fare questo?

MODIFICA: se possibile, desidero effettivamente rispondere con Graph API, poiché Facebook sta attualmente ritirando l'API REST.

BONUS: se qualcuno può spiegare il formato dell'ora restituito da Facebook. Ho 2010-09-13T00%3A25%3A16%2B0000 come esempio.

+3

A proposito, il formato dell'ora è solo URL codificato. Decodificalo e ottieni questo "2010-09-13T00: 25: 16 + 0000". Più ovvio ora? :) – DougW

+0

Sì! Non sapevo come mi sono perso. È passato un anno e mezzo da quando ho postato questo. –

risposta

7

tutto ciò che è necessario che aggiungere un metodo per la sottoclasse Facebook o si

- (void)requestWithURLString:(NSString *)fullURL 
       andHttpMethod:(NSString *)httpMethod 
       andDelegate:(id <FBRequestDelegate>)delegate { 
    [self openUrl:fullURL params:nil httpMethod:httpMethod delegate:delegate]; 
} 

ps della seconda param "httpMethod" può essere sempre @ "GET" si può omettere

+0

WOW, funziona molto bene! Grazie mille! Perché BTW non è stato creato da Facebook SDK? Sai se è un aggiornamento pianificato? ? –

+0

No, non ho trovato alcuna attività su quella funzione su https://github.com/facebook-facebook-ios-sdk/issues ma puoi essere il primo a farlo) – UIBuilder

+0

Oh ok, grazie allora dovrò file that =) –

1

Sì, è possibile ottenere il risultato chiamando la funzione di api ho usato qui di seguito il codice per ottenere gli stati degli utenti nel tuo caso è possibile utilizzare il metodo stream.get è possibile trovato qui http://developers.facebook.com/docs/reference/rest/stream.get/

NSMutableDictionary * params = [[NSMutableDictionary alloc] init]; 
    [params setValue:[NSString stringWithFormat:@"%@", appDelegate.user_id] forKey:@"uid"]; 
    [params setValue:@"150" forKey:@"limit"]; 
    [params setValue:@"results" forKey:@"callback"]; 


    [_facebook requestWithMethodName: @"status.get" 
      andParams: params 
      andHttpMethod: @"POST" 
         andDelegate: self]; 

Puoi usare questo codice per te.

+0

Questo otterrà i primi 150 stati giusto? Come ottengo i prossimi 150? –

+0

Puoi inserire un limite infinito come 100000 o più ma il numero massimo di record forniti da facebook è di circa 1 anno. Puoi ottenere di più usando le API di Facebook perché non forniscono i dati più di un anno fa. –

+0

cosa intendi con cui posso ottenere di più utilizzando qualsiasi API di Facebook? –

2

si può fare qualcosa di simile:

[appDelegate.fb requestWithGraphPath:@"me/home" 
          andParams:[NSMutableDictionary dictionaryWithObject:@"2011-01-27T04%3A48%3A50%2B0000" forKey:@"since"] 
         andDelegate:self]; 

Si noti che, nel paging parte del tuo feed, i next e previous URL differiscono da un solo parametro di ricerca (until e since). Puoi utilizzare i valori che ottieni da questo per ottenere la pagina successiva e precedente dei risultati.

Spero che questo aiuti!

+0

Ah ... Sembra fattibile, grazie! Ci proverò presto. –

+0

Hmm non funziona per me, ho un errore da Facebook: impossibile analizzare 2011-01-27T04% 3A48% 3A50% 2B0000 in una data o un'ora. Altre idee? –

+0

Hmm, è strano ... Ha funzionato per me prima. Cercherò di capire anche questo, dato che ne ho bisogno per un mio progetto .. Ti terrò aggiornato .. – donkim

0

Almeno per quanto per quanto riguarda il formato della data, è una variante del formato RFC 3339. Per quanto ne so, iOS non ha un formattatore predefinito di quel tipo.

Creo un programma di formattazione della data e lo tengo in giro (sono stranamente lenti da creare) così posso facilmente convertirli quando lavoro con i dati FB.

 NSDateFormatter * sRFC3339DateFormatter = nil; 
     NSLocale * enUSPOSIXLocale; 

     sRFC3339DateFormatter = [[NSDateFormatter alloc] init]; 
     enUSPOSIXLocale = [[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"] autorelease]; 

     [sRFC3339DateFormatter setLocale:enUSPOSIXLocale]; 
     [sRFC3339DateFormatter setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ssZ"]; 
     [sRFC3339DateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]]; 

Una volta ottenuto tale formattatore, è possibile convertire facilmente avanti e indietro.

NSDate* myDate = nil; 
myDate = [sRFC3339DateFormatter dateFromString:@"2011-01-27T04%3A48%3A50%2B0000"]; 

Rompere l'URL in un dizionario di stringhe è piuttosto semplice con i metodi NSURL.

6

Con iOS SDK versione di Facebook 3 fuori, la risposta originale non si applica più alla versione corrente.

Ho dovuto fare qualche ricerca, perché la nuova versione non rende tutto più semplice.Ho trovato un esempio di come ottenere questo risultato nella classe FBGraphObjectPagingLoader che il nuovo SDK fornisce per aiutare a fare questo per le tabelle. È incredibilmente brutto, ma presumo che sia il metodo "raccomandato" poiché è quello che usano.

Ecco la mia leggera modifica del loro codice (che si trova originariamente nel FBGraphObjectPagingLoader's followNextLink method)

FBRequest *request = [[[FBRequest alloc] initWithSession:FBSession.activeSession graphPath:nil] autorelease]; 
FBRequestConnection *connection = [[[FBRequestConnection alloc] init] autorelease]; 
[connection addRequest:request completionHandler:^(FBRequestConnection *connection, id result, NSError *error) { 
    // Do some stuff 
}]; 

// Override the URL using the one passed back in 'next'. 
NSURL *url = [NSURL URLWithString:urlString]; 
NSMutableURLRequest* urlRequest = [NSMutableURLRequest requestWithURL:url]; 
connection.urlRequest = urlRequest; 

[connection start]; 

Si potrebbe ovviamente modificare la propria biblioteca e racchiudendolo nel classe stessa se si voleva.

+0

Grazie, non ho ancora provato l'iOS SDK 3.0, ma sembra che non lo rendano più facile. –