IMAPSでは、クライアント内にデータをセキュアに保存するための仕組みとして、SLSを提供しています。SLSを認証モードで利用している場合、格納データはパスワードをキーにして保護されています。
そのためパスワードが変更された場合、格納された暗号化データを引き継ぐ(暗号化データを新しいパスワードで再暗号化する)必要があります。
IMALoginManager *loginManager;
- (void)func1
{
loginManager = [[IMALoginManager alloc] init:self];
[loginManager loginOnline:@"https:// サーバアドレス:ポート/"userId:@"userid"
passwd:@"password"];
// この後、ログイン結果は、IMALoginDelegateプロトコルのdidLoginFinishedメソッドで通知されます。
// IMALoginManagerのinitで自分自身をdelegateとして指定しています。
// 詳細はIMALoginManagerクラスを参照してください。
}
- (void) didLoginFinished:(NSError *)anError
{
NSString *message = nil;
if(anError == nil) {
message = @"LOGIN DONE";
} else {
if([anError.domain isEqualToString:IMAAuthErrorDomain]) {
switch (anError.code) {
case AuthLoginFailed:
message = @"LOGIN FAILED";
break;
case AuthAlreadyLogin:
message = @"ALREADY LOGIN";
break;
// それぞれのエラーの実装.
default:
message = @"SYSTEM ERROR";
break;
}
} else if([anError.domain isEqualToString:IMASlsErrorDomain]) {
switch (anError.code) {
case SlsOfflinePasswordError:
message = @"OFFLINE LOGIN FAILED";
break;
case SlsPasswordError:
{
message = @"NEED TAKES OVER";
// SLSデータの引き継ぎが必要.
// データを引き継ぐ場合は、旧パスワードを使用してtransDataを呼び出します.
// データを削除する場合は、deleteDataを呼び出します.
break;
}
// それぞれのエラーの実装.
default:
message = @"SYSTEM ERROR";
break;
}
} else {
message = @"SYSTEM ERROR";
}
NSLog(message);
}
}
// ダイアログで、データ引き継ぎをおこなうかをユーザーに問い合わせる場合
- (void)func2
{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"title"
message:@"データ引き継ぎか削除かの問い合わせ"
delegate:self
cancelButtonTitle:nil
otherButtonTitles: @"削除", @"引き継ぎ", nil];
[alert show];
}
// ダイアログでデータ引き継ぎか削除が選択された時の処理の切り分けを行う
- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex
{
NSError *anError = nil;
BOOL result = NO;
if (buttonIndex == 0) {
// 削除が選択された場合は、deleteDataを呼び出します。
result = [loginManager deleteData:&anError];
if (!result) {
// それぞれのエラーの実装.
}
} else if (buttonIndex == 1) {
// データ引き継ぎが選択された場合は、入力された旧パスワードを引数に、transDataを呼び出します。
// UITextFieldから旧パスワードを取得
NSString *oldPassword = _oldPassword.text;
result = [loginManager transData:oldPassword error:&anError];
if(!result) {
// それぞれのエラーの実装.
}
}
}