edo1z blog

プログラミングなどに関するブログです

FirestoreでiOSだけデータが取れない (T_T)

firestoreにiosのchromeとかsafariからアクセスすると、データ取得できないものがある。全部じゃないんだけど。PCのブラウザだと全く問題なく取れる。なんで??? alertでどこまで動いてるか確認したら、get()まで来てる。firestoreのget()。

const ref = db.collection('hoge')
alert('Start')
const snapshot = await ref.get()
alert('End')

上記だと、Startは表示されるんだけど、Endが全く表示されない。 表示されないけど、エラーにもならない。つまりここで動作が止まってる、awaitから返ってこないみたいな感じになっている。

AndroidとiPadを確認してみます。AndroidはOK。PCと全く同じ挙動。iPadはiPhoneと同じ挙動。ただのWEBアプリなのにiOSで動かない。chromeでもsafariでも。 ログインしてuserを取得するといったことは普通に出来る。しかし、userの取得完了前に、別のデータを取ろうとすると、どっちもawaitから返ってこなくなる。 ログイン+ログインuser取得まではloadingさせて、その後、他の処理を始めるようにしてもダメだった。なんでuserとか他のデータ取れるのに、もっといえば同じコレクションのデータが取れているのに、一部取れないものがあるのか??

whereを使っているからかな?違う点はそこだけな気がする。

whereを外したら取得できた。なんでiOSだけwhere使うと止まっちゃうのだろうか???複合インデックスとかいうのは取得済みなのだが。 ちなみにiOSのバージョンは、iPhoneは、12.4.1。iPadは、12.2。

where自体はいけるなあ。timestamp的なやつかな。日時をwhereで比較しているコードを入れるとダメだな。

const start = new Date('2000-01-01')
const ref = db.collection('hoge')
  .where('date', '>=', start)
const snap = await ref.get()

上記のような感じだが、これでiOSのみref.get()が終わらないで止まる。 FirestoreはTimestamp型というやつで、Date型とは違う。Timestamp型に対して、.toDate()とすることで、Date型になるので、比較方法を改める必要があるのかもしれん。でもPCとかAndroidだと全く問題なく動いてる気がするのだが、気のせいなのだろうか。

試しにこれもやってみたけど、ダメだった。。。。。

const ref = db.collection('hoge')
  .orderBy('date', 'asc')
  .startAt(start)
  .endBefore(end)

では仕方ない、timestampなしで、whereとかが使えるか確認します。 あーできる、普通のnumberならできる。timestampの比較方法を調べればいいのかな。

これか???

firebase.firestore.Timestamp.fromDate(new Date("December 10, 1815"))

そういえば、DateとTimestamp違うのにDateと比べるの変なんだけど、そもそもデータ登録時にDate型入れてた。勝手にTimestampに変えたりしてくれるのかもしれないけど、表面的には変だな。Timestamp型を入れて、Timestamp型と比べればさすがにiOSも怒らないだろー。

ダメでした。。。。なんだこりゃ?? 仕方ないのでFunctions使うか、20190915みたいな文字列を使うかでやろうと思います (T_T)