2013-09-05 23 views
7

iOSアプリでLinkedInを使用しています。私は、将来の使用のためにアクセストークンを保存したい。iOS SDKを使用してLinkedInアクセストークンを保存するにはどうすればよいですか?

トークンは、NSUserDefaultsに直接保存できない非プロパティタイプです。 私はこのためNSKeyedArchiverを使用してみましたが、私は出力を得た:トークンのテキストが来ているが、値がnullで来ている

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

-(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; 
} 

は、私はまた、このように保存しようとしましたが、結果は同じです::

コードは1スニペット

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

コードが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]; 

何かワロンはありますか?私のコーディングやアクセストークンで、いくつかの特別なテクニックが必要ですか?

+0

明確にしていますあなたはユーザーにトークン直接アクセスを保存することを願って、このように

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]; 

をresponseBodyを保存defaults.No必要に役立ちますme.Hopeのために働いていましたそれをアーカイブしてください –

+0

レスポンスをありがとうございます。私はデフォルトで直接保存すると[NSUserDefaults setObject:forKey:]というメッセージが表示されます:クラス 'OAToken'のプロパティ値 ''を挿入しようとしました。プロパティリストの辞書と配列には、プロパティ値のみが含まれている必要があることに注意してください。 – Imran

+0

OATokenオブジェクトを直接保存しないでください。応答本体を直接保存します。アクセストークンを使用する場合は、応答トークンを使用してアクセストークンを使用したい場合は、アクセストークン 'self.accessToken = [[NSUserDefaults standardUserDefaults] valueForKeyPath:@ "accessToken"]; [OAToken alloc] initWithHTTPResponseBody:self.accessToken] ' –

答えて

10

これは私が保存した方法です。それは

- (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:^{ 

    }]; 
} 

使用は、私はこの時

+0

答えをありがとう。私たちがアプリを入力した次回は、呼び出し時にアクセストークンを与えるでしょう:self.accessToken = [[OAToken alloc] initWithHTTPResponseBody:responseBody];レスポンスボディ(文字列)を保存しています。 – Imran

+0

次回からNSUserDaのresponseBody文字列を受け取り、OATokenオブジェクトを作成する必要があります.responseBodyはあなたのアプリケーションをアンインストールするまで利用可能になります –

+0

名前accessToken Conflictsとして明示しましょう。 'self.accessToken = [[OAToken alloc] initWithHTTPResponseBody:responseBody];'この行のaccessTokenはOATokenのインスタンスで、 'self.accessToken = [[NSUserDefaults standardUserDefaults] valueForKeyPath:@" accessToken "];'この行のaccessTokenはNSString 。 –

関連する問題