MAUIでiOSアプリの開発!

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

アプリ内のフォルダをバックアップ対象外にする方法

アプリ内のLibraryフォルダにDBファイルを作成・保持しているのですが、PCでバックアップした際にDBファイルがバックアップされるので、無理やり中身を確認することができてしまいます。

 

そこでLibraryフォルダをバックアップ対象外にしました。

参考

iOS/Android セキュリティガイドライン - Qiita

xamarin-macios/UrlTest.cs at main · xamarin/xamarin-macios · GitHub

 

 

実装
AppDelegate.cs

var libPath = System.IO.Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal), "../Library");
using (NSUrl url = NSUrl.FromFilename(libPath))
{
   url.SetResource(NSUrl.IsExcludedFromBackupKey, (NSNumber)1);
}

※NSFileManager.SetSkipBackupAttribute
でもバックアップ対象外にできるらしいのですが、うまくいきませんでした。

Xamarin iOS - Disable Back up and Restore for Application - Stack Overflow

xamarin-docs/file-system.md at live · MicrosoftDocs/xamarin-docs · GitHub


メモリリークの対応

Instrumentsではメモリリークの原因・箇所の特定にはいたりませんでしたので、.NETでの一般的なメモリリーク観点で問題がないか、コードのチェックを行いました。

以下のサイトが参考になりました。

michaelscodingspot.com

 

概ねこの内容にそって修正することで解消できたのですが、それでも原因不明でリークする箇所がありました。

 

メイン画面のxamlの中から、サブ画面のxamlを表示しているのですが、サブ画面でListViewやPickerなどのコントロールを使用していると、メモリ解放されずに残り続けていました。

 

色々調べて試した結果、以下の方法で解放されるようになりました。
・サブ画面のxamlからListViewの定義を削除
・サブ画面のxaml.csで画面を表示する箇所で、ListViewをコードで作成して画面に追加
・サブ画面を非表示にする際に、ListViewを削除

 

Xamarinでメモリリークの確認

アプリの連続試験でメモリリークの確認を行うため、XCodeのInstrumentsを使ってメモリ使用量の計測をおこないました。

マウスを自動操作するツールで連続して操作した結果、メモリが増加傾向にあることがわかりました。

リークの解析はXamarim.Profilerというツールが良さそうだったのですが、Enterpriseライセンスがないと使用できません。

Instrumentsでリークの調査も行えるようなので、使ってみました。

 

使い方はこちらを参照
https://docs.microsoft.com/ja-jp/xamarin/ios/deploy-test/using-instruments-to-detect-native-leaks-using-markheap
https://docs.microsoft.com/ja-jp/xamarin/ios/deploy-test/walkthrough-apples-instrument
https://qiita.com/nohirap/items/39ed06c550b6b5c1f247

 

Instrumentsを使ってLeaksの項目を追加しましたが、リークが発生していることは検出できるのですが、詳細情報を見てもどこが原因なのか特定することができませんでした。

ですので、操作しながら「All Heap & Anonymous VM」を見て、メモリが増加して減少しない操作・機能にあたりをつけて、ソースをチェックしていきました。

イベントハンドラの解放漏れ、usingを使っていない、など、C#での基本的な処理不足を修正すると、概ねリークの傾向がなくなるとこまでもっていきました。

まだLeaks項目でリークが検出されているのですが、メモリはほぼ増えてませんので、これで良しとします。

 

ListViewで表示したリストの一番下が切れた状態で表示される

ListViewを使ってリストを作成していますが、リスト表示時にアニメーションでパラパラと表示されるのが嫌だったので、以下の設定でアニメーションなしにしました。

ListView(リスト)を表示した際に、中のコントロールがぱらぱらと追加されていくアニメーションをやめる - Xamarin.FormsでiOSアプリの開発!

すると、表示したリストの一番下が半分切れたような状態で表示されるようになりました。

こちらのサイトを参考に、Xamlの<ListView>のところに

    HasUnevenRows="True"

を追加したところ、切れずに表示されるようになりました。

Xamarin Forms の ListView でコンテキストサイズを変更しても行の高さが更新されない - はつねの日記

XCodeのインストールが遅い

XCodeを13.2にアップデートしましたが、プログレスバーはわずかしか進まず、終わる気配がありませんでした。

インストール中はログが出力されているので、以下のコマンドでログを表示できます。

tail -f /var/log/install.log

 

ログが出力されていれば、まだインストール中です。

 

Xcodeのインストールがとても遅いときに確認したい事 | ソフトアンテナ

XCodeのインストールが遅い

XCodeを13.2にアップデートしましたが、プログレスバーはわずかしか進まず、終わる気配がありませんでした。

インストール中はログが出力されているので、以下のコマンドでログを表示できます。

tail -f /var/log/install.log

 

ログが出力されていれば、まだインストール中です。

 

Xcodeのインストールがとても遅いときに確認したい事 | ソフトアンテナ

デバッグ実行するときに、シミュレータが表示されない

新しいWindowsPCをmacにつなげてVisualStudioでデバッグ実行しようとしましたが、▶のところに通常であればシミュレータの機種・OSが表示されるのですが、「接続」となっており、実行できませんでした。

f:id:murakentake:20201008222913p:plain

XCodeをアップデートしたり、VisualStudioをアップデートしたり修復しましたが、解決せず。

もしかしたらVisualStudioを再インストールしたら直るのかもしれませんが、一応回避策は見つかりました。

ソリューションファイルをクリックしてのVisualStudio起動ではなく、VisualStudioを単体で起動してから、ソリューションファイルを開いてやることで、デバッグ実行欄に表示されるようになりました。