Work in progress
The content of this page was not yet updated for Godot
4.2
and may be outdated. If you know how to improve this page or you can confirm
that it's up to date, feel free to open a pull request.
Plugins pour iOS¶
Godot fournit StoreKit, GameCenter, les services iCloud et d'autres plugins. Ils utilisent le même modèle d'appels asynchrones expliqué ci-dessous.
Les accès ARKit et Camera sont également fournis sous forme de plugins.
Dernières mises à jour, la documentation et le code source peuvent être trouvé à l'adresse Godot iOS plugins repository
Accéder aux singletons de plug-in¶
Pour accéder aux fonctionnalités du plugin, vous devez d'abord vérifier que le plugin est exporté et disponible en appelant la fonction Engine.has_singleton(), qui renvoie un singleton enregistré.
Voici un exemple de la façon de procéder dans GDScript :
var in_app_store
var game_center
func _ready():
if Engine.has_singleton("InAppStore"):
in_app_store = Engine.get_singleton("InAppStore")
else:
print("iOS IAP plugin is not available on this platform.")
if Engine.has_singleton("GameCenter"):
game_center = Engine.get_singleton("GameCenter")
else:
print("iOS Game Center plugin is not available on this platform.")
Méthodes asynchrones¶
Lors de la demande d'une opération asynchrone, la méthode ressemblera à ceci :
Error purchase(Variant params);
Le paramètre sera généralement un Dictionnaire, avec les informations nécessaires pour faire la requête, et l'appel aura deux phases. Tout d'abord, la méthode retournera immédiatement une valeur d'erreur. Si l'erreur n'est pas 'OK', l'opération d'appel est terminée, avec une erreur probablement causée localement (pas de connexion internet, API mal configurée, etc). Si la valeur d'erreur est 'OK', un événement de réponse est produit et ajouté à la file d'attente des 'pending events'. Exemple :
func on_purchase_pressed():
var result = in_app_store.purchase({ "product_id": "my_product" })
if result == OK:
animation.play("busy") # show the "waiting for response" animation
else:
show_error()
# put this on a 1 second timer or something
func check_events():
while in_app_store.get_pending_event_count() > 0:
var event = in_app_store.pop_pending_event()
if event.type == "purchase":
if event.result == "ok":
show_success(event.product_id)
else:
show_error()
N'oubliez pas que lorsqu'un appel renvoie OK, l'API produira toujours un événement via l'interface pending_event, même s'il s'agit d'une erreur, ou d'un dépassement de temps du réseau, etc. Vous devriez pouvoir, par exemple, bloquer en toute sécurité l'interface en attente d'une réponse du serveur. Si l'une des API ne se comporte pas de cette manière, cela doit être traité comme un bogue.
L'interface des événements en attente se compose de deux méthodes :
get_pending_event_count()
Renvoie le nombre d'événements en attente dans la file d'attente.Variant pop_pending_event()
Extrait(pops) le premier événement de la file d'attente et le renvoie.
Kit de magasin¶
Implémenté dans le plugin Godot iOS InAppStore plugin.
L'API du Store Kit est accessible par le singleton InAppStore
. Il est initialisé automatiquement.
Les méthodes suivantes sont disponibles et documentées ci-dessous :
Error purchase(Variant params)
Error request_product_info(Variant params)
Error restore_purchases()
void set_auto_finish_transaction(bool enable)
void finish_transaction(String product_id)
and the pending events interface:
::
int get_pending_event_count()
Variant pop_pending_event()
purchase
¶
Acquiert un identifiant de produit via l'API du kit de magasin. Vous devez appeler finish_transaction(product_id)
une fois que vous avez reçu une réponse positive ou appeler set_auto_finish_transaction(true)
avant d'appeler purchase()
. Ces deux méthodes garantissent que la transaction est terminée.
Paramètres¶
Prend un dictionnaire comme paramètre, avec un champ, product_id
, un string avec votre ID de produit. Exemple :
var result = in_app_store.purchase({ "product_id": "my_product" })
Événement de réponse¶
L'événement de réponse sera un dictionnaire avec les champs suivants :
En cas d'erreur :
{
"type": "purchase",
"result": "error",
"product_id": "the product ID requested",
}
En cas de succès :
{
"type": "purchase",
"result": "ok",
"product_id": "the product ID requested",
}
request_product_info
¶
Demande l'information sur le produit dans une liste d'identifiants de produits.
Paramètres¶
Prend un dictionnaire comme paramètre, avec une seule clé product_ids
à laquelle un string array d'IDs de produits est attribué. Exemple :
var result = in_app_store.request_product_info({ "product_ids": ["my_product1", "my_product2"] })
Événement de réponse¶
L'événement de réponse sera un dictionnaire avec les champs suivants :
{
"type": "product_info",
"result": "ok",
"invalid_ids": [ list of requested IDs that were invalid ],
"ids": [ list of IDs that were valid ],
"titles": [ list of valid product titles (corresponds with list of valid IDs) ],
"descriptions": [ list of valid product descriptions ],
"prices": [ list of valid product prices ],
"localized_prices": [ list of valid product localized prices ],
}
restore_purchases
¶
Restaure les achats effectués précédemment sur le compte de l'utilisateur. Cela créera des événements de réponse pour chaque ID de produit acheté précédemment.
Événement de réponse¶
Les événements de réponse seront des dictionnaires avec les champs suivants :
{
"type": "restore",
"result": "ok",
"product_id": "product ID of restored purchase",
}
set_auto_finish_transaction
¶
Si elle a la valeur "true", une fois la transaction réussie, votre transaction sera automatiquement finalisée. Appelez cette méthode avant d'appeler "purchase()``.
Paramètres¶
Prend un booléen comme paramètre qui spécifie si les transactions doivent être automatiquement finalisées. Exemple :
in_app_store.set_auto_finish_transaction(true)
finish_transaction
¶
Si vous ne souhaitez pas que les transactions soient automatiquement finalisées, appelez cette méthode après avoir reçu une réponse positive à un achat.
Paramètres¶
Prend une chaîne de caractères product_id
comme argument. product_id
spécifie sur quel produit finaliser l'achat. Exemple :
in_app_store.finish_transaction("my_product1")
Game Center¶
Implémenté dans le plugin Godot iOS GameCenter.
The Game Center API is available through the GameCenter
singleton. It
has the following methods:
Error authenticate()
bool is_authenticated()
Error post_score(Variant score)
Error award_achievement(Variant params)
void reset_achievements()
void request_achievements()
void request_achievement_descriptions()
Error show_game_center(Variant params)
Error request_identity_verification_signature()
et l'interface des événements en cours :
int get_pending_event_count()
Variant pop_pending_event()
authenticate
¶
Authentifie un utilisateur dans le Game Center.
Événement de réponse¶
L'événement de réponse sera un dictionnaire avec les champs suivants :
En cas d'erreur :
{
"type": "authentication",
"result": "error",
"error_code": the value from NSError::code,
"error_description": the value from NSError::localizedDescription,
}
En cas de succès :
{
"type": "authentication",
"result": "ok",
"player_id": the value from GKLocalPlayer::playerID,
}
post_score
¶
Affiche un score dans le classement du Game Center.
Paramètres¶
Prend un dictionnaire comme paramètre, avec deux champs :
Le
score
est un nombre flottantcategory
une chaîne de caractères avec le nom de la catégorie
Exemple :
var result = game_center.post_score({ "score": 100, "category": "my_leaderboard", })
Événement de réponse¶
L'événement de réponse sera un dictionnaire avec les champs suivants :
En cas d'erreur :
{
"type": "post_score",
"result": "error",
"error_code": the value from NSError::code,
"error_description": the value from NSError::localizedDescription,
}
En cas de succès :
{
"type": "post_score",
"result": "ok",
}
award_achievement
¶
Modifie la progression d'un achèvement du Game Center.
Paramètres¶
Prend un dictionnaire comme paramètre, avec 3 champs :
name
(chaîne de caractères) le nom de l'achèvementprogress
(float) de l'avancement de l'achèvement de 0,0 à 100,0 (passée àGKAchievement::percentComplete
)show_completion_banner
(bool) si le Game Center doit afficher une bannière d'achèvement en haut de l'écran
Exemple :
var result = award_achievement({ "name": "hard_mode_completed", "progress": 6.1 })
Événement de réponse¶
L'événement de réponse sera un dictionnaire avec les champs suivants :
En cas d'erreur :
{
"type": "award_achievement",
"result": "error",
"error_code": the error code taken from NSError::code,
}
En cas de succès :
{
"type": "award_achievement",
"result": "ok",
}
reset_achievements
¶
Efface tous les achèvements du Game Center. La fonction ne prend aucun paramètre.
Événement de réponse¶
L'événement de réponse sera un dictionnaire avec les champs suivants :
En cas d'erreur :
{
"type": "reset_achievements",
"result": "error",
"error_code": the value from NSError::code,
}
En cas de succès :
{
"type": "reset_achievements",
"result": "ok",
}
request_achievements
¶
Demandez tous les achèvements du Game Center sur lesquelles le joueur a progressé. La fonction ne prend aucun paramètre.
Événement de réponse¶
L'événement de réponse sera un dictionnaire avec les champs suivants :
En cas d'erreur :
{
"type": "achievements",
"result": "error",
"error_code": the value from NSError::code,
}
En cas de succès :
{
"type": "achievements",
"result": "ok",
"names": [ list of the name of each achievement ],
"progress": [ list of the progress made on each achievement ],
}
request_achievement_descriptions
¶
Demandez la description de toutes les achèvements du Game Center, quel que soit le progrès réalisé. La fonction ne prend aucun paramètre.
Événement de réponse¶
L'événement de réponse sera un dictionnaire avec les champs suivants :
En cas d'erreur :
{
"type": "achievement_descriptions",
"result": "error",
"error_code": the value from NSError::code,
}
En cas de succès :
{
"type": "achievement_descriptions",
"result": "ok",
"names": [ list of the name of each achievement ],
"titles": [ list of the title of each achievement ],
"unachieved_descriptions": [ list of the description of each achievement when it is unachieved ],
"achieved_descriptions": [ list of the description of each achievement when it is achieved ],
"maximum_points": [ list of the points earned by completing each achievement ],
"hidden": [ list of booleans indicating whether each achievement is initially visible ],
"replayable": [ list of booleans indicating whether each achievement can be earned more than once ],
}
show_game_center
¶
Affiche la superposition intégrée du Game Center montrant les classements, les achèvements et les défis.
Paramètres¶
Prend un dictionnaire comme paramètre, avec deux champs :
view
(chaîne de caractère) (facultatif) le nom de la vue à présenter. Accepte "default", "leaderboards", "achievements" ou "challenges". La valeur par défaut est "default".leaderboard_name
(chaîne de caractère) (optionnel) le nom du classement à présenter. Utilisé uniquement lorsque "view" est "leaderboards" (ou "default" est configuré pour afficher les classements). S'il n'est pas spécifié, le Game Center affichera le classement global.
Exemples :
var result = show_game_center({ "view": "leaderboards", "leaderboard_name": "best_time_leaderboard" })
var result = show_game_center({ "view": "achievements" })
Événement de réponse¶
L'événement de réponse sera un dictionnaire avec les champs suivants :
En clôture :
{
"type": "show_game_center",
"result": "ok",
}