制作 iOS framework 静态库的一些总结

制作步骤

这部分资料很多,这里就不再赘述。

参考资料:

Xcode10制作 framework详细步骤及坑说明

iOS 制作 framework

iOS静态库 【.a 和framework】【超详细】

要点

  1. 如果需要调用 framework 中的分类(category)方法,需要在使用静态库的工程中配置 other linker flags 为 -Objc

  2. 默认 framework 是动态库,制作静态库需要设置 Mach-O Type 为 Static Library

  3. 想要在 framework 进行断点调试,可以在 framework 工程中创建一个新的 Target -> Single View

  4. 需要选择正确的指令集,真机 arm64,模拟器 x86_64

  5. 每一个需要暴露的 class 都需要在 Target Membership 中设置为 Public

  6. 工程中要使用 framework 中的资源,需要在工程中的 Build Phases -> Copy Bundle Resources 中添加 framework

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    - (UIImage *)downloadImage {

        NSBundle *bundle = [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:@"DownloadAndPrint" ofType:@"framework"]];
        
        NSString* imagesPath = [bundle.resourcePath stringByAppendingPathComponent:@"images"];
        
        NSLog(@"imagesPath:\%@", imagesPath);
        
        NSBundle* imageBundle = [NSBundle bundleWithPath:imagesPath];
        
        return  [UIImage imageNamed:@"test" inBundle:imageBundle compatibleWithTraitCollection:nil];
        
        }

iOS framework 合并和拆分多种架构

参考资料:

iOS静态库支持架构查看、分离、合并

合并生成模拟器和真机通用的framework

合并:

Target -> Build Settings -> Build Active Architecture Only(是否只编译当前架构) -> Debug 改为 NO(改为 NO,模拟器可以直接合成两种架构)

1
➜  ~ lipo -create /Users/acan/Library/Developer/Xcode/DerivedData/AFNTestFrameworking-dbzgzczpzorkzxakdyptgdkckcee/Build/Products/Debug-iphonesimulator/AFNTestFrameworking.framework/AFNTestFrameworking /Users/acan/Library/Developer/Xcode/DerivedData/AFNTestFrameworking-dbzgzczpzorkzxakdyptgdkckcee/Build/Products/Debug-iphoneos/AFNTestFrameworking.framework/AFNTestFrameworking -output /Users/acan/Library/Developer/Xcode/DerivedData/AFNTestFrameworking-dbzgzczpzorkzxakdyptgdkckcee/Build/Products/Debug-iphonesimulator/AFNTestFrameworking.framework/AFNAllFramework

查看:

1
2
3
➜  ~ lipo -info /Users/acan/Library/Developer/Xcode/DerivedData/AFNTestFrameworking-dbzgzczpzorkzxakdyptgdkckcee/Build/Products/Debug-iphonesimulator/AFNTestFrameworking.framework/AFNAllFramework
    
Architectures in the fat file: /Users/acan/Library/Developer/Xcode/DerivedData/AFNTestFrameworking-dbzgzczpzorkzxakdyptgdkckcee/Build/Products/Debug-iphonesimulator/AFNTestFrameworking.framework/AFNAllFramework are: i386 armv7 x86_64 arm64

拆分:

1
➜  ~ lipo /Users/acan/Library/Developer/Xcode/DerivedData/AFNTestFrameworking-dbzgzczpzorkzxakdyptgdkckcee/Build/Products/Debug-iphonesimulator/AFNTestFrameworking.framework/AFNTestFrameworking -thin x86_64 -output /Users/acan/Library/Developer/Xcode/DerivedData/AFNTestFrameworking-dbzgzczpzorkzxakdyptgdkckcee/Build/Products/Debug-iphonesimulator/AFNTestFrameworking.framework/AFNSingleFrameworking

查看

1
Non-fat file: /Users/acan/Library/Developer/Xcode/DerivedData/AFNTestFrameworking-dbzgzczpzorkzxakdyptgdkckcee/Build/Products/Debug-iphonesimulator/AFNTestFrameworking.framework/AFNSingleFrameworking is architecture: x86_64

查看 framework 中包含的文件

使用 ar -t 命令,如:

1
2
3
4
5
6
7
➜  ~ ar -t /Users/acan/Library/Developer/Xcode/DerivedData/AFNTestFrameworking-dbzgzczpzorkzxakdyptgdkckcee/Build/Products/Debug-iphoneos/AFNTestFrameworking.framework/AFNTestFrameworking
    
__.SYMDEF SORTED
    
AFNTestManager.o
    
AFNTestFrameworking_vers.o

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
~ ar -t /Users/acan/Library/Developer/Xcode/DerivedData/DownloadAndPrint-esbkggakvotbghavvyrahlbwezwq/Build/Products/Debug-iphonesimulator/DownloadAndPrint.framework/DownloadAndPrint
    
__.SYMDEF
    
KUIProgressView+AFNetworking-a1a40cc17fc24f3f1ceddd74a693da30783bb34d0b01752ff79431573398a33e.o
    
KUIRefreshControl+AFNetworking-a1a40cc17fc24f3f1ceddd74a693da30f1f87774da2328e9287dd2097ab84517.o
    
KAFNetworkActivityIndicatorManager-a1a40cc17fc24f3f1ceddd74a693da30f6671dc689dbfeba653612a231d647e7.o
    
KUIImageView+AFNetworking-a1a40cc17fc24f3f1ceddd74a693da30d53daed08856f37e76e6d82b576e6c02.o
    
KUIButton+AFNetworking-a1a40cc17fc24f3f1ceddd74a693da309068630115bb1ea9a64e2af147e2d7cc.o
    
KUIActivityIndicatorView+AFNetworking-a1a40cc17fc24f3f1ceddd74a693da30367e3613ffc21cd2355caeca550a3ec7.o
    
KUIWebView+AFNetworking-a1a40cc17fc24f3f1ceddd74a693da308d779735f99bde934e571a128acba67d.o
    
KAFAutoPurgingImageCache-a1a40cc17fc24f3f1ceddd74a693da309beb5c005faa1444982c7565da4f9d8f.o
    
KAFImageDownloader-a1a40cc17fc24f3f1ceddd74a693da306a9a96f20bb980ab71772976283c0ecd.o
    
KAFURLResponseSerialization-a1a40cc17fc24f3f1ceddd74a693da30f0f5d2b89304980be949d764a3365c6d.o
    
KAFHTTPSessionManager-a1a40cc17fc24f3f1ceddd74a693da30c4b25aedaa55956bff8fcbbbeb00c3d3.o
    
KAFURLSessionManager-a1a40cc17fc24f3f1ceddd74a693da306e27ec6df912b8bec430b6a53d149649.o
    
KAFURLRequestSerialization-a1a40cc17fc24f3f1ceddd74a693da30005e720b8baa25b301ab087d70369baf.o
    
KAFNetworkReachabilityManager-a1a40cc17fc24f3f1ceddd74a693da306313f935294440fda518e03d49d37daa.o
    
KAFSecurityPolicy-a1a40cc17fc24f3f1ceddd74a693da3015da43421ec97c77d75192b90a53efa1.o
    
Print.o
    
DownloadImage.o
    
FrameworkManager.o
    
Print+test.o
    
DownloadAndPrint_vers.o

报错及解决办法

  1. 找不到头文件

创建了一个名为 AFNTestFrameworking 的静态 framework,里面包含一个 AFNTestManager 的类:

在 AFNTestFramework.h 类中,引入需要暴露出来的类:

编译的时候没有问题,但是将这个 framework 导入到测试项目时,报错:

解决办法:

  1. 动态链接找不到对应的库
1
2
3
4
5
6
7
dyld: Library not loaded: @rpath/AFNetworking.framework/AFNetworking
    
  Referenced from: /Users/acan/Library/Developer/CoreSimulator/Devices/8B9DBFCA-F796-4142-ABC1-203A91E58762/data/Containers/Bundle/Application/D9084DBC-C80C-4774-BAA0-D71FA86991DD/TestFramework.app/TestFramework
      
    Reason: image not found
        
    Message from debugger: Terminated due to signal 6

解决办法:

  1. 符号表冲突的问题

场景描述:我制作了一个 .framework 静态库,静态库引用了 AFNetworking,在我的 Demo 工程中也引用了 AFNetworking,报了以下错误:

1
2
3
ld: 165 duplicate symbols for architecture x86_64
        
clang: error: linker command failed with exit code 1 (use -v to see invocation)

解决办法:

把 framework 中用到的第三方库的类更改名字

Step 1:修改类名

Step 2:根据报错提示,全局搜索,手动修改冲突的类名

1
2
3
uplicate symbol _OBJC_CLASS_$__AFURLSessionTaskSwizzling in:
        
    /Users/acan/Library/Developer/Xcode/DerivedData/DownloadAndPrint-esbkggakvotbghavvyrahlbwezwq/Build/Intermediates.noindex/DownloadAndPrint.build/Debug-iphonesimulator/DownloadAndPrintDemo.build/Objects-normal/x86_64/AFURLSessionManager.o

如:

过程比较繁琐,但是有效。

Powered by Hexo and Hexo-theme-hiker

Copyright © 2013 - 2019 Acan's blog All Rights Reserved.

访客数 : | 访问量 :