2013-09-05 8 views
7

Ich verwende LinkedIn in meiner iOS App. Ich möchte das Zugriffstoken für die zukünftige Verwendung speichern.So speichern Sie LinkedIn Access Token mit iOS SDK?

Das Token ist nicht vom Eigenschaftstyp, das nicht direkt in NSUserDefaults gespeichert werden kann. Ich versuchte NSKeyedArchiver dafür verwendet, aber ich habe die Ausgabe:

Token===oauth_token "(null)" oauth_token_secret "(null)" oauth_verifier "(null)" 

Der Text in dem Token kommt aber die Werte kommen null.

Code-Snippet 1:

-(void)saveData :(LOAToken *)token 
{ 
    NSFileManager *filemgr; 
    NSString *docsDir; 
    NSArray *dirPaths; 

    filemgr = [NSFileManager defaultManager]; 

    // Get the documents directory 
    dirPaths = NSSearchPathForDirectoriesInDomains(
                NSDocumentDirectory, NSUserDomainMask, YES); 

    docsDir = [dirPaths objectAtIndex:0]; 

    // Build the path to the data file 
    NSString *dataFilePath = [[NSString alloc] initWithString: [docsDir 
                   stringByAppendingPathComponent: @"data.archive"]]; 

    [NSKeyedArchiver archiveRootObject: 
    token toFile:dataFilePath]; 
} 


-(LOAToken *)GetToken 
{ 
    NSFileManager *filemgr; 
    NSString *docsDir; 
    NSArray *dirPaths; 

    filemgr = [NSFileManager defaultManager]; 

    // Get the documents directory 
    dirPaths = NSSearchPathForDirectoriesInDomains(
                NSDocumentDirectory, NSUserDomainMask, YES); 

    docsDir = [dirPaths objectAtIndex:0]; 

    // Build the path to the data file 
    NSString *dataFilePath = [[NSString alloc] initWithString: [docsDir 
                   stringByAppendingPathComponent: @"data.archive"]]; 

    // Check if the file already exists 
    if ([filemgr fileExistsAtPath: dataFilePath]) 
    { 
     LOAToken *token; 

     token = [NSKeyedUnarchiver 
        unarchiveObjectWithFile: dataFilePath]; 

     return token; 
    } 

    return NULL; 
} 

Ich habe auch versucht, so zu speichern, aber das Ergebnis ist dasselbe:

Token===oauth_token "(null)" oauth_token_secret "(null)" oauth_verifier "(null)" 

Code-Snippet 2:

NSData *myEncodedObject = [NSKeyedArchiver archivedDataWithRootObject:self.accessToken]; 
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    [defaults setObject:myEncodedObject forKey:@"myEncodedObjectKey"]; 
    [defaults synchronize]; 

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    NSData *myEncodedObject = [defaults objectForKey:@"myEncodedObjectKey"]; 
      LOAToken *obj = (LOAToken *)[NSKeyedUnarchiver unarchiveObjectWithData: myEncodedObject]; 

Gibt es irgendetwas, wron? g mit meiner Codierung oder Access Token benötigen eine spezielle Technik zum Speichern? Bitte schlagen Sie vor.

+0

Sie Zugriff speichern können Token direkt in Benutzer defaults.No Notwendigkeit Archivieren Sie es –

+0

Danke für die Antwort.Wenn ich direkt zu den Standardeinstellungen speichern ich bekomme Nachricht [NSUserDefaults setObject: forKey:]: Versuch, Nicht-Eigenschaft Wert '' der Klasse 'OAToken' einzufügen. Beachten Sie, dass Wörterbücher und Arrays in Eigenschaftslisten auch nur Eigenschaftswerte enthalten müssen. – Imran

+0

Speichern Sie nicht OAToken Objekt direkt speichern Sie den Antworttext wie ich tat und wenn Sie Zugriffstoken verwenden möchten, initialisieren Sie es mit AntwortBody thi Sway und verwenden Sie Zugriffstoken 'self.accessToken = [[NSUserDefaults standardUserDefaults] valueForKeyPath: @ "accessToken"]; [[OAToken alloc] initWithHTTPResponseBody: self.accessToken] ' –

Antwort

10

so habe ich gespeichert. Er arbeitete für me.Hope es

- (void)accessTokenResult:(OAServiceTicket *)ticket didFinish:(NSData *)data 
{ 
    NSDictionary *dict; 
    NSString *responseBody = [[NSString alloc] initWithData:data 
               encoding:NSUTF8StringEncoding]; 
    BOOL problem = ([responseBody rangeOfString:@"oauth_problem"].location != NSNotFound); 
    if (problem) 
    { 
     DLog(@"Request access token failed."); 
     DLog(@"%@",responseBody); 
     dict = [NSDictionary dictionaryWithObjectsAndKeys:@"0",@"success",@"Request access token failed.",@"reason", nil]; 
    } 
    else 
    { 
     self.accessToken = [[OAToken alloc] initWithHTTPResponseBody:responseBody]; 
     [[NSUserDefaults standardUserDefaults] setObject:responseBody forKey:@"accessToken"];//save here 
     [[NSUserDefaults standardUserDefaults] setObject:[NSDate date] forKey:@"TokenRefreshDate"];//save here 
     [[NSUserDefaults standardUserDefaults] synchronize]; 
     dict = [NSDictionary dictionaryWithObjectsAndKeys:@"1",@"success",@"Login Successful",@"reason", nil]; 
    } 
    // Notify parent and close this view 
    [[NSNotificationCenter defaultCenter] postNotificationName:@"loginViewDidFinish" object:self userInfo:dict]; 
    [self dismissViewControllerAnimated:YES completion:^{ 

    }]; 
} 

Verwendung gespeichert Response auf diese Weise

self.accessToken = [[NSUserDefaults standardUserDefaults] valueForKeyPath:@"accessToken"]; 
NSURL *url = [NSURL URLWithString:@"http://api.linkedin.com/v1/people/~/connections:(id,first-name,last-name,headline,maiden-name,picture-url,formatted-name,location,positions,public-profile-url,specialties,num-connections,industry)"]; 

OAMutableURLRequest *request = [[OAMutableURLRequest alloc] initWithURL:url 
                    consumer:self.consumer 
                     token:[[OAToken alloc] initWithHTTPResponseBody:self.accessToken] 
                    callback:nil 
                  signatureProvider:nil]; 

[request setValue:@"json" forHTTPHeaderField:@"x-li-format"]; 
OADataFetcher *fetcher = [[OADataFetcher alloc] init]; 
[fetcher fetchDataWithRequest:request 
         delegate:self 
       didFinishSelector:@selector(connectionsApiCallResult:didFinish:) 
        didFailSelector:@selector(connectionsApiCallResult:didFail:) withId:0]; 

hilft Ich hoffe, ich bin klar diesmal

+0

Danke für die Antwort.Nächste Zeit, wenn wir die App eingeben Wird es Zugriffstoken beim Aufruf geben: self.accessToken = [[OAToken alloc] initWithHTTPResponseBody: responseBody]; da wir Antwortkörper (String) speichern. – Imran

+0

von nächsten Zeit sollten Sie ResponseBody String von NSUserDa] Standards nehmen und dann OAToken object.responseBody erstellen wird bis zur Deinstallation Ihrer App zur Verfügung stehen –

+0

Lassen Sie mich als Name AccessToken Konflikte klären. 'self.accessToken = [[OAToken alloc] initWithHTTPResponseBody: responseBody];' in dieser Zeile ist accessToken eine Instanz von OAToken und 'self.accessToken = [[NSUserDefaults standardUserDefaults] valueForKeyPath: @" accessToken "];' in dieser Zeile ist accessToken NSString . –