Приложение iphone iCloud аварийно завершает работу при компиляции на iOS 4

Я хотел бы использовать iCloud, но когда я компилирую приложение на симуляторе iOS 4.3, оно вылетает.

dyld: символ не найден: _OBJC_CLASS_$_NSMetadataQuery

Что мне сделать, чтобы он работал на iOS 3, 4 и 5?


person Bartosz Bialecki    schedule 20.10.2011    source источник


Ответы (3)


Этот API был запущен с ios5, поэтому вы не можете запустить его на симуляторе 4 или ниже, но для публикации вы можете установить минимальную цель развертывания семейства ios, которое оно должно поддерживать.

person B25Dec    schedule 20.10.2011
comment
У меня есть цель развертывания iOS, установленная на 3.0. - person Bartosz Bialecki; 20.10.2011
comment
тогда это создаст проблему, пока вы не опубликуете ее в магазине приложений, это цель развертывания магазина приложений, а не цель тестирования разработки. - person B25Dec; 20.10.2011
comment
поэтому я не могу протестировать приложение на устройстве с iOS 4? - person Bartosz Bialecki; 20.10.2011
comment
нет, вы можете разработать приложение только для ios 5 и установить цель развертывания для более низкой ОС. Apple несет ответственность за поддержку этого средства на этих устройствах после запуска в магазине приложений. - person B25Dec; 20.10.2011
comment
ок, спасибо, надеюсь, когда я отправлю приложение в AppStore, пользователи с IOS 3 и 4 смогут его установить :) - person Bartosz Bialecki; 20.10.2011
comment
нет, просто установите SDK для развертывания и базовый SDK (как правило, это обновленный), приложение укажет, на что оно может устанавливать и поддерживать ОС, по ссылкам itunes. - person B25Dec; 20.10.2011
comment
Хотя вы говорите, что NSClassFromString не работает для вас, все же обязательно проверьте, что доступно на телефоне пользователя. Если вы этого не сделаете, у вас будут проблемы с пользователем ниже iOS 5.0. - person huesforalice; 20.10.2011
comment
Я не согласен с Баллу здесь. Вы можете установить симулятор iOS 4, а затем запустить там свое приложение. Если не запускается - это ваши проблемы, а не яблоки. Когда вы устанавливаете минимальную цель развертывания IOS на что-либо, кроме «последней версии iOS», вам нужно быть опытным разработчиком, чтобы заставить его работать на более старых версиях iOS. - person Tom Andersen; 21.10.2011
comment
Большинство приложений не смогут работать с SDK, установленным на iOS 5, на устройстве iOS 3. Просто слишком много различий. - person Tom Andersen; 21.10.2011
comment
Хорошо, Том, добавьте icloud api из ios 5 в свой xcode 4.2, а затем запустите его на ОС ниже, чем 4.2, вы получите результат, возможно, вы можете получить ошибку времени компиляции, все зависит от того, какую структуру вы используете и была ли она доступна в последней ОС. Но если вы создаете приложение на обновленном SDK и устанавливаете цель развертывания, то в документации Apple говорится, что оно будет установлено на ОС, указанной в plist приложения во время отправки в магазин приложений. Пожалуйста, проверьте это iphonedevelopertips.com/xcode/ - person B25Dec; 21.10.2011
comment
Определенно можно получить условный доступ к этому API, продолжая работать без него в более старых средах выполнения. Подробности смотрите в ответе NguyenHungA5. Вам нужно динамически загружать класс, но он отлично работает. Также можно выбрать iOS 6 (и более поздние версии...) в качестве целевого SDK с минимальной целью развертывания 3.1.3. Единственная сложность заключается в том, что вам нужно использовать более старый Xcode (4.4.1) для создания двоичного файла, совместимого со старыми устройствами. - person pendor; 10.09.2013

мое мнение:

Где изменить NSMetadataQuery на id: ex

нормальный: - (void) loadData: (NSMetadataQuery *) запрос; изменить на: - (void) loadData: (id) запрос;

обычный: @property (сохранить, неатомарный) NSMetadataQuery *query; изменить на: @property (сохранить, неатомарный) запрос идентификатора;

и проверьте наличие iCloud:

if ([[NSFileManager defaultManager] respondsToSelector:@selector(URLForUbiquityContainerIdentifier:)]) {
        NSURL *ubiq = [[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:nil];
        if (ubiq) {
            // Code for access iCloud here
        }
    }

При использовании NSMetadataQuery:

id _query = [[NSClassFromString(@"NSMetadataQuery") alloc] init];
// Some code here
[_query startQuery];

Получайте удовольствие (^_^)

person NguyenHungA5    schedule 08.12.2011
comment
Важной частью здесь является [[NSClassFromString(@"NSMetadataQuery") alloc] init]. Вы не можете использовать [NSMetadataQuery alloc]. - person kurtzmarc; 05.08.2012

Обычный способ — скомпилировать его с iOS 5 SDK и установить в качестве цели развертывания самую старую версию iOS, с которой вы хотите, чтобы она работала. Однако вам решать во время выполнения проверять, какие классы и методы доступны для текущей системы. Например, пользователь iOS 4 не сможет использовать функции, которые поставляются только с iOS 5.

Чтобы проверить наличие классов, выполните:

if ( NSClassFromString(@"NSMetadataQuery") != nil ) {
  //do stuff with NSMetadataQuery here
}

Для проверки доступности методов выполните:

if ( [myObject respondsToSelector:@selector(doSomething)] ) {
  //call doSomething on myObject
}
person huesforalice    schedule 20.10.2011
comment
Я использовал NSClassFromString, но это не помогло. Я получаю ту же ошибку. - person Bartosz Bialecki; 20.10.2011
comment
Я бы не стал заморачиваться ни с чем, кроме iOS 4.3 и iOS 5. Есть так много вещей, которых нет в 3. Также люди, которые покупают вещи в магазине приложений, вероятно, имеют обновленные телефоны. - person Tom Andersen; 21.10.2011
comment
Этот пост полезен для того, чтобы показать, как пользовательские версии разбиваются на Instapaper, популярное приложение marco.org/2011/11/30/. Краткая версия - не делайте только iOS5, если вам это не нужно, но только iOS4 и выше - это нормально. - person Peter Johnson; 13.12.2011