iOS小技能:使用PlistBuddy/plutil进行增删改查plist文件

1,011 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第10天,点击查看活动详情

前言

defaults、plutil、PlistBuddy的区别:

  • defaults命令使用domain的概念访问plist文件,而且对命令的文件书写方式要求严格(比如不能带.plist),有的时候还找不到或无法访问非标准目录的,而且对复杂格式数据的鞋操作比较麻烦,但是它的读取操作确比plutil简单。
#显示系统隐藏文件
defaults write ~/Library/Preferences/com.apple.finder AppleShowAllFiles - bool true

  • plutil对于复杂格式的写操作很直观,很类似于对类的操作,而且文件名也是直截了当,就是读数据功能太弱。

  • PlistBuddy可以说具有前面两者的优点,避免了它们各自的缺点,书写也方便。但是对于系统参数的plist文件操作,还是使用Defaults命令号,因为它会通知系统服务该参数文件已经修改,而PlistBuddy则不会。

I Info.plist的常用配置

1.1 支持微信唤起支付

canOpenURL: failed for URL: weixin://app/wx的解决方案

    <key>LSApplicationQueriesSchemes</key>
    <array>
        <string>weixin</string>
    </array>

1.2 支持访问相册进行图片保存

	<key>NSPhotoLibraryAddUsageDescription</key>
	<string></string>

1.3 支持访问照相机 NSCameraUsageDescription

	<key>NSCameraUsageDescription</key>
	<string></string>

1.4 ATS

从iOS 9开始,所有使用NSURLSession建立的HTTP连接默认使用ATS(App Transport Security),这个新的安全协议要求所有的网络连接必须使用HTTPS协议,否则会提示如下错误。

App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure. Temporary exceptions can be configured via your app's Info.plist file.

如果有一些特殊的原因需要忽略ATS限制的话,可以在Info.plist文件中添加如下配置。

	<key>NSAppTransportSecurity</key>
	<dict>
		<key>NSAllowsArbitraryLoads</key>
		<true/>
	</dict>

II 使用macOS自带的PlistBuddy进行CURD(增删改查)plist文件

  •  PlistBuddy -- read and write values to plists
    
  • ➜ retail git:(develop) man PlistBuddy

SYNOPSIS PlistBuddy [-cxh] file.plist

-rwxr-xr-x  1 root  wheel  54256  4  7 04:45 /usr/libexec/PlistBuddy

  • 应用场景: 在修改tweak的plist的时候,如果要临时调试修改修改plist文件,或者使用脚本修改plist内容的时候,使用PlistBuddy就很方便

2.1 新建plist

➜  Desktop /usr/libexec/PlistBuddy test.plist
File Doesn't Exist, Will Create: test.plist
Command: save
Saving...
Command: exit
➜  Desktop ls -lrt | grep test.plist

-rw-r--r--   1 mac  staff      181  9 29 16:01 test.plist

➜  Desktop cat test.plist
<?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>

如果不想每次都使用全全路径使用PlistBuddy,可以在 .bash_profile配置alias

➜  ~ open -e .bash_profile

内容如下

alias PlistBuddy='/usr/libexec/PlistBuddy'

记得source ~/.bash_profile,才会在当前终端生效。

2.2 添加key

2.2.1 添加基本类型的key Add :字段名 类型 值

  • PlistBuddy -c 'Add :Version string 1.0' test.plist
Desktop PlistBuddy -c 'Add :Version string 1.0' test.plist
➜  Desktop cat test.plist
<?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>Version</key>
	<string>1.0</string>
</dict>
</plist>

2.2.2 array类型的key

先使用Add :数组名 array设置数组名,在使用Add :数组名: 类型 值 添加数组元素

Desktop PlistBuddy -c 'Add :Applications array' test.plist
➜  Desktop PlistBuddy -c 'Add :Applications: string app1' test.plist
➜  Desktop PlistBuddy -c 'Add :Applications: string app2' test.plist
➜  Desktop PlistBuddy -c "print" test.plist
Dict {
    Users = Dict {
        Name = Bob
        sex = false
        Age = 20
    }
    Version = 1.0
    Applications = Array {
        app1
        app2
    }
}

2.2.3 dict类型的key

  • 先添加字典名 Add :字典名 dict
  • 再添加字典的元素:key和value Add :字典名:key 类型 值
Desktop PlistBuddy -c 'Add :Users dict' test.plist
➜  Desktop PlistBuddy -c 'Add :Users:Name string Bob' test.plist
➜  Desktop PlistBuddy -c 'Add :Users:sex Bool ture' test.plist
➜  Desktop PlistBuddy -c 'Add :Users:Age integer 20' test.plist
➜  Desktop PlistBuddy -c "print" test.plist
Dict {
    Users = Dict {
        Name = Bob
        sex = false
        Age = 20
    }
    Version = 1.0
}
➜  Desktop cat test.plist
<?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>Users</key>
	<dict>
		<key>Age</key>
		<integer>20</integer>
		<key>Name</key>
		<string>Bob</string>
		<key>sex</key>
		<false/>
	</dict>
	<key>Version</key>
	<string>1.0</string>
</dict>
</plist>

2.3 查看plist

  • PlistBuddy -c "print" test.plist

  • plutil -p 至于查看plist,个人更新后plutil的json格式输出,因为可以明显看出字段的类型

Desktop plutil -p test.plist
{
  "Applications" => [
    0 => "app1"
    1 => "app2"
  ]
  "Users" => {
    "Age" => 20
    "Name" => "Bob"
    "sex" => 0
  }
  "Version" => "1.0"
}

  • cat test.plist : 标准的XML文本格式

2.3.1 根据key查value

➜  Desktop PlistBuddy -c 'Print :Users' test.plist
Dict {
    Name = Bob
    sex = false
    Age = 20
}

2.3.2 根据下标查数组的元素

Desktop PlistBuddy -c 'Print :Applications:1' test.plist
app2

2.4 修改

Desktop PlistBuddy -c 'Set :Applications:1 "reset application 1"' test.plist
➜  Desktop PlistBuddy -c 'Print :Applications:1' test.plist
reset application 1

2.5 删除

Desktop PlistBuddy -c 'Delete :Applications' test.plist
➜  Desktop PlistBuddy -c "print" test.plist
Dict {
    Users = Dict {
        Name = Bob
        sex = false
        Age = 20
    }
    Version = 1.0
}

2.6 合并

合并test 2.plist 到 test.plist

Desktop PlistBuddy -c 'print' test2.plist
Dict {
    kunnanVersion = 9.0
}
➜  Desktop PlistBuddy -c 'print' test.plist 
Dict {
    Users = Dict {
        Name = Bob
        sex = false
        Age = 20
    }
    Version = 1.0
}
➜  Desktop PlistBuddy -c 'Merge test2.plist' test.plist
➜  Desktop PlistBuddy -c 'print' test.plist            
Dict {
    Users = Dict {
        Name = Bob
        sex = false
        Age = 20
    }
    Version = 1.0
    kunnanVersion = 9.0
}

III plutil命令操作Plist文件

plutil -h

blog.csdn.net/z929118967/…