使用Xcode 6,我们可以创建自己的Dynamic Cocoa Frameworks.

因为:
模拟器仍然使用32-bit库
从2015年6月1日开始,提交到App Store的应用更新必须包含64位支持,并使用iOS 8 SDK(developer.apple.com)构建
我们必须使胖库在设备和模拟器上运行项目.即支持Frameworks中的32位和64位.
但我没有找到任何手册,如何导出通用胖框架以便将来与其他项目集成(并与某人共享此库).
设置ONLY_ACTIVE_ARCH=NO在Build Settings

支持添加armv7 armv7s arm64 i386 x86_64至Architectures(肯定)


但最终我仍然遇到在设备和模拟器上同时使用此框架运行项目的问题.
如果我从Debug-iphoneos文件夹中获取框架- 它适用于设备并在模拟器上获取错误:ld: symbol(s) not found for architecture i386
xcrun lipo -info CoreActionSheetPicker
Run Code Online (Sandbox Code Playgroud)
胖文件中的体系结构:CoreActionSheetPicker是:armv7 armv7s arm64
如果我从Debug-iphonesimulator文件夹中获取框架- 它适用于模拟器.我在设备上有错误:ld: symbol(s) not found for architecture arm64
xcrun lipo -info CoreActionSheetPicker
Run Code Online (Sandbox Code Playgroud)
胖文件中的体系结构:CoreActionSheetPicker是:i386 x86_64
这个答案与Xcode 6 iOS …
我正在尝试为iOS应用程序制作动态框架.感谢新版本的Xcode(6),我们可以在创建新项目时选择Cocoa Touch Framework,不再需要添加聚合目标,运行脚本等等.构建框架时我没有问题.但是当我尝试在iOS应用程序中使用它时,我遇到了一些架构问题.
ld: warning: ignoring file /Library/Frameworks/MyFramework.framework/MyFramework, file was built for x86_64 which is not the architecture being linked (arm64): /Library/Frameworks/MyFramework.framework/MyFramework
Undefined symbols for architecture arm64:
"_OBJC_CLASS_$_MyFrameworkWebService", referenced from:
objc-class-ref in AppDelegate.o
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
ld: warning: ignoring file /Library/Frameworks/MyFramework.framework/MyFramework, file was built for x86_64 which is not the architecture being linked (armv7): /Library/Frameworks/MyFramework.framework/MyFramework
Undefined symbols for architecture armv7:
"_OBJC_CLASS_$_MyFrameworkWebService", referenced …Run Code Online (Sandbox Code Playgroud) 这可能不仅限于iOS Universal Frameworks,而是所有xxx.framework文件.但是,我似乎无法找到有关如何在客户端应用程序中获取当前版本和构建框架的文档.在应用程序中,您可以使用以下内容:
NSString *name = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleDisplayName"];
NSString *build = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];
NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
Run Code Online (Sandbox Code Playgroud)
这将为您提供存储在应用程序的Info.plist中的当前信息.但是我们如何找到框架的信息.就我而言,特别是嵌入式框架.
过去一天一直在研究这个没有成功,希望有人可以提供一些关于这个的指针。
我继承了一个旧的 objC 静态库项目,我正在尝试将其转换为动态的通用框架。
为框架创建了一个新目标,编译无问题(经过一些构建设置调整后)创建一个新聚合,添加一个运行脚本阶段:
######################
# Options
######################
REVEAL_ARCHIVE_IN_FINDER=true
FRAMEWORK_NAME="MyUniversalFramework"
SIMULATOR_LIBRARY_PATH="${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${FRAMEWORK_NAME}.framework"
DEVICE_LIBRARY_PATH="${BUILD_DIR}/${CONFIGURATION}-iphoneos/${FRAMEWORK_NAME}.framework"
UNIVERSAL_LIBRARY_DIR="${BUILD_DIR}/${CONFIGURATION}-iphoneuniversal"
FRAMEWORK="${UNIVERSAL_LIBRARY_DIR}/${FRAMEWORK_NAME}.framework"
######################
# Build Frameworks
######################
xcodebuild -project ${FRAMEWORK_NAME}.xcodeproj -target "${PROJECT_NAME}" ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphoneos BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build
xcodebuild -project ${FRAMEWORK_NAME}.xcodeproj -target "${PROJECT_NAME}" -configuration ${CONFIGURATION} -sdk iphonesimulator ONLY_ACTIVE_ARCH=NO BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build
######################
# Create directory for universal
######################
rm -rf "${UNIVERSAL_LIBRARY_DIR}"
mkdir "${UNIVERSAL_LIBRARY_DIR}"
mkdir "${FRAMEWORK}"
######################
# Copy files Framework
######################
cp -R "${SIMULATOR_LIBRARY_PATH}" "${FRAMEWORK}"
cp -R "${DEVICE_LIBRARY_PATH}" "${FRAMEWORK}"
######################
# Make an …Run Code Online (Sandbox Code Playgroud) 我知道如何在Xcode 5中创建一个框架.但是在Xcode 6中如何结合模拟器框架和设备框架?当我尝试组合时,我得到代码签名错误.当我lipo用来组合两个框架时,我也会收到错误.
错误: Command /bin/sh failed with exit code 65
我正在开发一个依赖 Alamofire 的小型 Swift 框架。我将它用作属于同一工作区的应用程序的嵌入式框架,并且运行良好。
当我想构建一个具有聚合目标的通用框架时,问题就出现了。然后,在执行脚本以生成框架时,它失败并显示消息No such module 'Alamofire',指的import Alamofire是我的一个源文件中的 。
这是我的 Podfile:
platform :ios, '9.0'
use_frameworks!
inhibit_all_warnings!
target 'FSIBackend' do
pod 'SwiftLint'
pod 'Alamofire'
pod 'SwiftyJSON'
end
Run Code Online (Sandbox Code Playgroud)
这是生成框架的脚本。它适用于没有 Pods 依赖项的其他框架,所以我认为没问题:
set -e
# Setup
FRAMEWORK_NAME="${1}"
BUILD_DIR="${SRCROOT}/build"
OUTPUT_DIR="${HOME}/Desktop/"
OUTPUT="${OUTPUT_DIR}/${FRAMEWORK_NAME}.framework"
rm -rf "${BUILD_DIR}"
rm -rf "${OUTPUT}"
mkdir -p "${OUTPUT_DIR}"
# Build
xcodebuild -target "${FRAMEWORK_NAME}" -configuration Release -arch arm64 -arch armv7 -arch armv7s only_active_arch=no defines_module=yes -sdk "iphoneos"
xcodebuild -target "${FRAMEWORK_NAME}" -configuration Release -arch x86_64 -arch i386 only_active_arch=no defines_module=yes …Run Code Online (Sandbox Code Playgroud) 我的Xcode 9.x,我正在使用下面的脚本,效果很好:
######################
# Options
######################
REVEAL_ARCHIVE_IN_FINDER=false
FRAMEWORK_NAME="${PROJECT_NAME}"
SIMULATOR_LIBRARY_PATH="${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${FRAMEWORK_NAME}.framework"
DEVICE_LIBRARY_PATH="${BUILD_DIR}/${CONFIGURATION}-iphoneos/${FRAMEWORK_NAME}.framework"
UNIVERSAL_LIBRARY_DIR="${BUILD_DIR}/${CONFIGURATION}-iphoneuniversal"
FRAMEWORK="${UNIVERSAL_LIBRARY_DIR}/${FRAMEWORK_NAME}.framework"
######################
# Build Frameworks
######################
xcodebuild -project "${PROJECT_FILE_PATH}" -target "${TARGET_NAME}"
ONLY_ACTIVE_ARCH=NO -configuration "${CONFIGURATION}" -sdk iphonesimulator
BUILD_DIR="${BUILD_DIR}" OBJROOT="${OBJROOT}" BUILD_ROOT="${BUILD_ROOT}"
CONFIGURATION_BUILD_DIR="${IPHONE_SIMULATOR_BUILD_DIR}" SYMROOT="${SYMROOT}"
ARCHS="i386 x86_64" ENABLE_BITCODE=YES OTHER_CFLAGS="-fembed-bitcode" $ACTION 2>&1
xcodebuild -project "${PROJECT_FILE_PATH}" -target "${TARGET_NAME}"
ONLY_ACTIVE_ARCH=NO -configuration "${CONFIGURATION}" -sdk iphoneos
BUILD_DIR="${BUILD_DIR}" OBJROOT="${OBJROOT}" BUILD_ROOT="${BUILD_ROOT}"
CONFIGURATION_BUILD_DIR="${IPHONE_DEVICE_BUILD_DIR}" SYMROOT="${SYMROOT}"
ARCHS="armv7 armv7s arm64" ENABLE_BITCODE=YES OTHER_CFLAGS="-fembed-bitcode" $ACTION 2>&1
######################
# Create directory for universal
######################
rm -rf "${UNIVERSAL_LIBRARY_DIR}"
mkdir "${UNIVERSAL_LIBRARY_DIR}"
mkdir "${FRAMEWORK}"
######################
# Copy files Framework
###################### …Run Code Online (Sandbox Code Playgroud) ios ×6
frameworks ×3
cocoa-touch ×2
xcode ×2
cocoa ×1
cocoapods ×1
ios8 ×1
lipo ×1
objective-c ×1
swift ×1
xcode10 ×1
xcode6 ×1