将 Fabric/Crashlytics 与开源应用程序一起使用的最佳实践?
Best practice for using Fabric/Crashlytics with open-source app?
我有一个 iOS 应用程序要开源。我不想在应用程序上线时将我的密钥和秘密包含在 运行 脚本代码中,原因很明显。
什么是既能继续使用 Fabric/Crashlytics 又能保证这些密钥安全以便只有能够部署该应用程序的人才能访问这些凭据的最佳方式?
这里有一个方法:
1 - 将结构密钥存储在本地文件中。
<apiKey>
<secretKey>
2 - 在您的 cocoa pods 运行 脚本阶段(在 Xcode 中的构建阶段下),让您的脚本获取 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
注意 -
$(PROJECT_DIR)/Info.plist
可能不是您特定项目的正确路径。
Jake 的回答对我不起作用。显然 $(PROJECT_DIR)/Info.plist
returns 路径不正确。
但这是一个同时使用 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
@Jake 的 post 非常好 - 谢谢!这是我的变体,它检查秘密文件是否存在,并使用 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 $?
我有一个 iOS 应用程序要开源。我不想在应用程序上线时将我的密钥和秘密包含在 运行 脚本代码中,原因很明显。
什么是既能继续使用 Fabric/Crashlytics 又能保证这些密钥安全以便只有能够部署该应用程序的人才能访问这些凭据的最佳方式?
这里有一个方法:
1 - 将结构密钥存储在本地文件中。
<apiKey>
<secretKey>
2 - 在您的 cocoa pods 运行 脚本阶段(在 Xcode 中的构建阶段下),让您的脚本获取 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
注意 -
$(PROJECT_DIR)/Info.plist
可能不是您特定项目的正确路径。
Jake 的回答对我不起作用。显然 $(PROJECT_DIR)/Info.plist
returns 路径不正确。
但这是一个同时使用 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
@Jake 的 post 非常好 - 谢谢!这是我的变体,它检查秘密文件是否存在,并使用 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 $?