こんにちは、あかぴです。
以前作成した自室のIoT化の派生で、予約機能を実装してみました。
今回はフロント側。詰まった所、詰まされた所を覚え書き。
前回
Raspberry Piの3つの使い方
実装の概要
フロント側の実装も素朴。予約用ページを作って元の画面と自由に行き来できるようにする。予約ページ上で予約したい日時を入力した状態でボタンを押すと予約用phpファイルにPOSTリクエストを飛ばす。その辺のロジックはほぼ流用できた。特筆すべきは日時の入力にDatePickerとTimePickerを使ったこと。これがXamarinFormsの凄いところで、各プラットフォームの日付指定UIと時間指定UIを使うことができる。
DatePickerとTimePickerのデータバインディング
Xamarinでは設計方針としてMVVMを用いるのが主流であり、自分もそれに則って作成している。それを補助するフレームワーク(Prism)とかもあるが、MVVMの練習も兼ねているので全部自力で実装している。
さて、MVVMではUIとロジックを分離するためにデータバインディングという仕組みを用いる。テキストボックスならString型変数にバインディングすれば良いというのはわかるが、DatePickerやTimePickerは何型になるのだろうか。結論を言うと
DatePicker:DateTime型
TimePicker:TimeSpan型
だった。
Andoroid上でのみ発生した不具合と原因と対策
起こったこと
HTTPリクエストを飛ばす所で「定義してない関数を呼んだ」という旨のエラーが出た。
これは前回作った時には起こらなかったが、当時のソースを呼び出してコンパイルしても同様の症状が出たため環境側の問題であると予想された。
原因
デバッグした結果、SSLのオレオレ証明書を通すためにHttpClientのServerCertificateCustomValidationCallbackにコールバックを設定している所で上記エラーが出ていることがわかった。
HttpClientライブラリが古いものになっており、
ServerCertificateCustomValidationCallbackフィールドが存在しないことに原因があるらしい
NuGetで再インストールしたり、参照を変更したり試したものの変わらず
ここで実際に呼ばれているライブラリはXamarin.Andoroidが互換のあるものをいい感じに持ってきてくれているわけなのだが、Xamarinのアップデートに伴い参照の優先度が変わってしまい古いものが呼ばれるようになったものと思われる。
対策
結局依存関係クリアにできなくて別環境でビルドしたら一発で通った。
自分はもともとVS2017で作業をしていたが、VS2019から該当リポジトリにチェックアウトして作業することにした。
自分の環境のVS2017 のXamarinが壊れたということだったのかもしれない。
次回予告
Xamarinの本領発揮、iOSアプリの自分のスマホへのインストールができるようになったのでその辺の話をしたいと思ってます。