macOS: 使用新版plutil命令操作Plist文件更方便

本文链接:https://blog.csdn.net/afatgoat/article/details/54729106

    前言
    介绍
        测试环境
            创建空Plist文件
        在线帮助
        验证Plist文件格式
        显示文件内容
        转换格式
        创建简单键值
        删除一个键
        替换一个键值
        提取一个键值
        复杂键值操作
            数组
            字典
            复杂类型的标识
            举例
        数组
            创建数组
            插入数组项
            删除数组项
            替换数组项
        字典
            创建字典
            插入字典项目
            删除数组项
            替换数组项
    后序
        命令比较
            参考

前言

自从OS X 10.11和更新版macOS 10.12操作系统发布以来,plutil命令的功能也随之有了增强,使我们可以除了使用defaults和PlistBuddy命令之外,又多了一个有力的操作工具。

最早plutil命令单单用来对Plist文件进行语法验证和格式转换,没有太多的用途。现在它除了部分功能,如显示部分不如defaults和PlistBuddy灵活外,对于Plist的写操作有了突出的改进,比defaults要简单,与PlistBuddy不相上下。

下面就介绍下它的具体功能。
介绍

Plist文件是由一对一对的“键”和“值”组成的,键(Key)是后面值(Value)的名称,值可能是简单的数值或字符串,也可能是复杂的数据,这在后面具体说。
测试环境

首先,为了方便,我们现在当前用户目录下面建立一个空目录:~/plutil_temp,然后在Termianl中转到该目录为当前目录,后面的测试我们都在该目录下进行。

mkdir -p ~/plutil_temp
cd ~/plutil_temp

 

创建空Plist文件

由于plutil命令还不支持创建一个空的Plist文件,我们可以用下面命令创建一个空的文件:

echo '<?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/></plist>' > example.plist

 

注意上面的命令是一行命令,不分行。

或者使用其他命令创建带有初始值的Plist文件,比如:

/usr/libexec/plistbuddy -c Set: example1.plist

 

虽然它会显示错误信息,但是依然可以成功创建一个空的原始Plist文件。
也可以尝试使用defaults命令创建一个,这里不再赘述。
在线帮助

先来显示一下它的在线帮助:

plutil -h

 

先仔细看一下它的在线帮助
验证Plist文件格式

现在让我们来验证一下我们前面建立的空Plist文件格式是否正确:

plutil -lint example.plist

 

如果文件格式没问题,会在stdout中显示OK,同时返回值为0
显示文件内容

这个也很简单,使用-p命令:

plutil -p example.plist

 

显示结果:

    {
    }

请记住它的输出格式,这种格式叫做json,其实plutil只支持json格式输出的。
不妨试试,用诸如cat命令来显示我们的示例文件,它应该是XML格式的文本文件:

cat example1.plist

 

上面的命令显示的就是标准的XML文本格式的Plist文件。
请记住两个输出的不同,最好再看一下文件的大小。
下面我们详细说plist文件格式

转换格式

Plist支持三种格式: xml1, json和binary,前两者都是纯文本格式,后一种是二进制格式。也就是说前两种使用文本编辑器方便地编辑,二进制格式就不好手动编辑了。如果需要手动编辑,还是先转化为文本格式,完成后再转化回二进制格式。

一般来说,对于使用操作系统提供的标准Plist文件操作API,无论是哪种格式都正常可以操作,没有任何差别。

转换格式使用-convertml命令:

plutil -convert json example.plist

 

转换之后,我们再来看看文件的大小。是不是变化了?!

一个小启发,能不能用另外一种更简单的方式创建一个新的Plist文件呢?

创建简单键值

Plist文件支持下面的简单类型:
类型     说明

-bool布尔型
-integer64位整数
-float64位浮点数
-string字符串
-date时间
-data数据(是base-64转码字符串)

创建使用-insert(插入)命令。我们一一举例说明

plutil -insert Agree -bool "Yes" example.plist
plutil -insert Passed -bool "True" example.plist
plutil -insert Count -integer 10 example.plist
plutil -insert Total -float 9876.54321 example.plist
plutil -insert LastName -string "Liu" example.plist
plutil -insert FirstName -string "Tony" example.plist
plutil -insert Content -data "cGx1dGls5ZG95Luk5omp5bGV5LuL57uNCg==" example.plist

 

这些都很简单,但是-date类型有点麻烦,至今为止已知的时间类型它都不支持,根据plutil的在线说明
“-date: a date in XML property list format,”
我们只好使用后面才提到的XML格式,这在后面一节统一介绍。至于为什么只能这样,还不知道。

删除一个键

删除使用-remove命令,举例说

plutil -remove Passed example.plist

 

替换一个键值

替换使用-replace命令,举例说

plutil -replace Total -float 9876.54321 example.plist

 

提取一个键值

plutil没有一个内置命令用于显示某一项的值。其中一种方法,虽然有点笨重,我们可以利用-extract命令来实现。
比如我们要显示LastName的内容:

plutil -extract LastName xml1 example.plist -o LastName.plist; plutil -p LastName.plist

 

它的过程是,使用-extract来讲需要的项提取到一个新的plist文件中(LastName.plist),然后在显示它的内容。
其实还可以有很多其他方法,留给读者自己考虑


复杂键值操作

好了这是它的精华之处了。
话说一个Plist文件,之所以可以包含多种的键和值,关键一点就是它的根一定是一个字典类型,在XML中以表示。下面我们说说他的复杂类型。
复杂键值包括数列和字典。


数组

什么是数组?数组是同质数据的集合,可以使用整数作为索引访问每个数据对象。什么是”同质数据“呢,就是说,一个数组中如果任何一个数据是浮点数类型,那么所有的都是浮点数类型。
数组的数据也可以是后面说的”字典“类型,至于数组中每个字典是否机构相同,Plist中没有强制要求,所以可以不同。

字典

什么是字典类型呢?它是一种可以包含子键值对的对象数据。子键值对可以是前面说的任意的简单和复杂类型。
复杂类型的标识

在plutil命令中,可以使用下面两种方式表示
类型     说明

-xmlXML格式
-jsonJSON格式


举例

记得前面提到的无法使用-date输入一个时间类型的值把,我们这里就使用-xml来实现

plutil -insert CreateTime -xml "<date>2017-01-26T04:59:49Z</date>" example.plist

 

看见了,和之间的就是ISO8601的UTC日期与时刻表示法的字符串格式
数组

我们下面通过具体操作来介绍如何使用plutil来操作数组。建议每次操作完成之后,使用-p命令来查看文件的变化,这样可以直观地看见他的前后变化,利于理解。
创建数组

怎么创建一个数组呢?我们可以上面提到的两种标识来做,比如:

plutil -insert listStyle -xml "<array/>" example.plist
plutil -insert listColor -json "[]" example.plist

 

第一句创建一个叫做listStyle的数组,第二个创建一个叫做listColor的数组


插入数组项

plutil -insert listStyle.0 -string "Suite" example.plist
plutil -insert listStyle.1 -string "Casual" example.plist
plutil -insert listStyle.2 -string "Casual" example.plist
plutil -insert listStyle.3 -string "Vibrant" example.plist

 

上面我们依照顺序在listStyle数组中插入了四个字符串类型的数组项。从中可以看出,访问每个数组项的索引表达方式。

plutil -insert listColor.0 -string "Red" example.plist
plutil -insert listColor.1 -string "Green" example.plist
plutil -insert listColor.0 -string "Orange" example.plist
plutil -insert listColor.3 -string "Purple" example.plist

 

上面的例子中,第一句在位置.0处插入了”Red”,.1出插入“Green”,而第三句又在.0处插入了”Orange”,那么结果是:

   

listColor.0 = Orange
listColor.1 = Red
listColor.2 = Green

也就是说插入点的数据顺序向后移动。


删除数组项

在删除前先看看example.plist文件中的数据。
这个不难想象,根据前面的知识应该可猜到。比如我们删除listColor的”Green”一项,还记得它的位置吧,是.2,所以:

plutil -remove listColor.2 example.plist

 

删除后,在看看结果。
替换数组项

与前面的删除方法是类似的,比如我们上面的listStyle中有两个都是Casual,我们把.2的换成Elegant:

plutil -replace listStyle.2 -string "Elegant" example.plist

 

字典

同上面介绍数组时的建议一样,还是掏多观察操作前后的变化

创建字典

怎么创建一个字典呢?我们可以上面提到的两种标识来做,比如:

plutil -insert Employee -xml "<dict/>" example.plist

 

第一句创建一个叫做Employee的字典对象,第二个创建一个叫做Education的字典对象
插入字典项目

plutil -insert Employee.LastName -string "Liu" example.plist
plutil -insert Employee.FirstName -string "Tony" example.plist
plutil -insert Employee.UserName -string "TonyLiu" example.plist
plutil -insert Employee.Phone -string "1-222-890-1234" example.plist
plutil -insert Employee.Password -data "5oiR5LiN5ZGK6K+J5L2gCg==" example.plist

 

上面我们依照顺序在Employee字典中插入了五个各种类型的项目。从中可以看出,访问每个字典内各个项目的表达方式。

删除数组项

有了数组的经验,相信这里不会难倒读者了:

plutil -remove Employee.Password example.plist

   

替换数组项

替换根式清澈熟路了:

plutil -replace Employee.Phone -string "13911399999" example.plist

 

后序


命令比较

简单说来:

  • defaults命令使用domain的概念访问plist文件,而且对命令的文件书写方式要求严格(比如不能带.plist),有的时候还找不到或无法访问非标准目录的,而且对复杂格式数据的鞋操作比较麻烦。但是它的读取操作确比plutil简单多了。
  • plutil对于复杂格式的写操作很直观,很类似于对类的操作,而且文件名也是直截了当,就是读数据功能太弱。
  • PlistBuddy可以说具有前面两者的有点,避免了它们各自的缺点,书写也方便。但是对于系统参数的plist文件操作,还是使用Defaults命令号,因为它会通知系统服务该参数文件已经修改,而PlistBuddy则不会。


参考

[JSON介绍] http://www.json.org/
[ISO8601时间格式] https://en.wikipedia.org/wiki/ISO_8601
————————————————
版权声明:本文为CSDN博主「afatgoat」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/cneducation/article/details/54729106

### 如何在 Xcode 中创建和编辑 Plist 文件 #### 创建 Plist 文件 为了在项目中添加一个新的 `Plist` 文件,在 Xcode 的项目导航栏内右键点击想要放置该文件的目录,选择新建文件选项。随后,在弹出窗口里挑选 Property List 类型并完成命名过程。 ```swift // 这是一个示例 Swift 代码片段展示如何访问 Plist 文件中的数据 if let path = Bundle.main.path(forResource: "Info", ofType: "plist") { if let dict = NSDictionary(contentsOfFile: path) as? [String: Any] { print(dict) } } ``` 当涉及到 SwiftUI 和较新版本的 Xcode (如 Xcode 13),默认情况下不再显示 Info.plist 文件,但这并不意味着无法对其进行操作或不存在此文件[^1]。 #### 编辑 Plist 文件 对于已存在的 `Plist` 文件可以直接双击打开以进入可视化编辑界面;也可以通过源码形式查看其 XML 结构以便精细地调整属性值。值得注意的是,某些特定场景下可能需要手动编写部分配置项来满足开发需求。 利用第三方工具可以进一步简化对复杂结构化数据的操作流程。例如提到过的 `plistset.zip` 压缩包提供了专门针对 `.plist` 文件设计的一系列实用程序,方便开发者们高效处理这类资源文件[^2]。 获取指定路径下的 Plist 数据可以通过如下 Objective-C 语句实现: ```objectivec NSString* strErrorCodePath = [[NSBundle mainBundle] pathForResource:@"ErrorCode" ofType:@"plist"]; ``` 上述命令能够帮助定位到应用程序捆绑包内的目标 Plist 资源位置,并返回对应的文件系统路径字符串表示形式[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值