2018年1月30日火曜日

2段階認証を設定した端末が破損したせいで Google アカウントがロックアウトされてしまった

概要

予期せぬことでメインで使っていた iPhone5 がぶっ壊れてしまい別のスマホに乗り換えようとしました
Google アカウントは 2 段階認証を設定しており 2 段階認証に Authenticator アプリを使っていました
iPhone5 が壊れてしまったせいで Authenticator アプリが起動できず 2 段階認証用のコードが取得できずログインできない状態になってしまいました
いろいろと試して何とか Google さんに 2 段階認証の機能を無効にしてもらえたのでその方法を紹介したいと思います

環境

  • iPhone5 + Google Authenticator アプリ

Google の設定

Google の 2 段階認証の設定はメインが Authenticator アプリにしていました
Google の場合 2 段階目の要素はいろいろとあり他には電話番号による SMS 認証やバックアップコードによる認証があります

自分の場合有効にしていたのが

  • Authenticator アプリによる認証
  • バックアップコードによる認証

の 2 つだけでした
しかもバックアップコードをちゃんとメモしておらず今回の状況に陥りました
なので本来であればバックアップコードをちゃんと取得しておけば問題なく 2 段階認証を通過できていたことになります

また、2 段階認証では使っていませんでしたが「電話番号」と「予備のメールアドレス」は設定している状態でした
結果的にこれが 2 段階認証を解除できた決めてになったかもしれません

どうやって 2 段階認証を解除したか

パスワード再設定リクエストを Google に送る

2 段階認証ができないのでログイン画面をいろいろと探していたら「その他の方法」というのがあり、そこから Google のサポートに問い合わせをしてログインできるようになる方法があったのでそれを使いました

内容としてはいろいろと本人確認するための質問をされます
それら質問に答えた後、数営業日後に Google から連絡がきて本人確認できれば無事解除という流れになります
質問される内容は人それぞれのようですが自分の場合以下の 3 つの質問をされました

  • セキュリティ保護用の質問の回答は?
  • Google のアカウント作成日は?
  • 再設定用のメールアドレスに送られた PIN コードは?

1 つ目は Google アカウントに謎の秘密のキーワードを設定していたようでカンで入れたら正解しました
2 つ目のアカウント作成日はまだ Gmail にログインできるセッションが残ったマシンあったので Gmail の一番初めのメールが届いた日付を入力しました
そして 3 つ目は Google アカウントに紐付いた予備のアドレスに 6 桁の PIN コードが送られそこに記載されているコードを入力しました

この 3 つの質問に答えて Google に問い合わせたのが 2018/1/28 で問い合わせが完了すると Gmail に「Google アカウントのパスワード再設定リクエスト」というメールが届きました
google_2auth1.png

当然ですがこの段階ではまだ 2 段階認証は解除されていません

連絡が届いてパスワードを再設定する

自分の場合 2 営業日後の夕方 2018/01/30 に以下のようなメールが Google から届きました
google_2auth2.png

ここのログインを選択するとパスワードを再設定する画面に遷移するので再設定しましょう
どうやらパスワードは必ず再設定しなければいけないようです
ここで注意が必要なのですがパスワードが変わるので Chrome など Google ログインしていたものが一度ログアウト状態になります
再度認証しないと使えないので注意してください

無事 2 段階認証解除

パスワードの変更に成功すると以下の画面になり 2 段階認証も解除されます
google_2auth3.png

最後に

メイン端末が壊れてしまい Authenticator アプリが起動できず Google でロックアウト状態になってしまいましたが何とかアカウントが復旧できたのでよかったです

Google の Authenticator アプリは 1 台の端末でしか有効にできないのが辛いなと思いました
別の iPhone がありそっちにも Authenticator アプリはインストールされていたのですがそっちに表示される PIN コードは使えない状態になっていました
メインを iPhone5 に変えそのときに Authenticator アプリもインストールしたのですがその段階で有効な Authenticator アプリは iPhone5 だけになってしまったようです

今回一番の失敗だったのはバックアップコードをメモしておかなかったことでした
これあればロックアウトにもならず問い合わせする必要もなかったと思います
あとは 2 段階認証の要素を SMS や予備アドレスでの認証も追加しておくべきかなと思いました
ただ、今回の場合、電話番号を持っている iPhone5 で SMS の受信もできない状態だったので SMS での 2 段階認証を有効にしていてもダメだったと思います

不幸中の幸いだったのは「セキュリティ保護用の質問」と「再設定用のメールアドレス」を設定していたことでした
前者は覚えていたのも幸いでした
おそらく今回の解除の決めては後者の方だと思います
ここに送られた PIN コードを問題なく入れらたので個人の特定ができ解除に至ったんだと思います

それにしても解除できて本当によかったです
皆様も 2 段階認証を使う場合は要注意です

2018年1月5日金曜日

「ぶたスラッシュ」アプリサポートページ

「ぶたスラッシュ」アプリサポートページ

butaslash_icon.png

概要

このページは「ぶたスラッシュ」アプリのサポートページです
機能改善、バグ報告、各種問い合わせはこちらのコメントまたは Twitter にてご連絡お願いします

アプリ

iOS 版・・・https://apple.co/2CHhVb4
Android 版・・・提供なし

リリースノート

v1.8

細かい修正を行いました

v1.7

スプラッシュスクリーンの表示を廃止しました

v1.6

インターステイシャル広告を廃止しました
ゲーム終了時にバナー広告を表示します

v1.5

敵と爆弾の当たり判定を修正しました
敵と爆弾が画面外にはみ出すバグを修正しました

v1.4

iPhoneX, Xs, XsMax, XR に最適化しました

v1.3

デフォルトでは音が出ないようにしました

v1.2

スプラッシュ画面がうまく表示されないバグを修正しました

v1.1

効果音を追加しました
ON/OFF できるのでアプリが思い場合は OFF にしてお楽しみください

v1.0

リリースしました

プライバシーポリシー

広告 ID の利用について

ぶたスラッシュ (以下本アプリ) では Admob を使った広告配信をしております。そのため広告 ID と呼ばれる識別情報が使われております。本アプリでは広告 ID は主に広告の配信と Firebase を使った Analytics での情報収集に利用しております。本アプリの主な機能としては使っておりません。収集データはクラウドに収集され厳密に管理されます。個人で管理するデータベースやサーバでは収集しておりません。各クラウドサービスのプライバシーポリシーは以下を御覧ください。

Admob のプライバシーポリシーについてはこちらを御覧ください。
Firebase Analytics のプライバシーポリシーについてはこちらを御覧ください。

2017年12月16日土曜日

LINE スタンプを家族 Slack でも使えるようにしたお話

概要

先日「むすめちゃんスタンプス」という LINE スタンプを公開しました



せっかくスタンプを作成したのですが、前回の記事で紹介したように家族の連絡に LINE を使うのをやめてしまいました
これはもったいないと思い Slack でもスタンプが使えないかなと調べたところ微妙なやり方ですができそうだったのでそのやり方を紹介したいと思います

仕組み

やり方は正直たくさんあると思います
ググってみると同じような内容の記事がいろいろと出てくると思います

今回紹介するのはボットを使う方法です
と言っても大元の機能は Slack にある画像の URL を投稿するとその画像を取得してチャネルに流してくれるという機能を使います
察しの言い方はもうだいたい仕組みがわかると思います

今回の構成は以下の通りです
line_stickers_to_slack1.png

ボットをコマンド形式にする場合 @bot help みたいな感じでボットを呼び出しますが、それだとスタンプを呼ぶのに少し面倒なのである特定の自然言語でコメントするとそのコメントにあった画像のスタンプを投稿する感じにしています
Slack の API はイベント API を使いメッセージの受信のイベントをハンドリングします

ボットは今回 Ruby で作成しました
Slack には Hubot Apps があるので Hubot を使って簡単に作成することもできますが、Ruby が好きなので Ruby で作成しました
あとはそれを Heroku 上で動かします

スタンプ画像をどうやって公開するか

これが一番悩んだかもしれません
Slack に画像の URL を投稿する場合はその URL はパブリックな URL でなければなりません
なので認証がかかっていたり、アクセスできないネットワーク上にある画像では Slack 上に表示することができません

とは言えば自分でサーバを立ててスタンプ画像だけを配信するのも大げさかな、、、
ボットを Heroku 上で動かすのでそのボット上で画像の配信を行ってもよかったのですがボットと画像配信用の Web アプリを同居させるのが面倒くさそうでやめました

で、最終的な結論は imgur にしました
無料で使えて画像への直リンクも取得可能です
また、URL が短いのも魅力でした
Slack に画像の URL をボットが投稿したときに異様に長いとスタンプっぽさがなくなってしまいます

imgur にはアルバムレベルで限定公開できる機能もあるの今回はそれを使って画像をホスティングしてます

ボットを作成する

あとは imgur でホスティングした画像の URL を Slack にポストするボットを作成すれば OK です
今回はコマンドベースではなく自然言語を特定してマッチした場合に imgur の画像 URL を Slack 上にポストします
なので、イベント API を使って message イベントに反応するボットを作成します

一から API をコールしても良いですが Ruby で Slack ボットを作成するための slack-ruby-bot というライブラリがあるのでこれを素直に使います

コードは以下の通りです

  • vim bot.rb
require 'slack-ruby-bot'
require 'json'
SlackRubyBot::Client.logger.level = Logger::WARN

class Bot
  def initialize
    @answer = JSON.parse(File.read('./answer.json'))
  end
  def call(client, data)
    client.say(text: @answer.keys.join(", "), channel: data.channel) if data.text == "へるぷ"
    client.say(text: @answer[data.text], channel: data.channel) if @answer.has_key?(data.text)
  end
end

server = SlackRubyBot::Server.new(
  token: ENV["TOKEN"],
  hook_handlers: {
    message: Bot.new
  }
)
server.run

非常にシンプルに書けるのがうれしいです
別途 answer.json という自然言語と画像の URL を紐付ける設定ファイルを用意しましょう

  • vim answer.json
{
  "えっへん": "https://i.imgur.com/I5OjXAn.png"
}

こんな感じです
これをスタンプ 40 個分追加していきます
エイリアス的なの張りたいのであれば同じ URL に対して別のキーワードを紐付けてあげれば OK です
今回はおまけで「へるぷ」という文字列が来たときには json に記載されているキーワードの一覧を表示するようにしてみました

あとは Procfile なり、Dockerfile なりを準備して Heroku への push or container:push をすれば OK です
Procfile の場合は Web アプリではないので push 後に heroku ps:scale bot=1 的なことをしてあげましょう

ボットが起動したら忘れずに環境変数でトークンを設定してあげましょう

  • heroku config set TOKEN=xoxb-222222222222-xxxxxxxxxxxxxxxxxxxxxxxx

動作確認

Heroku 上にデプロイできたらボットと会話してみましょう
こんな感じで画像 (スタンプ) が表示されれば OK です
line_stickers_to_slack2.gif

問題点

実は今回の方法には大きな欠点があります
それは同じ画像 URL が連投されると Slack さんがその画像を展開してくれないという点です

今回、画像のホスティングに imgur を使ったので URL を変更するのは結構大変なので回避する方法はありません
適当に文字をコメントしてから再度ボットから画像を取得するようにしてください

うーん、やってしまった、、、ごめんなさい

最後に

自作 LINE スタンプを作ったので Slack 上でも使えるようにしてみました
欠点ありですが、個人で使う分にはこのレベルで十分かなと思います
無料ですし簡単な技術しか使っていないので

ついでに宣伝ですが LINE スタンプ出してるのでよろしくお願いします


2017年12月4日月曜日

プライベートの連絡に LINE ではなく Slack に移行した話

概要

家族の連絡にずっと LINE を使っていたのですが、Slack に移行したのでそのメリットやデメリットを紹介したいと思います
ちなみに移行してまだ 2 週間ほどなので、今後更にメリット、デメリットが分かる可能性はあります (その際は追記でもしようかなと)

この手の記事は他の方もいろいろと紹介しているのでこの記事も参考程度に見てもらえればと思います

環境

  • LINE アプリ iOS 版 (iPhone5 + mineo Aプラン)
  • Slack アプリ iOS 版 (iPhone5 + mineo Aプラン)
  • Slack クライアント macOS 版 (10.13.1)

なぜ移行したか

まず初めにそもそも移行が必須というわけではありませんでした
が、日頃 LINE を使う上で少し問題があり「LINE よりも Slack の方が良さそうなんじゃないか」と思い Slack に移行してみました

移行したと言っても完全に移行したわけではなく、あくまでも家族のやり取りを Slack に移行しただけでそれ以外の友人などとはこれまで通り LINE を使っています

移行する上で問題だったことや逆に Slack になって問題になったことや導入するにあたって問題だったことを紹介したいと思います

LINE を使う上で問題だったこと

まず日頃から使っていた LINE の問題ですがざっくり以下の通りです
(環境によって発生しないケースもあるらしいのであくまで自分の環境での問題です)

  • 新着メッセージ到着時にプッシュ通知が届かないケースがあった (これが一番)
  • スマホアプリへのログインは 1 アカウント 1 端末しかできない制約がある

それぞれ詳細に説明します

まず 1 つ目のプッシュ通知が届かない問題ですが移行理由としてはこれが一番大きかったかなと思います
いろいろと症状や原因を調べてみると他の人も同じようにプッシュ通知が届かないケースがあり自分だけではないということがわかりました
原因の 1 つに回線や端末、またその組み合わせ等の問題があるようで、もしかすると自分の環境 (iPhone5 + mineo、この環境は家族も同様) が悪かったのかもしれません
アプリを再インストールしたり再ログインをし直したりしてみましたが症状は解消されませんでした

プッシュ通知は届かないわけではないのですが、アプリを開かないと届かないというケースがかなり多かったです
誰かにメッセージを送らないとと思い LINE アプリを起動すると「ブー」と言ってプッシュ通知が届きメッセージを見ると昨日や一昨日のメッセージだったなんてことが結構ありました

リアルタイムで受け取りたいのに、プッシュ通知が届かないとそもそも LINE を使っている意味がないかなーと思った感じです

そして 2 つ目の 1 アカウントでログイン可能なスマホ端末は 1 台までという制約ですがこれも大きな理由の 1 つです
そもそもこの問題がなければ別のスマホに LINE アプリをインストールしてそっちでプッシュ通知を受け取ることができたかもしれません

ご存知の通り Slack アプリではこの制約はありません
いろんな端末に Slack アプリをインストールして 1 つのログインアカウントでそれぞれの端末にログインすることができます
もちろんメンションやチャネルに新規メッセージが来た場合は Slack アプリをインストールしたすべての端末にプッシュ通知が届いてくれます

という感じで LINE で起きていた大きな 2 つの問題は Slack さんを使えば解決できるということが分かり移行した感じです

移行するのにポジティブな理由

上記はネガティブな理由ですがポジティブな理由もあります

  • 作業端末の Mac に Slack クライアントが常駐している
  • 「xx is Typing」の機能が便利
  • Bot やスラッシュコマンド、拡張絵文字が使える

簡単に詳細を説明します
1 つ目の Mac のクライアントが常駐しているというやつですが自分の場合、普段から Slack をプライベートで使っています
そこに家族チャネルを作ってやり取りするようにしました
なので、家族用のチームを新規で作成するということはしていません
メッセージのプッシュ通知はスマホにも届きますが、Mac のクライアント側にも届きます
作業中は主には Mac とにらめっこしているので返信もそのまま Mac でできます
返信のためにわざわざスマホでアプリを起動する必要がないので楽です
クライアントアプリって話であれば LINE にも Mac 用のクライアントアプリがあるのでそれを常駐させれば良いだけという話ではあるのですが、それだと自分しか解決に至らないのでダメでした

2 つ目の「xx is Typing」は LINE にはない機能で普段家族とメッセージをやりとりするのに必須だとは思っていませんが、あると意外と便利だということに気が付きました
LINE の場合たまーに返信が早すぎて話が前後することがあったのでそれを回避することができます
これは心理的な問題でもあるので必須ではないですが個人的にはあったほうがやりやすいなと思いました

3 つ目の Bot やスラッシュコマンド、カスタム絵文字ですがこれも Slack にしかない機能かなと思います
今のところ家族 Slack で Bot やスラッシュコマンドが必要なケースはほとんどありませんが、今後使っていこうかなと思います (後述)

ポジティブな理由はそんな感じです

Slack に移行して問題になったこと

では逆に Slack に移行して問題になったことを紹介します

  • スタンプがない
  • Slack のアカウント取得からアプリの設定をやってあげないと導入は厳しい

それぞれ詳細に説明します
1 つ目のスタンプ問題は言わずもがなかと思います
Slack には絵文字の機能があるのでそれで代用することは可能です
可能ではあるのですが完全に代用というわけにはいきません
絵文字がない場合、普段スタンプのみの会話で済んでいたのが、スタンプがないために文字の会話にせざるを得ません

また、例えば家族用に自分で頑張ったスタンプがある場合にも使うことができません
どうしても使いたい購入したスタンプがある場合も同様です

ただー Slack には Bot やスラッシュコマンドの機能がありこれらを使えば「スタンプっぽいこと」を実現することは可能です
ご存知の通り Slack には画像の URL を投稿するとそこから画像を取得してポストしてくれるという機能があります
これを使って画像をスタンプを配信するサーバなり Bot を構築してあとはそれらを GET するスラッシュコマンド or Bot のコマンドを作成すれば OK です
自分も今試し中なのでやり方や使い勝手が分かれば別記事で紹介したいと思います

そして 2 つ目のアカウント取得ですが、これはやって上げることをオススメします
家族のみんながネットリテラルがある程度あり「Slack アカウント取得したら教えて」というレベルのお願いでやってくれるのであれば何ら問題はないですが「Slack?は?」「アカウント取得?は?」という感じなのであれば正直全部やってあげるのが最善だと思います
もちろん言葉でやり方を説明してやらせることは可能ですが、それでも難しいと思います
いずれやってくれるかもしれませんが導入障壁を上げるだけなので素直にやってあげましょう
メールアドレスの認証はさすがにやってもらうしかないので「自分のアドレスに確認の URL が届いてるからちょっとタップしてもらえる」と言って一緒に画面を見ながらやってもらいました
あとは好きなチームに invite して家族チャネルに invite してあげれば OK かなと思います

たぶん家族 Slack を導入するにあたっての一番の障壁はここだと思うので頑張ってやってあげましょう

最後に

家族の連絡を LINE をやめて Slack に移行したので、そのメリット、デメリットを紹介しました
今のところ問題なく使えているので今後も Slack でやっていこうと思っています
たぶんフリープランだけで事足りると思います
過去のメッセージを全部辿りたい場合やたくさん Bot を入れたいなどあれば別ですが、まぁないと思います

今後も使い続けて更に何か分かればまた紹介したいと思います

2017年11月18日土曜日

「ぶた忍者」アプリサポートページ

「ぶた忍者」アプリサポートページ

butaninja_icon.png

概要

このページは「ぶた忍者」アプリのサポートページです
機能改善、バグ報告、各種問い合わせはこちらのコメントまたは Twitter にてご連絡お願いします

アプリ

iOS 版・・・https://apple.co/2yShowP
Android 版・・・提供なし

プライバシーポリシー

広告 ID の利用について

ぶたスラッシュ (以下本アプリ) では Admob を使った広告配信をしております。そのため広告 ID と呼ばれる識別情報が使われております。本アプリでは広告 ID は主に広告の配信と Firebase を使った Analytics での情報収集に利用しております。本アプリの主な機能としては使っておりません。収集データはクラウドに収集され厳密に管理されます。個人で管理するデータベースやサーバでは収集しておりません。各クラウドサービスのプライバシーポリシーは以下を御覧ください。

Admob のプライバシーポリシーについてはこちらを御覧ください。
Firebase Analytics のプライバシーポリシーについてはこちらを御覧ください。

リリースノート

v1.11

細かい修正を行いました

v1.10

スプラッシュスクリーンの表示を廃止しました

v1.9

インターステイシャル広告を廃止しました
ゲーム終了時にバナー広告を表示します

v1.8

スプラッシュスクリーンを修正しました

v1.7

手裏剣の調整をしました

v1.6

iPhoneX 系のデバイスでのバグを修正しました

v1.5

iPhoneX, Xs, XsMax, XR に最適化しました
iOS10 以上のみサポートするように変更しました

v1.4

レート機能を追加しました
これでだいたい完成です

v1.3

ステージ 5 から 8 まで追加しました
遊び方の説明ページを追加しました
登場する敵、アイテムの一覧を確認できるページを追加しました

v1.2

新ステージを追加しました
ステージ 2, 3, 4 で新たに Level16 まで遊べます
ステージ 5, 6, 7, 8 も今後追加予定です

v1.1

Exp が正常に表示されないバグを修正しました

v1.0

リリースしました

2017年8月24日木曜日

「ぶたもり2D」アプリサポートページ

「ぶたもり2D」アプリサポートページ

butamori_icon.png

ぶたもり2D の LINE スタンプが登場しました!

概要

このページは「ぶたもり2D」アプリのサポートページです
機能改善、バグ報告、各種問い合わせはこちらのコメントまたは Twitter にてご連絡お願いします

アプリ

iOS 版・・・http://apple.co/2wGgBl5
Android 版・・・提供なし

攻略動画

Youtube で攻略動画を公開しました

他のステージの攻略動画もあります
ぶたもり2D 攻略動画

リリースノート

v1.22

細かい修正を行いました

v1.21

スプラッシュスクリーンの表示を廃止しました

v1.20

インターステイシャル広告を廃止しました
ゲーム終了時にバナー広告を表示します

v1.19

土台の当たり判定のバグを修正しました

v1.18

コインボーナスの交換に必要なコインの枚数を大幅に減らしました
黄色のぶたが結合できる条件を修正しました

v1.17

ぶたの当たり判定を修正しました
青ぶたが重なるバグを修正しました

v1.16

お手本の動画を表示する際のバグを修正しました

v.1.15

UI の修正をしました

v1.14

ゴールドの条件の文言追加

v1.13

iPhoneX, Xs, XsMax, XR に最適化しました
iOS10 以上のみサポートするように変更しました

v1.12

スコアの計算方法にバグがあったので修正しました
タイトルロゴに文字枠を付与しました

v1.11

スプラッシュ画面を追加しました

v1.10

タイトルのロゴをポップな感じに変更しました
効果音を追加しました

v1.9

iPhoneX に対応しました

v1.8

すべてのログインボーナスを実装しました
すべてのコインボーナスを実装しました
次のバージョンで iPhoneX 対応します、すいません

v1.7

初級、中級、上級ステージを 9 つまで増やしました
コイン制度を導入しました
コインで交換できるアイテムを 3 つ (タイトルレインボー、ログイン、称号) を解放しました
またリファクタリングしました

v1.6

超上級を解放しました
初級、中級のステージを追加しました
コイン制度を導入しました
リファクタリングしました (xcode9 対応)

v1.5

iOS8 以上の端末で動作するように対応しました
タップ時のぶたを落下させる挙動を調整しました

v1.4

ボーナス一覧画面で回数が正しく表示されないバグを修正しました
遊び方からプライのお手本動画を表示できるようにしました
インタースティシャル広告をぶっこみました

v1.3

上級ステージを追加しました
ログインボーナスの要素を追加しました (ストック機能)
※ボーナス一覧で「ストック機能」の達成回数が 7 日になっていますが正しくは「14」の間違いです
実際は 14 回ログイン後に解放されます
次バージョンにて修正予定です

v1.2

データの保存方法を UserDefaults から Realm を使うように変更しました
これでアプリをバージョンアップした際にデータがクリアされないようになりました
タイトルにログインボーナス一覧へのツールチップを配置しました

v1.1

ログインボーナス機能を追加しました
物理エンジンのチューニングを行いました
App プレビューを更新しました
Firebase/Analytics を導入させていただきました

がこのバージョンにアップデートするとスコアが 0 にクリアされてしまうバグが確認されています
現在修正中で次のバージョンからデータがクリアされなくなるため、現在のバージョンでプレイしたデータも次のバージョンにアップデートしたときにクリアされてしまいます
申し訳ございません

v1.0

リリースしました
ステージは中級まで遊べます

プライバシーポリシー

広告 ID の利用について

ぶたスラッシュ (以下本アプリ) では Admob を使った広告配信をしております。そのため広告 ID と呼ばれる識別情報が使われております。本アプリでは広告 ID は主に広告の配信と Firebase を使った Analytics での情報収集に利用しております。本アプリの主な機能としては使っておりません。収集データはクラウドに収集され厳密に管理されます。個人で管理するデータベースやサーバでは収集しておりません。各クラウドサービスのプライバシーポリシーは以下を御覧ください。

Admob のプライバシーポリシーについてはこちらを御覧ください。
Firebase Analytics のプライバシーポリシーについてはこちらを御覧ください。

2017年8月10日木曜日

Firebase のリアルタイムデータベース + iOS で「could not cast value of type __NSArrayM」が発生した

P.S 2017/08/15

公式に質問したところ回答をいただいたので記載します
日本語で質問したんですが、日本語で丁寧に回答いただきました (ありがとうがございます)
一応回答をブログで公開して良いという了承も得ています
結論としてどうやら今回の現象は仕様のようです

開発ご担当者様

お世話になっております。

> リアルタイムデータベースで json 情報を登録する際にキーが数字の json を登録しました 
> コンソール上では問題なく数値のキーとして登録されているのですが、コンソールから json をエクスポートすると null の配列としてエクスポートされてしまいました 
> この現象がバグなのか仕様なのかを知りたいです 

こちらの現象は仕様となります。
キーに文字列が含まれている場合、JSONで返却されます。
数字キーの半分以下に対して、数値が有る場合、ArrayではなくJSONで返却されます。
数字キーの半分以上に対して、数値が有る場合、Arrayで返却さます。

以下に例を記載致します。
例:(screen1.png)
Rand5の中に、登録されているキーは 1,2,5 となっています。最大の数字は 5 であり、すべてのキーは0,1,2,3,4,5(6個)になります。半分のキー(3/6)が登録されているため、Arrayで返却されます。
Rand6の中に、登録されているキーは 1,2,6 となっています。最大の数字は 6 であり、すべてのキーは0,1,2,3,4,5,6(7個)になります。しかし、半分のキー(3/7)が登録されていないため、JSONで返却されます。

詳細資料は https://firebase.googleblog.com/2014/04/best-practices-arrays-in-firebase.html にご参照くださいますようお願い致します。

> In particular, if all of the keys are integers, and more than half of the keys between 0 and the maximum key in the object have non-empty values, then Fire> base will render it as an array. This latter part is important to keep in mind.

また、他にご質問ございますたらご連絡くださいますようお願い致します。
以上、よろしくお願い致します。

公式のブログで紹介していたんですね、、、
さすがにたどり着けませんでした

概要

Firebase のリアルタイムデータベースからデータを取得して Swift 上で処理しようとしたらタイトルのエラーが発生しました
結果的にプログラム側ではなく Firebase 側の挙動 (仕様?) がおかしいということが判明したので紹介します

環境

  • Firebase (2017/08/10 時点)
  • Xcode 8.3.3 (8E3004b)

Firebase の挙動がおかしい、、、

どういう挙動かというと本来インポートしたい json データが Firebase にインポートされると null として扱われてしまうという現象になります

実際に確認してみました
まず 2 つの json ファイルを用意します

  • cat success.json
{
        "5" : [ "a" ],
        "6" : [ "b", "c", "d" ],
        "7" : [ "e", "f", "g" ],
        "8" : [ "h" ],
        "9" : [ "i" ],
        "20" : [ "" ]
}
  • cat fail.json
{
        "5" : [ "a" ],
        "6" : [ "b", "c", "d" ],
        "7" : [ "e", "f", "g" ],
        "8" : [ "h" ],
        "9" : [ "i" ]
}

数字をキーに持つ単純な json ファイルです
値には配列で文字列を持っています

これを Firebase のコンソールからインポートしてみます

  • success.json

success.png

  • fail.json

fail.png

はい、コレだけ見るとどちらも予期したとおりにデータが入っています
ちゃんと数字のキーがありその中に配列情報が格納されています
Firebase では配列情報に自動でインデックスが振られるのは仕様です

で、ここからが問題なのですが、そのままコンソールでそれぞれの json をエクスポートしてみましょう
ここでエクスポートできる json は API で取得できる json のフォーマットと同じデータになります

するとなんと

  • cat success-export.json
{
  "5" : [ "a" ],
  "6" : [ "b", "c", "d" ],
  "7" : [ "e", "f", "g" ],
  "8" : [ "h" ],
  "9" : [ "i" ],
  "20" : [ "" ]
}
  • cat fail-export.json
[ null, null, null, null, null, [ "a" ], [ "b", "c", "d" ], [ "e", "f", "g" ], [ "h" ], [ "i" ] ]

fail-export.json になぞの null 文字が連なっています!
本当は success-export.json みたいにハッシュでキーが数値で値が配列でエクスポートしてほしいのですが、なぜか配列でかつ null が並んでいて、その後に値の配列が並んだ状態でエクスポートされてしまいます

当然 Swift で取得できる json も上記の null が並んだ json になってしまうのでタイトルの could not cast value of type __NSArrayM が発生していました
本来は NSDictionary で来ることを想定した書き方をしているため該当のエラーが発生します

これは仕様なのかバグなのか

success.json はキーの数字が 5 から 9 と並んだあとに 20 が来ています
fail.json はキーの数字が 5 から 9 と連番で並んでいます
おそらく連番で並んでいるというのが原因 (仕様 or バグ) だと思います

試しに 5 から 8 のあとに 10 を記載したら問題なく json のハッシュ形式でエクスポートできました

  • cat revised_fail.json
{
        "5" : [ "a" ],
        "6" : [ "b", "c", "d" ],
        "7" : [ "e", "f", "g" ],
        "8" : [ "h" ],
        "10" : [ "i" ]
}

また、10 ではなく ab などの文字列でも問題なくエクスポートできました
Firebase ではインポートする際の json をリアルタイムデータベースに格納するために自動でフォーマットして格納します
おそらくその際のアルゴリズムで連番の場合には null 埋めするという謎の仕様がありそれに引っかかったんだと思います

ちょっと調べた感じだとその旨が記載されたドキュメントは見つかりませんでした
仕様ということであれば仕方ないので連番を使わないようにするか 05, 06 のように先頭を 0 埋めして登録するしかありません
バグということであれば是非改善してほしいなと思っています

そもそも数値をキーにするなという問題もありますが、、、

最後に

Firebase のリアルタイムデータベースの謎の挙動を追ってみました
おそらく仕様だと思います
が、知らないと完全にハマリます

問い合わせ窓口的なのがあれば問い合わせてみようかなと思っています
結果わからばコメントなどで追記しようかなと思っています