我有一个iOS应用程序,我即将开源。当应用程序处于活动状态时,我不希望在运行脚本代码中包含我的密钥和秘密,供所有人查看,分叉,下载等等。显而易见。
仍然使用Fabric / Crashlytics的最佳方法是什么,同时保持这些密钥的安全性,以便只有那些可以部署应用程序的人才能访问这些凭据?
答案 0 :(得分:7)
这是一种方式:
1 - 将结构密钥存储在本地文件中。
<apiKey>
<secretKey>
2 - 在你的可可豆荚运行脚本阶段(在Xcode中的Build Phases下),让你的脚本从本地文件中获取api密钥和密钥。
apiKey=$(sed -n '1p' < localFile.txt)
secretKey=$(sed -n '2p' < localFile.txt)
3 - 在cocoa pods运行脚本阶段使用PlistBuddy
将API密钥设置为Info.plist
文件。像这样:
/usr/libexec/PlistBuddy -c "Set :Fabric:APIKey string $apiKey" $(PROJECT_DIR)/Info.plist
4 - 调用cocoa pods run
命令。
"${PODS_ROOT}/Fabric/run" $apiKey $secretKey
编辑:完整脚本
apiKey=$(sed -n '1p' < localFile.txt)
secretKey=$(sed -n '2p' < localFile.txt)
/usr/libexec/PlistBuddy -c "Set :Fabric:APIKey string $apiKey" $(PROJECT_DIR)/Info.plist
"${PODS_ROOT}/Fabric/run" $apiKey $secretKey
答案 1 :(得分:1)
杰克的答案对我不起作用。显然$(PROJECT_DIR)/Info.plist
返回的路径不正确。
但这是一个同时使用Fabric和Google登录的项目的工作示例。(截至2018年7月,此方法在Xcode 9中非常有效)
FabricApiKey=$(sed -n '2p' < app_config.txt)
FabricSecretKey=$(sed -n '4p' < app_config.txt)
GoogleReversedClientId=$(sed -n '6p' < app_config.txt)
INFO_PLIST="$BUILT_PRODUCTS_DIR/$INFOPLIST_PATH"
/usr/libexec/PlistBuddy -c "Set :Fabric:APIKey $FabricApiKey" "$INFO_PLIST"
/usr/libexec/PlistBuddy -c "Set :CFBundleURLTypes:0:CFBundleURLSchemes:0 $GoogleReversedClientId" "$INFO_PLIST"
"${PODS_ROOT}/Fabric/run" $FabricApiKey $FabricSecretKey
这是项目根目录中必须存在的app_config.txt
文件的结构:
FabricApiKey:
your_key_here
FabricSecretKey:
your_secret_here
GoogleReversedClientId:
google_reversed_client_id_here
答案 2 :(得分:0)
@Jake的精彩帖子-谢谢!这是我的变体,它检查机密文件是否存在,并使用Xcode 9.4提供的一些环境变量。
#1/usr/bin/env sh
secretsFile=$PROJECT_DIR/scripts/fabric.secrets
if [ ! -f $secretsFile ]; then
echo "warning: '$secretsFile' not found"
exit 0
fi
apiKey=$(sed -n '1p' < $secretsFile)
secretKey=$(sed -n '2p' < $secretsFile)
/usr/libexec/PlistBuddy -c "Set :Fabric:APIKey $apiKey" $PRODUCT_SETTINGS_PATH
$PROJECT_DIR/Fabric.framework/run $apiKey $secretKey
注意:echo "warning: "
部分将被Xcode检测到,并以黄色警告的形式放入构建日志中。
最后,这是一个预提交的git钩子,用于检查意外将40个字符的十六进制字符串添加到Info.plist
:
#!/usr/bin/env sh
files=$(ls */Info.plist)
git diff --cached --name-status | while read modificationtype thisfile; do
if [ "$modificationtype" == 'D' ]; then continue; fi
for file in $files
do
if [ ! "$thisfile" == "$file" ]; then continue; fi
if egrep '[0-9a-fA-F]{40}' $file ; then
echo "ERROR: API key in file: ${file}"
exit 1
fi
done
done || exit $?