ошибка при проверке SLServiceTypeFacebook и twitter

Мое приложение поддерживает iOS 5+. Теперь я хочу добавить facebook и twitter. Я добавил social.framework как необязательный и на facebook, но я проверяю

if([SLComposeViewController isAvailableForServiceType:SLServiceTypeFacebook]) {
        NSLog(@"Facebook iOS 6 avaliable");
}
else
{
 NSLog(@"Feature not supported"); // for iOS 5 users
}

то же самое для твиттера. Но симулятор iOS 6 работает нормально, а симулятор iOS 5 выдает ошибку. любая помощь или руководство по добавлению facebook и twitter на iOS 5 и iOS 6.

EXC_BAD_ACCESS (code=2, address=0x0) isAvailableForServiceType:SLServiceTypeFacebook
isAvailableForServiceType:SLServiceTypeTwitter

после обновления проекта для ответа 1 появляется эта ошибка.

введите здесь описание изображенияздесь префикс файла введите здесь описание изображения


person user777304    schedule 19.01.2013    source источник


Ответы (2)


EXC_BAD_ACCESS (code=2, address=0x0)

Таким образом, эта ошибка является «ошибкой сегментации», поскольку платформа Social предназначена только для iOS6. Поскольку вы использовали слабую связь (вот что означает добавление фреймворка в качестве «необязательного»), класс SLComposeViewController равен Nil (т. е. он фактически указывает на недопустимый адрес памяти 0x0), поэтому любая функция, которую вы попытаетесь вызвать, скорее всего, приведет к в ошибке сегментации (поскольку разыменование этого адреса невозможно).

Что вам нужно сделать, так это проверить, что этот класс является допустимым указателем:

if (NSClassFromString(@"SLComposeViewController") != Nil) {
    // iOS 6
} else {
    // iOS 5, Social.framework unavailable, use Twitter.framework instead
}
person Community    schedule 19.01.2013
comment
ошибка в if (SLComposeViewController != Nil) ... Ожидаемый идентификатор - person user777304; 19.01.2013
comment
Вы можете установить для социальной структуры значение «Необязательный», и тогда Xcode добавит ее только в том случае, если iOS 6 или выше - person MCKapur; 19.01.2013
comment
@RohanKapur Опять же, это проверка во время выполнения, а не во время компиляции. Кроме того, привязка не связана с ошибкой компилятора, которая была у OP. - person ; 19.01.2013
comment
О, хорошо, теперь я понял. Извините за путаницу. Да, ты прав. - person MCKapur; 19.01.2013
comment
означает, что тогда не нужно проверять приложение для iOS 6 и iOS 5 для этой функции обмена....? - person user777304; 19.01.2013

Фреймворк Social (SLComposeViewController) был представлен только в iOS 6. В iOS 5 единственным встроенным подключением к любой социальной сети был Twitter и класс TWTweetComposeViewController. iOS 6 представила фреймворк Social с уже существующей поддержкой Twitter и новой интеграцией Facebook и Sina Weibo.

Таким образом, в iOS 5 вы не можете сделать какую-либо ссылку или вызвать SLComposeViewController, вам нужно будет использовать условия, чтобы увидеть, какая версия (iOS 5 или 6) работает на устройстве пользователя, а затем выполнить какие-либо операции/условия.

Код if ([SLComposeViewController isAvailableForServiceType:SLServiceTypeFacebook]) используется, чтобы узнать, настроил ли пользователь учетную запись Facebook в приложении «Настройки».

Да, поэтому вы добавляете платформу Twitter для совместимости с iOS 5, кстати, убедитесь, что Social framework установлен как необязательный.

Чтобы проверить, какая версия работает на устройстве, добавьте это в свой файл MyApp-Prefix.pch:

#define SYSTEM_VERSION_EQUAL_TO(v)         ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedSame)
#define SYSTEM_VERSION_GREATER_THAN(v)       ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedDescending)
#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)
#define SYSTEM_VERSION_LESS_THAN(v)         ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)
#define SYSTEM_VERSION_LESS_THAN_OR_EQUAL_TO(v)   ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedDescending)

Затем вы можете использовать его в любом классе, потому что файл префикса автоматически импортируется во все классы:

if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"5.0") && SYSTEM_VERSION_LESS_THAN(@"6.0")) {

       NSLog(@"This is called when device is running iOS 5, 5.0.1, 5.1 etc.");
}
else if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"6.0")) {

       NSLog(@"iOS 6.0, 6.0.1, 6.0.2, 6.1 etc.");
}
person MCKapur    schedule 19.01.2013
comment
Так зачем этот код??? if([SLComposeViewController isAvailableForServiceType:SLServiceTypeFacebook]) - person user777304; 19.01.2013
comment
okx.. Еще одна вещь.. Если у меня есть твиттер, поделитесь. Чем я должен добавить social.framework и twitter.framework для поддержки iOS 6 и iOS 5.? Также подскажите, как проверить версию iOS и запустить метод желания, написанный для iOS 6 и iOS 5. - person user777304; 19.01.2013
comment
Это не позволяет вам запускать приложение как на iOS 5, так и на 6, поскольку оно обнаруживает функцию во время компиляции. Что ищет OP, так это проверка доступных функций во время выполнения. - person ; 19.01.2013
comment
@user777304 user777304 Обновленный ответ, но я удивлен, что вам нужно, чтобы я сказал вам - person MCKapur; 19.01.2013
comment
Используйте ответ @H2CO3, но не мой. - person MCKapur; 19.01.2013