目录
一、前言
一提到关于[Xcode]的[profile]文件的管理,就会想到这几个问题:
1、[profile]文件的创建;
2、[profile]文件的删除;
3、[profile]文件的恢复(在需要的账号里面的)。
这些基本流程已经有很多的相关文档,这里不做赘述,详细可参考:
iOS开发:手把手教你如何创建、清除或者恢复xcode里面的mobileprovision文件
但涉及到多人开发且配置文件比较多的情况下,就需要涉及到[profile]的便携管理,于是便有了使用脚本统一管理[profile]的想法。方便一个管理多人使用,关于这方面的资料很少。本人也对shell语言知之甚少,趁此机会也切身体会了下shell的相关知识点。为此有比较做个笔记:
二、项目思路
2.1、最终目标
1、建立一个独立的项目管理或者在在原有的项目中开辟一个目录管理,将profiles和certificers文件放置在该项目,可以像代码一样提交gitlab,方便专人管理,多人共享,避免重复无聊的工作。
2、实现一个脚本,直接执行脚本命令,就可以将配置文件导入(注意:这里是导入)到系统目录中,方便其他使用者在使用配置文件时实现一键执行操作。
2.2、实现步骤
1、创建一个新的项目,在项目里创建两个文件夹,一个放配置文件,一个放证书。
2、在配置文件目录创建一个执行脚本、一个使用说明、一个放配置文件的目录。
3、提交gitlab,使用者只要下载该项目,执行一下脚本即可。
以下项目目录结构:
2.3、难点
1、由于之前几乎没有接触到shell编程,执行脚本的实现是我的难点
2.4、脚本实现思路
1、我们知道Xcode里的profile存放路径是:
~/Library/MobileDevice/Provisioning Profiles
这个思路便与路径有关。即将需要的配置文件直接拷贝到该目录中。
2、我们平时使用配置文件的时候,是直接双击某个配置文件。第二个思路就是模拟点击配置文件。
三、脚本实现[Profile]的配置
这里实现了两个脚本[installProfiles.sh]、[openProfiles.sh],分别对应的是以上两个脚本实现思路。
3.1、installProfiles.sh 脚本说明
1、精解版:
#!/bin/sh
# ======= 路径配置 =========
IFS=$'\n' #避免文件名中有空格时出错,不然带空格的文件无法读取
# 存储配置文件的位置
targetDir=~/Library/MobileDevice/Provisioning\ Profiles
# 当前配置文件的位置
profilesDir=$(pwd)/profiles
# 拷贝配置文件到对应的目录中
function zm_copyProfiles() {
echo "\n文件拷贝中>>>>>>"
echo "====================================\n"
echo FROM:
echo $profilesDir
echo TO:
echo $targetDir
echo "\n===================================="
cp -rf $profilesDir/. $targetDir
echo "文件拷贝成功!\n"
}
# 获取文件目录下的文件,并删除其所有子文件
function zm_deleteAllFiles() {
echo "\n文件清除中>>>>>>"
echo "===================================="
for element in `ls $1` #两个反引号,表示运行系统命令
do
dir_or_file=$1"/"$element
if [ -d $dir_or_file ] #此处之间一定要加上空格,否则会报错
then
zm_deleteAllFiles $dir_or_file
else
#在此处处理文件
echo $dir_or_file
rm -rf $dir_or_file
fi
done
echo "===================================="
}
# 判断是否清理完毕
function zm_judgeIsDeleteAll() {
if [ $? -eq 0 ]
then
echo "配置文件全部删除成功!"
else
echo "配置文件清理失败!"
cd $CURRPATH
exit 1
fi
}
# 拷贝配置文件,带删除就数据
function zm_copyProfilesAfterDeleteFiles() {
zm_deleteAllFiles $targetDir
zm_judgeIsDeleteAll
zm_copyProfiles
}
# 条件判断处理
usage() {
case $choice in
1)
zm_copyProfiles
sleep 1
exit 0
;;
2)
zm_copyProfilesAfterDeleteFiles
sleep 1
exit 0
;;
3)
exit 0
;;
*)
;;
esac
}
# 执行文件
startInstall() {
while :
do
cat<<EOF
*************************************************
* MENU
* 1.仅拷贝文件到系统目录
* 2.先删除所有系统配置文件,再拷贝
* 3.exit
*************************************************
EOF
read -p "please enter your choice : " choice
usage
done
}
startInstall
2、极简化版:
#!/bin/sh
IFS=$'\n'
targetDir=~/Library/MobileDevice/Provisioning\ Profiles
profilesDir=$(pwd)/profiles
cp -r $profilesDir/. $targetDir
3.2、openProfiles.sh 脚本说明
1、精解版:
#!/bin/sh
# ======= 路径配置 =========
IFS=$'\n' #避免文件名中有空格时出错,不然带空格的文件无法读取
# 存储配置文件的位置
targetDir=~/Library/MobileDevice/Provisioning\ Profiles
# 当前配置文件的位置
profilesDir=$(pwd)/profiles
# 获取同级目录下的子文件,并执行方法(参数:$profilesDir)
function zm_openNewProfiles() {
#两个反引号,表示运行系统命令
echo "\n文件配置中>>>>>>"
echo "===================================="
for element in `ls $1`
do
dir_or_file=$1"/"$element
#此处之间一定要加上空格,否则会报错
if [ -d $dir_or_file ]
then
zm_openNewProfiles $dir_or_file
else
#在此处处理文件
echo $dir_or_file
open $dir_or_file
fi
done
echo "===================================="
echo "文件添加成功!\n"
}
# 获取文件目录下的文件,并删除其所有子文件(参数:$targetDir)
function zm_deleteAllFiles() {
echo "\n文件清除中>>>>>>"
echo "===================================="
for element in `ls $1` #两个反引号,表示运行系统命令
do
dir_or_file=$1"/"$element
if [ -d $dir_or_file ] #此处之间一定要加上空格,否则会报错
then
zm_deleteAllFiles $dir_or_file
else
echo $dir_or_file
#在此处处理文件
rm -rf $dir_or_file
fi
done
echo "===================================="
}
# 判断是否清理完毕
function zm_judgeIsDeleteAll() {
# 假如前一条的命令执行成功
if [ $? -eq 0 ]
then
echo "配置文件全部删除成功!"
else
echo "配置文件清理失败!"
cd $CURRPATH
exit 1
fi
}
# 执行配置文件,带删除就数据
function zm_openNewProfilesAfterDeleteFiles() {
zm_deleteAllFiles $targetDir
zm_judgeIsDeleteAll
zm_openNewProfiles $profilesDir
}
# 条件判断处理
usage() {
case $choice in
1)
zm_openNewProfiles $profilesDir
sleep 1
exit 0
;;
2)
zm_openNewProfilesAfterDeleteFiles
sleep 1
exit 0
;;
3)
exit 0
;;
*)
;;
esac
}
# 执行文件
startInstall() {
while :
do
cat<<EOF
*************************************************
* MENU
* 1.仅导入文件到系统目录
* 2.先删除所有系统配置文件,再导入
* 3.exit
*************************************************
EOF
read -p "please enter your choice : " choice
usage
done
}
startInstall
2、极简化版:
#!/bin/sh
IFS=$'\n'
profilesDir=$(pwd)/profiles
function zm_openNewProfiles() {
for element in `ls $1`
do
dir_or_file=$1"/"$element
if [ -d $dir_or_file ]
then
zm_openNewProfiles $dir_or_file
else
open $dir_or_file
fi
done
}
zm_openNewProfiles $profilesDir
3.3、碰到的问题
1、执行拷贝脚本碰到的问题:自己在多次测试之后,在后面发现次数多了,竟然无法将文件拷贝进去(状态:修改命令语句并执行的第一次:在系统对应的目录下闪一下需要拷贝进去的文件,然后马上消失;再次执行命令连闪一下的面子都不给)。仅在[Mac Pro]上出现过类似的情况,过大概几个小时就没问题了。在[Mac mini]没有出现类似的情况,尝试了几遍[for]循环1000次也没有问题,尴尬😭😭😭。
2、执行模拟双击脚本碰到的问题:执行删除系统文件再双击加入[profile],发现会报如下错误:
Failed to install one or more provisioning profiles on the device.
Please ensure the provisioning profile is configured for this device. If not, please try to generate a new profile.
大体意思是:
未能在设备上安装一个或多个配置配置文件。请确保为此设备配置配置文件。如果没有,请尝试生成一个新的配置文件。
看字面意思是要本机配置新的配置文件,度娘了一波,然而并没有什么好的处理方式。
奇怪的是过几个小时之后再执行,竟然没有问题了,并没有做其他什么操作啊。😭😭😭
所以以上两个脚本都留着吧,以防万一哈。
四、小白式shell知识点记录:
1、[#!/bin/sh] 含义:
指此脚本使用/bin/sh来解释执行,#!是特殊的表示符,其后面跟的是此解释此脚本的shell的路径。
#!/bin/sh
2、赋值与备注
赋值时中间不能有空格,否则赋值是失败;备注用[#]开头
# 备注内容
a=1
# 当前文件路径
profilesDir=$(pwd)/profiles
# 存储配置文件的位置
targetDir=~/Library/MobileDevice/Provisioning\ Profiles
3、获取路径之前一定要加上这句,不然带空格的文件无法读取
# 避免文件名中有空格时出错,不然带空格的文件无法读取
IFS=$'\n'
4、函数写法:
function methodsName() {
}
5、for循环语句的写法:
5.1、Python风格:
for i in {1..100}
do
echo $i
done
5.2、C语言风格:
for ((i=1; i<=100; i++))
do
echo $i
done
6、条件语句:
a=1
b=2
if [ $a -eq $b ]
then
echo $a is equal $b
else
echo $a is not equal $b
fi
以下是常见语法规则,借用了别人了图片,忘记哪里的了,善哉善哉~
这些规则是什么意思,有兴趣的话可以深入了解。
7、脚本执行:
在终端,cd到当前路径下,然后执行如下脚本
./openProfiles.sh
# 或者
./installProfiles.sh
[./xxx]:xxx为文件名称。
附加:
证书管理也是一样的思路,不过证书模拟双击后如果有设置密码,会弹框要求输入密码,看了下shell编程没有直接输入密码的方法。只能自己手动输入了。
附件下载地址:Profiles_Certificates_Manage