Μετάβαση στο κύριο περιεχόμενο

Ενσωμάτωση Unity SDK

Το Unity SDK τυλίγει τα native SDK του Joryio για iOS και Android. Δεν προσθέτει δική του λογική παρακολούθησης: κάθε κλήση προωθείται στο native SDK, οπότε η συμπεριφορά, η ομαδοποίηση και ο χειρισμός εκτός σύνδεσης είναι ίδια με μια native ενσωμάτωση.

Απαιτήσεις​

  • Unity 2022.3 LTS ή νεότερο. Τα Unity 2021.3 και 2022.1 κάνουν build για Android με JDK 8 και δεν μπορούν να κάνουν compile με το native Android SDK (bytecode Java 11).
  • iOS 14.0+ / Android 6.0+ (API 23)
  • Android: Target API Level 34 ή νεότερο (Player Settings). Οι βιβλιοθήκες AndroidX του native SDK απαιτούν compileSdk 34 και το Android build του Unity αποτυγχάνει με χαμηλότερη τιμή.
  • Android: External Dependency Manager for Unity (EDM4U). Το iOS δεν το χρησιμοποιεί (δείτε Εγκατάσταση).
  • iOS: Xcode 15 ή νεότερο, με πρόσβαση δικτύου στο github.com στο πρώτο build του εξαγόμενου έργου - το Xcode κατεβάζει το native SDK ως Swift package.
  • Για push στο Android: Firebase Cloud Messaging στο παιχνίδι - το πακέτο Messaging του Firebase Unity SDK και το δικό σας google-services.json. Το native Android SDK γίνεται compile με το firebase-messaging αλλά δεν το φέρνει· χωρίς αυτό, τα analytics και τα in-app μηνύματα λειτουργούν και το push μένει ανενεργό.
Υποστηριζόμενες πλατφόρμες

Μόνο iOS και Android. Στις υπόλοιπες - Editor, desktop, κονσόλες - κάθε μέθοδος υπάρχει και δεν κάνει τίποτα, και το SDK καταγράφει μία προειδοποίηση ανά συνεδρία. Ο κώδικας του παιχνιδιού σας δεν χρειάζεται ποτέ #if UNITY_IOS || UNITY_ANDROID γύρω από μια κλήση Joryio.

Εγκατάσταση​

Προσθέστε το package (com.joryio.sdk) από το Git: στο Package Manager επιλέξτε + → Add package from git URL και δώστε το URL με το tag της έκδοσης:

https://github.com/joryio/joryio-unity-sdk.git#1.3.3

Για ενημέρωση, αλλάξτε το tag στη νέα έκδοση. Κλειδώνετε πάντα ένα tag: χωρίς αυτό το Package Manager ακολουθεί το πιο πρόσφατο commit.

Εναλλακτικά, κατεβάστε το joryio-unity-<version>.unitypackage από τη σελίδα releases στο GitHub και εισαγάγετέ το με Assets → Import Package → Custom Package. Το SDK τοποθετείται στο Assets/JoryioSDK· για ενημέρωση, διαγράψτε τον φάκελο και εισαγάγετε τη νέα έκδοση.

Χρησιμοποιήστε έναν τρόπο εγκατάστασης, όχι και τους δύο. Το package από Git URL και ο φάκελος Assets/JoryioSDK έχουν τα ίδια assemblies (Joryio.Runtime, Joryio.Editor) και τα ίδια GUID στα assets, οπότε ένα project με τα δύο δεν κάνει compile. Για να αλλάξετε τρόπο, αφαιρέστε πρώτα αυτόν που έχετε: διαγράψτε το Assets/JoryioSDK ή αφαιρέστε το πακέτο Joryio από το Package Manager. Το .unitypackage φέρνει στο Assets/JoryioSDK και τους όρους άδειας (LICENSE), το README.md και το CHANGELOG.md.

Το package δεν υπάρχει στο OpenUPM, που δέχεται μόνο packages ανοιχτού κώδικα· τα SDK της Joryio διατίθενται με εμπορική άδεια.

Το package δεν περιλαμβάνει προμεταγλωττισμένα native binaries, ώστε οι κοινές βιβλιοθήκες να συμβιβάζονται με ό,τι ήδη χρησιμοποιεί το έργο σας. Φέρνει τα native SDK χωρίς UI - tracking, ταυτότητα και push, αλλά όχι τις native προβολές των in-app μηνυμάτων (δείτε In-app μηνύματα):

  • Android: αφήστε το EDM4U να επιλύσει το io.joryio:joryio-android μέσω Gradle, από το αρχείο δηλώσεων εξαρτήσεων του package (Editor/JoryioDependencies.xml).
  • iOS: τίποτα για επίλυση στο Unity. Όταν κάνετε build για iOS, το package προσθέτει το native SDK στο εξαγόμενο έργο Xcode ως Swift package (https://github.com/joryio/joryio-ios-sdk, ακριβώς στην έκδοση του package) και συνδέει το product Joryio στο UnityFramework. Το Xcode το κατεβάζει και το επιλύει την πρώτη φορά που ανοίγει ή κάνει build το έργο. Ούτε το CocoaPods ούτε το EDM4U εμπλέκονται στο iOS.
Αναβάθμιση από έκδοση που χρησιμοποιούσε CocoaPods

Οι προηγούμενες εκδόσεις έπαιρναν το iOS SDK από το CocoaPods (το pod Joryio/Core), και το CocoaPods trunk σταματά να δέχεται νέες εκδόσεις στις 2 Δεκεμβρίου 2026. Μετά την αναβάθμιση, κάντε μία φορά build του iOS player με Replace αντί για Append, ώστε το εξαγόμενο έργο να μη φέρει πια το παλιό pod, και διαγράψτε κάθε γραμμή <iosPod name="Joryio/..."> από τα δικά σας αρχεία εξαρτήσεων EDM4U.

Γρήγορη εκκίνηση​

Κάθε πλατφόρμα έχει το δικό της SDK key (jry_sdk_ios_..., jry_sdk_android_...), από το Settings → Apps στο dashboard. Χρησιμοποιήστε το API host που εμφανίζεται για το workspace σας.

using Joryio.Runtime;

void Awake()
{
#if UNITY_IOS
const string sdkKey = "jry_sdk_ios_YOUR_IOS_KEY";
#else
const string sdkKey = "jry_sdk_android_YOUR_ANDROID_KEY";
#endif
JoryioSDK.Initialize(sdkKey, "api-eu1.joryio.com");
}

Έπειτα καταγράψτε τι κάνουν οι παίκτες:

JoryioSDK.Track("level_complete", new Dictionary<string, object> {
{ "level", 7 },
{ "duration_seconds", 143.5 },
});

JoryioSDK.Identify("player-1234");
JoryioSDK.SetAttribute("favourite_class", "mage");
JoryioSDK.IncrementAttribute("games_played");

// Another identifier for the same player - works before Identify too
JoryioSDK.AddAlias("steam_id", "76561198000000000");

Οι τιμές διατηρούν τον τύπο τους: το { "level", 7 } αποθηκεύεται ως ο αριθμός 7, όχι ως "7". Τα τμήματα κοινού συγκρίνουν αριθμητικά, οπότε ένας αριθμός αποθηκευμένος ως κείμενο δεν θα ταιριάξει με κανέναν. Κάθε αριθμητικός τύπος διατηρείται, τα ένθετα λεξικά και οι λίστες παραμένουν αντικείμενα και πίνακες, το DateTime στέλνεται ως ISO-8601 σε UTC, και το NaN ή το άπειρο γίνεται null.

Ως τιμή attribute (SetAttribute, SetAttributes, IncrementAttribute), το NaN ή το άπειρο αγνοείται με προειδοποίηση και το attribute μένει ως έχει - δεν διαγράφεται. Η μετατροπή σε null ισχύει μόνο μέσα στις ιδιότητες ενός συμβάντος.

Καμία κλήση δεν πετά εξαίρεση μέσα στο παιχνίδι σας: μια κλήση πριν από το Initialize, ένα υποχρεωτικό όρισμα null ή μια εγγενής αποτυχία καταγράφεται και αγνοείται.

Η εξαίρεση είναι η συναίνεση: τα OptOut(), OptIn() και UpdateConsent() λειτουργούν και πριν από το Initialize. Η απόφαση εφαρμόζεται όταν ξεκινά το SDK, πριν σταλεί οτιδήποτε. Και το IsUserOptedOut() απαντά πριν από το Initialize - δείτε Συναίνεση. Και τα WipeData() και GetTrackingConsent() λειτουργούν πριν από το Initialize, όπως και τα SetSdkAuthenticationToken και SetSdkAuthenticationErrorHandler - δείτε Αυθεντικοποίηση SDK. Το ίδιο και οι αλλαγές συνδρομής και το UnregisterPush(): τα SetSubscription, AddToSubscriptionGroup, RemoveFromSubscriptionGroup και UnregisterPush() που καλούνται πριν από το Initialize κρατούνται στη συσκευή, ακόμη και μετά από επανεκκίνηση, και στέλνονται μόλις ξεκινήσει το SDK. Μια νεότερη αλλαγή του ίδιου καναλιού ή της ίδιας ομάδας αντικαθιστά μια παλαιότερη, ώστε να στέλνεται η τελευταία επιλογή του παίκτη. Μια ανάκληση (απεγγραφή, έξοδος από ομάδα, UnregisterPush()) στέλνεται πάντα: ένα OptOut(), μια συναίνεση Denied ή ένα WipeData() πριν από το Initialize απορρίπτουν τις εγγραφές που κρατούνται, ποτέ τις ανακλήσεις, και μια ανάκληση που έγινε πριν από ένα WipeData() στέλνεται για τον παίκτη που την έκανε, όχι για τη νέα ταυτότητα που δημιουργεί η διαγραφή. Ένα RegisterPushToken πριν από το Initialize δεν στέλνεται και δεν ακυρώνει ένα UnregisterPush() που κρατείται. Μια εγγραφή, ένα opt-in ή μια συμμετοχή σε ομάδα πριν από το Initialize, ενώ ο παίκτης έχει κάνει opt-out ή η συναίνεση είναι Denied (αποθηκευμένη από προηγούμενη εκκίνηση ή ορισμένη σε αυτή), δεν κρατείται καθόλου: απορρίπτεται με προειδοποίηση, και ένα μεταγενέστερο OptIn() ή Granted δεν τη στέλνει.

Μια τιμή null σε attribute δεν είναι σφάλμα: το SetAttribute("clan", null) διαγράφει το attribute, όπως το UnsetAttribute("clan"), σε iOS και Android εξίσου.

Ρυθμίσεις​

Κάθε ρύθμιση είναι προαιρετική και αντιστοιχεί στην ομώνυμη επιλογή των εγγενών SDK. Οι διάρκειες είναι δευτερόλεπτα και το λένε στο όνομά τους, επειδή τα εγγενή SDK διαφωνούν (το iOS παίρνει δευτερόλεπτα, το Android χιλιοστά) - οι γέφυρες μετατρέπουν.

JoryioSDK.Initialize(sdkKey, "api-eu1.joryio.com", new JoryioConfig {
Debug = UnityEngine.Debug.isDebugBuild,
FlushIntervalSeconds = 10,
AnonymousId = existingDeviceId, // only if you already have one
});
ΙδιότηταΤύποςΠροεπιλογήΠεριγραφή
DebugboolfalseΑναλυτικό εγγενές logging. Το εγγενές επίπεδο log το ακολουθεί: debug όταν είναι true, μόνο σφάλματα αλλιώς.
BatchSizeint50Συμβάντα ανά παρτίδα πριν από αυτόματη αποστολή.
FlushIntervalSecondsdouble5Δευτερόλεπτα μεταξύ αυτόματων αποστολών.
SendImmediatelyboolfalseΑποστολή κάθε συμβάντος αμέσως μόλις καταγραφεί, χωρίς παρτίδες (δεν συνιστάται για παραγωγή).
MaxQueueSizeint1000Μέγιστος αριθμός συμβάντων που κρατά η τοπική ουρά όσο οι αποστολές αποτυγχάνουν· πέρα από αυτόν τα παλαιότερα απορρίπτονται.
RequestTimeoutSecondsdouble10Χρονικό όριο HTTP ανά αίτημα.
SessionTimeoutSecondsdouble1800Δευτερόλεπτα αδράνειας πριν ξεκινήσει νέα συνεδρία.
TrackSessionStartbooltrueΑυτόματη αποστολή συμβάντος έναρξης συνεδρίας.
AnonymousIdstringδημιουργείταιΤο δικό σας ανώνυμο id για αυτή τη συσκευή. Χρησιμοποιείται για αυτή την εκτέλεση και αποθηκεύεται μόνο όταν δεν υπάρχει ήδη κάτι αποθηκευμένο, ώστε ένα id που ορίστηκε μία φορά να επιβιώνει αν το παιχνίδι πάψει να περνά την επιλογή.
RequestPushPermissionAtLaunchboolfalseΑίτημα άδειας push κατά το Initialize. Δείτε παρακάτω γιατί η προεπιλογή είναι απενεργοποιημένη.
MaxRetriesint3Επαναλήψεις ανά αίτημα πριν περιμένει την επόμενη αποστολή.
RetryBackoffMsint1000Βασική καθυστέρηση μεταξύ επαναλήψεων, σε χιλιοστά (το όνομα των εγγενών SDK).
TrackingConsentTrackingConsent?null (μη ορισμένο)Η απάντηση της οθόνης συναίνεσης κατά την εκκίνηση. Μη ορισμένο κρατά την απάντηση που θυμάται το SDK (ένα αποθηκευμένο Denied παραμένει άρνηση) και αλλιώς η παρακολούθηση είναι κανονική. Το Granted παρακολουθεί και αντικαθιστά μια αποθηκευμένη άρνηση· το Pending δεν στέλνει τίποτα μέχρι το UpdateConsent(TrackingConsent.Granted), μόνο για την τρέχουσα εκκίνηση· το Denied δεν συλλέγει τίποτα και το θυμάται. Δείτε Συναίνεση.
OptOutboolfalseΈναρξη σε κατάσταση opt-out. Το opt-out αποθηκεύεται, οπότε το false δεν αναιρεί ένα προηγούμενο OptOut().
NotificationChannelNamestringnull ("Notifications")Μόνο Android. Το όνομα του καναλιού ειδοποιήσεων στις ρυθμίσεις ειδοποιήσεων του συστήματος (Android 8+)· περάστε το μεταφρασμένο. Το iOS δεν έχει κανάλια και το αγνοεί.
EnableSdkAuthenticationboolfalseΑποστολή υπογεγραμμένου token με κάθε αίτημα. Δείτε Αυθεντικοποίηση SDK.
SdkAuthenticationTokenstringκανέναΤο token για την έναρξη, αν έχετε ήδη ένα.
AllowHtmlJsInAppMessagesboolfalseΕπιτρέπει στο εγγενές UI να σχεδιάζει μηνύματα HTML. Τα scripts μέσα σε αυτά δεν εκτελούνται· η γέφυρα του εγγενούς SDK χειρίζεται κουμπιά και φόρμες. Δεν επηρεάζει μηνύματα που σχεδιάζει ο δικός σας handler.
HoldInAppMessagesForHandlerboolfalseΑπό την έκδοση 1.3.2. Το παιχνίδι σας σχεδιάζει τα in-app μηνύματα με δικό του handler: κρατά τα μηνύματα που είναι έτοιμα πριν κληθεί το SetInAppMessageHandler. Δείτε Πριν οριστεί ο handler σας.

Το Debug ορίζει και το εγγενές επίπεδο log και την εγγενή λειτουργία debug σε iOS και Android, κάτι που ξεκλειδώνει επίσης τις δοκιμαστικές κλήσεις ResetDisplayedCampaigns και EvaluateInAppCampaigns.

Push notifications​

Αν το παιχνίδι σας δεν έχει ήδη μηχανισμό push, το SDK εγγράφει τη συσκευή μόνο του - στο iOS πάντα, και στο Android όταν το Firebase Cloud Messaging υπάρχει στο παιχνίδι (δείτε Απαιτήσεις). Χωρίς Firebase στο Android δεν υπάρχει FCM token, άρα τίποτα δεν εγγράφεται και το push μένει ανενεργό· τα analytics και τα in-app μηνύματα δεν επηρεάζονται. Ζητήστε την άδεια όταν ο παίκτης έχει λόγο να πει ναι - μια προτροπή στα πρώτα δευτερόλεπτα ενός παιχνιδιού είναι αυτή που απορρίπτεται συχνότερα, και μια άρνηση είναι πολύ δυσκολότερο να αντιστραφεί από μια καθυστέρηση.

JoryioSDK.RequestPushPermission(granted => {
Debug.Log(granted ? "Push enabled" : "Player declined");
});

Το callback εκτελείται στο main thread, ακριβώς μία φορά. Στο iOS το SDK λαμβάνει στη συνέχεια μόνο του το token APNs - δεν υπάρχει app delegate να επεξεργαστείτε.

Στο Android η προτροπή εμφανίζεται από το activity του παιχνιδιού: το GameActivity (προεπιλογή στο Unity 6) ή το κλασικό UnityPlayerActivity (παλαιότερες εκδόσεις, ή έργο Unity 6 που το επιλέγει). Και στα δύο η απάντηση του παίκτη αναφέρεται όταν κλείσει ο διάλογος του συστήματος. Κάτω από το Android 13 δεν υπάρχει προτροπή χρόνου εκτέλεσης, και το callback απαντά αμέσως αν οι ειδοποιήσεις είναι ενεργές.

Αν προτιμάτε το SDK να ρωτήσει ήδη στο Initialize - μια έκδοση soft-launch, ένα παιχνίδι όπου οι ειδοποιήσεις είναι το ζητούμενο, ή απλώς για να δείτε τη ροή - ενεργοποιήστε το στο config:

JoryioSDK.Initialize(sdkKey, "api-eu1.joryio.com", new JoryioConfig {
RequestPushPermissionAtLaunch = true,
});

Είναι απενεργοποιημένο εξ ορισμού, όχι μη διαθέσιμο. Η προτροπή είναι εφάπαξ και στις δύο πλατφόρμες, οπότε η προεπιλογή προστατεύει τη συνήθη περίπτωση· η επιλογή υπάρχει για όποιον αποφάσισε διαφορετικά.

Αν χρησιμοποιείτε ήδη Firebase ή Unity Mobile Notifications​

Τα περισσότερα παιχνίδια το κάνουν, και δύο μηχανισμοί push που διεκδικούν το ίδιο token είναι ο συνηθισμένος τρόπος να σπάσει μια ενσωμάτωση. Κρατήστε τον δικό σας και δώστε μας το token - το APNs device token στο iOS, το FCM registration token στο Android. Στο Android αυτό το token προέρχεται από το Firebase Messaging (ή δικό σας wrapper για FCM): το Unity Mobile Notifications δεν παράγει FCM token στο Android - εκεί προγραμματίζει τοπικές ειδοποιήσεις - οπότε μπορεί να δώσει το token μόνο στο iOS:

JoryioSDK.RegisterPushToken(tokenFromYourExistingStack);

Προσθέστε callback για να μάθετε πώς πήγε - isRetryable σημαίνει παροδική αποτυχία (εκτός σύνδεσης, DNS, 5xx) που αξίζει νέα καταχώριση, isUnauthorized σημαίνει λάθος κλειδί SDK:

JoryioSDK.RegisterPushToken(tokenFromYourExistingStack, result =>
{
if (!result.success && result.isRetryable)
{
// παροδικό (εκτός σύνδεσης, DNS, 5xx): καταχωρίστε ξανά όταν επανέλθει το δίκτυο
}
});

Στο Android το SDK τότε δεν αγγίζει την υπηρεσία FCM. Στο iOS δύο πράγματα συμβαίνουν ακόμη, ώστε να μη σας εκπλήξουν:

  • Το Initialize κάνει το SDK delegate του UNUserNotificationCenter και προωθεί κάθε callback στον delegate που ήταν εγκατεστημένος πριν από αυτό. Αρχικοποιήστε το Joryio αφού το άλλο plugin push ορίσει τον delegate του (το Unity Mobile Notifications το κάνει στην εκκίνηση, οπότε το Awake είναι εντάξει). Ένα plugin που ορίζει τον delegate αργότερα αντικαθιστά αυτόν του Joryio, και τότε η καταγραφή ανοιγμάτων εξαρτάται από τη δική σας κλήση TrackPushClick.
  • Το SDK λαμβάνει μόνο του το token APNs από τον app controller του Unity. Αν δώσετε το ίδιο token και στο RegisterPushToken, δεν βλάπτει - εκτός αν ο παίκτης έχει απενεργοποιήσει τα push, γιατί το RegisterPushToken αναιρεί ένα UnregisterPush() (δείτε παρακάτω).

Το RegisterPushToken ενεργοποιεί ξανά τα push για αυτή τη συσκευή: αναιρεί ένα προηγούμενο UnregisterPush(). Το OnTokenReceived του Firebase καλείται από μόνο του σε κάθε εκκίνηση, οπότε αν το προωθείτε, παραλείψτε το όσο ο παίκτης έχει απενεργοποιήσει τα push στις ρυθμίσεις σας, και καλέστε το RegisterPushToken όταν τα ενεργοποιήσει ξανά. Αλλιώς μια ανανέωση token, και όχι ο παίκτης, αναιρεί την επιλογή του.

Τα UpdateBadgeCount(count) και ClearBadge() ορίζουν το σήμα στο εικονίδιο της εφαρμογής στο iOS. Στο Android δεν κάνουν τίποτα, αφού δεν υπάρχει εκεί API σημάτων.

In-app μηνύματα​

Το αρχείο εξαρτήσεων φέρνει τα native SDK χωρίς UI, οπότε από προεπιλογή τίποτα δεν σχεδιάζει τα in-app μηνύματα: μέχρι να δηλώσετε handler ή να προσθέσετε το native UI, οι καμπάνιες φτάνουν στη συσκευή και δεν εμφανίζονται. Επιλέξτε έναν από τους δύο τρόπους.

Σχεδιάστε τα μέσα στη μηχανή με τα δικά σας γραφικά (προτείνεται για παιχνίδια) - δηλώστε handler:

JoryioSDK.SetInAppMessageHandler(message => {
// Title / Body / ImageUrl / Buttons are the authored content.
// Name is the campaign's dashboard label - never copy to show a player.
myCanvas.Show(message.Title, message.Body, message.ImageUrl);
foreach (var button in message.Buttons)
myCanvas.AddButton(button.Text, () => {
message.MarkClicked(button);
if (button.Action == "url" || button.Action == "deep_link")
Application.OpenURL(button.Url);
else if (button.Action == "request_push_permission")
JoryioSDK.RequestPushPermission(granted => { });
myCanvas.Hide();
message.MarkDismissed(); // the tap closed the message
});
message.MarkDisplayed();
}, canRenderHtml: false);
Η αναφορά είναι πλέον δική σας ευθύνη

Η εγκατάσταση handler σταματά το SDK από το να σχεδιάζει, και από εκείνη τη στιγμή δεν μπορεί να δει τι συνέβη. Καλέστε MarkDisplayed() όταν εμφανιστεί το μήνυμα, και MarkClicked(button) / MarkDismissed() καθώς ο παίκτης ενεργεί. Το MarkDisplayed() αναφέρει μία φορά ανά μήνυμα όσες φορές κι αν κληθεί, και το MarkClicked(button) στέλνει το Id του κουμπιού ως elementId του κλικ, ώστε ο χάρτης κλικ να ξεχωρίζει τα κουμπιά. Ένα κουμπί χωρίς id δεν στέλνει elementId - ποτέ την ετικέτα του, που είναι κείμενο προβολής.

Ένα πάτημα που κλείνει το μήνυμα αναφέρεται και ως τα δύο: MarkClicked(button) και μετά MarkDismissed(), όπως στέλνουν τα native SDK όταν σχεδιάζουν το μήνυμα μόνα τους.

Ένα μήνυμα που δεν αναφέρθηκε ποτέ μετρά σαν να μην εμφανίστηκε ποτέ: καμία εμφάνιση στις αναφορές, τίποτα για να συνδέσει η απόδοση εσόδων, και τα όρια συχνότητας δεν το μετρούν. Η καμπάνια τότε φαίνεται να μην έφτασε σε κανέναν, κάτι που μοιάζει με πρόβλημα στόχευσης και όχι ενσωμάτωσης. Το SDK καταγράφει προειδοποίηση αν ένα μήνυμα απορριφθεί χωρίς αναφορά.

Για να επιστρέψετε τη σχεδίαση στο native SDK - όταν ο renderer σας καταστρέφεται ή μια σκηνή δεν έχει UI για να σχεδιάσει - αφαιρέστε τον handler:

JoryioSDK.ClearInAppMessageHandler(); // ίδιο με SetInAppMessageHandler(null)

Το native SDK τότε σχεδιάζει ξανά τα μηνύματα με τις δικές του προβολές (αν τα UI artifacts του υπάρχουν στο build - δείτε παρακάτω) και αναφέρει στον server τις δικές του δυνατότητες. Είναι το clearInAppMessageCallback των native SDK.

Από ένα component που ίσως δεν είναι ο μόνος renderer - ένας renderer ανά σκηνή, για παράδειγμα - περάστε τον handler που εγκαταστήσατε. Αφαιρείται μόνο αν είναι ακόμη ο εγκατεστημένος, ποτέ ένας handler που εγκατέστησε άλλο script μετά:

void OnDestroy() => JoryioSDK.ClearInAppMessageHandler(myHandler);

Το canRenderHtml περιγράφει τον δικό σας renderer. Ένας απλός καμβάς Unity δεν μπορεί να εμφανίσει περιεχόμενο HTML, που απαιτεί web view. Δεν είναι καλλωπιστικό: οι καμπάνιες στοχεύονται με βάση όσα αναφέρει η συσκευή, και μια μη δηλωμένη δυνατότητα διαβάζεται ως "δεν μπορεί", όχι ως "άγνωστο". Δηλώνοντας HTML που δεν μπορείτε να σχεδιάσετε στέλνετε καμπάνιες σε παίκτες που δεν θα τις δουν ποτέ· παραλείποντας HTML που μπορείτε, στερείτε από τον εαυτό σας καμπάνιες που θα μπορούσατε να εμφανίσετε.

Αν το web view σας αποδίδει μήνυμα HTML με <form data-jry-form>, υποβάλετέ το μέσω του SDK ώστε οι τιμές να γραφτούν στο προφίλ του παίκτη. Οι τιμές είναι συμβολοσειρές, ή λίστα συμβολοσειρών για ομάδα checkbox:

JoryioSDK.SubmitInAppForm(message.Id, new Dictionary<string, object> {
{ "email", "[email protected]" },
{ "topics", new List<string> { "events", "offers" } },
}, result => {
if (!result.ok) Debug.Log(result.message);
});

Το callback εκτελείται πάντα μία φορά· κάθε αποτυχία, και η έλλειψη δικτύου, είναι ok = false.

Πριν οριστεί ο handler σας​

Από την έκδοση 1.3.2. Το SetInAppMessageHandler μπορεί να κληθεί μόνο μετά το Initialize, και ο πρώτος συγχρονισμός μπορεί να τελειώσει νωρίτερα - τότε το native SDK, αν το UI του υπάρχει στο build, σχεδιάζει μόνο του εκείνο το μήνυμα. Ορίστε HoldInAppMessagesForHandler = true στο JoryioConfig για να το αποτρέψετε: ένα μήνυμα που είναι έτοιμο πριν οριστεί ο handler σας κρατείται - δεν σχεδιάζεται, δεν αναφέρεται, δεν μετρά σε κανένα όριο συχνότητας - και δίνεται στον handler σας τη στιγμή που τον ορίζετε. Το ClearInAppMessageHandler() αντί γι' αυτό τερματίζει την αναμονή και το native SDK σχεδιάζει το μήνυμα που κρατήθηκε.

Ή αφήστε το native SDK να τα σχεδιάσει​

Για να σχεδιάζει το native SDK τα μηνύματα μόνο του - ένα overlay σε στιλ λειτουργικού συστήματος πάνω από το παιχνίδι, με αυτόματη αναφορά και χωρίς κώδικα - προσθέστε τα UI artifacts του.

Android: προσθέστε το UI artifact σε δικό σας αρχείο εξαρτήσεων EDM4U, για παράδειγμα Assets/Editor/JoryioUIDependencies.xml, με την ίδια έκδοση με το package:

<dependencies>
<androidPackages>
<androidPackage spec="io.joryio:joryio-android-ui:1.3.3" />
</androidPackages>
</dependencies>

iOS: προσθέστε το scripting define symbol JORYIO_IOS_UI στο Player Settings → iOS → Other Settings → Scripting Define Symbols. Το build για iOS τότε συνδέει επίσης το product JoryioUI του Swift package, στην έκδοση του package.

Ένας handler που δηλώνεται με SetInAppMessageHandler εξακολουθεί να αντικαθιστά τις native προβολές.

Τι μεταφέρει ένα μήνυμα​

Ο handler λαμβάνει ό,τι έστειλε ο διακομιστής, με τα ίδια ονόματα πεδίων που χρησιμοποιεί το SDK του React Native (παλαιότερα λάμβανε μόνο Id και Name, οπότε το παιχνίδι είχε να δείξει μόνο την εσωτερική ετικέτα της καμπάνιας):

ΠεδίοΟρίζεται ότανΣημασία
Id, Name, TypeπάνταId καμπάνιας, όνομα στο dashboard (όχι κείμενο προς εμφάνιση) και modal / banner / slideup / fullscreen / custom.
Kindπάνταnative ή html - ποια από τις παρακάτω ομάδες είναι συμπληρωμένη. Τα IsNative / IsHtml είναι συντομεύσεις.
Title, Body, ImageUrlnativeΤο κείμενο και η εικόνα της καμπάνιας. Τα Title και ImageUrl μπορεί να είναι null· το Body ορίζεται πάντα.
ButtonsnativeΠοτέ null. Κάθε κουμπί έχει Id, Text, Action (dismiss, url, deep_link, request_push_permission) και Url για τις δύο ενέργειες συνδέσμου. Το SDK δεν μπορεί να ενεργήσει σε κουμπί που σχεδιάζετε εσείς: ανοίξτε το URL μόνοι σας, καλέστε RequestPushPermission για την ενέργεια primer και αναφέρετε το πάτημα με MarkClicked(button).
CloseButton, BackdropDismissiblenativeΑν ο συντάκτης ζήτησε κουμπί κλεισίματος και αν το πάτημα εκτός μηνύματος το κλείνει.
StylenativeΟι παρακάμψεις παρουσίασης του συντάκτη, ή null όταν η καμπάνια δεν όρισε καμία. BackgroundColor, TextColor, PrimaryButtonColor, PrimaryButtonTextColor (συμβολοσειρές χρώματος CSS), CornerRadius, FontSize (μέγεθος σώματος - κλιμακώστε τον τίτλο από αυτό), TitleWeight (regular / medium / semibold / bold), TextAlign (auto / start / center / end - το auto ακολουθεί τη γλώσσα του ίδιου του μηνύματος, όχι τη ρύθμιση της συσκευής) και FontFamily. Κάθε πεδίο είναι προαιρετικό και ένα απόν πεδίο σημαίνει κληρονόμηση του στυλ του παιχνιδιού σας· εφαρμόστε όσα υπάρχουν και μην αντικαταστήσετε τα υπόλοιπα με δικές σας προεπιλογές. Το FontFamily είναι βέλτιστης προσπάθειας - εφαρμόστε το μόνο αν το παιχνίδι σας περιλαμβάνει τη γραμματοσειρά. Ίδια πεδία και ονόματα με το message.style του React Native SDK.
Html, CsshtmlΤο έγγραφο. Ένας καμβάς uGUI δεν μπορεί να το αποδώσει - δηλώστε canRenderHtml: true μόνο αν το παιχνίδι φιλοξενεί web view.

Τι δεν μπορεί να αποδώσει το Unity, ξεκάθαρα. Το περιεχόμενο HTML χρειάζεται web view που η μηχανή δεν παρέχει. Οι εικόνες είναι URL: κατεβάστε τις μόνοι σας (UnityWebRequestTexture). Οι παρακάμψεις στυλ του συντάκτη φτάνουν στο Style, αλλά τίποτα δεν τις εφαρμόζει για εσάς - ένας καμβάς δεν έχει θέμα να κληρονομήσει, οπότε ο renderer σας διαβάζει τα πεδία που υποστηρίζει και κρατά το δικό του στυλ για τα υπόλοιπα.

Ξεκινήστε από το δείγμα​

Το πακέτο περιλαμβάνει το δείγμα In-app renderer: μια σκηνή, ένα prefab που αλλάζει εμφάνιση και το script που τα συνδέει. Εισαγάγετέ το από το Package Manager (επιλέξτε το πακέτο Joryio, ανοίξτε Samples, πατήστε Import), βάλτε τα SDK keys σας στο αντικείμενο JoryioInApp του JoryioInAppSample.unity και κάντε build σε συσκευή iOS ή Android. Τα μηνύματα φτάνουν μόνο σε build συσκευής: στον Editor το SDK δεν κάνει τίποτα, οπότε το Play δεν δείχνει τίποτα.

Εγκαταστήσατε από το .unitypackage; Δεν υπάρχει καταχώριση στο Package Manager για εισαγωγή: κατεβάστε το joryio-unity-<version>-sample.unitypackage από την ίδια σελίδα releases και εισαγάγετέ το με τον ίδιο τρόπο. Τοποθετείται στο Assets/Samples/Joryio/<version>/In-app renderer, εκεί όπου το Package Manager βάζει το δείγμα, και χρειάζεται επίσης το com.unity.ugui.

Το prefab είναι το κομμάτι που κάνετε δικό σας - αλλάξτε χρώματα, γραμματοσειρά, βάλτε τα δικά σας γραφικά. Ο renderer σχεδιάζει ό,τι υπάρχει στο πεδίο Panel Prefab (το JoryioInAppPanel.prefab στη σκηνή του δείγματος) και συμπληρώνει τέσσερα παιδιά που βρίσκει με το όνομα: Title και Body (Text), PrimaryButton (αντιγράφεται μία φορά ανά κουμπί της καμπάνιας) και SecondaryButton (το κουμπί κλεισίματος). Οι παρακάμψεις στυλ του συντάκτη εφαρμόζονται από πάνω όπου τις όρισε η καμπάνια. Με το πεδίο κενό, χτίζει ένα απλό panel σε κώδικα.

Τα κουμπιά uGUI χρειάζονται EventSystem, οπότε ο renderer δημιουργεί ένα όταν η σκηνή δεν έχει - με το UI module του Input System όταν αυτός είναι ο ενεργός χειρισμός εισόδου σας, αλλιώς με το παλιό. Το script δείχνει το ένα πράγμα που πρέπει να κρατήσετε: την αναφορά του κύκλου ζωής κάθε μηνύματος. Απαιτεί το com.unity.ugui, που το ίδιο το SDK δεν απαιτεί.

Πότε ένα μήνυμα μετρά ως εμφανισμένο​

Ένα μήνυμα μετρά ως εμφανισμένο - αναφέρεται το in_app.displayed και καταναλώνεται το όριο συχνότητας της καμπάνιας - μόνο όταν το άτομο μπορούσε πράγματι να το δει. Ο χρόνος που πρέπει να μείνει στην οθόνη είναι το IN_APP_DISPLAY_DWELL_MS (1000 ms), η ίδια σταθερά σε κάθε Joryio SDK.

  • Τα μηνύματα που σχεδιάζει το native SDK ακολουθούν τον κανόνα των iOS και Android: εμφανίζονται μόνο σε σταθερή οθόνη στο προσκήνιο και μετρούν μετά από 1 δευτερόλεπτο στην οθόνη με την εφαρμογή στο προσκήνιο. Ένα πάτημα ή κλείσιμο νωρίτερα μετρά ως προβολή· ένα μήνυμα που φεύγει από την οθόνη νωρίτερα δεν μετρά και παραμένει επιλέξιμο.
  • Αν το παιχνίδι σχεδιάζει μόνο του τα μηνύματα, καλέστε το MarkDisplayed() με τον ίδιο κανόνα - JoryioSDK.IN_APP_DISPLAY_DWELL_MS: αφού το μήνυμα είναι ορατό τόσο χρόνο, ή αμέσως πριν από MarkClicked / MarkDismissed όταν ο παίκτης ενεργεί νωρίτερα. Μην το καλείτε για μήνυμα που έφυγε πρώτα από την οθόνη (αλλαγή σκηνής, παύση εφαρμογής).

Δύο ανεξάρτητοι διακόπτες, ίδιοι σε κάθε Joryio SDK:

  • Συναίνεση παρακολούθησης - η απάντηση της οθόνης συναίνεσης: Granted, Denied ή Pending.
  • Opt-out - η επιλογή του ίδιου του παίκτη: OptOut() / OptIn().

Δεδομένα συλλέγονται μόνο όταν η συναίνεση έχει δοθεί και ο παίκτης δεν έχει κάνει opt-out· οποιοδήποτε "όχι" υπερισχύει. Κανένας διακόπτης δεν αλλάζει τον άλλον: το UpdateConsent(TrackingConsent.Granted) δεν αίρει ένα opt-out (μόνο το OptIn() το αίρει), και το OptOut() δεν αλλάζει τη συναίνεση.

Αν ο παίκτης δεν έχει απαντήσει ακόμη στην οθόνη συναίνεσης, ξεκινήστε με συναίνεση Pending: δεν στέλνεται τίποτα - ούτε έναρξη συνεδρίας, ούτε συγχρονισμός in-app, ούτε εγγραφή push - και τα συμβάντα περιμένουν στη συσκευή (έως MaxQueueSize) μέχρι να έρθει η απάντηση.

JoryioSDK.Initialize(sdkKey, apiHost, new JoryioConfig {
TrackingConsent = TrackingConsent.Pending,
});
// όταν απαντήσει ο παίκτης
JoryioSDK.UpdateConsent(TrackingConsent.Granted); // στέλνει όσα περίμεναν
// ή
JoryioSDK.UpdateConsent(TrackingConsent.Denied); // τα απορρίπτει, δεν συλλέγει τίποτα
  • Το Denied απομνημονεύεται μεταξύ επανεκκινήσεων. Αίρεται μόνο με UpdateConsent(TrackingConsent.Granted) ή με ρητό TrackingConsent = TrackingConsent.Granted στις ρυθμίσεις.
  • Αν αφήσετε το JoryioConfig.TrackingConsent μη ορισμένο (η προεπιλογή), μια αποθηκευμένη άρνηση διατηρείται· χωρίς αποθηκευμένη απάντηση το SDK παρακολουθεί κανονικά, άρα ένα παιχνίδι χωρίς οθόνη συναίνεσης δεν χρειάζεται καμία ρύθμιση.
  • Το Pending ισχύει μόνο για την τρέχουσα εκκίνηση και δεν υπερισχύει ποτέ ενός αποθηκευμένου Denied.
  • Μια τιμή εκτός του enum (λάθος cast) αγνοείται με προειδοποίηση· στις ρυθμίσεις θεωρείται μη ορισμένη.
JoryioSDK.OptOut(); // διακοπή συλλογής· τα γεγονότα στην ουρά και οι εκκρεμείς εγγραφές ιδιοτήτων απορρίπτονται
JoryioSDK.OptIn(); // επανεκκίνηση
JoryioSDK.WipeData(); // διαγραφή όλων όσων έχουν αποθηκευτεί στη συσκευή (το opt-out διατηρείται)

Το opt-out αποθηκεύεται και επιβιώνει από επανεκκινήσεις. Για να ξεκινήσει μια συνεδρία ήδη σε opt-out, ορίστε JoryioConfig.OptOut = true.

Το IsUserOptedOut() αντικατοπτρίζει μόνο τον διακόπτη opt-out, όχι τη συναίνεση. Το GetTrackingConsent() επιστρέφει τον διακόπτη συναίνεσης: Granted, Denied ή Pending. Και τα δύο απαντούν και πριν από το Initialize, από ό,τι είναι αποθηκευμένο στη συσκευή: ένα opt-out ή ένα Denied από προηγούμενη εκκίνηση αναφέρεται ως έχει, όχι ως προεπιλογή, και ένα OptOut() / OptIn() που έγινε νωρίτερα στην ίδια εκκίνηση υπερισχύει του αποθηκευμένου opt-out. Το GetTrackingConsent() επιστρέφει Granted μόνο όταν δεν έχει αποφασιστεί τίποτα, που είναι και ο τρόπος που λειτουργεί τότε το SDK.

Όταν αλλάζει το opt-out, το SDK το καταγράφει στο προφίλ του παίκτη ως το boolean χαρακτηριστικό tracking_opted_out, ώστε τα segments να μπορούν να εξαιρούν όσους έχουν κάνει opt-out. Το GetTrackingConsent() αναφέρει τη συναίνεση που κρατά το εγγενές SDK, συμπεριλαμβανομένου ενός Denied που απομνημονεύτηκε από προηγούμενη εκκίνηση.

Αυθεντικοποίηση SDK​

Το token αποδεικνύει ποιος είναι ένας ταυτοποιημένος χρήστης: τα αιτήματα που αναφέρουν user ID πρέπει να φέρουν έγκυρο token. Οι ανώνυμοι επισκέπτες δεν έχουν token να δείξουν, οπότε τα αιτήματά τους γίνονται δεκτά χωρίς αυτό, εκτός αν το workspace ενεργοποιήσει και την αυστηρή ταυτότητα (strict identity).

Σε workspaces με ενεργή αυθεντικοποίηση SDK, κάθε αίτημα φέρει token που υπογράφει ο διακομιστής σας:

JoryioSDK.Initialize(sdkKey, apiHost, new JoryioConfig { EnableSdkAuthentication = true });
JoryioSDK.SetSdkAuthenticationToken(tokenFromYourServer); // μετά τη σύνδεση

JoryioSDK.SetSdkAuthenticationErrorHandler(error => {
// error.reason: missing, invalid, expired, sub_mismatch ή unknown
// error.refreshExhausted: το SDK σταμάτησε να ξαναδοκιμάζει αυτό το αίτημα
FetchFreshToken(token => JoryioSDK.SetSdkAuthenticationToken(token));
});

Τα SetSdkAuthenticationToken και SetSdkAuthenticationErrorHandler λειτουργούν και πριν από το Initialize. Το native SDK ξεκινά με αυτό το token, πριν από το πρώτο του αίτημα, και το κρατά και μετά από ένα WipeData() πριν από το Initialize, ώστε μια απεγγραφή που κρατήθηκε για τον παίκτη που διαγράφεται να φεύγει ακόμη με το δικό του token. Μπορείτε επίσης να δώσετε το πρώτο token στο JoryioConfig.SdkAuthenticationToken.

Ο handler εκτελείται στο main thread. Καλείται για ένα 401 αυθεντικοποίησης στα αιτήματα του τρέχοντος παίκτη, και πριν οριστεί οποιοδήποτε token (reason missing) - ποτέ για τα υπόλοιπα ενός παίκτη που αποσυνδέθηκε, ώστε να μη σας κάνει ποτέ να αποσυνδέσετε τον παίκτη που παίζει τώρα. Τα συμβάντα και οι εγγραφές του τρέχοντος παίκτη που απορρίφθηκαν κρατιούνται και ξαναστέλνονται μόλις ορίσετε νέο token. Τα συμβάντα φεύγουν σε παρτίδες ενός παίκτη τη φορά, και τα συμβάντα και οι εγγραφές ενός παίκτη που αποσυνδέθηκε απορρίπτονται σε κάθε 401 αυθεντικοποίησης (missing, invalid, expired ή sub_mismatch), ώστε να μην καθυστερούν ποτέ του επόμενου παίκτη. Το Reset() βγάζει το token από τη συνεδρία· μένει με τα υπόλοιπα του παίκτη που αποσυνδέεται, και τα αιτήματα του επόμενου παίκτη δεν το φέρουν ποτέ - ορίστε το δικό του token με το SetSdkAuthenticationToken μόλις συνδεθεί. Συμβάντα και εγγραφές που ο παίκτης που αποσυνδέεται είχε ήδη βάλει στην ουρά εξακολουθούν να στέλνονται με το δικό του token, οπότε μια κανονική αποσύνδεση δεν χάνει τίποτα.

E-commerce​

Για εμπορικά συμβάντα χρησιμοποιήστε τον τυποποιημένο tracker αντί για το Track. Εφαρμόζει τα κανονικά ονόματα συμβάντων που διαβάζουν οι αναφορές εσόδων και η απόδοση· ένα όνομα πληκτρολογημένο με το χέρι, όπως "Added to Cart", αποθηκεύεται ως διαφορετικό συμβάν και δεν ταιριάζει με καμία αναφορά.

var item = new EcommerceCartItem { ProductId = "gems_500", Name = "500 gems", Price = 4.99, Quantity = 1 };
JoryioSDK.Ecommerce.AddToCart(item, cartValue: 4.99);
JoryioSDK.Ecommerce.Purchase(new EcommerceOrder {
OrderId = "order-1042",
Items = new List<EcommerceCartItem> { item },
Value = 4.99,
Currency = "USD",
});

Ο tracker έχει τα ίδια είκοσι συμβάντα με το SDK του React Native, από το ViewProduct έως το SubmitReview.

Μια κλήση χωρίς απαιτούμενο όρισμα καταγράφει προειδοποίηση και δεν στέλνει τίποτα - ποτέ ένα κενό ή μηδενικό συμβάν: ένα προϊόν χωρίς ProductId, μια παραγγελία χωρίς OrderId ή Items, ένα κενό αναγνωριστικό παραγγελίας ή κουπονιού, μια κλήση καλαθιού χωρίς τη λίστα ειδών. Ένα ποσό που είναι NaN ή άπειρο (Value, Price, cartValue, Shipping, Tax, Discount, refundAmount, discountAmount) απορρίπτεται με τον ίδιο τρόπο, αντί να καταγραφεί ως 0.

Ταυτότητα και συνεδρία​

Στείλτε τους αριθμούς τηλεφώνου με + και κωδικό χώρας

Στέλνετε πάντα τους αριθμούς τηλεφώνου σε πλήρη διεθνή μορφή (E.164): +, ο κωδικός χώρας και μετά ο αριθμός - για παράδειγμα +972501234567. Ένας αριθμός χωρίς + διαβάζεται με την προεπιλεγμένη χώρα για αριθμούς τηλεφώνου του χώρου εργασίας· αν δεν έχει οριστεί, ή αν τα ψηφία διαβάζονται με δύο τρόπους, αποθηκεύεται ως μη επαληθευμένος και δεν χρησιμοποιείται για μηνύματα. Πώς χειρίζονται οι αριθμοί τηλεφώνου

var (userId, anonymousId) = JoryioSDK.GetIdentity(); // userId είναι null για ανώνυμο παίκτη
var (sessionId, sessionStart, duration) = JoryioSDK.GetSessionInfo(); // duration σε δευτερόλεπτα

Το Reset() αποσυνδέει τον παίκτη: νέο ανώνυμο id, χωρίς user id.

Αναφορά API​

Κάθε δημόσιο μέλος του JoryioSDK, με τα ονόματα των παραμέτρων του. Όλα είναι static και ασφαλή πριν από το Initialize (καταγράφουν και δεν κάνουν τίποτα, και ένα callback απαντά πάλι μία φορά).

Εξαίρεση: οι κλήσεις συναίνεσης, το WipeData() και οι κλήσεις αυθεντικοποίησης SDK ισχύουν και πριν από το Initialize, ενώ οι κλήσεις συνδρομής και το UnregisterPush() κρατούνται μέχρι αυτό.

ΜέθοδοςΤι κάνει
Initialize(sdkKey, apiHost, config = null)Ξεκινά το SDK. Μια δεύτερη κλήση αγνοείται. Ένα κλειδί άλλης πλατφόρμας (τα κλειδιά iOS ξεκινούν με jry_sdk_ios_, τα κλειδιά Android με jry_sdk_android_) απορρίπτεται με σφάλμα και το SDK μένει ανενεργό. Δείτε Ρυθμίσεις.
IsInitializedΑν το Initialize πέτυχε. True και σε εκκίνηση iOS πριν από το πρώτο ξεκλείδωμα της συσκευής: το εγγενές SDK ολοκληρώνει την εκκίνηση με το ξεκλείδωμα και οι κλήσεις στο μεταξύ το περιμένουν. Αν στη συσκευή υπάρχουν ακόμη κλήσεις που κράτησε μια προηγούμενη εκκίνηση, το iOS τις κρατά κι αυτές μη αναγνώσιμες ως εκείνο το ξεκλείδωμα: το SDK δεν συλλέγει τίποτα και κάθε κλήση περιμένει ώσπου να διαβαστούν, και τότε στέλνονται πρώτες και οι κλήσεις που έγιναν στο μεταξύ μετά από αυτές, με τη σειρά. Στο μεταξύ τα GetTrackingConsent() και IsUserOptedOut() αναφέρουν τις αποφάσεις αυτής της εκκίνησης (κλήσεις και JoryioConfig). Χωρίς τέτοια απόφαση, το GetTrackingConsent() αναφέρει Pending, επειδή η αποθηκευμένη συναίνεση δεν μπορεί ακόμη να διαβαστεί, και το IsUserOptedOut() απαντά από το εγγενές SDK, που ίσως να μη βλέπει ως το ξεκλείδωμα ένα opt-out αποθηκευμένο από προηγούμενη εκκίνηση. Όταν στέλνονται οι κλήσεις, εφαρμόζεται η συναίνεση που όρισε ρητά αυτή η εκκίνηση (UpdateConsent πριν από το Initialize, αλλιώς JoryioConfig.TrackingConsent)· χωρίς αυτήν, ισχύει η απόφαση που είναι αποθηκευμένη στη συσκευή, που διαβάζεται μετά το ξεκλείδωμα, όπως στα εγγενή SDK: ένα αποθηκευμένο Denied μένει Denied, και αν δεν υπάρχει αποθηκευμένη απόφαση το SDK είναι σε Granted, όπως σε κάθε άλλη εκκίνηση. Άλλες συναρτήσεις ανάγνωσης, όπως GetUserId(), GetAnonymousId() και GetSessionId(), απαντούν ακόμη από το εγγενές SDK και δεν αντικατοπτρίζουν ακόμη τις κλήσεις που περιμένουν.
SdkVersionΗ έκδοση του SDK, "1.3.3".
Track(eventName, properties = null)Καταγράφει ένα event.
TrackScreen(screenName, properties = null)Καταγράφει μια προβολή οθόνης.
Flush()Στέλνει τώρα τα events της ουράς.
Identify(userId)Ταυτοποιεί τον παίκτη. Όσο ο παίκτης έχει κάνει opt-out ή η συναίνεση είναι Denied, το id απλώς αποθηκεύεται στη συσκευή (δεν στέλνεται τίποτα), ώστε μια απεγγραφή στο μεταξύ να φτάσει στον σωστό παίκτη.
Reset()Αποσύνδεση: νέο ανώνυμο id, χωρίς user id.
AddAlias(label, name)Προσθέτει άλλο αναγνωριστικό, π.χ. ("steam_id", "7656..."). Λειτουργεί και για ανώνυμο παίκτη.
GetUserId() / GetAnonymousId()Τα τρέχοντα ids ("" όταν λείπουν).
GetIdentity()(userId, anonymousId)· το userId είναι null για ανώνυμο παίκτη.
SetAttributes(attributes)Ορίζει πολλά attributes. Μια τιμή null διαγράφει εκείνο το attribute.
SetAttribute(key, value)Ορίζει ένα attribute, κρατώντας τον τύπο του. Μια τιμή null το διαγράφει· το NaN ή το άπειρο αγνοείται.
IncrementAttribute(key, by = 1)Προσθέτει σε αριθμητικό attribute. Το NaN ή το άπειρο αγνοείται.
UnsetAttribute(key)Διαγράφει ένα attribute.
UpdateConsent(consent)TrackingConsent.Granted, Denied ή Pending. Δεν αλλάζει ποτέ το opt-out. Λειτουργεί και πριν από το Initialize. Δείτε Συναίνεση.
OptOut() / OptIn()Σταματά ή ξαναρχίζει τη συλλογή. Αποθηκεύεται μεταξύ επανεκκινήσεων· δεν αλλάζει ποτέ τη συναίνεση. Λειτουργούν και πριν από το Initialize.
IsUserOptedOut()Αν ο παίκτης έχει κάνει opt-out (μόνο ο διακόπτης opt-out). Απαντά και πριν από το Initialize, από την αποθηκευμένη απόφαση.
GetTrackingConsent()Η τρέχουσα συναίνεση: TrackingConsent.Granted, Denied ή Pending (μόνο ο διακόπτης συναίνεσης). Απαντά και πριν από το Initialize, από την αποθηκευμένη απόφαση.
WipeData()Σβήνει ό,τι είναι αποθηκευμένο στη συσκευή. Το opt-out διατηρείται.
SetSubscription(channel, status)Συνδρομή μάρκετινγκ για ένα κανάλι. Δείτε Συνδρομή μάρκετινγκ.
AddToSubscriptionGroup(groupId, channel) / RemoveFromSubscriptionGroup(groupId, channel)Είσοδος σε ή έξοδος από ομάδα συνδρομής.
RequestPushPermission(onResult)Ζητά την άδεια ειδοποιήσεων· onResult(bool granted).
GetPushPermissionStatus(onResult)"granted", "denied", "notDetermined" ή "unavailable".
IsPushEnabled(onResult)Αν οι ειδοποιήσεις είναι ενεργές· onResult(bool).
RegisterPushToken(token, onResult = null)Παραδίδει token από το δικό σας push stack· onResult(PushRegistrationResult).
ReportPushDelivered(trackingId)Αναφέρει ότι έφτασε ένα push (δικό σας push stack).
TrackPushClick(trackingId)Αναφέρει ότι άνοιξε μια ειδοποίηση.
UnregisterPush()Σταματά τα push σε αυτή τη συσκευή. Μένει ανενεργό και μετά από επανεκκίνηση, μέχρι ένα RegisterPushToken (μετά το Initialize) ή ένα αίτημα άδειας. Κρατείται αν κληθεί πριν από το Initialize.
GetDeviceToken()Το push token που κρατά το SDK ("" όταν δεν υπάρχει).
UpdateBadgeCount(count) / ClearBadge()Badge του εικονιδίου στο iOS· δεν κάνουν τίποτα στο Android.
GetSessionId()Το id της τρέχουσας συνεδρίας.
GetSessionInfo()(sessionId, sessionStart, duration)· duration σε δευτερόλεπτα.
SetSdkAuthenticationToken(token)Δίνει υπογεγραμμένο token. Δείτε Αυθεντικοποίηση SDK.
SetSdkAuthenticationErrorHandler(handler)Ειδοποιεί όταν ένα αίτημα απορρίπτεται υπό αυθεντικοποίηση SDK· null σταματά την ακρόαση.
EcommerceΟ typed tracker για e-commerce. Δείτε E-commerce.
SetInAppMessageHandler(handler, canRenderHtml = false)Σχεδιάζετε μόνοι σας τα in-app μηνύματα. Το null επιστρέφει τη σχεδίαση στο native SDK.
ClearInAppMessageHandler()Επιστρέφει τη σχεδίαση των in-app μηνυμάτων στο native SDK.
ClearInAppMessageHandler(handler)Το ίδιο, μόνο αν ο handler είναι ακόμη ο εγκατεστημένος. Ένας handler null καθαρίζει όποιον είναι εγκατεστημένος.
TrackInAppImpression(campaignId, action, elementId = null)Αναφέρει displayed, clicked ή dismissed· το elementId είναι το id του κουμπιού που πατήθηκε. Προτιμήστε τις μεθόδους Mark... του μηνύματος.
SubmitInAppForm(campaignId, values, onResult)Υποβάλλει φόρμα από μήνυμα HTML που σχεδιάζετε· onResult(InAppFormSubmitResponse).
SyncInAppCampaigns()Φέρνει τώρα τις πιο πρόσφατες καμπάνιες.
EvaluateInAppCampaigns() / ResetDisplayedCampaigns()Βοηθήματα δοκιμών· αγνοούνται εκτός αν το Debug είναι ενεργό.

Στο μήνυμα που λαμβάνει ο handler σας: MarkDisplayed(), MarkClicked(button = null) και MarkDismissed().

Build​

Το SDK ρυθμίζει αυτόματα τα εξαγόμενα έργα. Δεν χρειάζεται καμία χειροκίνητη ενέργεια:

  • Xcode: το native SDK ως Swift package (joryio-ios-sdk, συνδεδεμένο στο UnityFramework), έκδοση Swift, ενσωμάτωση του Swift runtime, η δυνατότητα push, το background mode για απομακρυσμένες ειδοποιήσεις, και το UNITY_USES_REMOTE_NOTIFICATIONS στο Classes/Preprocessor.h - χωρίς αυτό το Unity αφαιρεί το callback που παραδίδει το token APNs. Η δυνατότητα push προστίθεται στο υπάρχον αρχείο entitlements του target όταν υπάρχει, ώστε να διατηρούνται τα entitlements άλλων plugins.
  • Android: κανόνες keep για τη γέφυρα Java προστίθενται στο παραγόμενο proguard-unity.txt, ώστε ένα minified release build να κρατά τις μεθόδους που καλεί η C# με το όνομά τους.

Αν οι ειδοποιήσεις δεν φτάνουν ποτέ σε ένα build που κατά τα άλλα λειτουργεί, ελέγξτε ότι υπάρχει η δυνατότητα Push Notifications στο target: είναι η μόνη ρύθμιση της οποίας η απουσία δεν παράγει σφάλμα πουθενά.

Συνδρομή μάρκετινγκ​

Αν επιτρέπεται να στέλνουμε μηνύματα σε αυτό το άτομο σε ένα κανάλι. Διαφορετική συναίνεση από το OptOut(), που αφορά αν επιτρέπεται να το παρακολουθούμε - καμία δεν συνεπάγεται την άλλη.

Αυτό γράφει ένα κέντρο προτιμήσεων μέσα στην εφαρμογή.

JoryioSDK.SetSubscription("email", "unsubscribed");
JoryioSDK.AddToSubscriptionGroup("list_abc123", "email");

Κανάλια: email, sms, whatsapp, push, viber. Καταστάσεις: optedIn, subscribed, unsubscribed.

Απαιτείται αναγνωριστικό - η κλήση παραλείπεται, με καταγραφή σφάλματος, αν δεν υπάρχει ούτε user id ούτε anonymous id.