4569


[TreasureBox](https://itunes.apple.com/app/id937819189?mt=8)というお気に入りアイテムを登録するアプリを作っているのですが、今回Share
Extension経由でもお気に入りアイテムを登録できるようにしたいと考えました。

バックエンドはParseを使っており、Share
Extensionを経由で他のアプリ（Safariなど）からお気に入りアイテムを登録するときに、自動的にユーザーをログインさせたいです。

Keychainを使って本体アプリとExtensionの間でcredentialを共有させることで、上記を実現しようとしているのですが、Parseではpasswordが管理者に対しても隠されており平文で参照することができないので、本体アプリ側でuser.passwordのように値を取ろうとするとnilになってしまい、extension側でログインできない状況です。

なお、KeychainのハンドリングはUICKeyChainStoreライブラリを利用させてもらっています。

**質問**

・Parseのログイン情報を本体アプリとExtensionで共有する方法としてKey Chainは適切でしょうか。 ・Key
chainを使うのが正しいとして、passwordがstringで取れない場合、どのようにcredentialを渡すことができますでしょうか。PFUser
OjbectをそのままkeychainないしNSUserDefaults経由で渡すことができればいいなぁと思いましたが、リファレンスを読む限りそれを実現する方法が見つかりませんでした。

アドバイスを頂けたら幸いです。

**本体アプリ側コード**

下記を本体アプリのfirst viewで実行するとusernameは取れるが、passwordがnilになってしまう。

[code]

    user = [PFUser currentUser];
    
    UICKeyChainStore *store = [UICKeyChainStore keyChainStoreWithService:@"nu.yuuichi"];
    [store setString:user.username forKey:@"UserName"];
    [store setString:user.password forKey:@"UserPassword"];
    [store synchronize];
    
[/code]

**Extension側コード**

[code]

    UICKeyChainStore *store = [UICKeyChainStore keyChainStoreWithService:@"nu.yuuichi"];    
    NSString *userName = [store stringForKey:@"UserName"];
    NSString *userPassword = [store stringForKey:@"UserPassword"];
    
    [store synchronize];
    
    if(userName && userPassword){
        [PFUser logInWithUsernameInBackground:userName password:userPassword];
    }
    
[/code]


CC BY-SA 3.0
2015-01-03T16:57:28.900
3002
2015-01-14T15:28:08.550
682
question
objective-c parse.com
Parseのログイン情報を本体アプリとApp Extensionで共有する方法


コメントでもサジェスチョン頂きましたように、sessionTokenをkeyChain経由で渡すことで目的を達成することができました。自己レスになりますが、今後同じことをやりたい方への参考までに、objective-
Cのコードを参考までに下記に記しておきます。

本体アプリ側コード

[code]

    //Get Parse session token to pass it to Extension
    _user = [PFUser currentUser];
    NSString *parseSessionToaken = _user.sessionToken;
    NSLog(@"ParseSessionTokenは%@",parseSessionToaken);
    NSString *parseUserName = _user.username;
    NSLog(@"User nameは%@",parseUserName);
    
    //Store it in Keychain
    UICKeyChainStore *store = [UICKeyChainStore keyChainStoreWithService:@"hogehoge"];
    [store setString:parseUserName forKey:@"UserName"];
    [store setString:parseSessionToaken forKey:@"SessionToken"];
    [store synchronize];
    
[/code]

Share Extension側コード

[code]

    //Parse Log-in via Keychain
    UICKeyChainStore *store = [UICKeyChainStore keyChainStoreWithService:@"hogehoge"];
    NSString *userName = [store stringForKey:@"UserName"];
    _sessionToken= [store stringForKey:@"SessionToken"];
    [store synchronize];
    
[/code]


CC BY-SA 3.0
2015-01-14T15:28:08.550
4569
2015-01-14T15:28:08.550
682
3002
answer