人気記事

Firebase Swift

Firebase RealtimeDatabaseからデータを取得してiPhoneアプリ上に表示する

更新日:

前回はラズパイに接続したセンサBME280から温度等のデータをFirebaseのRealtimeDatabaseにアップするところまで実施しました。

今回はアップした温度と時間を表示するiPhoneアプリを作りました。

データベースの新しいデータがアップされたら自動的に更新するようにしています。

以下がアプリの画面です。

 

1.FirebaseとXcodeの連携


Firebaseのプロジェクトからアプリを追加でiOSを選択

XcodeのバンドルIDをFirebaseのiOSバンドルIDにコピーする

GoogleService-Info.plistをダウンロードし、Xcodeプロジェクトに追加する。

Firebase側の設定は以上で完了です。

次にXcodeでFirebaseを扱えるよう設定します。まずはFirebaseインストールの前準備としてCocoa Podsをインストールします。

ターミナルを開き、Xcodeのプロジェクトのあるパスにcdして、以下コマンドを実行します。

pod init

以下のようにPodfileが出来上がるので、ファイルに下記を追記します。

  # Pods for firebase_bme280
    pod 'Firebase'
    pod 'Firebase/Auth'
    pod 'Firebase/Database'
 
その後、podからFirebaseライブラリをインストールします。
 
pod install

私の環境では先に以下のコマンドでgitのバッファリング容量を16Mに設定する必要がありました。

git config --global http.postBuffer 16M

FirebaseライブラリがXcodeプロジェクトにインストールされたのでコーディングに移ります。

 

2. データベースからアプリに反映する


AppDelegate.swiftに

・import Firebase

・FirebaseApp.configure()

を追記します。

次にViewController.swiftを以下のように記述します。

<ソースコード>
import UIKit
import Firebase

class ViewController: UIViewController {

    @IBOutlet weak var tempatureLabel: UILabel!
    @IBOutlet weak var timeLabel: UILabel!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        fetchData()
        
    }

    
    func fetchData(){
        
        let fetchDataRef = Database.database().reference()
        
        fetchDataRef.child("environment").observe(.childAdded){(snapShot) in
            
            let snapShotData = snapShot.value as AnyObject
            
            let tempature = snapShotData.value(forKeyPath: "bme280.tempature")
            let record_time = snapShotData.value(forKeyPath: "bme280.record_time")
            
            self.tempatureLabel.text = String(format: "%.2f", tempature as! Double) + " ℃"
            
            self.timeLabel.text = record_time as? String
            
        }
    }
}

ポイントとなるFirebaseからデータを取得している箇所は以下となります。

fetchDataRef.child("environment").observe(.childAdded){(snapShot) in 
let snapShotData = snapShot.value as AnyObject

.childAddedはデータベースにアイテムが追加されたらsnapShotに追加されたアイテムを入れて、in以下の処理が動作します。いわゆるクロージャです。

RealtimeDatabaseは個々のアイテムを参照することはできず、上記のようなイベント発生によってデータを自動的に取り出す機能に役立つのでよくチャットアプリに使われているようです。

今回は、センサデータがデータベースに追加されたらアプリに表示としています。

snapShotの中身をprintしてみますと確かに辞書型のセンサデータが取得できている事が分かります。

あとは辞書型のデータから必要なデータを抜きしてラベルに放り込みます。

データベースは以下のような構成となっています。

なので例えばtempatureを取り出す場合には

snapShotData.value(forKeyPath: "bme280.tempature")

と風にすればOKです。

 

これでbuildしてiPhoneにアプリ作成すれば完成です。

 

以上。

 

 

 

-Firebase, Swift

Copyright© ITエンジニアへの転身 , 2024 All Rights Reserved Powered by STINGER.