Новые предупреждения в iOS 9: «весь битовый код будет сброшен»

387

В моем приложении появилось новое предупреждение о Google Framework:

(null): СРОЧНО: весь битовый код будет удален, потому что '/ Users / myname / Library / Mobile Documents / com ~ apple ~ CloudDocs / имя_файла / appname / GoogleMobileAds.framework / GoogleMobileAds (GADSlot + AdEvents.o)' был создан без битового кода , Необходимо перестроить его с включенным битовым кодом (настройка Xcode ENABLE_BITCODE), получить обновленную библиотеку от поставщика или отключить битовый код для этой цели. Примечание. В будущем это будет ошибкой.

Xcode 7 дает мне около 204 предупреждений об этой же концепции, и я не мог обойтись с этим. Также у меня проблема с доступом к сети из моего приложения. Это ошибка из области отладки:

-canOpenURL: сбой для URL: "kindle: // home" - ошибка: "Это приложение не может запрашивать схему kindle"

Все эти проблемы отсутствовали в iOS 8.

C.Farrugia
источник
Итак, вы включили битовый код в своей цели XCode?
Дроппи
Извините, я новичок в этом, вы можете сказать мне, как пожалуйста?
C.Farrugia
Я никогда этого не делал, но похоже, что это то, что вы должны установить намеренно. Вы, кажется, сделали это.
Дроппи
4
@ Droppy AFAIK настройка включена по умолчанию, но вы можете отключить ее в любое время в настройках вашего проекта.
ИМЕЕТ
Я выключил их, и все предупреждения ушли. Я немного исследовал, и Google нужно обновить свою структуру, чтобы эта ошибка была отключена, до сих пор просто выключение не будет работать. Кто-нибудь знает о -canOpenURL: сбой для URL: "kindle: // home" - ошибка: "Это приложение не имеет права запрашивать схему kindle"? Это я понятия не имею, о чем говорит Xcode
C.Farrugia

Ответы:

1023

Ваша библиотека была скомпилирована без битового кода, но опция битового кода включена в настройках вашего проекта. Скажем , NOчтобы Enable Bitcodeв ваших целевых параметрах сборки и библиотека параметров сборки , чтобы удалить предупреждения.

Для тех, кто интересуется, требуется ли включение биткода:

Для приложений iOS битовый код используется по умолчанию, но не является обязательным. Для приложений watchOS и tvOS требуется битовый код. Если вы предоставляете битовый код, все приложения и платформы в комплекте приложений (все цели в проекте) должны включать битовый код.

https://help.apple.com/xcode/mac/current/#/devbbdc5ce4f

Зия
источник
@Centurion предыдущая библиотека Google Analytics устарела и не компилируется с xcode 7 / ios9
zonabi
1
@goelv да, вы должны иметь возможность отправлять приложения с отключенным битовым кодом. это необязательно прямо сейчас. это может потребоваться в будущем.
Зонаби
2
У меня НЕ работает архивация. До XCODE 7 проект работал нормально, теперь не может АРХИВИТЬ, даже если Enable Bitcode имеет значение NO. Это для библиотеки AWS.
ort11
1
Все еще получаю ошибку после отключения Биткода на всех целях.
datWooWoo
110

После Xcode 7 опция битового кода будет включена по умолчанию. Если ваша библиотека была скомпилирована без битового кода, но опция битового кода включена в настройках вашего проекта, вы можете:

  1. Обновите свою библиотеку с помощью битового кода,
  2. Скажите «НЕТ», чтобы включить биткод в настройках вашей цели

Введите описание изображения здесь

И настройки сборки библиотеки для удаления предупреждений.

Для получения дополнительной информации, перейдите к документации битового кода в библиотеке разработчика .

И WWDC 2015 Сессия 102: «Платформа Государство Союза»

Введите описание изображения здесь

ElonChan
источник
42

В моем случае, чтобы избежать этой проблемы:

  1. Убедитесь, что вы имеете дело с Xcode 7 , а не с более низкими версиями. В более низкой версии этот флаг не существует.

  2. Настройка: Проект> Настройки сборки> Все> Параметры сборки> Включить битовый код = НЕТ

введите описание изображения здесь

Хавьер Калатрава Ллаверия
источник
2
Итак, вам придется перекомпилировать библиотеки, включенные в ваш проект, с XCode7 и с EnableBitcode, установленным в YES. Довольно сложно, если вы работаете со сторонними библиотекарями .a.
Хавьер Калатрава Llavería
15

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

Это дает все записи журнала, как

-canOpenURL: сбой для URL: "kindle: // home" - ошибка: "Это приложение не может запрашивать схему kindle"

Поставщики должны обновить свою логику для этого.

Если вам нужно запросить установленные приложения / доступные схемы, вам нужно добавить их в свой info.plistфайл.

Добавьте ключ 'LSApplicationQueriesSchemes' в ваш список в виде массива. Затем добавьте строки в этот массив как «kindle».

Конечно, на самом деле это не вариант для рекламных баннеров (поскольку они динамические), но вы все равно можете запрашивать свои собственные приложения или другие приложения, такие как Twitter и Facebook.

Документация о canOpenUrl: метод canOpenUrl:

Документация о ключе LSApplicationQueriesSchemes

Сарен Инден
источник
Предполагается, что статическая библиотека будет проверять Deeplink родительского приложения, как использовать исключение «LSApplicationQueriesSchemes» в статической библиотеке? Обычно у вас нет Info.plist для этого.
Лоретопариси
Я не совсем уверен в этом, если библиотеке нужно проверять приложения вне своего родителя, родитель должен определить URL-адреса в своем info.plist (так, документируйте это для фреймворка). Если canOpenUrl также возвращает no, если родительское приложение сможет с этим справиться, то вы должны (я полагаю) также включить их в info.plist
Saren Inden,
13

Если вы используете CocoaPods и хотите отключить битовый код для всех библиотек, используйте следующую команду в Podfile

post_install do |installer|
    installer.pods_project.targets.each do |target|
        target.build_configurations.each do |config|
            config.build_settings['ENABLE_BITCODE'] = 'NO'
        end
    end
end
Эйке
источник
8

Отказ от ответственности: это предназначено для тех, кто поддерживает непрерывный рабочий процесс интеграции, которые требуют автоматизированного процесса. Если вы этого не сделаете, пожалуйста, используйте Xcode, как описано в ответе Хавьера .

Это сработало для меня, чтобы установить ENABLE_BITCODE = NOчерез командную строку:

find . -name *project.pbxproj | xargs sed -i -e 's/\(GCC_VERSION = "";\)/\1\ ENABLE_BITCODE = NO;/g'

Обратите внимание, что это может быть нестабильным в разных версиях Xcode. Он был протестирован с Xcode 7.0.1 и как часть проекта Cordova 4.0.

miraculixx
источник
-2

Эта проблема была недавно исправлена ​​(ноябрь 2010 г.) компанией Google, см. Https://code.google.com/p/analytics-issues/issues/detail?id=671 . Но имейте в виду, что в качестве исправления это приносит больше ошибок :)

Вы также должны будете следовать методу инициализации, указанному здесь: https://developers.google.com/analytics/devguides/collection/ios/v2 .

Последние инструкции приведут вас к головной боли, потому что они ссылаются на утилиты, не включенные в модуль. Ниже не получится с Cocoapod

// Configure tracker from GoogleService-Info.plist.
NSError *configureError;
[[GGLContext sharedInstance] configureWithError:&configureError];
NSAssert(!configureError, @"Error configuring Google services: %@", configureError);
user1119517
источник