2011-12-20 2 views
4

Я хочу использовать инфраструктуру Twitter для iOS 5, но иметь возможность запускать свое приложение в более старой ОС.Как получить доступ к слабым связанным фреймворкам в iOS?

Я добавил слабую ссылочную структуру (т. Е. Установил «необязательный» флаг) в настройках Xcode 4.2 Target. Базовый SDK - это iOS 5, iOS-развертывание. Цель - iOS 3.2.

Далее, я пытаюсь использовать щебетать рамки:

#import <Twitter/Twitter.h> 
... 
    Class twClass = NSClassFromString(@"TWTweetComposeViewController"); 
    if (!twClass) // Framework not available, older iOS 
    { 
     [self shareWithTwitterPriorIOS5]; 
     return; 
    } 

    if ([TWTweetComposeViewController canSendTweet]) // Check if twitter is setup and reachable 
    { 
     TWTweetComposeViewController* twc = [[TWTweetComposeViewController alloc] init]; 
//  [twc addURL:[NSURL URLWithString:@"http://mail.ru"]]; 
//  [twc addImage:[UIImage imageNamed:@"Some image.png"]] 
     [twc setInitialText:textToShare]; 
     [viewController presentViewController:twc animated:YES completion:^{ 
      // Optional 
     }]; 
     [twc release]; 
     // Assume twc is ARC released or call [twc release]; 
    } 
    else 
    { 

    // Twitter account not configured, inform the user 
} 

Он хорошо работает на IOS 5 тренажере. Как только я попытаюсь использовать симулятор или реальное устройство со старой версией ОС, я получаю сообщение об ошибке «Twitter/Twitter.h», который не найден (во время компиляции). Если я удалю директиву «#import», я получаю пару ошибок, которые не найден. Класс TWTweetComposeViewController не найден.

Если я прокомментирую весь код, связанный с Twitter, я получаю ошибку компоновщика: «ld: framework not found Twitter». Команда Ld вызвала ошибку:

Ld /Users/mikhailkeskinov/Library/Developer/Xcode/DerivedData/Dictionary-eiyrziajmltuglfzgtnjxffkojwi/Build/Products/Debug-iphoneos/Dictionary.app/Dictionary normal armv6 
    cd /Developer/WorkShop/XDictionary/trunk 
    setenv IPHONEOS_DEPLOYMENT_TARGET 3.2 
    setenv PATH "/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin" 
    /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/clang -arch armv6 -isysroot /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.2.sdk -L/Users/mikhailkeskinov/Library/Developer/Xcode/DerivedData/Dictionary-eiyrziajmltuglfzgtnjxffkojwi/Build/Products/Debug-iphoneos "-L/Developer/WorkShop/XDictionary/trunk/Dictionary/Twitter+OAuth/Libraries & Headers" -F/Users/mikhailkeskinov/Library/Developer/Xcode/DerivedData/Dictionary-eiyrziajmltuglfzgtnjxffkojwi/Build/Products/Debug-iphoneos -filelist /Users/mikhailkeskinov/Library/Developer/Xcode/DerivedData/Dictionary-eiyrziajmltuglfzgtnjxffkojwi/Build/Intermediates/Dictionary.build/Debug-iphoneos/Dictionary.build/Objects-normal/armv6/Dictionary.LinkFileList -dead_strip -miphoneos-version-min=3.2 -lxml2 -framework AVFoundation -framework UIKit -framework Foundation -framework CoreGraphics -lOAuth -weak_framework Twitter -o /Users/mikhailkeskinov/Library/Developer/Xcode/DerivedData/Dictionary-eiyrziajmltuglfzgtnjxffkojwi/Build/Products/Debug-iphoneos/Dictionary.app/Dictionary 

Что здесь не так?

ответ

5

Через 5 часов, тонкий глупый читатель документации, меняя все целевые настройки & и т. Д. Я, по крайней мере, прихожу к решению. Оказывается, это довольно легко, когда вы это знаете. Наверное, мой ответ спасет чей-то день.

enter image description here

Как вы можете видеть, назначение реальное устройство ("IPOD mkeskinov в") в два раза. Я никогда не обращаю внимания на этот факт. Похоже, что он просто удваивается какой-то ошибкой, но это не так. Если выбрать «Продукт \ Изменить Схемы» & открытый список адресатов (на верхней части окна), вы можете четко видеть разницу:

enter image description here

Что мне нужно сделать, чтобы успешно скомпилировать приложение для реального устройства - просто выберите второй вариант. Он будет компилироваться для iOS 5, а затем запускаться на реальном устройстве с ОС 4. Первый вариант означает, что он будет компилироваться для iOS 4, и если у вас есть ссылки на Framework, которые не представлены в iOS 4 (неважно, слабые ссылки или сильный) - вы получаете ошибку времени компиляции.

+1

Да, ты спас меня от своей судьбы! В моем случае не было никакой разницы между двумя элементами в редакторе схем, но переключение делало трюк. Возможно, это вызвало это, установив более старый SDK для iOS в новый Xcode. Документирование/совместное использование собственного ответа всегда хорошо. Благодарю. –

+0

Apple исправила эту проблему в XCode 4.3. Ответ выше для XCODE v. 4.2 –

0

Вместо использования импорта вы должны ссылаться на класс TWTweetComposeViewController, используя объект класса, полученный из NSClassFromString(), например. [twClass canSendTweet] вместо [TWTweetComposeViewController canSendTweet].

+0

Если я сделаю это, я получу пару warrings, например «Метод класса + canSendTweet not found» или «Метод экземпляра -setInitialText: not found». Не нравится. И самая большая проблема - я все еще не могу запустить свой код под старой ОС из-за связанной ошибки (см. Отредактированный вопрос выше). –

1

Добавьте это в заголовочном файле .h:

#import <Twitter/TWTweetComposeViewController.h> 

Вот что я использовал для моего приложения:

if ([TWTweetComposeViewController class]) 
{ 
    //can tweet 
} else 
{ 
    //can't tweet 
} 
+0

И вы используете #import вверху файла .m, так? По какой-то причине этот #import вызывает ошибку компиляции. –

+0

Я отредактировал свой ответ, чтобы включить необходимый файл заголовка. – user523234

+0

So. Можете ли вы подключить устройство с более старой версией ОС к MAC и запустить приложение на этом устройстве с помощью Xcode 4? Если ваш ответ ДА, сообщите мне, как вы это делаете. Я получаю ошибку компиляции каждый раз, когда я пытаюсь использовать более старую версию ОС. –

4

Ваш код, вероятно, хорошо.

Вы абсолютно хотите создать свое приложение против SDK iOS5. Бинарный файл, который вы производите, будет работать на старых версиях iOS (если ваш целевой SDK является более старой версией, как вы указали).

Ваш код правильно проверяет возможности iOS5 и делает правильную вещь, и вы правильно слабый, ссылающийся на структуру Twitter. Именно эти методы позволяют вашему приложению (построенному против последнего SDK) работать без сбоев на старых версиях iOS.

+0

Но ** как ** я могу запустить свой код на ** реальном устройстве со старой ОС **? Я ожидал, что настройка Base SDK = 5.0 должна приводить к тому, что Xcode всегда будет строить с SDK iOS5. –

+0

Вам необходимо иметь устройство со старой версией. :-) Вы можете проверить это с помощью симулятора. Просто используйте симулятор 4.3, и ваше приложение должно работать (построено против iOS5 SDK) просто отлично. Все функции, зависящие от iOS5, которые вы проверяете, не будут иметь места при симуляторе 4.3, но ваше приложение должно работать нормально. –

+0

Наконец-то я нашел, как скомпилировать iOS 5. Это довольно легко, когда вы знаете (я отправил свой собственный ответ). –