macOS dotnet MAUI Apple Script実行

dotnet MAUI AppleScript

Visual Studio for Mac Preview 17.3MAUIプロジェクトで Apple Scriptを実行する方法です。

新しいプロジェクトで、 .NET MAUI アプリプロジェクトを 作成後

新規プロジェクト
新規プロジェクト

メイン画面に テキストボックスとボタン追加

作成したプロジェクト内に「MainPage.xaml」があるので下記のように編集する。

テキストボックスと、 ボタンを追加
テキストボックスと、 ボタンを追加

「MainPage.xaml」のコードは下記を追加する。

<HorizontalStackLayout HorizontalOptions="Center">
<Entry
	x:Name="TextField1"                
	Text="" HorizontalOptions="Center" WidthRequest="200"/>
<Button Text="Execute Script" Clicked=""></Button>
</HorizontalStackLayout>

MAUIの場合、 テキストボックスは<Entry />です。

ボタンイベントを作成

「MainPage.xaml」作成したButtonのClicked=””の空部分で、 コントロール+スペースで「New Event Handler」を選ぶ

MAUI Button Event
Button Event

「MainPage.xaml.cs」C#コード側にボタンイベントが作成されました。

各プラットフォームに対応するコードを記述していく

プロジェクト内 Platformsは、 Android, iOS, MacCatalyst, Tizen, Windows フォルダがあり、

それぞれに対応するコードが書ける。

この5つのプラットフォームに ダミークラスを用意する。

TUtils.csを各プラットフォームに作成する
TUtils.csを各プラットフォームに作成する
public class TUtils : IUtils
{
	public string ScriptExecute(string text)
	{
		return "";
	}
}

MacCatalystフォルダ内のTUtils.cs↓だけ中身を書く

using System;
using Foundation;
public class TUtils : IUtils
{
	public string ScriptExecute(string text)
	{
		try
		{
			NSDictionary d1;
			var scrpt = new NSAppleScript(text);
			var exe = scrpt.ExecuteAndReturnError(out d1);
			if (d1 == null)
			{
				string s = exe.StringValue;
				return s;
			}
		}
		catch (Exception _e)
		{
			Console.WriteLine(_e.Message);
		}
		return "";
	}
}

MainPage.xaml近くに共通するIUtilsインターフェイスを作成する。

public interface IUtils
{
	public string ScriptExecute(string text);
}

MainPage.xamlのボタンから作成した関数ScriptExecute()を呼び出す。

先程作成したイベント MainPage.xaml.csのButton_Clicked()の中を、 下記に編集する。

void Button_Clicked(System.Object sender, System.EventArgs e)
{
	var u1 = new TUtils();
	TextField1.Text = u1.ScriptExecute("set value to \"Execute AppleScript.\"");
}

上記コードのScriptExecute()引数の文字列に、 簡単な文字を返すだけのAppleScriptコードを入れました。

macOSで実行するので、 「MacCatalyst フォルダ」にあるTUtilsクラスが呼ばれます。

実行画面

下↓のようにボタンを押すとAppleScriptが実行されました。

アプリ実行
アプリ実行

macOS .NET MAUI タイマーを使った時計表示

MAUIアプリ タイマーで時計表示

Visual Studio 17.3 Preview版 MAUIプロジェクトで Timerを使い XAMLのLabelに時計を表示する。

Visual Studio for 2022 Macは、下↓のURLからダウンロードできます。

https://visualstudio.microsoft.com/ja/vs/mac/

Preview版は、 現時点バージョン17.3で MAUIアプリの プロジェクトが作成できます。

新規プロジェクト作成 .NET MAUI アプリ
新規プロジェクト作成 .NET MAUI アプリ

メインの XAML画面で「タイマーを使った時計表示」

MAUIアプリプロジェクトを作成すると、デフォルトで下のアプリが実装されています。

初期実装されているアプリ

この画面の「Hello, World!」Label部分を時計表示に変えるコードです。

上記の画面は「MainPage.xaml」です。

下記は、「MainPage.xaml.cs」です。

コンストラクタにタイマーとイベントを追加しています。

public partial class MainPage : ContentPage
{
	int count = 0;

	public MainPage()
	{
		InitializeComponent();
        new Timer((state) =>
        {
            try
            {
                Dispatcher.Dispatch(() =>
                {
                    try
                    {
                        Label1.Text = DateTime.Now.ToString();
                        SemanticScreenReader.Announce(Label1.Text);//これいらん?
                    }
                    catch (Exception _e)
                    {
                        Console.WriteLine(_e.Message);
                    }
                });
            }
            catch (Exception _e1)
            {
                Console.WriteLine(_e1.Message);
            }
        }, null, new TimeSpan(0), new TimeSpan(0, 0, 1));
    }
}

TimerSystem.Threading.Timerです。

この、Timerイベントから 直接 Label1.Textの値を 変更すると ぶつかります。

イベント内の、Dispatcher.Dispatch()の 中で Label1.Textの値を変更しています。

macOS アプリ削除 で残ってしまうゴミ保存データ削除

macOS アプリ削除 で残ってしまうゴミ保存データ削除

macOS上の、 アプリを削除しても 次に同じアプリをインストールした場合 保存されたデータが 残っていて 以前の設定でアプリが使えてしまうことがあります。

これは、 アプリが macOS内に 何かデータを書き込んでいることになります

その一つが、 UserDefaults です。

この機能を使えば、 アプリのプログラム内部で 簡単にデータ保存利用できます。

アプリの UserDefaults データを 削除する方法です。

UserDefaultsの保存場所

各ユーザーカレントの中に、 「Library」という アプリのデータを保存するフォルダが隠されています。 この「Library」はターミナルから確認することが可能です。

open ~/Library
open ~/Library

上記コマンドで Finderの[ライブラリ]が 開きます。

Finder ライブラリ

その中に [Preferences]フォルダがあり、 そのフォルダを開くと アプリで保存したplistがあります。

[Preferences]フォルダ
[Preferences]フォルダ

たくさんの plistが入っています。 その中から要らないアプリ名を探します。

そのままゴミ箱ではなく、ターミナルから下記のコマンドを実行し削除します。

ターミナルから defaultsコマンドで 保存情報削除

defaults delete com.xxxxxxx

上記で削除する場合 plist拡張子は なしです

これで アプリの UserDefaultsは削除できました。

削除せず確認だけ行う場合は、ターミナルから 下記のコマンドを実行します。

defaults read com.xxxxxxx

このコマンドで、保存内容を確認することもできます。