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 flottant

  • category 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èvement

  • progress (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",
}