iOS SDK封装Framework带资源文件封装(二)

简介: iOS SDK封装Framework带资源文件封装

五、引入第三方库


1、pod时候选择Framework文件


1.png


2、使用Framework文件的时候,同样需要引入所需的第三方库


六、Framework 的导出与文档


1、切换到 Release 模式


Product --> Edit Scheme --> Build Configuration

1.png


2、导出 Framework


(1)在 Target 为 MyFramework 下,选择模拟器和Generic iOS Device各自 Command + B 一次

(2)在工程目录 Products 下 -> 右击 Framework -> Show in Finder,会看到有两个文件夹,一个是真机包,一个是模拟器包。

真机包:Release-iphoneos

模拟机包:Release-iphonesimulator


查看包所支持框架:lipo -info 路径/MyFramework.framework/MyFramework

1.png

armv7 arm64 armv7s arm64e 说明是真机

i386 x86_64 说明是模拟机


(3)将合成的MyFramework 包替换其中的一个,然后这个 MyFramework.framework就是我们需要


合并:lipo -create 真机路径/MyFramework.framework/MyFramework 模拟器路径/MyFramework.framework/MyFramework -output 真机路径/MyFramework.framework/MyFramework


再次查看包支持框架:二者均在,说明合并成功

1.png


友情提示:实践证明弄模拟机的i386、x86_64没有什么用处,而且后面上传时候还会报错,让你剔除这两框架。


七、Bug总结


1、error: Invalid bitcode signature

clang: error: linker command failed with exit code 1 (use -v to see invocation)

1.png

原因:Deployment Target 版本低于Framework要求的最低版本

解决方案:修改 Deployment Target 版本


2、Could not load NIB in bundle


image.png

原因:加载NIB时候未找到文件

解决方案: Targets -> Build Phases -> Link Binary With Libraries、Copy Bundle Resources 处都加上引入的Framework文件

image.png


3、ld: symbol(s) not found for architecture x86_64


原因:Framework文件框架当中缺少x86_64,也就是模拟机框架


解决方案:本人出现原因是因为,我只合成了真机的Framework文件,所以在模拟机跑的时候报缺少框架,但是在真机上可以正常运行。


生成模拟机Framework文件和真机Framework文件,然后将两个文件合成。


4、ld: symbol(s) not found for architecture x86_64


clang: error: linker command failed with exit code 1 (use -v to see invocation)

1.png

原因:未引入所需的三方库

解决方案:pod 需要的三方库 从图可以看出缺少 MJRefresh 和 CHTCollectionViewWaterfallLayout


5、All object files and libraries for bitcode must be generated from Xcode Archive or Install build for architecture armv7


工程中引入的第三方静态库真机调试没有问题,打包的时候报错

1.png

原因:第三方库不兼容 XCode7later 之后默认开启 BitCode


解决方案:

第一种:更新Framework文件使包含 Bitcode(armv7)。

第二种:选择工程,在 Build Settings 中,把 ENABLE_BITCODE 设置为NO

1.png


6、Found an unexpected Mach-O header code: 0x72613c21


打好包之后上传时候出现错误!!!

第一种原因:Framework是一个Static Library,我把他添加在Embedded Binaries里面了。


解决方案:

第一种:从 Embedded Binaries(动态库里来文件)中删除静态Framework文件(KJFramework.framework)但是你直接删除会发现下面 Linked Frameworks and Libraries(签署了框架和库)中 Framework 文件也没了。这是需要重新往 Linked Frameworks and Libraries 里添加刚刚被删除的Framework文件。


第二种:重新将Framework文件封装成Dynamic Library(动态库),使用动态库要注意需要在 Linked Frameworks and Libraries 和 Embedded Binaries 都加入对应的动态库。


第二种原因:把Framework文件添加到了 Copy Bundle Resources当中

解决方案:从 Copy Bundle Resources 中将Framework文件删除,这是你可能会出现,加载不出来你封装在Framework文件当中的资源文件,因此你需要把资源文件单独提炼出来用 Bundle 来装。


7、dyld: Library not loaded: @rpath/KJFramework.framework/KJFramework


1.png

  • 原因:
  • 解决方案:此处加上Framework文件即可
  • 1.png

8、"Unsupported Architectures. The executable for yht.temp_caseinsensitive_rename.app/Frameworks/VideoCore.framework contains unsupported architectures '[x86_64, i386]'."


1.png

原因:说明自建的这个SDK里面包含了x86_64、i386 架构,当然这个AppStore是不允许的

解决方案:剔除掉x86_64, i386这两个架构

TARGETS -> Build Phases -> 点击加号选择 New Run Script Phase -> 然后复制粘贴下面代码

1.png

    APP_PATH="${TARGET_BUILD_DIR}/${WRAPPER_NAME}"  
    # This script loops through the frameworks embedded in the application and  
    # removes unused architectures.  
    find "$APP_PATH" -name '*.framework' -type d | while read -r FRAMEWORK  
    do  
    FRAMEWORK_EXECUTABLE_NAME=$(defaults read "$FRAMEWORK/Info.plist" CFBundleExecutable)  
    FRAMEWORK_EXECUTABLE_PATH="$FRAMEWORK/$FRAMEWORK_EXECUTABLE_NAME"  
    echo "Executable is $FRAMEWORK_EXECUTABLE_PATH"  
    EXTRACTED_ARCHS=()  
    for ARCH in $ARCHS  
    do  
    echo "Extracting $ARCH from $FRAMEWORK_EXECUTABLE_NAME"  
    lipo -extract "$ARCH" "$FRAMEWORK_EXECUTABLE_PATH" -o "$FRAMEWORK_EXECUTABLE_PATH-$ARCH"  
    EXTRACTED_ARCHS+=("$FRAMEWORK_EXECUTABLE_PATH-$ARCH")  
    done  
    echo "Merging extracted architectures: ${ARCHS}"  
    lipo -o "$FRAMEWORK_EXECUTABLE_PATH-merged" -create "${EXTRACTED_ARCHS[@]}"  
    rm "${EXTRACTED_ARCHS[@]}"  
    echo "Replacing original executable with thinned version"  
    rm "$FRAMEWORK_EXECUTABLE_PATH"  
    mv "$FRAMEWORK_EXECUTABLE_PATH-merged" "$FRAMEWORK_EXECUTABLE_PATH"  
    done  


相关文章
|
4月前
|
开发工具 iOS开发 计算机视觉
|
3月前
|
开发工具 iOS开发 容器
【Azure Blob】关闭Blob 匿名访问,iOS Objective-C SDK连接Storage Account报错
【Azure Blob】关闭Blob 匿名访问,iOS Objective-C SDK连接Storage Account报错
|
3月前
|
开发工具 图形学 iOS开发
Unity与IOS⭐Unity接入IOS SDK的流程图
Unity与IOS⭐Unity接入IOS SDK的流程图
|
4月前
|
SQL 分布式计算 大数据
MaxCompute产品使用合集之如何使用SDK获取ODPS上的资源文件
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
|
4月前
|
开发工具 iOS开发 容器
【Azure Blob】关闭Blob 匿名访问,iOS Objective-C SDK连接Storage Account报错
iOS Objective-C 应用连接Azure Storage时,若不关闭账号的匿名访问,程序能正常运行。但关闭匿名访问后,上传到容器时会出现错误:“Public access is not permitted”。解决方法是将创建容器时的公共访问类型从`AZSContainerPublicAccessTypeContainer`改为`AZSContainerPublicAccessTypeOff`,以确保通过授权请求访问。
【Azure Blob】关闭Blob 匿名访问,iOS Objective-C SDK连接Storage Account报错
|
3月前
|
JavaScript 前端开发 Java
[Android][Framework]系统jar包,sdk的制作及引用
[Android][Framework]系统jar包,sdk的制作及引用
77 0
|
3天前
|
Java Linux API
Android SDK
【10月更文挑战第21天】
17 1
|
13天前
|
程序员 开发工具 Android开发
Android|使用阿里云推流 SDK 实现双路推流不同画面
本文记录了一种使用没有原生支持多路推流的阿里云推流 Android SDK,实现同时推送两路不同画面的流的方法。
38 7
|
3月前
|
开发工具 Android开发
解决Android运行出现NDK at /Library/Android/sdk/ndk-bundle did not have a source.properties file
解决Android运行出现NDK at /Library/Android/sdk/ndk-bundle did not have a source.properties file
164 4
解决Android运行出现NDK at /Library/Android/sdk/ndk-bundle did not have a source.properties file
|
3月前
|
Dart 开发工具 Android开发
Android Studio导入Flutter项目提示Dart SDK is not configured
Android Studio导入Flutter项目提示Dart SDK is not configured
265 4