Lors de l'envoi de la mise à jour de mon application Appel sur Mac, Apple m'a refusé cette mise à jour au motif que le bouton Réglages ne fonctionnait pas. Il faut dire que mon application est une application IOS qui fonctionne sur Mac avec MACCATALYST, c'est à dire un peu comme dans un simulateur. Jusque là, Apple n'avait jamais fait de remarque sur ce sujet, il y a dû y avoir des changements de politique de test.
C'est un peu gonflé de la part d'Apple, puisqu'une application IOS n'a pas forcément de réglages systèmes, ni de réglages tout court. Or, MACCATALYST crée le menu système avec une entrée "Réglages" par défaut, sans que le développeur n'ai rien demandé. Mais il n'y a pas d'action par défaut... C'est idiot, autant ne pas mettre l'entrée du tout.Bon, ceci étant dit, il faut tout de même gérer la chose. On ne peut pas le faire dans l'éditeur de ressource (ce que l'on ferait avec une application MacOSX), le menu ne se trouve dans aucune ressource, il est créé à la volée par le système. Il faut donc agir dessus en programmation.
Heureusement, nous avons un point d'entrée. Dans notre AppDelegate.m nous devons ajouter une fonction :
- (void)buildMenuWithBuilder:(id<UIMenuBuilder>)builder;
Cette fonction est appelée lors de la construction du menu, et permet de le modifier. Il reste cependant quelques difficulté que n'ont pas résolus correctement mon copilote (perplexity.ai). Le problème principal est une question de définition de ce qu'est un menu, puis de ce qu'est une action, puis de ce qu'est un raccourcit clavier.
Un menu est normalement un bouton qui ouvre une liste de boutons, non ? Et bien non. Un menu peut ne pas avoir de bouton et contenir une seule action qui prend la place du bouton d'ouverture du menu. Donc un menu peut-être un bouton, Mais dans un menu Apple, les boutons qui font autre chose qu'ouvrir une liste sont des actions, c'est pour cela qu'un bouton est en fait une action contenu dans un menu vide.
Commençons par créer une action qui ouvre les préférences (avec une fonction showPreferences à nous) :
// Créer l'action pour ouvrir les préférences
UIAction *action = [UIAction
actionWithTitle:@"Réglages..."
image:nil
identifier:nil
handler:^(__kindof UIAction * _Nonnull action) {
[self showPreferences:nil];
}];
// Créer le menu de préférences
UIMenu *preferencesMenu = [UIMenu menuWithTitle:@""
image:nil
identifier:nil
options:UIMenuOptionsDisplayInline
children:@[ action ]];
UIKeyCommand *key = [UIKeyCommand keyCommandWithInput:@","
modifierFlags:UIKeyModifierCommand
action:@selector(showPreferences:)];
key.title = @"Réglages...";
UIMenu *old = [builder menuForIdentifier:UIMenuPreferences];
key.title = old.children.firstObject.title;
- (void)buildMenuWithBuilder:(id<UIMenuBuilder>)builder {
[super buildMenuWithBuilder:builder];
UIMenu *old = [builder
menuForIdentifier:UIMenuPreferences];
if(old) {
UIKeyCommand *key = [UIKeyCommand
keyCommandWithInput:@","
modifierFlags:UIKeyModifierCommand
action:@selector(showPreferences:)];
key.title = old.children.firstObject.title;
// Créer le menu de préférences
UIMenu *preferencesMenu = [UIMenu
menuWithTitle:@""
image:nil
identifier:nil
options:UIMenuOptionsDisplayInline
children:@[ key ]];
[builder
replaceMenuForIdentifier:UIMenuPreferences
withMenu:preferencesMenu];
}
}
UIKeyCommand *src = (UIKeyCommand*)old.children.firstObject;
UIKeyCommand *key = [UIKeyCommand
keyCommandWithInput:src.input
modifierFlags:src.modifierFlags
action:@selector(showPreferences:)];
key.title = src.title;
Commentaires