この問題を解決する方法についてさまざまな投稿を見てきましたが、うまくいきませんでした。ハートビート ソリューションを試しましたが、何もしません。キーチェーンに更新トークンが保存されていることはわかっていますが、何の役にも立っていません。
手順:
- アプリを起動
- ロード ディレクトリ (この場合はルート) に移動します。
- このエラーを取得します。
編集: 最初に 20000 エラーが発生します。認証トークンが更新されていないようです。
エラー Domain=com.box.sdk.errordomain Code=20002 「操作を完了できませんでした。(com.box.sdk.errordomain エラー 20002.)」
- Box のログイン プロセスをもう一度実行します。
- テーブルビューをリロード
- 動作します。
このコードを使用してアクセス トークンを更新しています (そうすべきだと思います)。
if (storedRefreshToken)
{
[BoxSDK sharedSDK].OAuth2Session.refreshToken = storedRefreshToken;
}
ここでも何かが足りない気がします。
許可された 14 日間、ユーザーがログインしたままにする必要があります。アプリの再起動後も生き残るためにアプリのログイン状態を取得するにはどうすればよいですか?
最新の V2 SDK を使用しています。
編集:
各ViewControllerのキーチェーンでrefreshtokenを更新することから、AppDelegateを参照することまで、すべてを試しました。ログインしたままにすることができず、アプリを再起動すると20002エラーが発生し続けます(再開ではなくコールドスタート)。Box ファイルピッカーを使用したくありませんが、独自のテーブルビューを作成したいと考えています。そこに他のアイデアはありますか?
AppDelegate:
in didFinishLaunching:
[BoxSDK sharedSDK].OAuth2Session.clientID = @"XXXXXXXXXX";
[BoxSDK sharedSDK].OAuth2Session.clientSecret = @"XXXXXXX";
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(boxAPITokensDidRefresh:) name:BoxOAuth2SessionDidBecomeAuthenticatedNotification object:[BoxSDK sharedSDK].OAuth2Session];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(setRefreshTokenInKeychain:) name:BoxOAuth2SessionDidRefreshTokensNotification object:[BoxSDK sharedSDK].OAuth2Session];
// set up stored OAuth2 refresh token
_keychain = [[KeychainItemWrapper alloc] initWithIdentifier:REFRESH_TOKEN_KEY accessGroup:nil];
id storedRefreshToken = [_keychain objectForKey:(__bridge id)kSecValueData];
if (storedRefreshToken)
{
[BoxSDK sharedSDK].OAuth2Session.refreshToken = storedRefreshToken;
}
リスナーメソッド
- (void)boxAPITokensDidRefresh:(NSNotification *)notification
{
BoxOAuth2Session *OAuth2Session = (BoxOAuth2Session *) notification.object;
[self setRefreshTokenInKeychain:OAuth2Session.refreshToken];
_isBox = YES;
[self removeBoxLoginViewController];
}
- (void)setRefreshTokenInKeychain:(NSString *)refreshToken
{
[_keychain setObject:@"MyApp" forKey: (__bridge id)kSecAttrService];
[_keychain setObject:refreshToken forKey:(__bridge id)kSecValueData];
NSLog(@"refreshToken: %@", refreshToken);
}
メイン ViewController: ViewDidLoad
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(boxAPIAuthenticationDidSucceed:) name:BoxOAuth2SessionDidBecomeAuthenticatedNotification object:[BoxSDK sharedSDK].OAuth2Session];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(boxAPIAuthenticationDidFail:) name:BoxOAuth2SessionDidReceiveAuthenticationErrorNotification object:[BoxSDK sharedSDK].OAuth2Session];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(boxAPIAuthenticationRefreshToken:) name:BoxOAuth2SessionDidReceiveRefreshErrorNotification object:[BoxSDK sharedSDK].OAuth2Session];
[self boxAPIHeartbeat];
ハートビート:
- (void)boxAPIHeartbeat
{
[[BoxSDK sharedSDK].foldersManager folderInfoWithID:@"0" requestBuilder:nil success:nil failure:nil];
}
ハートビート後の ListenerMethods:
- (void)boxAPIAuthenticationDidSucceed:(NSNotification *)notification
{
NSLog(@"Received OAuth2 successfully authenticated notification");
BoxOAuth2Session *session = (BoxOAuth2Session *) [notification object];
NSLog(@"Access token (%@) expires at %@", session.accessToken, session.accessTokenExpiration);
NSLog(@"Refresh token (%@)", session.refreshToken);
//[self.tableView reloadData];
}
- (void)boxAPIAuthenticationDidFail:(NSNotification *)notification
{
NSLog(@"Received OAuth2 failed authenticated notification");
NSString *oauth2Error = [[notification userInfo] valueForKey:BoxOAuth2AuthenticationErrorKey];
NSLog(@"Authentication error (%@)", oauth2Error);
//[self dismissViewControllerAnimated:YES completion:nil];
}
- (void)boxAPIAuthenticationRefreshToken:(NSNotification *)notification
{
BoxOAuth2Session *OAuth2Session = (BoxOAuth2Session *) notification.object;
[self setRefreshTokenInKeychain:OAuth2Session.refreshToken];
NSLog(@"REFRESH TOKEN: %@", OAuth2Session.refreshToken);
}
//trying this out????
- (void)setRefreshTokenInKeychain:(NSString *)refreshToken
{
[_keychain setObject:@"MyApp" forKey: (__bridge id)kSecAttrService];
[_keychain setObject:refreshToken forKey:(__bridge id)kSecValueData];
NSLog(@"refreshToken: %@", refreshToken);
}
今週末にこれを把握できなければ、Box SDK を使用できません。Box は開発者が自社の SDK を使用することを望んでいると思いますが、ドキュメントは貧弱です。私は何が欠けていますか?コールド スタート後もアプリをログインしたままにしたいだけです。