ios-sdk静态库framework开发


title: ios-sdk静态库framework开发
categories: Ios
tags: [ios, xcode, 静态库, sdk]
date: 2021-02-01 10:02:13
comments: false
mathjax: true
toc: true

ios-sdk静态库framework开发


前篇

  • iOS-SDK开发经验分享 - https://www.jianshu.com/p/cbb1f54b89d2
  • Unity iOS教程之Xcode打包framework在Unity调用 - https://jingyan.baidu.com/article/9080802204bd19fd91c80f3e.html
  • 包含 Bundle 资源的 framework 的正确打包方式 - https://www.jianshu.com/p/c92c08d8afda
  • xcode6 framework missing submodule xxx 警告 - https://www.cnblogs.com/cocoajin/p/4645446.html

主要是给 unity 开发 ios 插件, 以 framework 的形式集成到 unity 中, 供 unity 调用 ios 原生接口.


头文件引入方式

  1. 创建模块 UnityApi 时会一起创建一个头文件 UnityApi.h, 这个头文件里用来 import 改模块里的需要导出的 头文件, 如

    • UnityApi.h

      #import <UnityApi/UnityPlugin.h>
      #import <UnityApi/Tools.h>
      #import <UnityApi/Model.h>
      #import <UnityApi/Define.h>
      

      即使文件存放有目录层级, 但是 import 的时候是没有目录层级, 只有 <模块/头文件>

  2. 文件引入

    • UnityApi 模块内 引入文件内部文件是用到什么就引入什么

    • UnityApi 模块外 的其他模块, 只需要引入 UnityApi.h 即可


创建 静态 framework

  1. 创建 framework, 如: UnityApi

  2. 编译设置

    点击目标工程 >> 选择你创建的 Framework >> 点击工程设置 >> 做出如下修改

    Build Settings >> Dead Code Stripping >> 设置为NO
    Build Settings >> Strip Debug Symbol During Copy >> 全部设置为NO
    Build Settings >> Strip Style >> 设置为Non-Global Symbols
    Build Settings >> Base SDK >> Latest iOS(iOS 选择最新的)
    Build Settings >>  Link With Standard Libraries >> 设置为 NO
    Build Settings >>  Mach-O Type >> Static Library
    
    对于Mach-O Type有两种情况:1)选择 Static Library 打出来的是静态库;2)选择 Relocatable Object File 打出来是动态库。
    
  3. 编写代码 并 导出头文件

    外部需要访问的头文件需要导出

    在对应的 target 上, 把头文件拖到 public 下

  4. 构建 真机/模拟器 的 framework

    1. 切到 对应的模块 及 要编译的 真机 (any ios devices) or 模拟器

    2. cmd + b 进行构建

      构建成功后在 products 目录下会显示成 白色.

  5. 合并 真机 和 模拟器 的 framework. 命令: lipo -create (如果只是 真机 或 模拟器 其中一个使用, 就不需要合并了, 直接使用 framework)

    $ lipo -create /Users/wilker/Library/Developer/Xcode/DerivedData/Build/Products/Debug-iphoneos/UnityApi.framework/UnityApi /Users/wilker/Library/Developer/Xcode/DerivedData/Build/Products/Debug-iphonesimulator/UnityApi.framework/UnityApi -output UnityApi
    

    • 查看合并后支持的架构

      $ lipo -info UnityApi
      Architectures in the fat file: UnityApi are: armv7 x86_64 arm64 // x86_64 就是 模拟器 支持的架构, armv7 arm64 都是真机支持的架构
      
  6. 然后 选择 真机 (或 模拟器 都行) 导出的 framework

    1. 删除原有的 静态库文件 和 _CodeSignature 目录
    2. 将合并后的 静态库文件 拖入 framework 中. 然后就可以使用这个 framework.


bundle 打包资源

  1. 直接创建一个文件加, 重命名为 res.bundle.

    右键 bundle -> show package contents 可以进入到 bundle 里, 然后就可以往里面拖资源

  2. 将 bundle 拖入项目, 会自动引入 bundle 资源

  3. 加载, 可以无视目录路径, 比如

    UnityApi 模块中加载代码

    +(void)addImgForView:(UIViewController*) ctrl {
       // 方式 1: bundle 内相对路径 (无文件后缀)
        NSString *bundlePath = [[NSBundle mainBundle] pathForResource:@"res" ofType:@"bundle"];
        NSBundle *resourceBundle = [NSBundle bundleWithPath:bundlePath];
        NSString* picPath = [resourceBundle pathForResource:@"pic01" ofType:@"png"];
        // UIImage* img = [UIImage imageWithContentsOfFile:picPath];
        
        // 方式 2: 绝对路径 (有文件后缀)
        UIImage *img = [UIImage imageNamed:@"res.bundle/pic01.png"];
        
        UIImageView *imageV = [[UIImageView alloc]init];
        imageV.frame = CGRectMake(100, 100, 100, 100);
        imageV.backgroundColor = [UIColor greenColor];
        imageV.image = img;
        
        [ctrl.view addSubview:imageV];
    }
    

踩坑

build settings 配置要和 引用这个库的 一致

  • architecures armv7 arm64, 不然报错: one or more
  • ios developement target 9.0

猜你喜欢

转载自blog.csdn.net/yangxuan0261/article/details/113765885