文档Swift 混淆

Swift 混淆

预计阅读时间:15 分钟

概述

CodeFog 支持 Swift 项目的混淆,包括类、结构体、枚举、协议、方法和属性。 Swift 项目混淆需要注意一些特殊情况,本文档将详细介绍。

支持的混淆类型

class(类)
struct(结构体)
enum(枚举)
protocol(协议)
func(方法)
var/let(属性)
extension(扩展)
参数名

混淆效果示例

混淆前
class PaymentService {
    var balance: Double = 0
    private var transactionHistory: [String] = []
    
    func processPayment(amount: Double, 
                        currency: String) -> Bool {
        guard amount > 0 else { return false }
        balance -= amount
        return true
    }
    
    func getTransactionCount() -> Int {
        return transactionHistory.count
    }
}
混淆后
class ZFJObj_3nM7k {
    var zfj_8kX4m: Double = 0
    private var zfj_9pN2j: [String] = []
    
    func zfj_5pN9j(zfj_2mK7x: Double, 
                   zfj_6nP3k: String) -> Bool {
        guard zfj_2mK7x > 0 else { return false }
        zfj_8kX4m -= zfj_2mK7x
        return true
    }
    
    func zfj_4kM8n() -> Int {
        return zfj_9pN2j.count
    }
}

SwiftUI 项目注意事项

View 协议实现

body 属性会自动排除,无需手动配置

@State/@Binding 属性

带有属性包装器的属性会正常混淆

@Published 属性

ObservableObject 中的 @Published 属性会正常混淆

Preview Provider

PreviewProvider 相关代码会自动排除

需要加入白名单的情况

Codable 模型

使用 Codable/Decodable 的模型类,属性名需要与 JSON 键匹配

@objc 暴露的方法

使用 @objc 标记暴露给 OC 的方法需要注意

Mirror 反射

使用 Mirror 进行反射的类需要排除

UserDefaults 键名

使用字符串作为 UserDefaults 键的情况

最佳实践

  • 1.使用 CodingKeys 枚举来固定 JSON 键名
  • 2.将 API 模型类统一放在一个目录,方便配置白名单
  • 3.混淆后运行完整的单元测试
  • 4.使用 SPM 管理的包会自动排除