apinotes实践 - ShenYj/ShenYj.github.io GitHub Wiki

apinotes实践

操作

  1. 文件命名格式: SDK名称.apinotes

    ---
    Name: OCSDK
    Classes:
    - Name: OCClass
    SwiftName: SDKClass
    Methods:
    - Selector: 'oc_func1'
        MethodKind: Class
        SwiftName: 'func1'
    - Selector: 'oc_func2'
        MethodKind: Class
        SwiftName: 'func2'
    - Selector: 'oc_func3:number2:'
        MethodKind: Instance
        SwiftName: 'func3(_:number2:)'
  2. 将文件放在 SDK 的目录中

      .
      ├── OCSDK
      │   ├── OCClass.h
      │   ├── OCClass.m
      │   ├── OCSDK.apinotes
      │   └── OCSDK.h
      └── OCSDK.xcodeproj
  3. Build Phase 下点击 + 号选择 New Copy files Phase,将 .apinotes 拷贝到 FrameworkHeaders 目录下:

    .

    如果在 Copy Bundle Resources 中有 .apinotes 可以将其删除掉,没必要 copy 到 framework 的根目录下

  • 通过这种方式配置 SDK 后,文件会被打包进入 Framework 中, 这样也就保证了使用方能够读取配置

apinotes文件最终存放路径

  • 从最终产物的角度对比一下 .apinotes 文件的存放路径

    • framework: 在 Framework 的 Headers 目录下 .

    • ipa: 在 Frameworks/OCSDK.framework 下, 与库二进制文件同级 .

实现效果

通过示例,实现了以下处理

  • OCClass 这个 OC 类文件在 Swift 下定义为 SDKClass

  • oc_func3:number2: 这个方法定义为 func3(_:number2:)

    如图: .

原 OC 本身的符号并不会被改变, Swift 在调用 OC 方法前会进行解析,在此过程中处理映射

疑问

.apinotes 配置中,除了上面两处生效配置外,还有两个类方法的重命名,但是实测并没有生效,暂时还不确定原因

资源

APINotes demo 工程 下载

官方参考资料: API Notes: Annotations Without Modifying Headers

⚠️ **GitHub.com Fallback** ⚠️