14
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

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

14
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?