DeepLinkDispatchにプルリクを出した
どういうライブラリかというと、こちらのスライドがわかりやすいと思う。
とてもシンプルなライブラリ。
こんな感じのプルリクを出した。
上手くいかなかったパターン
今回は以下のようなケースで値が取れなかった
airbnb://foo/baz?marsh[max]=mallow
hoge[max]
の値がnullになってしまっていた。
原因を追う
プルリクの中にも書いたけど、こんな感じ。
DeepLinkDispatchの中でクエリパラメータを取得する時に、
androidについてくるUri
というライブラリを使っていた。
ざっくりと以下のような使われ方をしていた。
import android.net.Uri; String urlString = "airbnb://foo/baz?marsh[max]=mallow"; Uri uri = Uri.parse(urlString); uri.getQueryParameter("marsh[max]"); // null uri.getQueryParameterNames(); // can get key(marsh[max])
getQueryParameter
で値を取得していたのだけど、
それが何故かnullになってしまっていた。
ソース的にはこの辺のはず。たぶん。
んで、デバッグして調べていくと、
この辺でgetEncodedQuery()
した結果がエンコードされていない状態になっていた。
marsh[max]=mallow
一方でキー(marsh[max]
)の方はエンコードされて
marsh%5Bmax%5D
という感じになっているので、その辺でおかしくなって値を取得する部分のif文の中に入らずにおかしくなってしまっている状態だった。
さらに内部実装どうなってるかの見たかったけどどうすればいいかわからなかったー
android.net.Uri
を頑張って修正したとしても既に世間にある端末の中身が全て変更される事はないので、まぁ、ライブラリを変更するのがいいのかなぁと思った。
プルリク
別の方法で実装しなきゃといろいろ調べてみたら、ライブラリの中で
queryParameterValues
という便利メソッドがあったので使ってみた。メソッドが存在しているけど使われてないのが疑問に思ったのだが、社内で使っているものをライブラリとして切り出した時に消し忘れたとかそんな感じなのかなぁ
Mergeされるといいなぁと思うけど、どうなんだろうかー。という感じ。