MAUIでiOSアプリの開発!

MAUIを使ったiOSアプリの開発についての技術的なメモです。

MauiのiOSでGIFアニメーションが動かない

XamarinのときはGIFアニメーションは動作していたのですが、MauiではiOSの場合に動かなくなっていました。

どうやらMauiのバグのようです。

[Bug] Animated GIF files do not play on iOS/macOS · Issue #866 · dotnet/maui · GitHub

 

回避策として、GIFアニメーションの場合はXamarin.Formsのレンダラーを使うようにすれば動くようになります。

 

GifImage.cs
Imageクラスを継承しただけのGifImageクラスを作成します。

 

public class GifImage : Image
{
}

 

Maui.Program.cs
GifImageクラスを使用する場合は、Xamarin.Formのレンダラーを使うように設定します。

 

・・・
.ConfigureMauiHandlers(handlers =>
{
#if IOS
    handlers.AddCompatibilityRenderer(typeof(GifImage), typeof(Microsoft.Maui.Controls.Compatibility.Platform.iOS.ImageRenderer));
#endif
})
・・・

 

MainPage.xaml
GifImageクラスを使用してアニメーションGifを表示します。

 

<local:GifImage
    Source="anime.gif" IsAnimationPlaying="True"
/>

WebViewのカスタムコントロールを作る

Xamarinで開発したときはiOSのWkWebViewと使うためにRendererを使って実装していましたが、MAUIに移行したらJavaScriptが実行されなかったり問題が色々でました。
ハンドラーを使った実装を調べました。

 

https://stackoverflow.com/questions/73217992/js-net-interact-on-maui-webview
こちらの書き込みに色々試した形跡があり、サンプルコードもありました。
https://github.com/nmoschkin/MAUIWebViewExample

 

これらを参考にして、Sourceプロパティを扱えるようにし、C#からJavaScript実行できるようにしてみました。

※ひとまず動作してはいますが、あまり詳しくないので変なコードになっていてもご容赦ください。

 

MainPage.xaml
C#からJavaScriptを実行するためのボタンを追加

MainPage.xaml.cs
・ViewModelのSourceプロパティへの設定を、MyWebViewのSourceプロパティの設定へ変更
・追加したボタンのクリックイベントを作成し、MyWebView.EvaluateJavaScriptAsyncでJavaScriptを実行する処理を追加

HyblidWebView.cs
・IHybridWebViewの継承元をIView→IWebView
・HybridWebViewの継承元をView→WebView
・Sourceプロパティ関係の記述を削除

HybridWebViewHandler.cs ※iOS
・Sourceプロパティ関係の記述を削除
・HybridWebViewHandlerクラスの継承元をViewHandler→WebViewHandlerに変更
・PropertyMapperを定義し、Sourceプロパティををマッピング
・コンストラクタにMapperとCommandMapperを渡す
・JSBridgeクラスでhybridRenderer.VirtualViewにアクセスするときにHybridWebViewにキャストする。


WebViewHandlerに定義がないプロパティ(今回の場合はSource)を使いたい場合は、PropertyMapperでマッピングを追加しないといけません。
EvaluateJavaScriptAsyncはWebViewHandlerに定義があるので、マッピングしなくても使えます。

MAUIでカスタムコントロールを使う

Xamarinでカスタムコントロールを使っていたのですが、MAUIでは方法が変わっていました。
Rendererではなくハンドラーを使って実装するのが主流のようです。

こちらを参考にしました。

Create custom controls with .NET MAUI handlers - .NET MAUI | Microsoft Learn

MAUI で独自のコントロールを作る方法のメモ

MAUIのカスタムコントロールの所感

MAUIのコントロールをカスタマイズする方法 - Qiita

Customizing Controls in .NET MAUI - .NET Blog

[Enhancement] (HybridWebView) - Invoke C# code from JavaScript · Issue #6446 · dotnet/maui · GitHub

Creating a .NET MAUI Maps Control

 

iPadで入力した¥マーク

iPadで入力した文字が半角英数字記号かをチェックする為に、以下の正規表現を使っていました。

 

[ -~]+

 

シミュレータのテストでは特に問題ありませんでしたが、iPadの実機を使ってテストしていたろころ、¥だけがチェックに引っかかりました。

 

シミュレータではPCのキーボードを使って¥を入力していましたが、iPadやシミュレータのソフトキーボードで¥を入力すると、Windowsの¥(バックスペース)とは異なる文字のため、正規表現で期待通りに動作していませんでした。

 

それなので、チェックする直前に¥マークをバックスペースに置換してからチェックを行うようにしました。

 

checkString = checkString.Replace((char)165, '\\');