【问题标题】:How to list all available patterns in a SCDynamicStorage?如何列出 SCDynamicStorage 中的所有可用模式?
【发布时间】:2021-09-24 07:55:15
【问题描述】:

考虑以下命令:

sudo scutil
> list

我得到“模式”或可用子键的列表:

subKey [0] = Plugin:...
subKey [1] = Setup:....
....

在 Objective-C 中以编程方式,我可以访问一个特定的键:

SCDynamicStoreRef ds = SCDynamicStoreCreate(nullptr, CFSTR("GetWorkgroup"), nullptr, nullptr);
NSLog(@"Config: %@", SCDynamicStoreCopyValue(ds, CFSTR("State:/Network/Global/IPv4")));

但是,我正在努力获取所有可用模式的列表。

以下程序不起作用:

SCDynamicStoreRef ds = SCDynamicStoreCreate(nullptr, CFSTR("GetWorkgroup"), nullptr, nullptr);

const auto  list = SCDynamicStoreCopyKeyList(ds, CFSTR("State:/Network/Service/"));
const size_t keysNum = CFArrayGetCount(list);

std::cout << keysNum << std::endl;
for (size_t i = 0; i< keysNum; ++i)
{
    auto property = static_cast<CFDictionaryRef>(SCDynamicStoreCopyValue(ds, static_cast<CFStringRef>(CFArrayGetValueAtIndex(list, i))));
    NSLog(@"Key: %@", property);
}

我尝试了很多代码都没有成功。在互联网上搜索 SCDynamicStore list subKey SCDynamicStore iterate patterns 或类似的结果很少。

此外,developer.apple.com 上的文档像往常一样是无用的:没有示例,文档依赖于您已经了解的所有内容,没有#include/#import 指示等等。

问题

如何在SCDynamicStore 中列出所有可用的模式?

【问题讨论】:

  • 有办法解决这个问题吗?

标签: swift objective-c macos scdynamicstore


【解决方案1】:

所以,经过一番研究,我发现SCDynamicStoreCopyMultiple 有一个pattern 类型的参数:这意味着可以使用正则表达式来定义键。

发现这一点后,很容易实现概念验证。

SCDynamicStoreRef ds = SCDynamicStoreCreate(nullptr, CFSTR("test"), nullptr, nullptr);
    
const auto keys = CFArrayCreate(nullptr, nullptr, 0, nullptr);
const auto keyValue = CFSTR(".*");
const auto patterns = CFArrayCreate(nullptr, (const void**)&keyValue, 1, nullptr);
const CFDictionaryRef  list = SCDynamicStoreCopyMultiple(ds, keys, patterns);

const size_t num = CFDictionaryGetCount(list);
std::vector<CFTypeRef> valuesV(num);
std::vector<CFTypeRef> keysV(num);
CFDictionaryGetKeysAndValues(list, keysV.data(), valuesV.data());
    
for (size_t i = 0; i< num; ++i)
{
    NSLog(@"%@ = %@", keysV[i], valuesV[i]);
}

声明:好的,这不是纯粹的 Objective-C,但转换它以防万一。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-15
    • 2020-04-24
    • 2023-03-19
    • 2013-04-09
    • 1970-01-01
    • 2020-05-12
    • 1970-01-01
    相关资源
    最近更新 更多