It seems to me that Garageband for iOS does not support the userPresets feature for AUv3 extensions. In fact it seems to sabotage the feature somewhat. But I might be wrong. Can someone confirm?
Here are my findings:
I've been working on implementing AUv3 userPresets for my Audio Unit extension.
Everything seems to be going as expected while using my app with AUM; In AUM when the user goes to the section of presets, AUM checks the supportsUserPresets property. If it is true then it read the userPresets property. My app then gives it a list of user presets, and when the user selects one of them ( all numbered -1, -2, -3 etc ) AUM will call currentPreset with one of the negative user patches, requesting to select that user patch. When user chooses to save a user preset and store it inside the plugin, AUM will call saveUserPreset, passing along the name the patch should have. It uses patch number 0 to indicate that it is up to the plugin to select a new number.
Then I tried it in Garageband, and things got weird.
Garageband never checks the supportsUserPresets property. It also never reads the userPresets property. When the user saves a user patch it first asks the user for a name. After that it sets the currentPreset property ... asking the plugin to select (not save!) the patch with that name and number -1 ( always -1, never -2, -3 or something ). Then it reads the fullState property two times. And it uses this information to store the patch data locally. When recalling a user patch it just sets the fullState property to the data it stored.
So, at first glance it seems that Garageband does not support Apple's own userPatches feature, since it does not access supportsUserPresets or userPresets. But if even seems to sabotage its own userPatches feature by selecting patch number -1, potentially changing the fullState, before saving the fullState. So when implementing the currentPreset property you cannot blindly select user patch number -1 when the DAW asks for it. You have to check if the name of user patch -1 matches the name supplied by the DAW. And even then, if by any change the name and number checks out you will select a patch that overwrites the userpatch that the user wants to save.
This, or I am missing something, and that is also a good possibility.