Как получить доступ к слабому связанному фреймворку в iOS? - PullRequest
4 голосов
/ 20 декабря 2011

Я хочу использовать платформу Twitter для 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 голосов
/ 21 декабря 2011

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

enter image description here

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

enter image description here

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

4 голосов
/ 21 декабря 2011

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

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

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

1 голос
/ 21 декабря 2011

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

#import <Twitter/TWTweetComposeViewController.h>

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

if ([TWTweetComposeViewController class])
{
   //can tweet
} else
{
   //can't tweet
} 
0 голосов
/ 21 декабря 2011

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

...