5

在一个新的 Xcode 项目中,我以这种方式添加了一个带有自定义 init 方法的新类:

import Cocoa

class NewClass: NSControl {

    override init(frame: CGRect) {
        super.init(frame: frame)
    }

    required init(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

但是,如果我构建并存档项目,源文件的绝对路径会显示在二进制文件中:

/Users/my_username/my_path_to_xcode_projects/new_project/NewClass.swift

我计划通过互联网分发我的最终项目。如何防止 Xcode 将我的目录布局透露给其他人?我从对类似问题的回答中了解到,在 Xcode 的“构建设置”中,应该将“部署 Prostprocessing”设置为“是”,以便从二进制文件中删除符号,但这在我的情况下似乎不起作用。

4

1 回答 1

7

如果您仔细查看 的签名fatalError

@noreturn public func fatalError(
    @autoclosure message: () -> String = default, 
    file: StaticString = #file, line: UInt = #line)

您可以看到 the#file#linedefault 参数。这些在编译时进行评估并解析为当前文件和行。

要不使用默认参数,您可以自己提供它们:

fatalError("Something went wrong", file: "", line: 0)

在发布配置上编译时,路径不包含在二进制文件中。

如果您#file在标准库中搜索,您可以找到 4 个其他实例,其中两个已包含在发布版本中assertassertionFailure其中不包含在发布版本中。其余 2 个是preconditionpreconditionFailure

解决方法

如果我们添加DEBUG/RELEASE符号在此处输入图像描述

我们可以对 mocked 等函数进行条件编译,这些函数在发布版本fatalError中不使用预处理器语句:#file

#if RELEASE
@inline(__always) @noreturn func fatalError(@autoclosure message: () -> String = "") {
    Swift.fatalError(message, file: "", line: 0)
}
    
@inline(__always) func preconditionAlt(@autoclosure condition: () -> Bool, @autoclosure _ message: () -> String = "") {
    Swift.precondition(condition, message, file: "", line: 0)
}

@inline(__always) @noreturn func preconditionFailureAlt(@autoclosure message: () -> String = "") {
    Swift.preconditionFailure(message, file: "", line: 0)
}
#else
@inline(__always) func preconditionAlt(@autoclosure condition: () -> Bool, @autoclosure _ message: () -> String = "", file: StaticString = #file, line: UInt = #line) {
    Swift.precondition(condition, message, file: file, line: line)
}

@inline(__always) @noreturn func preconditionFailureAlt(@autoclosure message: () -> String = "") {
    Swift.preconditionFailure(message, file: file, line: line)
}
#endif

您调用任何这些函数的所有实例现在都使用自定义实现。这样您在调试时仍然可以获取文件和行信息,但会阻止它出现在产品中。但是,您必须更改 to 的每个实例,precondition[Failure]否则precondition[Failure]AltSwift 不能明确地推断出该函数。可以按Shift- Alt- Cmd-F在整个项目中进行搜索和替换

笔记

如果第三方框架使用了这些功能,而你在自己的机器上编译,那么路径显然会包含在框架产品中。为了防止这种情况,您要么必须使用预编译版本,要么自己使用模拟编译它。

如果任何其他自声明或第三方函数使用#file,您显然也必须更改它,但这并不常见。

我不知道文件结构可能还有其他泄露的可能性。

于 2016-07-23T02:10:03.147 回答