Отключить битовый код для зависимостей проекта и cocoapods с Xcode 7?

Как вы можете отключить биткод для ваших проектов и зависимостей cocoapod? Вот ошибка, которую я получаю при попытке запустить проект с помощью Xcode 7.

не содержит биткода. Вы должны перестроить его с включенным битовым кодом (параметр Xcode ENABLE_BITCODE), получить обновленную библиотеку от поставщика или отключить биткод для этой цели. для архитектуры arm64

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

Ответ 1

Чтобы установить этот параметр таким образом, чтобы он не переопределялся каждый раз, когда вы делаете pod install, вы можете добавить его в свой 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

Ответ 2

Существует способ создания целей CocoaPods с полным битовым кодом. Просто добавьте опцию -fembed-bitcode в OTHER_CFLAGS для каждого:

post_install do |installer|
  installer.pods_project.targets.each do |target|
    target.build_configurations.each do |config|
      cflags = config.build_settings['OTHER_CFLAGS'] || ['$(inherited)']
      cflags << '-fembed-bitcode'
      config.build_settings['OTHER_CFLAGS'] = cflags
    end
  end
end

Я думаю, что этот способ лучше, чем отключение битового кода.

Ответ 3

project 'frameworkTest.xcodeproj'

# Uncomment this line to define a global platform for your project
platform :ios, '8.0'

target 'frameworkTest' do
  # Uncomment this line if you're using Swift or would like to use dynamic frameworks
  # use_frameworks!

  # Pods for frameworkTest
  source 'https://github.com/CocoaPods/Specs.git' 


#zip files libs
  pod 'SSZipArchive'

#reachability 
  pod 'Reachability'

end

#bitcode enable
post_install do |installer|
  installer.pods_project.targets.each do |target|
    target.build_configurations.each do |config|

      # set valid architecture
      config.build_settings['VALID_ARCHS'] = 'arm64 armv7 armv7s i386 x86_64'

      # build active architecture only (Debug build all)
      config.build_settings['ONLY_ACTIVE_ARCH'] = 'NO'

      config.build_settings['ENABLE_BITCODE'] = 'YES'

      if config.name == 'Release' || config.name == 'Pro'
          config.build_settings['BITCODE_GENERATION_MODE'] = 'bitcode'
      else # Debug
          config.build_settings['BITCODE_GENERATION_MODE'] = 'marker'
      end

      cflags = config.build_settings['OTHER_CFLAGS'] || ['$(inherited)']

      if config.name == 'Release' || config.name == 'Pro'
          cflags << '-fembed-bitcode'
      else # Debug
          cflags << '-fembed-bitcode-marker'
      end      

      config.build_settings['OTHER_CFLAGS'] = cflags
    end
  end
end

Ответ 4

Перейдите к настройкам сборки для цели, которую вы хотите отключить. Найдите что-то, что говорит "Включить биткод", установите его на Нет.

Ответ 5

Отключение биткода в основном проекте и модулях

Другие ответы не в состоянии очистить флаг битового кода для основного проекта. Перехваты после установки Cocoapod не дают вам доступа к основному проекту, я считаю, что это выбор дизайна, поэтому вам нужно найти файл проекта и изменить его с помощью xcodeproj. Если бинарная библиотека содержит битовый код, вам нужно будет использовать xcrun bitcode_strip чтобы удалить битовый код для обеспечения согласованности проекта.

Две вспомогательные функции

def disable_bitcode_for_target(target)
    target.build_configurations.each do |config|
      config.build_settings['ENABLE_BITCODE'] = 'NO'

      remove_cflags_matching(config.build_settings, ['-fembed-bitcode', '-fembed-bitcode-marker'])
    end
end

def remove_cflags_matching(build_settings, cflags)
  existing_cflags = build_settings['OTHER_CFLAGS']

  removed_cflags = []
  if !existing_cflags.nil?
    cflags.each do |cflag|
      existing_cflags.delete_if { |existing_cflag| existing_cflag == cflag && removed_cflags << cflag }
    end
  end

  if removed_cflags.length > 0
    build_settings['OTHER_CFLAGS'] = existing_cflags
  end
end

Фаза после установки

post_install do |installer|    
  project_name = Dir.glob("*.xcodeproj").first
  project = Xcodeproj::Project.open(project_name)
  project.targets.each do |target|
    disable_bitcode_for_target(target)
  end
  project.save

  installer.pods_project.targets.each do |target|
    disable_bitcode_for_target(target)
  end

  installer.pods_project.save
end

Ответ 6

Чтобы отключить битовый код для вашего собственного модуля разработки, добавьте только следующий код в файл проекта.

post_install do |installer|
    installer.pods_project.targets.each do |target|
        if target.name == "YOUR SDK TARGET NAME"
            puts "Processing for disable bit code in YOUR SDK TARGET NAME SDK"
            target.build_configurations.each do |config|
                config.build_settings['ENABLE_BITCODE'] = 'NO'
            end
        end
    end
end

Ответ 7

Обновление для cocoapods 1. 7+, если вы включили множественную генерацию xcodeproj:

install! 'cocoapods', :generate_multiple_pod_projects => true

<Pod list section>

post_install do |installer|
    installer.pod_target_subprojects.each do |subproject|
        subproject.targets.each do |target|
            target.build_configurations.each do |config|
                config.build_settings['ENABLE_BITCODE'] = 'NO'
            end
        end
    end
end