How-To: Add Required Entitlements
On Apple platforms (iOS, Mac Catalyst) the Uno storage extension uses the OS Key Chain service to store secrets. This requires your application to have the keychain-access-groups
entitlement to work properly.
Step-by-steps
Important
This guide assumes you used the template wizard or dotnet new unoapp
to create your solution. If not, it is recommended that you follow the instructions for creating an application from the template.
1. Add the Entitlements.plist file
The default location, inside your project, for the new file(s) should be:
- iOS:
iOS/Entitlements.plist
- Mac Catalyst:
MacCatalyst/Entitlements.plist
The content of the file(s) should be:
<key>keychain-access-groups</key>
<array>
<string>$(AppIdentifierPrefix)$(CFBundleIdentifier)</string>
</array>
For more information see Apple's documentation related to the Key Chain.
The variables $(AppIdentifierPrefix)
and $(CFBundleIdentifier)
will be replaced with the correct values at build time. For more information about how the Microsoft .NET SDK works with entitlements you can consult:
2. Add capabilities in your Apple Developer Account
Adding the Entitlements.plist
to your project is not enough. You must also add the capability inside your Apple Developer Account and create a provisioning profile specific for your application. You can follow Microsoft's instructions for both steps:
[!CHEAT] You can use XCode to create a project, go to the Signing and Capabilities, use the same bundle identifier, add the Keychain Sharing capacity (again using the same bundle identifier) then ask Xcode to fix your
Xcode Managed Profile
.
3. Modifying the *.Mobile.csproj
A new property group should be added to your *.csproj
project file. The example below will work for both iOS and Mac Catalyst targets.
<PropertyGroup>
<CodesignEntitlements Condition="$(IsIOS)">iOS\Entitlements.plist</CodesignEntitlements>
<CodesignEntitlements Condition="$(IsMacCatalyst)">MacCatalyst\Entitlements.plist</CodesignEntitlements>
<CodesignKey>Apple Development: Some User (XXXXXXXXXX)</CodesignKey>
<CodesignProvision>Mac Catalyst Team Provisioning Profile: com.companyname.maccatalyst</CodesignProvision>
</PropertyGroup>
The values for the CodesignKey
and CodesignProvision
must match the values from the Apple Developer Portal.
[!CHEAT] If you used Xcode earlier then build the application and get both values from the build logs.
4. Rebuilding your application
Finally rebuilding the application for your target(s) will now code sign your application. This makes the entitlements valid and allows the Key Chain API to work properly at runtime.
5. Troubleshooting
Code signing issues can be difficult to diagnose as the application won't start (or hang) if misconfigured. The operating systems (both iOS or macOS) will log code signing failures. You can see the logs by using Apple's Console.app.