Как построить cocoa сенсорную структуру для всех архитектур, зависящих от других фреймворков, добавленных с использованием cocoapods?

88
8

Я хочу создать частный cocoapod исходной структуры, созданной как для симуляторов, так и для устройств.


Я создал структуру Cocoa touch, в которой я интегрировал CocoaLumberjack с использованием Cocoapods.
Я хочу построить структуру для всех возможных архитектур (симулятор, а также устройство).


По умолчанию параметр сборки


 'Build Active Architectures Only' is set to (Debug - Yes, Release - No).

Как только я установил этот параметр для отладки в No, сборка завершится неудачей со следующей ошибкой компоновщика:


Undefined symbols for architecture i386:
"_OBJC_CLASS_$_DDASLLogger", referenced from:
objc-class-ref in MyManager.o
"_OBJC_CLASS_$_DDLog", referenced from:
objc-class-ref in MyManager.o
"_OBJC_CLASS_$_DDTTYLogger", referenced from:
objc-class-ref in MyManager.o
ld: symbol(s) not found for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)

Я понимаю, что CocoaLumberjack доступен только для активных архитектур в отладочной версии.


Итак, я возвращаю встроенные активные архитектуры для отладки в Да и успешно создаю фреймворк.


Чтобы создать фреймворк для всех архитектур, я использую запуск script, добавленный в фазах Build, который также утверждает, что объединить ios-device и ios-simulator в один. Вот script:


    set -e
set +u
# Avoid recursively calling this script.
if [[ $SF_MASTER_SCRIPT_RUNNING ]]
then
exit 0
fi
set -u
export SF_MASTER_SCRIPT_RUNNING=1

# Constants
SF_TARGET_NAME=${PROJECT_NAME}
UNIVERSAL_OUTPUTFOLDER=${BUILD_DIR}/${CONFIGURATION}-universal

# Take build target
if [[ "$SDK_NAME" =~ ([A-Za-z]+) ]]
then
SF_SDK_PLATFORM=${BASH_REMATCH[1]}
else
echo "Could not find platform name from SDK_NAME: $SDK_NAME"
exit 1
fi

if [[ "$SF_SDK_PLATFORM" = "iphoneos" ]]
then
echo "Please choose iPhone simulator as the build target."
exit 1
fi

IPHONE_DEVICE_BUILD_DIR=${BUILD_DIR}/${CONFIGURATION}-iphoneos

# Build the other (non-simulator) platform
xcodebuild -project "${PROJECT_FILE_PATH}" -target "${TARGET_NAME}" -configuration "${CONFIGURATION}" -sdk iphoneos BUILD_DIR="${BUILD_DIR}" OBJROOT="${OBJROOT}" BUILD_ROOT="${BUILD_ROOT}" CONFIGURATION_BUILD_DIR="${IPHONE_DEVICE_BUILD_DIR}/arm64" SYMROOT="${SYMROOT}" ARCHS='arm64' VALID_ARCHS='arm64' $ACTION

xcodebuild -project "${PROJECT_FILE_PATH}" -target "${TARGET_NAME}" -configuration "${CONFIGURATION}" -sdk iphoneos BUILD_DIR="${BUILD_DIR}" OBJROOT="${OBJROOT}" BUILD_ROOT="${BUILD_ROOT}" CONFIGURATION_BUILD_DIR="${IPHONE_DEVICE_BUILD_DIR}/armv7" SYMROOT="${SYMROOT}" ARCHS='armv7 armv7s' VALID_ARCHS='armv7 armv7s' $ACTION

# Copy the framework structure to the universal folder (clean it first)
rm -rf "${UNIVERSAL_OUTPUTFOLDER}"
mkdir -p "${UNIVERSAL_OUTPUTFOLDER}"
cp -R "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework" "${UNIVERSAL_OUTPUTFOLDER}/${PROJECT_NAME}.framework"

# Smash them together to combine all architectures
lipo -create "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework/${PROJECT_NAME}" "${BUILD_DIR}/${CONFIGURATION}-iphoneos/arm64/${PROJECT_NAME}.framework/${PROJECT_NAME}" "${BUILD_DIR}/${CONFIGURATION}-iphoneos/armv7/${PROJECT_NAME}.framework/${PROJECT_NAME}" -output "${UNIVERSAL_OUTPUTFOLDER}/${PROJECT_NAME}.framework/${PROJECT_NAME}"


Я проверяю флажок "Запускать script только при установке", который находится ниже пробега script. Теперь я создаю структуру для универсального устройства iOS.
Теперь я нажимаю на группу Products, присутствующую в иерархии Project, и выбираю файл MyFramework.framework, щелкните правой кнопкой мыши и выберите show in finder. Он открывает библиотеку ~/Library/Developer/Xcode/DerivedData/MyFramework-dlpsipmxkqmemwgqrfeovlzgyhca/Build/Products/Debug-iphoneos/MyFramework.framework в finder.


Now, I create a new tag 'MyFramework-v0.0.1' containing the commit where I added MyFramework.framework file. 

Я перехожу к ~/.cocoapods/repos/MyRepoName/и создаю файл подкачки MyFramework.podspec следующим образом:


Pod::Spec.new do |s|
s.name = "MyFramework"
s.version = "0.0.1"
s.summary = "A pod for MyFramework"
s.description = "A pod designed for MyFramework"

s.homepage = "My_Private_Repo_Path"
s.license = { :type => "MIT", :file => "FILE_LICENSE" }
s.authors = { "My_Username" => "my_email_address"
}
s.platform = :ios, "8.0"
s.ios.deployment_target = "8.0"

s.source = { :git => "My_Private_Repo_Path", :tag => 'MyFramework-v'+String(s.version) }

s.requires_arc = true
s.vendored_frameworks = "MyFramework.framework"
s.dependency "CocoaLumberjack"
end


Теперь, когда я запускаю в терминале следующую команду:


pod repo push MyRepoName MyFramework.podspec

Я получаю следующую ошибку:


Validating spec
-> MyFramework (0.0.1)
- ERROR | [iOS] xcodebuild: Returned an unsuccessful exit code. You can use ` --verbose` for more information.
- NOTE | [iOS] xcodebuild: ld: warning: ignoring file MyFramework/MyFramework.framework/MyFramework, missing required architecture i386 in file MyFramework/MyFramework.framework/MyFramework (2 slices)
- NOTE | [iOS] xcodebuild: ld: warning: ignoring file MyFramework/MyFramework.framework/MyFramework, missing required architecture x86_64 in file MyFramework/MyFramework.framework/MyFramework (2 slices)
- NOTE | [iOS] xcodebuild: fatal error: lipo: -remove specified would result in an empty fat file

[!] The `MyFramework.podspec` specification does not validate.


Как построить Cocoa сенсорную структуру для всех устройств и симуляторов, которая зависит от другой структуры (CocoaLumberjack), добавленной с использованием cocoapods? Мне нужно создать частный модуль выходной структуры.

спросил(а) 2021-01-25T18:12:38+03:00 4 месяца, 4 недели назад
1
Решение
186

Итак, в основном я узнал, что мне просто нужно выполнить эти простые шаги.


1. Create a cocoa touch framework.
2. Set bitcode enabled to No.
3. Select your target and choose edit schemes. Select Run and choose Release from Info tab.
4. No other setting required.
5. Now build the framework for any simulator as simulator runs on x86 architecture.
6. Click on Products group in Project Navigator and find the .framework file.
7. Right click on it and click on Show in finder. Copy and paste it in any folder, I personally prefer the name 'simulator'.
8. Now build the framework for Generic iOS Device and follow the steps 6 through
9. Just rename the folder to 'device' instead of 'simulator'.
10. Copy the device .framework file and paste in any other directory. I prefer the immediate super directory of both.

Итак, структура каталога теперь становится:


 - Desktop
- device
- MyFramework.framework
- simulator
- MyFramework.framework
- MyFramework.framework

Теперь откройте терминал и компакт-диск на рабочем столе. Теперь начните вводить следующую команду:


lipo -create 'device/MyFramework.framework/MyFramework' 'simulator/MyFramework.framework/MyFramework' -output 'MyFramework.framework/MyFramework'

и что он. Здесь мы объединяем симулятор и версию устройства двоичного файла MyFramework, присутствующего в MyFramework.framework. Мы получаем универсальную структуру, которая строит для всех архитектур, включая симулятор и устройство.


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

ответил(а) 2021-01-25T18:12:38+03:00 4 месяца, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема