NSException убивает приложение, если поднят в фоновом режиме - PullRequest
0 голосов
/ 28 февраля 2012

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

UPDATE

Я использую обработчик uncaughtexception, написанный Мэттом Галлахаром (какао с любовью). Как мне отменить запрос, как только он сработал. Код для запроса вызывается в этой функции

+(NSString*)validate:(NSString*)username password:(NSString*)password server:(NSString*)server port:(int)port encryption:(int)encryption authentication:(int)authentication folders:(NSMutableArray*)folders {
    CTCoreAccount* account = [[CTCoreAccount alloc] init];

    @try   {
        [account connectToServer:server port:port connectionType:encryption authType:authentication login:username password:password];
    } @catch (NSException *exp) {
        NSLog(@"connect exception: %@", exp);
        return [NSString stringWithFormat:@"Connect error: %@", [ImapFolderWorker decodeError:exp]]; 
    }
}


- (void)connectToServer:(NSString *)server port:(int)port 
        connectionType:(int)conType authType:(int)authType
        login:(NSString *)login password:(NSString *)password {
    int err = 0;
    int imap_cached = 0;

    const char* auth_type_to_pass = NULL;
    if(authType == IMAP_AUTH_TYPE_SASL_CRAM_MD5) {
        auth_type_to_pass = "CRAM-MD5";
    }

    err = imap_mailstorage_init_sasl(myStorage,
                                     (char *)[server cStringUsingEncoding:NSUTF8StringEncoding],
                                     (uint16_t)port, NULL,
                                     conType,
                                     auth_type_to_pass,
                                     NULL,
                                     NULL, NULL,
                                     (char *)[login cStringUsingEncoding:NSUTF8StringEncoding], (char *)[login cStringUsingEncoding:NSUTF8StringEncoding],
                                     (char *)[password cStringUsingEncoding:NSUTF8StringEncoding], NULL,
                                     imap_cached, NULL);

    if (err != MAIL_NO_ERROR) {
        NSException *exception = [NSException
                exceptionWithName:CTMemoryError
                reason:CTMemoryErrorDesc
                userInfo:nil];
        [exception raise];
    }

    err = mailstorage_connect(myStorage);
    if (err == MAIL_ERROR_LOGIN) {
        NSException *exception = [NSException
                exceptionWithName:CTLoginError
                reason:CTLoginErrorDesc
                userInfo:nil];
        [exception raise];
    }
    else if (err != MAIL_NO_ERROR) {
        NSException *exception = [NSException
                exceptionWithName:CTUnknownError
                reason:[NSString stringWithFormat:@"Error number: %d",err]
                userInfo:nil];
        [exception raise];
    }
    else    
        connected = YES;
}

Исключение возникает, если я ввожу другой номер порта, в это время возникает исключение в следующей строке

NSException *exception = [NSException
                    exceptionWithName:CTUnknownError
                    reason:[NSString stringWithFormat:@"Error number: %d",err]
                    userInfo:nil];
            [exception raise]; // this line kills the app if the app is in background. 

Эти функции находятся в библиотеке MailCore. Теперь, если кто-то знает решение, пожалуйста, помогите мне.

1 Ответ

0 голосов
/ 28 февраля 2012

Вы зарегистрировали uncaughtExceptionHandler для своего приложения? Кроме того, Apple рекомендует отменить любые открытые сетевые запросы (или, по крайней мере, быть готовыми к их сбоям) до выключения (используйте - (void)applicationDidEnterBackground:(UIApplication *)application). См. Раздел «Быть ​​ответственным фоновым приложением» этой ссылки: https://developer.apple.com/library/ios/DOCUMENTATION/iPhone/Conceptual/iPhoneOSProgrammingGuide/ManagingYourApplicationsFlow/ManagingYourApplicationsFlow.html#//apple_ref/doc/uid/TP40007072-CH4-SW47

...