Приложение iOS падает после ввода неверного пароля для сертификата - PullRequest
0 голосов
/ 25 апреля 2018

в моем приложении мне нужен сертификат для доступа к серверу. После выбора сертификата я получаю всплывающее окно для ввода пароля. Когда это неправильно, полное приложение вылетает. Кто-нибудь знает, как я могу справиться с аварией?

- (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];
}

РЕДАКТИРОВАТЬ: Добавлен метод синхронизации из другого класса, где он также аварийно завершает работу после начала синхронизации или перезапуска приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...