Как получить доступ к слабому связанному фреймворку в iOS?

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

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

Далее я пытаюсь использовать фреймворк Twitter:

#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 не найден.

Если я комментирую весь код, связанный с твиттером, я получаю ошибку компоновщика: "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

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

4 ответа

Решение

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

Как видите, реальное назначение устройства ("iPod mkeskinov's") удвоилось. Я никогда не обращал внимания на этот факт. Похоже, что это просто удвоилось по какой-то ошибке, но это не так. Если вы выберете "Продукт \ Редактировать схемы" и откроете список назначений (в верхней части окна), вы сможете четко увидеть разницу:

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

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

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

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

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

#import <Twitter/TWTweetComposeViewController.h>

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

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

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

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