何が起きたか
.NET MAUI(iOS)アプリに、iOSのウィジットを組み込んだアプリで、UserDefaultsの情報が共有されない状態になりました。
色々Try-And-Errorで試していたところ、どうやらアプリやウィジットの署名をしなおすと解決するようだったのでそのときの記録を残しておきます。
環境
このページの作業は、以下の環境で確認しました。
- macOS Ventura (Intel)
- Xcode 15.2
- Visual Studio Code + MAUIの拡張機能
- .NET SDK 8.0.302
- Visual Studio for Mac (インストールしていますが今回はIDEを使用していません)
※当作業時にMac版はすでに提供終了が決まっています
何をして解消したか
.NETでビルドの署名後に、手動でアプリやウィジットを再署名するようにして解消しました。
.csproj
まず、以下の定義を追加し、.NETによる署名後に任意のスクリプトを実行を割り込ませるようにしました。
<Target Name="PostBuild" AfterTargets="_CodesignVerify">
<Exec Command="bash $(MSBuildProjectDirectory)/path/to/resign.sh $(MSBuildProjectDirectory)/$(_AppBundlePath)" />
</Target>
resign.sh
アプリ本体や、ウィジットに対して再署名をする処理を書きました。
以下はウィジットに対してのみ実施していますが、インストール時に問題が起きる場合もあったため、アプリ本体も再署名したほうが良さそうです。
再署名が必要かどうかは、プロジェクトによってまちまちでした。
#!/bin/bash
WIDGET_PATH=$1/PlugIns/widget.appex
rm -fr $WIDGET_PATH/_CodeSignature
rm $WIDGET_PATH/embedded.mobileprovision
cp /path/to/widget.mobileprovision $WIDGET_PATH/embedded.mobileprovision
codesign -f -s "certificate name" --entitlements /path/to/widget.entitlements $WIDGET_PATH
widget.entitlements
再署名の際に使用するEntitlementsファイルを用意しました。
以下は、ウィジットでAppGroupsを使用する場合の例です。適切な内容に書きかえてください。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>application-identifier</key>
<string>TEAMID.com.example.app.widget</string>
<key>com.apple.developer.team-identifier</key>
<string>TEAMID</string>
<key>com.apple.security.application-groups</key>
<array>
<string>group.com.example</string>
</array>
<key>get-task-allow</key>
<true/>
</dict>
</plist>
widget.mobileprovision
再署名時に使用するプロビジョニングプロファイルを用意しました。
Apple Developerから適切なものをダウンロードするだけです。
最後に
上記の状況から推察すると、.NETビルドによる署名の処理に何かしら問題がある可能性が考えられます。ただし、その証跡を得るまでには至っていません。