iOS Pod导入的库资源文件加载

iOS Pod导入的库资源文件加载,第1张

正常情况下我们加载根目录下添加的资源文件调用mainBundle即可

[[NSBundle mainBundle] pathForResource:<#(nullable NSString *)#>ofType:<#(nullable NSString *)#>]

调试窗口获取到的路径: po [NSBundle mainBundle]

/Users/user/Library/Developer/CoreSimulator/Devices/3DE5B5B5-2418-4344-BD9B-9513A7793785/data/Containers/Bundle/Application/E8E42082-402F-403D-BDCA-B9AFC786E82A/Object-C.app/

在 CocoaPods 0.36 之后,由于 iOS 8 Dynamic Frameworks 特性的引入,CocoaPods 能打包 framework了。0.36 版的 release note很详细地说明了加入 framework 特性所带来的变化。一个显著区别就是当你的 pod 库以 framework 形式被使用时,你的资源不是被拷贝到 mainBundle 下,而是被放到 pod 的最终产物—— framework里。此时,你必须保证自己在访问这个 framework 的 bundle,而不是根目录的。 [NSBundle bundleForClass:<#ClassFromPodspec#>]

我在使用pod导入第三方库 PinYin4Objc 时发现的问题,总是获取不到编码文件

需要用到如下方法:

NSString *path = [[NSBundle bundleForClass:[self class]] pathForResource:@"unicode_to_hanyu_pinyin" ofType:@"txt"]

替换 ChineseToPinyinResource 文件中 - (void)initializeResource 方法中resourceName的获取方式

路径:

/Users/user/Library/Developer/CoreSimulator/Devices/3DE5B5B5-2418-4344-BD9B-9513A7793785/data/Containers/Bundle/Application/E8E42082-402F-403D-BDCA-B9AFC786E82A/Object-C.app/Frameworks/PinYin4Objc.framework/unicode_to_hanyu_pinyin.txt

这是路径就会到framework下

用方法 NSLocalizedStringFromTableInBundle(<#key#>, <#tbl#>, <#bundle#>, <#comment#>) 代替NSLocalizedString(key, comment)

bundle传当前framework目录

两个project:

dym ->dym.framework

hello ->hello.app

hello.app动态链接dym.framework

关于动态链接的xcode设置有以下几个变量:

@rpath

hello项目中,Run Path search paths的值,基本格式如下:

//:configuration = Debug

LD_RUNPATH_SEARCH_PATHS = $(inherited) @loader_path/Frameworks @executable_path/Frameworks

//:configuration = Release

LD_RUNPATH_SEARCH_PATHS = $(inherited) @loader_path/Frameworks @executable_path/Frameworks

@loader_path

根据apple doc的解析,是使用加载共享库的二进制文件所在的目录

比如, hello.app/hello会加载dym.framework/dym,则@loader_path指向hello.app目录

@executable_path

根据app包中的可执行文件所在的目录;

dym项目需要设置:

Dynamic Library Install Name Base: @rpath

这样, Dynamic Library install Name, 默认设置

$(DYLIB_INSTALL_NAME_BASE:standardizepath)/$(EXECUTABLE_PATH)

就会显示成

@rpath/dym.framework/dym

那么,编译生成的动态库文件中,会保存对应的install name信息

hello项目的设置,只需要设置Run Path search paths即可, 编译完成后,会将path参数的信息保存到hello的目标文件的RPATH中, 程序运行的时候,会在RPATH指定的路径下,查找动态库的install name关于rpath在编译器中是怎么生成的,可以参考这里。

使用dlopen打开的时候,会根据@rapth指定的路径,查找动态库, 使用以下格式就可以打开:

dlopen(“./dym.framework/dym”, RTLD_LAZY)

在Package Explorer顶部的右侧有有机表图标按钮,点击倒三角Top Level Elements->Working Set。此时就会发现,很多项目会自动纳入一个文件夹,这个文件夹的名字叫做other Projects,这是默认的如果想自己建立自己的文件夹,点击倒三角,Configure Working Set,会出现d框。出现d框后,点击New按钮,就可以创建文件夹。在此界面,双击某一文件夹,就会进入编辑界面,可以修改文件夹名称,也可以选择将那个项目放置到该目录下。想删除,就选择remove。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/bake/11637248.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-17
下一篇2023-05-17

发表评论

登录后才能评论

评论列表(0条)

    保存