Mac App 的容器在对 App 进行签名时会发生变化

Mac App's container changing when the app is signed

提问人:Daniel Reina 提问时间:11/13/2023 最后编辑:Daniel Reina 更新时间:11/16/2023 访问量:59

问:

上下文

我有一个意想不到的场景,唱歌应用程序会导致容器改变位置。我将提供我所拥有的所有详细信息。

就上下文而言,我有一个应用程序,它将容器用于两件事:存储一个领域数据库,并为我自己存储一个包含一些调试日志的文件。log.txt

我已经将版本 1 发布并分发给一些用户。鉴于在 Xcode 中对应用程序进行签名的绝对混乱,该应用程序在未签名的情况下发布和分发。现在我正在尝试发布已签名的版本 2,但这是我遇到这个奇怪问题的时候。

编辑(感谢 Jay):所有版本,包括已签名和未签名的版本都不是沙盒。有了这个,我的意思是“启用应用程序沙盒”在目标/构建设置/签名下设置为“否”

所有未签名的应用程序(版本 1 和未签名版本 2)都使用路径作为容器。但是,已签名的版本 2 用作容器。例如~/Library/Containers/com.dgrcode.{appName}/Data~/

  • log.txt位于:

    • 未命名的应用:.~/Library/Containers/com.dgrcode.{appName}/Data/Documents/log.txt
    • 已签名的应用:~/Documents/log.txt
  • Realm 的文件位于:default.realm

    • 未签名的应用:~/Library/Containers/com.dgrcode.{appName}/Data/Library/Application Support/default.realm
    • 签名应用:我还没有😓找到它

编辑:我没有对这些路径进行硬编码。对于 Realm 数据库,我使用默认配置,对于 log.txt 文件,我正在执行
end Edit
Realm.Configuration.defaultConfigurationFileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0].appendingPathComponent("log.txt")

显而易见的问题是,从版本 1 安装版本 2 签名的任何用户都将开始使用新数据库,而不是继续使用现有数据库。显然,让我的应用程序数据通过他们的目录传播远非理想。~/

这是我在第一个版本上运行时得到的结果(为清楚起见,两者之间的所有内容都已编辑:codesign -v -d{}

Executable={/path/to/app}
Identifier=com.dgrcode.{appName}
Format=app bundle with Mach-O universal (x86_64 arm64)
CodeDirectory v=20500 size=56564 flags=0x10002(adhoc,runtime) hashes=1757+7 location=embedded
Signature=adhoc
Info.plist entries=29
TeamIdentifier=not set
Runtime Version=13.3.0
Sealed Resources version=2 rules=13 files=2
Internal requirements count=0 size=12

我认为最相关的部分是 和 .Signature=adhocTeamIdentifier=not set

现在,我存档了该应用程序的版本 2。我制作了一份副本,我只使用其中一份签名。我将它们打包在 .dmg 中(不确定这是否会影响任何事情,但以防万一),并在安装它们后检查每个 .dmg 中的 .app。codesign -v --sign

以下是每个结果的结果:codesign -v -d

  • 无符号:
    Executable={path/to/app}
    Identifier=com.dgrcode.{appName}
    Format=app bundle with Mach-O universal (x86_64 arm64)
    CodeDirectory v=20400 size=57452 flags=0x2(adhoc) hashes=1785+7 location=embedded
    Signature=adhoc
    Info.plist entries=31
    TeamIdentifier=not set
    Sealed Resources version=2 rules=13 files=4
    Internal requirements count=0 size=12
    
  • 签署
    Executable={path/to/app}
    Identifier=com.dgrcode.{appName}
    Format=app bundle with Mach-O universal (x86_64 arm64)
    CodeDirectory v=20400 size=57335 flags=0x0(none) hashes=1785+3 location=embedded
    Signature size=4798
    Signed Time=13 Nov 2023 at 12:17:24
    Info.plist entries=31
    TeamIdentifier=2W564BCY7Z
    Sealed Resources version=2 rules=13 files=4
    Internal requirements count=1 size=188
    

未签名的应用按预期工作。当我打开未签名的应用程序时,它继续使用上一个位置的领域数据库,我可以看到更新其内容。~/Library/Containers/com.dgrcode.{appName}/Datalog.txt

但是,已签名的应用不使用相同的数据库,并且不再写入 的文件 ,而是写入 。它确实使用数据库,但我不知道它在哪里。log.txt~/Library/Containers/com.dgrcode.{appName}/Data~/Documents/log.txt


问题

  1. 如何使已签名的应用使用路径作为其容器结构?~/Library/Containers/com.dgrcode.{appName}/Data/

  2. 仅仅通过签署 .app 怎么会发生这样的事情?

swift macOS 领域 代码签名 证书

评论

1赞 lorem ipsum 11/13/2023
您应该使用“不要对地址进行硬编码”FileManager
0赞 Daniel Reina 11/14/2023
对于 Realm,我没有使用 ,因为我只是使用 .对于日志.txt文件,我正在这样做。我应该做一些不同的事情吗?不过,对我来说,仅仅对应用程序进行签名就会改变容器路径,这听起来很疯狂。FileManagerRealm.Configuration.defaultConfigurationFileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0].appendingPathComponent("log.txt")
0赞 Daniel Reina 11/14/2023
谁会对我的问题投反对票而不给出理由?这正在成为黑客新闻吗?
1赞 Jay 11/15/2023
重要的是该问题可复制,到目前为止,我还无法复制它。在一个新的 XCode Realm 项目中,无论它是否签名,default.realm 文件的路径对我来说都是一样的。但是,问题中缺少一些数据:这是一个沙盒应用程序吗?你有什么东西可以改变 Realm 的配置吗?即使打开了沙盒,已签名或未签名都访问了位于file:///Users/jay/Library/Containers/com.my_company.ATest/Data/Library/Application%20Support/default.realm)
0赞 Daniel Reina 11/16/2023
@Jay感谢您的深思熟虑的评论,要求改进我的帖子:)我不知道沙盒会在这里产生任何影响,所以我会相应地更新帖子。若要将信息添加到此回复中,应用未沙盒化。

答: 暂无答案