2016-06-08 13 views
0

Ich verwende die AES-Verschlüsselung und Entschlüsselung in meinem Projekt, das ein Apple-Watch-Projekt ist. Also habe ich für die Verschlüsselung und Entschlüsselung eine Kategorie für NSData erstellt, und ich rufe diese Methoden in meiner Beispielansicht-Controller-Klasse auf. Es funktioniert gut.So beheben Sie diesen Fehler. Grund: '- [NSConcreteData AES256EncryptWithKey:]: nicht erkannter Selektor an Instanz 0x7ab084a0' gesendet?

Und dann habe ich den gleichen Code in meine ServerManager-Klasse kopiert, wo ich die eigentliche Verschlüsselung durchführen sollte. Aber es zeigt mir diesen Fehler.

Absturz mit Fehlern:

App beenden aufgrund nicht abgefangene Ausnahme 'NSInvalidArgumentException', Grund: '- [NSConcreteData AES256EncryptWithKey:]: Unbekannter Selektor gesendet Instanz 0x7ab084a0'

Der gleiche Code arbeitet in Beispielcode und es zeigt mir diesen Fehler in meinem aktuellen Projekt. Ich habe nicht verstanden, was der Grund sein könnte. Ich habe nie von NSConcreteData gehört. ebenfalls. Hier ist mein Code folgt.

In My Servermanager Klasse:

NSError *err; 


    NSDictionary *dict = @{@"accountType":@"ALL",@"uId":@"c8ff46be-a083-40 

09-8a33-fc2d22cc40e3|123456784",@"deviceId":@"qvxy1234"}; 

    NSData * jsonData = [NSJSONSerialization dataWithJSONObject:dict options:0 error:&err]; 

    NSString *encryptedData = [[jsonData AES256EncryptWithKey:kABAESCryptionKey] base64EncodedStringWithOptions:0]; 

    NSLog(@"%@",encryptedData); 

    NSData *nsdataFromBase64String = [[NSData alloc] 
             initWithBase64EncodedString:encryptedData options:0]; 

und NSData + CustomCategory Klasse ist wie folgt:

- (NSData *)AES256EncryptWithKey:(NSString *)key { 

    return [self AES256Operation:kCCEncrypt key:key]; 
} 

- (NSData *)AES256DecryptWithKey:(NSString *)key { 

    return [self AES256Operation:kCCDecrypt key:key]; 
} 

/*! 
* @brief Common method for encrypt and decrypt 
* @param Operation : pass required crypto CCOperation type 
* @param key : pass key based on which crption is done 
* @returns NSData object : Encrypted or Decrypted data 
*/ 
- (NSData *)AES256Operation:(CCOperation)operation key:(NSString *)key { 

    // 'key' should be 32 bytes for AES256, will be null-padded otherwise 
    char keyPtr[kCCKeySizeAES256+1]; 
    bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding) 

    // fetch key data 
    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding]; 

    NSUInteger dataLength = [self length]; 

    size_t bufferSize = dataLength + kCCBlockSizeAES128; 
    void *buffer = malloc(bufferSize); 

    size_t numBytesCrypted = 0; 
    CCCryptorStatus cryptStatus = CCCrypt(operation, kCCAlgorithmAES128, kCCOptionPKCS7Padding, 
              keyPtr, kCCKeySizeAES256, 
              NULL /* initialization vector (optional) */, 
              [self bytes], dataLength, /* input */ 
              buffer, bufferSize, /* output */ 
              &numBytesCrypted); 
    if (cryptStatus == kCCSuccess) { 

     return [NSData dataWithBytesNoCopy:buffer length:numBytesCrypted]; 
    } 

    free(buffer); //free the buffer 
    return nil; 
} 

Der gleiche Code in Probe funktioniert, aber nicht in meinem realen Projekt. ..

Zusatz:

Es ist nicht wegen base64EncodedStringWithOptions: Methode.

habe ich versucht, wie diese auch

NSData *encryptedData = [jsonData AES256EncryptWithKey:kABAESCryptionKey]; 

dieser Code So auch abstürzt, also ich bin sicher, dass das Problem nicht mit base64EncodedStringWithOptions: ist? Irgendeine Sache läuft schief, während ich in IWatch-Erweiterungsklassen verwende.

Hier ist der KABAESCryptionKey ein richtiger Schlüssel, der gut funktioniert. im Beispielbeispiel.

Antwort

0

Ja, ich habe die Antwort bekommen. Es ist so dummes Ding. Diese Kategorie wurde meinem Build-Ziel für die Uhr nicht hinzugefügt. Es zeigt also Fehler. Jetzt habe ich hinzugefügt NSData + CustomCategory.m bedeutet, ich habe diese Datei für meine Uhr Build-Ziel überprüft es funktioniert gut.

0

ich denke, das Problem ist in AES256EncryptWithKey ..See link kann dies helfen