Невозможно воспроизвести сбой приложения при проверке входа в службу на устройстве.

У меня есть приложение, которое, согласно журналам сбоев, падает при запуске, проверяя, вошел ли пользователь в Facebook на устройстве. Проблема в том, что я не могу воспроизвести этот сбой, и это происходит на разных устройствах. До сих пор я видел этот сбой только в операционных системах до iOS 6. Самая ранняя версия iOS, поддерживаемая моим приложением, - 4.3.

Вот код, если кто-нибудь может дать подсказку о том, почему этот метод иногда дает сбой (а в большинстве случаев нет!)

Я получаю ошибку EXC_BAD_ACCESS (SIGSEGV);KERN_INVALID_ADDRESS в 0x00000000.

    + (BOOL)loggedIntoServiceOnDevice:(int)socialService {

        __ENTERING_METHOD__
        BOOL loggedIntoServiceOnDevice = NO;
        ACAccountStore *accountStoreHere = [[NSClassFromString(@"ACAccountStore") alloc] init];
        ACAccountType *accountType;
        ACAccountType *accountType2;

        if (accountStoreHere) {
            if (socialService == FACEBOOK_SERVICE) {

                ACAccountType *accountType = [accountStoreHere accountTypeWithAccountTypeIdentifier:@"com.apple.facebook"];
                Class slComposeController = NSClassFromString(@"SLComposeViewController");
                if (accountType && slComposeController != nil)
                {
                    if ([SLComposeViewController isAvailableForServiceType:SLServiceTypeFacebook]) {

                         loggedIntoServiceOnDevice = YES;
                    }
                }
            }
            else if (socialService == TWITTER_SERVICE) {
                ACAccountType *accountType = [accountStoreHere accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierTwitter];
                if (accountType)
                {
                    Class slComposeController = NSClassFromString(@"SLComposeViewController");
                    if ([TWTweetComposeViewController canSendTweet] || slComposeController != nil) {
                        if ([SLComposeViewController isAvailableForServiceType:SLServiceTypeTwitter]) {

                            loggedIntoServiceOnDevice = YES;
                        }
                    }
                }
            }
        }
        [accountStoreHere release];
        return loggedIntoServiceOnDevice;
    }

1 ответ

Решение

Следующая строка также выполняется в iOS 5, так как [TWTweetComposeViewController canSendTweet] возвращается YES поэтому вторая часть OR чек не оценивается, так как первый уже возвращен YES:

[SLComposeViewController isAvailableForServiceType:SLServiceTypeTwitter]

Возможно, вы захотите изменить эти операторы if на что-то вроде:

if ([TWTweetComposeViewController canSendTweet] ||
    (
     slComposeController != nil &&
     [SLComposeViewController isAvailableForServiceType:SLServiceTypeTwitter]
    )
   ) {

Это гарантирует, что SLComposeViewController используется только, если класс действительно существует.

Другие вопросы по тегам