в моем приложении мне нужен сертификат для доступа к серверу. После выбора сертификата я получаю всплывающее окно для ввода пароля. Когда это неправильно, полное приложение вылетает. Кто-нибудь знает, как я могу справиться с аварией?
- (NSURLCredential*) getCertificateCredetials {
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *thePath = [documentsDirectory stringByAppendingPathComponent:[[NSUserDefaults standardUserDefaults] objectForKey:@"certificate"]];
// gets a certificate from local resources
//NSString *thePath = [[NSBundle mainBundle] pathForResource:@"mycert" ofType:@"p12"];
NSData *PKCS12Data = [[NSData alloc] initWithContentsOfFile:thePath];
if (PKCS12Data == nil) {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Fehler" message:@"xxx." delegate:nil cancelButtonTitle:@"Schließen" otherButtonTitles:nil, nil];
[alert show];
alert = nil;
return nil;
}
CFDataRef inPKCS12Data = (__bridge CFDataRef)PKCS12Data;
SecIdentityRef identity;
// extract the ideneity from the certificate
[self extractIdentity :inPKCS12Data :&identity];
SecCertificateRef certificate = NULL;
//Below I get an EXC_BAD_ACCESS after wrong password
SecIdentityCopyCertificate (identity, &certificate);
const void *certs[] = {certificate};
CFArrayRef certArray = CFArrayCreate(kCFAllocatorDefault, certs, 1, NULL);
// create a credential from the certificate and ideneity, then reply to the challenge with the credential
return [NSURLCredential credentialWithIdentity:identity certificates:(__bridge NSArray *)certArray persistence:NSURLCredentialPersistencePermanent];
}
- (NSURLCredential*) getCertificateCredetials {
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *thePath = [documentsDirectory stringByAppendingPathComponent:[[NSUserDefaults standardUserDefaults] objectForKey:@"certificate"]];
// gets a certificate from local resources
//NSString *thePath = [[NSBundle mainBundle] pathForResource:@"mycert" ofType:@"p12"];
NSData *PKCS12Data = [[NSData alloc] initWithContentsOfFile:thePath];
if (PKCS12Data == nil) {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Fehler" message:@"Das Zertifikat ist nicht gültig." delegate:nil cancelButtonTitle:@"Schließen" otherButtonTitles:nil, nil];
[alert show];
alert = nil;
return nil;
}
CFDataRef inPKCS12Data = (__bridge CFDataRef)PKCS12Data;
SecIdentityRef identity;
// extract the ideneity from the certificate
[self extractIdentity :inPKCS12Data :&identity];
SecCertificateRef certificate = NULL;
if (certificate != nil) {
SecIdentityCopyCertificate (identity, &certificate);
}
const void *certs[] = {certificate};
CFArrayRef certArray = CFArrayCreate(kCFAllocatorDefault, certs, 1, NULL);
// create a credential from the certificate and ideneity, then reply to the challenge with the credential
return [NSURLCredential credentialWithIdentity:identity certificates:(__bridge NSArray *)certArray persistence:NSURLCredentialPersistencePermanent];
}
РЕДАКТИРОВАТЬ: Добавлен метод синхронизации из другого класса, где он также аварийно завершает работу после начала синхронизации или перезапуска приложения.