Невозможно воспроизвести сбой приложения при проверке входа в службу на устройстве.
У меня есть приложение, которое, согласно журналам сбоев, падает при запуске, проверяя, вошел ли пользователь в 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
используется только, если класс действительно существует.