提问人:Daniel Reina 提问时间:11/13/2023 最后编辑:Daniel Reina 更新时间:11/16/2023 访问量:59
Mac App 的容器在对 App 进行签名时会发生变化
Mac App's container changing when the app is signed
问:
上下文
我有一个意想不到的场景,唱歌应用程序会导致容器改变位置。我将提供我所拥有的所有详细信息。
就上下文而言,我有一个应用程序,它将容器用于两件事:存储一个领域数据库,并为我自己存储一个包含一些调试日志的文件。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 EditRealm.Configuration.defaultConfiguration
FileManager.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=adhoc
TeamIdentifier=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}/Data
log.txt
但是,已签名的应用不使用相同的数据库,并且不再写入 的文件 ,而是写入 。它确实使用数据库,但我不知道它在哪里。log.txt
~/Library/Containers/com.dgrcode.{appName}/Data
~/Documents/log.txt
问题
如何使已签名的应用使用路径作为其容器结构?
~/Library/Containers/com.dgrcode.{appName}/Data/
仅仅通过签署 .app 怎么会发生这样的事情?
答: 暂无答案
评论
FileManager
FileManager
Realm.Configuration.defaultConfiguration
FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0].appendingPathComponent("log.txt")
file:///Users/jay/Library/Containers/com.my_company.ATest/Data/Library/Application%20Support/default.realm)