元気ですか?
RNCryptor を使用して、iOS デバイスと Web サーバー間のトランザクションを暗号化しようとしています。そのために、私は iOS と PHP で RNCryptor を使用し、iOS から WebServer への通信には AFNetworking を使用しています。
JSON 応答オブジェクトに解析される前に、AFNetworking から受信したデータを復号化するにはどうすればよいですか?
合成するために、私は持っています:
- Yii フレームワーク、サーバーサイド、PHP
- AFNetwoling、クライアント側、Objective-C
- RNCryptor、両面
iOS から PHP へ: データを使用する前に復号化できます。
PHP から iOS へ: AFNetworking はデータを使用する前に復号化しません。
私のPHPコードは次のようなものです:
RNCryptorHelper::init();
$encryptor = new \RNCryptor\Encryptor;
$data['Model1'] = Model1::model()->findAll();
$data['Model2'] = Model2::model()->findAll();
// EDITED TO REMOVE THIS HEADER
// header('Content-type: application/json');
echo $encryptor->encrypt(CJSON::encode($data), Yii::app()->params['cryptPassword']);
Yii::app()->end();
それはそのようなものを出力します:
AwFQ9+OfsHyXcSPynCrtveF7MQupQ+urd/VYeNMmt6OMxd6MhsDz4nxapvS1kVEHHbBZ4xLHqN7hTUDZos1LTWhB/CyeYoWpZSDhyFeHu9wNlHcRie6KTaHv/h14krvfb2/GHMt3GhIFqnyo7UKy/d06
私のObjective-Cコードは次のようなものです:
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
[manager GET:[NSString stringWithFormat:@"%@/Sync", URL_ROOT]
parameters:nil
success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"%@", [RNDecryptor decryptData:responseObject withPassword:CRYPT_PASSWORD error:nil]);
}
failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Error: %@", error);
}];
次のエラーが出力されます。
Error Domain=NSCocoaErrorDomain Code=3840 "The operation could not be completed. (Cocoa error 3840.)" (JSON テキストが配列またはオブジェクトで開始されておらず、フラグメントを許可するオプションが設定されていません。) UserInfo=0x15681970 {NSDebugDescription=JSON テキスト配列またはオブジェクトで開始されておらず、フラグメントを許可するオプションが設定されていません。}
ご協力いただきありがとうございます!!
編集1
コードを少し変更したところ、次の結果が得られました。
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
[manager GET:[NSString stringWithFormat:@"%@/Sync", URL_ROOT]
parameters:nil
success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSData *decryptedData = [RNDecryptor decryptData:[[NSData alloc] initWithBase64EncodedData:responseObject options:NSDataBase64DecodingIgnoreUnknownCharacters]
withPassword:CRYPT_PASSWORD
error:nil];
id json = [NSJSONSerialization JSONObjectWithData:decryptedData
options:kNilOptions
error:nil];
}
failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Error: %@", error);
}];
その復号化を自動化する Response Serializer を作成する方法についてのヒントはありますか?