Xcode脚本实现配置文件管理

一、前言

一提到关于[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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

瓜子三百克

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值