Как создать приложение с методами iOS 5.0 для iOS 4.3? - PullRequest
1 голос
/ 14 февраля 2012

Я заканчиваю функцию iCloud для своего приложения и не могу решить одну проблему: поскольку я использую некоторые новые функции 5.0, такие как NSFileCoordinator, я не могу собрать свое приложение для 4.3 из-за "dyld: Symbol not found:_OBJC_CLASS _ $ _ NSFileCoordinator».Как я могу «удалить» некоторые файлы (у которых есть методы iCloud) для сборки версии 4.3?Заранее спасибо!

Ответы [ 6 ]

4 голосов
/ 14 февраля 2012

Посмотрите на это .

Class cls = NSClassFromString (@"NSFileCoordinator");
if (cls) {
    // Create an instance of the class and use it.
} else {
    // Alternate code path to follow when the
    // class is not available.
}

Также проверьте этот ответ , чтобы понять, почему

вам следует избегать полагаться на строку версии в качестве указания на возможности устройства или ОС.

2 голосов
/ 14 февраля 2012

Чтобы просто извлечь их из исходной копии:

  1. Нажмите на файл вашего проекта.
  2. Перейдите в «Фазы сборки».
  3. Развернуть "Скомпилировать источники".
  4. Выберите файл, который вам не нужен, и нажмите кнопку «-» на нижняя часть секции.

Или вы можете удалить его из проекта (просто удалите ссылку, а не удаляя файл), и он также удалит его из этого раздела.

Или вы можете создать макросы препроцессора, чтобы проверить, может ли пользователь запускать функции

// System Versioning Preprocessor Macros
#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)

/* Usage
if (SYSTEM_VERSION_LESS_THAN(@"4.0")) {
    ...
}

if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"3.1.1")) {
    ...
}*/

При этом вы можете проверить, какую версию systen использует пользователь, и построить только для 5.0, но добавить функциональный код для версии ниже 5.0.

0 голосов
/ 14 февраля 2012

Сборка с последним SDK (5.0).Он будет настраивать как 4.3, так и 5.0

И вы можете проверить версию IOS

if ([[UIDevice currentDevice] systemVersion] floatValue] >= 5.0f) {
    // iCloud
} else {
    // iCloudless
}
0 голосов
/ 14 февраля 2012

У вас должна быть слабая ссылка на фреймворк (когда вы добавляете фреймворк в проект, просто установите его как необязательный, необязательный).

В файл h вы должны импортировать, только если у вас есть IOS 5

#if defined(__IPHONE_5_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_5_0
#import <Twitter/Twitter.h>
#import <Accounts/Accounts.h>
#endif

и в файле m вы должны попытаться создать класс из строки и проверить, есть ли у вас класс. А также проверьте top, чтобы увидеть, отвечает ли класс на селекторы.

Class TWTweetComposeViewControllerClass = NSClassFromString(@"TWTweetComposeViewController");

     if (TWTweetComposeViewControllerClass != nil) {
          if([TWTweetComposeViewControllerClass respondsToSelector:@selector(canSendTweet)]) {
              UIViewController *twitterViewController = [[TWTweetComposeViewControllerClass alloc] init];

              [twitterViewController performSelector:@selector(setInitialText:) 
                                          withObject:NSLocalizedString(@"TwitterMessage", @"")];
              [twitterViewController performSelector:@selector(addURL:) 
                                          withObject:url];

               [twitterViewController performSelector:@selector(addImage:) 
                                           withObject:[UIImage imageNamed:@"yourImage.png"]];
                [self.navigationController presentModalViewController:twitterViewController animated:YES];
                [twitterViewController release];
                }
            } else {
//do something else
}

Мой пример основан на твиттере, вы должны адаптировать его к своим классам.

0 голосов
/ 14 февраля 2012

Вы можете создать новую цель сборки и установить компилятор, предварительно обрабатывающий макрос, например, NO_CLOUD, а затем использовать

#ifdef NO_CLOUD ... code here ...#else ... cloud code here ... #endif

0 голосов
/ 14 февраля 2012

Я думаю, что лучше вообще отключить функцию iCloud для сборок 4.3.Вы можете сделать это, проверив версию iOS во время выполнения.В вашем конкретном случае вы можете проверить наличие класса NSFileCoordinator с функцией NSClassFromString(), но я уверен, что в Интернете есть более приличные способы сделать это.

...