【问题标题】:Best practice for using Fabric/Crashlytics with open-source app?将 Fabric/Crashlytics 与开源应用程序一起使用的最佳实践?
【发布时间】:2018-07-07 09:31:56
【问题描述】:

我有一个即将开源的 iOS 应用。当应用程序上线时,我不想在运行脚本代码中包含我的密钥和秘密,供所有人查看、分叉、下载等,原因很明显。

什么是仍然使用 Fabric/Crashlytics 并确保这些密钥安全的最佳方式,以便只有可以部署应用程序的人才能访问这些凭据?

【问题讨论】:

标签: ios crashlytics google-fabric


【解决方案1】:

这是一种方法:

1 - 将结构密钥存储在本地文件中。

<apiKey>
<secretKey>

2 - 在您的可可豆荚运行脚本阶段(在 Xcode 中的构建阶段下),让您的脚本从本地文件中获取 api 密钥和密钥。

apiKey=$(sed -n '1p' < localFile.txt)
secretKey=$(sed -n '2p' < localFile.txt)

3 - 在可可豆荚运行脚本阶段使用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 可能不是您特定项目的正确路径。

【讨论】:

  • 这一切都在一个运行脚本中吗?
  • 是的。应该已经有一个带有 cocoa pods run 命令的运行脚本。使用上面的代码编辑该运行脚本(可能需要稍作调整)。
  • 谢谢,现在正在处理。看看需要调整的地方
  • 这对我不起作用,问题源于Info.plist 的路径,我找到了解决方案并发布了另一个答案。
  • 出现错误:- 由于未捕获的异常“FABException”而终止应用程序,原因:“[Fabric] Info.plist 键“Fabric”的值必须是 NSDictionary。 *** 首先抛出调用栈:
【解决方案2】:

杰克的回答对我不起作用。显然$(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

【讨论】:

  • 出现错误:- 由于未捕获的异常“FABException”而终止应用程序,原因:“[Fabric] Info.plist 键“Fabric”的值必须是 NSDictionary。 *** 首先抛出调用栈:
【解决方案3】:

@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 检测到,并作为黄色警告放入构建日志。

最后,这是一个 pre-commit git 钩子,用于检查意外添加到 Info.plist 的 40 个字符的十六进制字符串:

#!/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 $?

【讨论】:

    猜你喜欢
    • 2011-06-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-06
    • 2021-03-15
    • 1970-01-01
    • 2010-10-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多