Swift的framework制作、使用和遇到的坑

简单了解一下静态库和动态库吧

Swift的framework制作、使用和遇到的坑_第1张图片
详细了解点击这里或者自行搜索
官方文档


制作静态库

创建一个项目,选择Cocoa Touch Framework:
Swift的framework制作、使用和遇到的坑_第2张图片
创建项目的时候要记得选Swift作为开发语言。
在Build Setting里修改两个参数:
1、将Build Active Architecture Only改为NO
Swift的framework制作、使用和遇到的坑_第3张图片
2、在Filter里搜索“mach“,将Mach -O Type改为static library
Swift的framework制作、使用和遇到的坑_第4张图片

修改一下deployment target,修改到想要的版本,我一般改到iOS10.0以上。

新建一个MySDK.swift:

import Foundation
// 要暴露出去的都加上public
public class MySDK {
    public init() {

    }

    public func myPrint() {
        print("----My print!----")
        myPrivatePrint()
    }

    public func myAdd(number1: Int, number2: Int) -> Int{
        return (number1 + number2)
    }

    // 私有
    private func myPrivatePrint() {
        print("----My private print!----")
    }
}

接着分两步build,分别编译出模拟器版本和真机版本的framework:
img
img

接着就会发现products文件夹多了个MySDK.framework:
Swift的framework制作、使用和遇到的坑_第5张图片
右键show in finder,找出MySDK.framework所在的位置:
Debug-iPhones里的是真机编译出来的库,Debug-iphonesimulator里的是模拟器编译出来的库。
Swift的framework制作、使用和遇到的坑_第6张图片
将MySDK.framework复制一份去另外一个路径下,我放在了Products下,接着打开终端,使用命令来将模拟器和真机编译的库合成在一起:

lipo -create12 -output 新合成库

Swift的framework制作、使用和遇到的坑_第7张图片
接着使用命令:

lipo -info 新合成库

可以看到新的库支持的处理器:
Swift的framework制作、使用和遇到的坑_第8张图片
把products里面模拟器的framework复制一份出来,用新的库替换掉旧的库:
Swift的framework制作、使用和遇到的坑_第9张图片
此时这个最新的MySDK.framework是真机和模拟器都可以使用的库了。
我以为products里面模拟器和真机的framework随便一份复制出来都可以,但是我用真机的framework的时候,模拟器会无法编译,会报错说找不到MySDK下的class。


使用静态库

新建一个项目,把刚刚制作好的MySDK.framework移动到项目文件夹里,不是在Xcode里添加文件!是通过folder复制过去!文件夹大概长这样:
Swift的framework制作、使用和遇到的坑_第10张图片
之后打开Build Phases -> Linked Frameworks and Libraries,点击左下角的+号将MySDK添加进去:
Swift的framework制作、使用和遇到的坑_第11张图片
点击Add other…
Swift的framework制作、使用和遇到的坑_第12张图片
点击open
Swift的framework制作、使用和遇到的坑_第13张图片
现在General里就会显示已经link了MySDK:
Swift的framework制作、使用和遇到的坑_第14张图片
我没有添加到Embedded Binaries里,添加了的话会导致坑2。

接着就可以在项目里使用MySDK了:

import UIKit
import MySDK

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        let addResult = MySDK.init().myAdd(number1: 1, number2: 2)
        print(addResult)
        MySDK.init().myPrint()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

}

运行结果:
Swift的framework制作、使用和遇到的坑_第15张图片


遇到的坑

坑1:使用lipo的时候提示Invalid argument:

这里写图片描述
解决方法:使用lipo的时候要精确到framework,如:

lipo -info xxxframework.framework/xxxframework
坑2:Xcode: “This app could not be installed at this time.”

Swift的framework制作、使用和遇到的坑_第16张图片
这是因为Embedded Binaries错了,embedded进不应该进去的东西了。同时要检查一下SDK的bundle id和项目里的bundle id是否冲突了、SDK是否的mach -o type是不是static library、SDK的Build Active Architecture Only是不是为NO。
问题参考1
问题参考2
Swift的framework制作、使用和遇到的坑_第17张图片

坑3:崩溃 dyld: Library not loaded Reason: image not found

可以尝试将framework添加进Embedded Binaries里,如果出现坑2,那就是添加库的方式出错了,请重新走一遍上文的使用流程。
问题参考3


后续有别的问题会更新~

你可能感兴趣的:(swift,iOS)