Help us understand the problem. What is going on with this article?

Fabric・Crashlytics の設定をレポジトリにコミットしないでJSONから読み込む

More than 3 years have passed since last update.

Fabric・Crashlytics は大変便利ですが、Fabric Mac app を使ってしまうと勝手にInfo.plistなどにapi keyなどの情報が書き込まれてしまいます。
このままだとパブリックなレポジトリにはコミットできませんし、開発用と本番用で使い分けたい時にも好ましくありません。

ですので、自分は

  1. api key, build secretをjsonファイル書いておく
  2. そのjson自体は.gitignoreに追加してレポジトリにはコミットしない
  3. Build phaseのスクリプト、アプリ起動時にjsonファイルからapi key, build secretを読み込むようにする。

今回はFabric・CrashlyticsはCocoaPods を経由で利用していることとします。

...
pod 'Fabric'
pod 'Crashlytics'
config/fabric.json
{
    "api_key": "api_key",
    "build_secret": "build_secret"
}

みたいなファイルを用意しておいて、xcodeプロジェクトにも追加しておきます。ただ、先述した通りgitレポジトリにはコミットしないようにしておきます。

その上で

起動時にfabric.jsonを読み込んで、Crashlytics.startWithAPIKey() にapi keyをセットします。

FabricConfig.swift
import UIKit
import SwiftyJSON

public class FabricConfig {
    private static let defaultApiKey = "api_key"
    public let apiKey:      String
    public let buildSecret: String
    public init(filePath: String) {
        let data                   = NSData(contentsOfFile: filePath)
        let jsonObject: AnyObject? = try? NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers)
        let json                   = JSON(jsonObject!)
        apiKey                     = json["api_key"].stringValue
        buildSecret                = json["build_secret"].stringValue
    }
AppDelegate.swift
let fabricConfig = FabricConfig(filePath: mainBundle.pathForResource("fabric", ofType: "json")!)
Crashlytics.startWithAPIKey(fabricConfig.apiKey)

次に、Build Phase -> Run scriptで./Pods/Fabric/runを実行してビルド情報をFabric・Crashlyticsのサーバに送信にします。

jsonから読み込んだapi key, build secretを./Pods/Fabric/runの引数に渡せばいいのですが、jsonをパースするのがだるいのでrubyで書きました。

RunScript
if [ -e config/fabric.json ]; then
    ruby scripts/fabric.rb
else
    echo "Running config/fabric.json is not found, do nothing."
fi
scripts/fabric.rb
require 'json'

config = ""
open("config/fabric.json") do |io|
  config = JSON.load(io)
end

if config["api_key"] == "api_key" || config["build_secret"] == "build_secret"
  puts "Skip fabric script because the fabric.json is not set correctly."
  exit
end
run_command = "./Pods/Fabric/run"
success = system("#{run_command} #{config["api_key"]} #{config["build_secret"]}")
if success
  puts "Succeeded in running fabric script"
else
  puts "Failed to run fabric script"
end

これで、Fabric Mac appを使わなくてもCrashlyticsが利用できるようになりました。
また同様に、他の外部WebサービスのためのAPI Keyも同様にjsonから読み込むようにして、レポジトリにコミットしないようにしています。

開発用と本番用のapi keyをスクリプトからサクッと切り替えられるようにすることもできるのでいい感じです。

パブリックなレポジトリにコードを置いている方、
開発用と本番用でapi keyを分けたい方などは参考にしてみてください。

https://github.com/kumabook/MusicFav/
https://github.com/kumabook/MusicFav/blob/master/scripts/make.swift
https://github.com/kumabook/MusicFav/tree/master/config

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away