ラズパイ赤外線装置に予約機能を追加した話~フロント側~

こんにちは、あかぴです。

以前作成した自室の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アプリの自分のスマホへのインストールができるようになったのでその辺の話をしたいと思ってます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です