使用 NSUserDefault 在多个进程之间共享数据

Posted

技术标签:

【中文标题】使用 NSUserDefault 在多个进程之间共享数据【英文标题】:sharing data between multiple processes using NSUserDefault 【发布时间】:2020-09-15 09:00:47 【问题描述】:

我想在 Objective-C 编译的进程和终端之间共享数据。都由同一个用户运行。

从 objC 代码中,我在域 a.b.c 下写了一些值:

NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:@"a.b.c"];
[defaults setObject:@"fffff" forKey:@"bbbbb"];
[defaults synchronize];

这个过程实际上是从 installer.app 运行的安装程序插件,并具有以下权利(无沙盒):

codesign -d --entitlements :- /System/Library/CoreServices/Installer.app
-->
Executable=/System/Library/CoreServices/Installer.app/Contents/MacOS/Installer
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>com.apple.private.tcc.allow-prompting</key>
    <array>
        <string>kTCCServiceAll</string>
    </array>
    <key>com.apple.security.cs.disable-library-validation</key>
    <true/>
</dict>
</plist>

并且期望使用defaults read 从终端可以看到这个值。但不幸的是,即使两个进程都在同一个用户下运行,它也没有显示出来。

这是终端的输出:

defaults read a.b.c
2020-09-15 14:56:58.245 defaults[23380:360050] 
Domain a.b.c does not exist

知道我在这里缺少什么吗? 谢谢。

【问题讨论】:

整个终端命令是什么? 我添加了默认的确切命令和响应。但是请注意,如果我运行写入值“fffff”的同一进程的另一个实例,它可以跟踪该值,但其他进程可能无法 应用是否被沙盒化? @Willeke,用权利更新了问题。写入数据的应用程序没有被沙盒化(参见上面的权利)。 【参考方案1】:

我是新手,不知道你说的“进程”是什么意思。

(可能是两个程序,Xcode 执行一个,终端执行一个)。

但我知道“NSUserdefaults”将数据存储在沙箱中。

终端程序没有沙箱,每个程序的沙箱是独立的。

【讨论】:

感谢您的帮助,我知道在 macOS 中NSUserDefaults 是每个用户,如果我写入特定域,而不是每个应用程序。

以上是关于使用 NSUserDefault 在多个进程之间共享数据的主要内容,如果未能解决你的问题,请参考以下文章

在沙盒 OSX 应用程序和扩展程序之间共享 NSUserDefault

进程间的通讯(IPC)方式

来自 segue 或 NSUserdefault 的 UIViewController 选项数据

进程间通信方式——共享内存

spring事务之多个业务之间怎么共享用同一个事务

Swift 问题 - NSUserDefault 和 Settings Bundle 没有响应