質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

942閲覧

Firebaseでonlineの監視

tonosam

総合スコア14

Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2019/08/29 18:16

firebaseのrealtimedatabaseを用いて以下コードでonline/offlineの取得を実装しました。

swift

1let database = Database.database() 2 let uid = Auth.auth().currentUser!.uid 3 // ".info/connected"という接続状況に応じて値の変わる特別なパスを監視 4 database.reference(withPath: ".info/connected").observe(.value) { snap in 5 let connected = snap.value as? Bool ?? false 6 print("connected: (connected)") 7 if !connected { 8 return 9 } 10 let statusRef = database.reference().child("status").child(uid) 11 // 接続が確立されたら、オフラインになったタイミングで更新したい処理を予約、 12 statusRef.onDisconnectSetValue([ 13 "state": "offline", 14 ]) 15 {(error, _) in 16 // stateをonlineに変更 17 statusRef.setValue([ 18 "state": "online", 19 ]) 20//以下でcloudStoreの方にもonlineが反映できている(しかし、offlineを伝えられない) 21 self.db.document(self.user!.uid).updateData([ 22 "state": "online" 23 ]) 24 }

上記コードではしっかりとrealtimedatabaseの方には反映されています。

しかしながら上記ではcloudStoreにonlineのデータしか渡すことができず、realtimedatabaseの方がofflineになったとほぼ同時にcloudbatabaseにもofflineのデータを渡したいのですがどのように実装したら良いのでしょうか?
解答よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

offlineになったら、offlineなので、当然ながらデータを送れないです。

通常はofflineになったら、データを待避所に保存するとか、
データの送信ボタンをinactiveにするとか
そういうことを想定して設定されているコードだと思いますよ。

offlineなのにデータを送りたいっていうのは当然無理ですよね。

直前にっていうのも結局無理ですね。
ユーザーがiPhoneをフライトモードなどに変更する場合は
技術的に言うと可能かもしれませんが、Apple(iOS)的には不可能ですね。

電波のない地域・場所に入るなどは、
そもそも予測できないことなので、きっかけを得る方法はないです。
よって、トリガーとなるコードの書き方がなくできません。

リソースの無駄遣いですが、最悪、1分間隔で通信して、
onlineから1分以上経過しているなら、offlineと判断するのは可能です。
他の方法で一番一般的なのはサーバサイドでのプログラミングが必要となります。

投稿2019/09/01 13:41

編集2019/09/01 13:54
hameji

総合スコア1380

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tonosam

2019/09/01 16:19

成る程。かなり参考にさせて頂きました。 inactive処理の場所にデータ送信の処理を記載することにより解決できました! <code>swift func applicationDidEnterBackground(_ application: UIApplication) { //省略// } </code>
hameji

2019/09/01 16:25

foregroundにない時、アプリのactiveUserでないとしたいと言うことですね。 そう言う意味で言うと、 applicationWillEnterForegroundの時は 再度activeUserに変えるのを忘れないで下さいね。 だいたいその2つはセットですから。
tonosam

2019/09/01 18:28

ご指摘ありがとうございます。 指摘いただいた通りに実装したところ思い通りにデータ管理できるようになりました。 func applicationWillEnterForeground(_ application: UIApplication) { //略// }
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問