Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
3
Help us understand the problem. What is going on with this article?
@kouheiszk

Firebaseの新しいSDKを使いたい場合は、Cocoapodsの1.0.0以上を利用する

More than 3 years have passed since last update.

TL;DR

先日公開されたFirebaseの新しいSDKを使いたい場合は、Cocoapodsの1.0.0以上を利用してSDKの導入を行う。
ロギング時のAOPライブラリでAspectsを利用している場合に、エラーが出る場合はMOAspectに乗り換えよう。

悩んだこと

Cocoapodsのバージョン0.39.0で新しくなったFirebaseのSDKをインストールしようとすると、Segmentation fault: 11というエラーが発生してビルドができない。FIRで始まるクラスがコード上に出現しなければ(コメントアウトなどをして)ビルドが成功するので、FirebaseのSDKのインストール方法に問題がありそうな感じだった。

  1. While loading members for 'FIRDatabaseReference' at <invalid loc>
  2. While deserializing decl #101 (PATTERN_BINDING_DECL)
  3. While deserializing decl #2 (VAR_DECL)

解決策

StackOverflowに問題とその解決策があり、Cocoapodsのバージョンが古いことが問題のようだった。
http://stackoverflow.com/questions/37347327/upgraded-firebase-now-getting-swift-compile-error

アップデートしたら無事にコンパイルが成功した。
そんな一日。

おまけ

Cocoapodsの1.0.0を利用すると、スクリーン表示をGoogleAnalyticsに送信する際に利用しているAspects(https://github.com/steipete/Aspects)のインポート時に、エラーが出るようになってしまった。

スクリーンショット 2016-05-23 16.12.03.png

作っているアプリではGAへの送信のためだけにAOPを利用しているので、最悪各ViewControllerのviewWillAppear(_:)においてGAへの送信処理を書けば良いのだが気持よく無いので、代替ライブラリがないか、あるいはAspectsをCocoapodsを1.0.0で利用できるように出来ないか調査することにした。

iOSでAOPを行えるライブラリ

簡単に探した所、上記2つ。

結論

MOAspectsを利用したらすんなりいけた。
UIViewControllerのviewWillAppear(_:)のAfterにHookを設定し、ScreenTrackableというプロトコルに準拠したViewControllerの場合のみ、そのScreenTrackableプロトコルのtrackingというメソッドを実行するようになっている。

func setupHook() {
    MOAspects.hookInstanceMethodForClass(UIViewController.self,
        selector: #selector(UIViewController.viewWillAppear(_:)),
        position: .After,
        range: MOAspectsHookRangeAll) { (instance: AnyObject!) -> Void in
            if let instance = instance as? UIViewController {
                if let viewController = instance as? ScreenTrackable {
                    viewController.tracking()
                }
            }
    }
}

ちなみにScreenTrackableプロトコルはこんな感じ。

UIViewController+ScreenTrackable.swift
protocol ScreenTrackable {
    func tracking()
}

extension ScreenTrackable where Self: UIViewController {
    func tracking() {
        let sceneName = self.sceneName() // クラス名からGAに送信するファイル名を取得する(※1)
        Event.Screen(sceneName).send() // GAに送信
    }
}

クラス名からGAに送信するファイル名を取得する部分(※1)は、http://qiita.com/tattn/items/647e094936287a6bd2d3 などに方法が書かれている。更に、そのままクラス名を送信するのではなく、対応した日本語のスクリーン名に直して送信している。こうすることでGAで格段に見易くなる。

スクリーンショット 2016-05-23 16.24.22.png

3
Help us understand the problem. What is going on with this article?
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
refcome
採用を仲間集めに。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
3
Help us understand the problem. What is going on with this article?