Commit a41fa39d55b905909c0ff14b694e00bb5f21798b
1 parent
74458f1735
Exists in
master
Update package name, bump version to 0.0.3
Showing 50 changed files with 2714 additions and 2712 deletions Side-by-side Diff
- AFInAppEvents.cs
- AFInAppEvents.cs.meta
- AFMiniJSON.cs
- AFMiniJSON.cs.meta
- AppsFlyer.asmdef
- AppsFlyer.asmdef.meta
- AppsFlyer.cs
- AppsFlyer.cs.meta
- AppsFlyerAndroid.cs
- AppsFlyerAndroid.cs.meta
- AppsFlyerObject.prefab
- AppsFlyerObject.prefab.meta
- AppsFlyerObjectScript.cs
- AppsFlyerObjectScript.cs.meta
- AppsFlyeriOS.cs
- AppsFlyeriOS.cs.meta
- Editor/AppsFlyer.Editor.asmdef
- Editor/AppsFlyer.Editor.asmdef.meta
- Editor/Unity.AppsFlyer.Editor.asmdef
- Editor/Unity.AppsFlyer.Editor.asmdef.meta
- IAppsFlyerConversionData.cs
- IAppsFlyerConversionData.cs.meta
- IAppsFlyerUserInvite.cs
- IAppsFlyerUserInvite.cs.meta
- IAppsFlyerValidateReceipt.cs
- IAppsFlyerValidateReceipt.cs.meta
- Runtime.meta
- Runtime/AFInAppEvents.cs
- Runtime/AFInAppEvents.cs.meta
- Runtime/AFMiniJSON.cs
- Runtime/AFMiniJSON.cs.meta
- Runtime/AppsFlyer.cs
- Runtime/AppsFlyer.cs.meta
- Runtime/AppsFlyerAndroid.cs
- Runtime/AppsFlyerAndroid.cs.meta
- Runtime/AppsFlyerObject.prefab
- Runtime/AppsFlyerObject.prefab.meta
- Runtime/AppsFlyerObjectScript.cs
- Runtime/AppsFlyerObjectScript.cs.meta
- Runtime/AppsFlyeriOS.cs
- Runtime/AppsFlyeriOS.cs.meta
- Runtime/IAppsFlyerConversionData.cs
- Runtime/IAppsFlyerConversionData.cs.meta
- Runtime/IAppsFlyerUserInvite.cs
- Runtime/IAppsFlyerUserInvite.cs.meta
- Runtime/IAppsFlyerValidateReceipt.cs
- Runtime/IAppsFlyerValidateReceipt.cs.meta
- Runtime/Unity.AppsFlyer.asmdef
- Runtime/Unity.AppsFlyer.asmdef.meta
- package.json
AFInAppEvents.cs
| 1 | +using UnityEngine; | |
| 2 | +using System.Collections; | |
| 3 | + | |
| 4 | +public class AFInAppEvents { | |
| 5 | + /** | |
| 6 | + * Event Type | |
| 7 | + * */ | |
| 8 | + public const string LEVEL_ACHIEVED = "af_level_achieved"; | |
| 9 | + public const string ADD_PAYMENT_INFO = "af_add_payment_info"; | |
| 10 | + public const string ADD_TO_CART = "af_add_to_cart"; | |
| 11 | + public const string ADD_TO_WISH_LIST = "af_add_to_wishlist"; | |
| 12 | + public const string COMPLETE_REGISTRATION = "af_complete_registration"; | |
| 13 | + public const string TUTORIAL_COMPLETION = "af_tutorial_completion"; | |
| 14 | + public const string INITIATED_CHECKOUT = "af_initiated_checkout"; | |
| 15 | + public const string PURCHASE = "af_purchase"; | |
| 16 | + public const string RATE = "af_rate"; | |
| 17 | + public const string SEARCH = "af_search"; | |
| 18 | + public const string SPENT_CREDIT = "af_spent_credits"; | |
| 19 | + public const string ACHIEVEMENT_UNLOCKED = "af_achievement_unlocked"; | |
| 20 | + public const string CONTENT_VIEW = "af_content_view"; | |
| 21 | + public const string TRAVEL_BOOKING = "af_travel_booking"; | |
| 22 | + public const string SHARE = "af_share"; | |
| 23 | + public const string INVITE = "af_invite"; | |
| 24 | + public const string LOGIN = "af_login"; | |
| 25 | + public const string RE_ENGAGE = "af_re_engage"; | |
| 26 | + public const string UPDATE = "af_update"; | |
| 27 | + public const string OPENED_FROM_PUSH_NOTIFICATION = "af_opened_from_push_notification"; | |
| 28 | + public const string LOCATION_CHANGED = "af_location_changed"; | |
| 29 | + public const string LOCATION_COORDINATES = "af_location_coordinates"; | |
| 30 | + public const string ORDER_ID = "af_order_id"; | |
| 31 | + /** | |
| 32 | + * Event Parameter Name | |
| 33 | + * **/ | |
| 34 | + public const string LEVEL = "af_level"; | |
| 35 | + public const string SCORE = "af_score"; | |
| 36 | + public const string SUCCESS = "af_success"; | |
| 37 | + public const string PRICE = "af_price"; | |
| 38 | + public const string CONTENT_TYPE = "af_content_type"; | |
| 39 | + public const string CONTENT_ID = "af_content_id"; | |
| 40 | + public const string CONTENT_LIST = "af_content_list"; | |
| 41 | + public const string CURRENCY = "af_currency"; | |
| 42 | + public const string QUANTITY = "af_quantity"; | |
| 43 | + public const string REGSITRATION_METHOD = "af_registration_method"; | |
| 44 | + public const string PAYMENT_INFO_AVAILIBLE = "af_payment_info_available"; | |
| 45 | + public const string MAX_RATING_VALUE = "af_max_rating_value"; | |
| 46 | + public const string RATING_VALUE = "af_rating_value"; | |
| 47 | + public const string SEARCH_STRING = "af_search_string"; | |
| 48 | + public const string DATE_A = "af_date_a"; | |
| 49 | + public const string DATE_B = "af_date_b"; | |
| 50 | + public const string DESTINATION_A = "af_destination_a"; | |
| 51 | + public const string DESTINATION_B = "af_destination_b"; | |
| 52 | + public const string DESCRIPTION = "af_description"; | |
| 53 | + public const string CLASS = "af_class"; | |
| 54 | + public const string EVENT_START = "af_event_start"; | |
| 55 | + public const string EVENT_END = "af_event_end"; | |
| 56 | + public const string LATITUDE = "af_lat"; | |
| 57 | + public const string LONGTITUDE = "af_long"; | |
| 58 | + public const string CUSTOMER_USER_ID = "af_customer_user_id"; | |
| 59 | + public const string VALIDATED = "af_validated"; | |
| 60 | + public const string REVENUE = "af_revenue"; | |
| 61 | + public const string RECEIPT_ID = "af_receipt_id"; | |
| 62 | + public const string PARAM_1 = "af_param_1"; | |
| 63 | + public const string PARAM_2 = "af_param_2"; | |
| 64 | + public const string PARAM_3 = "af_param_3"; | |
| 65 | + public const string PARAM_4 = "af_param_4"; | |
| 66 | + public const string PARAM_5 = "af_param_5"; | |
| 67 | + public const string PARAM_6 = "af_param_6"; | |
| 68 | + public const string PARAM_7 = "af_param_7"; | |
| 69 | + public const string PARAM_8 = "af_param_8"; | |
| 70 | + public const string PARAM_9 = "af_param_9"; | |
| 71 | + public const string PARAM_10 = "af_param_10"; | |
| 72 | +} |
AFInAppEvents.cs.meta
AFMiniJSON.cs
| 1 | +/* | |
| 2 | + * Copyright (c) 2013 Calvin Rien | |
| 3 | + * | |
| 4 | + * Based on the JSON parser by Patrick van Bergen | |
| 5 | + * http://techblog.procurios.nl/k/618/news/view/14605/14863/How-do-I-write-my-own-parser-for-JSON.html | |
| 6 | + * | |
| 7 | + * Simplified it so that it doesn't throw exceptions | |
| 8 | + * and can be used in Unity iPhone with maximum code stripping. | |
| 9 | + * | |
| 10 | + * Permission is hereby granted, free of charge, to any person obtaining | |
| 11 | + * a copy of this software and associated documentation files (the | |
| 12 | + * "Software"), to deal in the Software without restriction, including | |
| 13 | + * without limitation the rights to use, copy, modify, merge, publish, | |
| 14 | + * distribute, sublicense, and/or sell copies of the Software, and to | |
| 15 | + * permit persons to whom the Software is furnished to do so, subject to | |
| 16 | + * the following conditions: | |
| 17 | + * | |
| 18 | + * The above copyright notice and this permission notice shall be | |
| 19 | + * included in all copies or substantial portions of the Software. | |
| 20 | + * | |
| 21 | + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | |
| 22 | + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | |
| 23 | + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. | |
| 24 | + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY | |
| 25 | + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, | |
| 26 | + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE | |
| 27 | + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | |
| 28 | + */ | |
| 29 | +using System; | |
| 30 | +using System.Collections; | |
| 31 | +using System.Collections.Generic; | |
| 32 | +using System.IO; | |
| 33 | +using System.Text; | |
| 34 | + | |
| 35 | +namespace AFMiniJSON { | |
| 36 | + // Example usage: | |
| 37 | + // | |
| 38 | + // using UnityEngine; | |
| 39 | + // using System.Collections; | |
| 40 | + // using System.Collections.Generic; | |
| 41 | + // using MiniJSON; | |
| 42 | + // | |
| 43 | + // public class MiniJSONTest : MonoBehaviour { | |
| 44 | + // void Start () { | |
| 45 | + // var jsonString = "{ \"array\": [1.44,2,3], " + | |
| 46 | + // "\"object\": {\"key1\":\"value1\", \"key2\":256}, " + | |
| 47 | + // "\"string\": \"The quick brown fox \\\"jumps\\\" over the lazy dog \", " + | |
| 48 | + // "\"unicode\": \"\\u3041 Men\u00fa sesi\u00f3n\", " + | |
| 49 | + // "\"int\": 65536, " + | |
| 50 | + // "\"float\": 3.1415926, " + | |
| 51 | + // "\"bool\": true, " + | |
| 52 | + // "\"null\": null }"; | |
| 53 | + // | |
| 54 | + // var dict = Json.Deserialize(jsonString) as Dictionary<string,object>; | |
| 55 | + // | |
| 56 | + // Debug.Log("deserialized: " + dict.GetType()); | |
| 57 | + // Debug.Log("dict['array'][0]: " + ((List<object>) dict["array"])[0]); | |
| 58 | + // Debug.Log("dict['string']: " + (string) dict["string"]); | |
| 59 | + // Debug.Log("dict['float']: " + (double) dict["float"]); // floats come out as doubles | |
| 60 | + // Debug.Log("dict['int']: " + (long) dict["int"]); // ints come out as longs | |
| 61 | + // Debug.Log("dict['unicode']: " + (string) dict["unicode"]); | |
| 62 | + // | |
| 63 | + // var str = Json.Serialize(dict); | |
| 64 | + // | |
| 65 | + // Debug.Log("serialized: " + str); | |
| 66 | + // } | |
| 67 | + // } | |
| 68 | + | |
| 69 | + /// <summary> | |
| 70 | + /// This class encodes and decodes JSON strings. | |
| 71 | + /// Spec. details, see http://www.json.org/ | |
| 72 | + /// | |
| 73 | + /// JSON uses Arrays and Objects. These correspond here to the datatypes IList and IDictionary. | |
| 74 | + /// All numbers are parsed to doubles. | |
| 75 | + /// </summary> | |
| 76 | + public static class Json { | |
| 77 | + /// <summary> | |
| 78 | + /// Parses the string json into a value | |
| 79 | + /// </summary> | |
| 80 | + /// <param name="json">A JSON string.</param> | |
| 81 | + /// <returns>An List<object>, a Dictionary<string, object>, a double, an integer,a string, null, true, or false</returns> | |
| 82 | + public static object Deserialize(string json) { | |
| 83 | + // save the string for debug information | |
| 84 | + if (json == null) { | |
| 85 | + return null; | |
| 86 | + } | |
| 87 | + | |
| 88 | + return Parser.Parse(json); | |
| 89 | + } | |
| 90 | + | |
| 91 | + sealed class Parser : IDisposable { | |
| 92 | + const string WORD_BREAK = "{}[],:\""; | |
| 93 | + | |
| 94 | + public static bool IsWordBreak(char c) { | |
| 95 | + return Char.IsWhiteSpace(c) || WORD_BREAK.IndexOf(c) != -1; | |
| 96 | + } | |
| 97 | + | |
| 98 | + enum TOKEN { | |
| 99 | + NONE, | |
| 100 | + CURLY_OPEN, | |
| 101 | + CURLY_CLOSE, | |
| 102 | + SQUARED_OPEN, | |
| 103 | + SQUARED_CLOSE, | |
| 104 | + COLON, | |
| 105 | + COMMA, | |
| 106 | + STRING, | |
| 107 | + NUMBER, | |
| 108 | + TRUE, | |
| 109 | + FALSE, | |
| 110 | + NULL | |
| 111 | + }; | |
| 112 | + | |
| 113 | + StringReader json; | |
| 114 | + | |
| 115 | + Parser(string jsonString) { | |
| 116 | + json = new StringReader(jsonString); | |
| 117 | + } | |
| 118 | + | |
| 119 | + public static object Parse(string jsonString) { | |
| 120 | + using (var instance = new Parser(jsonString)) { | |
| 121 | + return instance.ParseValue(); | |
| 122 | + } | |
| 123 | + } | |
| 124 | + | |
| 125 | + public void Dispose() { | |
| 126 | + json.Dispose(); | |
| 127 | + json = null; | |
| 128 | + } | |
| 129 | + | |
| 130 | + Dictionary<string, object> ParseObject() { | |
| 131 | + Dictionary<string, object> table = new Dictionary<string, object>(); | |
| 132 | + | |
| 133 | + // ditch opening brace | |
| 134 | + json.Read(); | |
| 135 | + | |
| 136 | + // { | |
| 137 | + while (true) { | |
| 138 | + switch (NextToken) { | |
| 139 | + case TOKEN.NONE: | |
| 140 | + return null; | |
| 141 | + case TOKEN.COMMA: | |
| 142 | + continue; | |
| 143 | + case TOKEN.CURLY_CLOSE: | |
| 144 | + return table; | |
| 145 | + default: | |
| 146 | + // name | |
| 147 | + string name = ParseString(); | |
| 148 | + if (name == null) { | |
| 149 | + return null; | |
| 150 | + } | |
| 151 | + | |
| 152 | + // : | |
| 153 | + if (NextToken != TOKEN.COLON) { | |
| 154 | + return null; | |
| 155 | + } | |
| 156 | + // ditch the colon | |
| 157 | + json.Read(); | |
| 158 | + | |
| 159 | + // value | |
| 160 | + table[name] = ParseValue(); | |
| 161 | + break; | |
| 162 | + } | |
| 163 | + } | |
| 164 | + } | |
| 165 | + | |
| 166 | + List<object> ParseArray() { | |
| 167 | + List<object> array = new List<object>(); | |
| 168 | + | |
| 169 | + // ditch opening bracket | |
| 170 | + json.Read(); | |
| 171 | + | |
| 172 | + // [ | |
| 173 | + var parsing = true; | |
| 174 | + while (parsing) { | |
| 175 | + TOKEN nextToken = NextToken; | |
| 176 | + | |
| 177 | + switch (nextToken) { | |
| 178 | + case TOKEN.NONE: | |
| 179 | + return null; | |
| 180 | + case TOKEN.COMMA: | |
| 181 | + continue; | |
| 182 | + case TOKEN.SQUARED_CLOSE: | |
| 183 | + parsing = false; | |
| 184 | + break; | |
| 185 | + default: | |
| 186 | + object value = ParseByToken(nextToken); | |
| 187 | + | |
| 188 | + array.Add(value); | |
| 189 | + break; | |
| 190 | + } | |
| 191 | + } | |
| 192 | + | |
| 193 | + return array; | |
| 194 | + } | |
| 195 | + | |
| 196 | + object ParseValue() { | |
| 197 | + TOKEN nextToken = NextToken; | |
| 198 | + return ParseByToken(nextToken); | |
| 199 | + } | |
| 200 | + | |
| 201 | + object ParseByToken(TOKEN token) { | |
| 202 | + switch (token) { | |
| 203 | + case TOKEN.STRING: | |
| 204 | + return ParseString(); | |
| 205 | + case TOKEN.NUMBER: | |
| 206 | + return ParseNumber(); | |
| 207 | + case TOKEN.CURLY_OPEN: | |
| 208 | + return ParseObject(); | |
| 209 | + case TOKEN.SQUARED_OPEN: | |
| 210 | + return ParseArray(); | |
| 211 | + case TOKEN.TRUE: | |
| 212 | + return true; | |
| 213 | + case TOKEN.FALSE: | |
| 214 | + return false; | |
| 215 | + case TOKEN.NULL: | |
| 216 | + return null; | |
| 217 | + default: | |
| 218 | + return null; | |
| 219 | + } | |
| 220 | + } | |
| 221 | + | |
| 222 | + string ParseString() { | |
| 223 | + StringBuilder s = new StringBuilder(); | |
| 224 | + char c; | |
| 225 | + | |
| 226 | + // ditch opening quote | |
| 227 | + json.Read(); | |
| 228 | + | |
| 229 | + bool parsing = true; | |
| 230 | + while (parsing) { | |
| 231 | + | |
| 232 | + if (json.Peek() == -1) { | |
| 233 | + parsing = false; | |
| 234 | + break; | |
| 235 | + } | |
| 236 | + | |
| 237 | + c = NextChar; | |
| 238 | + switch (c) { | |
| 239 | + case '"': | |
| 240 | + parsing = false; | |
| 241 | + break; | |
| 242 | + case '\\': | |
| 243 | + if (json.Peek() == -1) { | |
| 244 | + parsing = false; | |
| 245 | + break; | |
| 246 | + } | |
| 247 | + | |
| 248 | + c = NextChar; | |
| 249 | + switch (c) { | |
| 250 | + case '"': | |
| 251 | + case '\\': | |
| 252 | + case '/': | |
| 253 | + s.Append(c); | |
| 254 | + break; | |
| 255 | + case 'b': | |
| 256 | + s.Append('\b'); | |
| 257 | + break; | |
| 258 | + case 'f': | |
| 259 | + s.Append('\f'); | |
| 260 | + break; | |
| 261 | + case 'n': | |
| 262 | + s.Append('\n'); | |
| 263 | + break; | |
| 264 | + case 'r': | |
| 265 | + s.Append('\r'); | |
| 266 | + break; | |
| 267 | + case 't': | |
| 268 | + s.Append('\t'); | |
| 269 | + break; | |
| 270 | + case 'u': | |
| 271 | + var hex = new char[4]; | |
| 272 | + | |
| 273 | + for (int i=0; i< 4; i++) { | |
| 274 | + hex[i] = NextChar; | |
| 275 | + } | |
| 276 | + | |
| 277 | + s.Append((char) Convert.ToInt32(new string(hex), 16)); | |
| 278 | + break; | |
| 279 | + } | |
| 280 | + break; | |
| 281 | + default: | |
| 282 | + s.Append(c); | |
| 283 | + break; | |
| 284 | + } | |
| 285 | + } | |
| 286 | + | |
| 287 | + return s.ToString(); | |
| 288 | + } | |
| 289 | + | |
| 290 | + object ParseNumber() { | |
| 291 | + string number = NextWord; | |
| 292 | + | |
| 293 | + if (number.IndexOf('.') == -1) { | |
| 294 | + long parsedInt; | |
| 295 | + Int64.TryParse(number, out parsedInt); | |
| 296 | + return parsedInt; | |
| 297 | + } | |
| 298 | + | |
| 299 | + double parsedDouble; | |
| 300 | + Double.TryParse(number, out parsedDouble); | |
| 301 | + return parsedDouble; | |
| 302 | + } | |
| 303 | + | |
| 304 | + void EatWhitespace() { | |
| 305 | + while (Char.IsWhiteSpace(PeekChar)) { | |
| 306 | + json.Read(); | |
| 307 | + | |
| 308 | + if (json.Peek() == -1) { | |
| 309 | + break; | |
| 310 | + } | |
| 311 | + } | |
| 312 | + } | |
| 313 | + | |
| 314 | + char PeekChar { | |
| 315 | + get { | |
| 316 | + return Convert.ToChar(json.Peek()); | |
| 317 | + } | |
| 318 | + } | |
| 319 | + | |
| 320 | + char NextChar { | |
| 321 | + get { | |
| 322 | + return Convert.ToChar(json.Read()); | |
| 323 | + } | |
| 324 | + } | |
| 325 | + | |
| 326 | + string NextWord { | |
| 327 | + get { | |
| 328 | + StringBuilder word = new StringBuilder(); | |
| 329 | + | |
| 330 | + while (!IsWordBreak(PeekChar)) { | |
| 331 | + word.Append(NextChar); | |
| 332 | + | |
| 333 | + if (json.Peek() == -1) { | |
| 334 | + break; | |
| 335 | + } | |
| 336 | + } | |
| 337 | + | |
| 338 | + return word.ToString(); | |
| 339 | + } | |
| 340 | + } | |
| 341 | + | |
| 342 | + TOKEN NextToken { | |
| 343 | + get { | |
| 344 | + EatWhitespace(); | |
| 345 | + | |
| 346 | + if (json.Peek() == -1) { | |
| 347 | + return TOKEN.NONE; | |
| 348 | + } | |
| 349 | + | |
| 350 | + switch (PeekChar) { | |
| 351 | + case '{': | |
| 352 | + return TOKEN.CURLY_OPEN; | |
| 353 | + case '}': | |
| 354 | + json.Read(); | |
| 355 | + return TOKEN.CURLY_CLOSE; | |
| 356 | + case '[': | |
| 357 | + return TOKEN.SQUARED_OPEN; | |
| 358 | + case ']': | |
| 359 | + json.Read(); | |
| 360 | + return TOKEN.SQUARED_CLOSE; | |
| 361 | + case ',': | |
| 362 | + json.Read(); | |
| 363 | + return TOKEN.COMMA; | |
| 364 | + case '"': | |
| 365 | + return TOKEN.STRING; | |
| 366 | + case ':': | |
| 367 | + return TOKEN.COLON; | |
| 368 | + case '0': | |
| 369 | + case '1': | |
| 370 | + case '2': | |
| 371 | + case '3': | |
| 372 | + case '4': | |
| 373 | + case '5': | |
| 374 | + case '6': | |
| 375 | + case '7': | |
| 376 | + case '8': | |
| 377 | + case '9': | |
| 378 | + case '-': | |
| 379 | + return TOKEN.NUMBER; | |
| 380 | + } | |
| 381 | + | |
| 382 | + switch (NextWord) { | |
| 383 | + case "false": | |
| 384 | + return TOKEN.FALSE; | |
| 385 | + case "true": | |
| 386 | + return TOKEN.TRUE; | |
| 387 | + case "null": | |
| 388 | + return TOKEN.NULL; | |
| 389 | + } | |
| 390 | + | |
| 391 | + return TOKEN.NONE; | |
| 392 | + } | |
| 393 | + } | |
| 394 | + } | |
| 395 | + | |
| 396 | + /// <summary> | |
| 397 | + /// Converts a IDictionary / IList object or a simple type (string, int, etc.) into a JSON string | |
| 398 | + /// </summary> | |
| 399 | + /// <param name="json">A Dictionary<string, object> / List<object></param> | |
| 400 | + /// <returns>A JSON encoded string, or null if object 'json' is not serializable</returns> | |
| 401 | + public static string Serialize(object obj) { | |
| 402 | + return Serializer.Serialize(obj); | |
| 403 | + } | |
| 404 | + | |
| 405 | + sealed class Serializer { | |
| 406 | + StringBuilder builder; | |
| 407 | + | |
| 408 | + Serializer() { | |
| 409 | + builder = new StringBuilder(); | |
| 410 | + } | |
| 411 | + | |
| 412 | + public static string Serialize(object obj) { | |
| 413 | + var instance = new Serializer(); | |
| 414 | + | |
| 415 | + instance.SerializeValue(obj); | |
| 416 | + | |
| 417 | + return instance.builder.ToString(); | |
| 418 | + } | |
| 419 | + | |
| 420 | + void SerializeValue(object value) { | |
| 421 | + IList asList; | |
| 422 | + IDictionary asDict; | |
| 423 | + string asStr; | |
| 424 | + | |
| 425 | + if (value == null) { | |
| 426 | + builder.Append("null"); | |
| 427 | + } else if ((asStr = value as string) != null) { | |
| 428 | + SerializeString(asStr); | |
| 429 | + } else if (value is bool) { | |
| 430 | + builder.Append((bool) value ? "true" : "false"); | |
| 431 | + } else if ((asList = value as IList) != null) { | |
| 432 | + SerializeArray(asList); | |
| 433 | + } else if ((asDict = value as IDictionary) != null) { | |
| 434 | + SerializeObject(asDict); | |
| 435 | + } else if (value is char) { | |
| 436 | + SerializeString(new string((char) value, 1)); | |
| 437 | + } else { | |
| 438 | + SerializeOther(value); | |
| 439 | + } | |
| 440 | + } | |
| 441 | + | |
| 442 | + void SerializeObject(IDictionary obj) { | |
| 443 | + bool first = true; | |
| 444 | + | |
| 445 | + builder.Append('{'); | |
| 446 | + | |
| 447 | + foreach (object e in obj.Keys) { | |
| 448 | + if (!first) { | |
| 449 | + builder.Append(','); | |
| 450 | + } | |
| 451 | + | |
| 452 | + SerializeString(e.ToString()); | |
| 453 | + builder.Append(':'); | |
| 454 | + | |
| 455 | + SerializeValue(obj[e]); | |
| 456 | + | |
| 457 | + first = false; | |
| 458 | + } | |
| 459 | + | |
| 460 | + builder.Append('}'); | |
| 461 | + } | |
| 462 | + | |
| 463 | + void SerializeArray(IList anArray) { | |
| 464 | + builder.Append('['); | |
| 465 | + | |
| 466 | + bool first = true; | |
| 467 | + | |
| 468 | + foreach (object obj in anArray) { | |
| 469 | + if (!first) { | |
| 470 | + builder.Append(','); | |
| 471 | + } | |
| 472 | + | |
| 473 | + SerializeValue(obj); | |
| 474 | + | |
| 475 | + first = false; | |
| 476 | + } | |
| 477 | + | |
| 478 | + builder.Append(']'); | |
| 479 | + } | |
| 480 | + | |
| 481 | + void SerializeString(string str) { | |
| 482 | + builder.Append('\"'); | |
| 483 | + | |
| 484 | + char[] charArray = str.ToCharArray(); | |
| 485 | + foreach (var c in charArray) { | |
| 486 | + switch (c) { | |
| 487 | + case '"': | |
| 488 | + builder.Append("\\\""); | |
| 489 | + break; | |
| 490 | + case '\\': | |
| 491 | + builder.Append("\\\\"); | |
| 492 | + break; | |
| 493 | + case '\b': | |
| 494 | + builder.Append("\\b"); | |
| 495 | + break; | |
| 496 | + case '\f': | |
| 497 | + builder.Append("\\f"); | |
| 498 | + break; | |
| 499 | + case '\n': | |
| 500 | + builder.Append("\\n"); | |
| 501 | + break; | |
| 502 | + case '\r': | |
| 503 | + builder.Append("\\r"); | |
| 504 | + break; | |
| 505 | + case '\t': | |
| 506 | + builder.Append("\\t"); | |
| 507 | + break; | |
| 508 | + default: | |
| 509 | + int codepoint = Convert.ToInt32(c); | |
| 510 | + if ((codepoint >= 32) && (codepoint <= 126)) { | |
| 511 | + builder.Append(c); | |
| 512 | + } else { | |
| 513 | + builder.Append("\\u"); | |
| 514 | + builder.Append(codepoint.ToString("x4")); | |
| 515 | + } | |
| 516 | + break; | |
| 517 | + } | |
| 518 | + } | |
| 519 | + | |
| 520 | + builder.Append('\"'); | |
| 521 | + } | |
| 522 | + | |
| 523 | + void SerializeOther(object value) { | |
| 524 | + // NOTE: decimals lose precision during serialization. | |
| 525 | + // They always have, I'm just letting you know. | |
| 526 | + // Previously floats and doubles lost precision too. | |
| 527 | + if (value is float) { | |
| 528 | + builder.Append(((float) value).ToString("R")); | |
| 529 | + } else if (value is int | |
| 530 | + || value is uint | |
| 531 | + || value is long | |
| 532 | + || value is sbyte | |
| 533 | + || value is byte | |
| 534 | + || value is short | |
| 535 | + || value is ushort | |
| 536 | + || value is ulong) { | |
| 537 | + builder.Append(value); | |
| 538 | + } else if (value is double | |
| 539 | + || value is decimal) { | |
| 540 | + builder.Append(Convert.ToDouble(value).ToString("R")); | |
| 541 | + } else { | |
| 542 | + SerializeString(value.ToString()); | |
| 543 | + } | |
| 544 | + } | |
| 545 | + } | |
| 546 | + } | |
| 547 | +} |
AFMiniJSON.cs.meta
AppsFlyer.asmdef
| 1 | +{ | |
| 2 | + "name": "AppsFlyer", | |
| 3 | + "references": [], | |
| 4 | + "includePlatforms": [], | |
| 5 | + "excludePlatforms": [], | |
| 6 | + "allowUnsafeCode": false, | |
| 7 | + "overrideReferences": false, | |
| 8 | + "precompiledReferences": [], | |
| 9 | + "autoReferenced": true, | |
| 10 | + "defineConstraints": [], | |
| 11 | + "versionDefines": [], | |
| 12 | + "noEngineReferences": false | |
| 13 | +} |
AppsFlyer.asmdef.meta
AppsFlyer.cs
| 1 | +using System.Collections.Generic; | |
| 2 | +using UnityEngine; | |
| 3 | + | |
| 4 | +namespace AppsFlyerSDK | |
| 5 | +{ | |
| 6 | + public class AppsFlyer : MonoBehaviour | |
| 7 | + { | |
| 8 | + | |
| 9 | + public static readonly string kAppsFlyerPluginVersion = "5.4.2"; | |
| 10 | + | |
| 11 | + | |
| 12 | + /// <summary> | |
| 13 | + /// Initialize the AppsFlyer SDK with your devKey and appID. | |
| 14 | + /// The dev key is required on all platforms, and the appID is required for iOS. | |
| 15 | + /// If you app is for Android only pass null for the appID. | |
| 16 | + /// </summary> | |
| 17 | + /// <param name="devKey"> AppsFlyer's Dev-Key, which is accessible from your AppsFlyer account under 'App Settings' in the dashboard.</param> | |
| 18 | + /// <param name="appID">Your app's Apple ID.</param> | |
| 19 | + /// <example> | |
| 20 | + /// <code> | |
| 21 | + /// AppsFlyer.initSDK("K2***********99", "41*****44""); | |
| 22 | + /// </code> | |
| 23 | + /// </example> | |
| 24 | + public static void initSDK(string devKey, string appID) | |
| 25 | + { | |
| 26 | + initSDK(devKey, appID, null); | |
| 27 | + } | |
| 28 | + | |
| 29 | + /// <summary> | |
| 30 | + /// Initialize the AppsFlyer SDK with your devKey and appID. | |
| 31 | + /// The dev key is required on all platforms, and the appID is required for iOS. | |
| 32 | + /// If you app is for Android only pass null for the appID. | |
| 33 | + /// </summary> | |
| 34 | + /// <param name="devKey"> AppsFlyer's Dev-Key, which is accessible from your AppsFlyer account under 'App Settings' in the dashboard.</param> | |
| 35 | + /// <param name="appID">Your app's Apple ID.</param> | |
| 36 | + /// <param name="gameObject">pass the script of the game object being used.</param> | |
| 37 | + /// <example> | |
| 38 | + /// <code> | |
| 39 | + /// AppsFlyer.initSDK("K2***********99", 41*****44, this); | |
| 40 | + /// </code> | |
| 41 | + /// </example> | |
| 42 | + public static void initSDK(string devKey, string appID, MonoBehaviour gameObject) | |
| 43 | + { | |
| 44 | +#if UNITY_IOS && !UNITY_EDITOR | |
| 45 | + AppsFlyeriOS.setAppsFlyerDevKey(devKey); | |
| 46 | + AppsFlyeriOS.setAppleAppID(appID); | |
| 47 | + if(gameObject != null) | |
| 48 | + { | |
| 49 | + AppsFlyeriOS.getConversionData(gameObject.name); | |
| 50 | + } | |
| 51 | +#elif UNITY_ANDROID && !UNITY_EDITOR | |
| 52 | + AppsFlyerAndroid.initSDK(devKey, gameObject); | |
| 53 | +#else | |
| 54 | + | |
| 55 | +#endif | |
| 56 | + } | |
| 57 | + | |
| 58 | + | |
| 59 | + /// <summary> | |
| 60 | + /// Once this API is invoked, our SDK will start. | |
| 61 | + /// Once the API is called a sessions will be immediately sent, and all background forground transitions will send a session. | |
| 62 | + /// </summary> | |
| 63 | + public static void startSDK() | |
| 64 | + { | |
| 65 | +#if UNITY_IOS && !UNITY_EDITOR | |
| 66 | + AppsFlyeriOS.startSDK(); | |
| 67 | +#elif UNITY_ANDROID && !UNITY_EDITOR | |
| 68 | + AppsFlyerAndroid.startSDK(); | |
| 69 | +#else | |
| 70 | + | |
| 71 | +#endif | |
| 72 | + } | |
| 73 | + | |
| 74 | + /// <summary> | |
| 75 | + /// Send an In-App Event. | |
| 76 | + /// In-App Events provide insight on what is happening in your app. | |
| 77 | + /// </summary> | |
| 78 | + /// <param name="eventName">Event Name as String.</param> | |
| 79 | + /// <param name="eventValues">Event Values as Dictionary.</param> | |
| 80 | + public static void sendEvent(string eventName, Dictionary<string, string> eventValues) | |
| 81 | + { | |
| 82 | +#if UNITY_IOS && !UNITY_EDITOR | |
| 83 | + AppsFlyeriOS.sendEvent(eventName, eventValues); | |
| 84 | +#elif UNITY_ANDROID && !UNITY_EDITOR | |
| 85 | + AppsFlyerAndroid.sendEvent(eventName, eventValues); | |
| 86 | +#else | |
| 87 | + | |
| 88 | +#endif | |
| 89 | + } | |
| 90 | + | |
| 91 | + /// <summary> | |
| 92 | + /// Once this API is invoked, our SDK no longer communicates with our servers and stops functioning. | |
| 93 | + /// In some extreme cases you might want to shut down all SDK activity due to legal and privacy compliance. | |
| 94 | + /// This can be achieved with the stopSDK API. | |
| 95 | + /// </summary> | |
| 96 | + /// <param name="isSDKStopped"> should sdk be stopped.</param> | |
| 97 | + public static void stopSDK(bool isSDKStopped) | |
| 98 | + { | |
| 99 | +#if UNITY_IOS && !UNITY_EDITOR | |
| 100 | + AppsFlyeriOS.stopSDK(isSDKStopped); | |
| 101 | +#elif UNITY_ANDROID && !UNITY_EDITOR | |
| 102 | + AppsFlyerAndroid.stopSDK(isSDKStopped); | |
| 103 | +#else | |
| 104 | + | |
| 105 | +#endif | |
| 106 | + } | |
| 107 | + | |
| 108 | + // <summary> | |
| 109 | + /// Was the stopSDK(boolean) API set to true. | |
| 110 | + /// </summary> | |
| 111 | + /// <returns>boolean isSDKStopped.</returns> | |
| 112 | + public static bool isSDKStopped() | |
| 113 | + { | |
| 114 | +#if UNITY_IOS && !UNITY_EDITOR | |
| 115 | + return AppsFlyeriOS.isSDKStopped(); | |
| 116 | +#elif UNITY_ANDROID && !UNITY_EDITOR | |
| 117 | + return AppsFlyerAndroid.isSDKStopped(); | |
| 118 | +#else | |
| 119 | + return false; | |
| 120 | +#endif | |
| 121 | + } | |
| 122 | + | |
| 123 | + /// <summary> | |
| 124 | + /// Get the AppsFlyer SDK version used in app. | |
| 125 | + /// </summary> | |
| 126 | + /// <returns>The current SDK version.</returns> | |
| 127 | + public static string getSdkVersion() | |
| 128 | + { | |
| 129 | +#if UNITY_IOS && !UNITY_EDITOR | |
| 130 | + return AppsFlyeriOS.getSDKVersion(); | |
| 131 | +#elif UNITY_ANDROID && !UNITY_EDITOR | |
| 132 | + return AppsFlyerAndroid.getSdkVersion(); | |
| 133 | +#else | |
| 134 | + return ""; | |
| 135 | +#endif | |
| 136 | + | |
| 137 | + } | |
| 138 | + | |
| 139 | + /// <summary> | |
| 140 | + /// Enables Debug logs for the AppsFlyer SDK. | |
| 141 | + /// Should only be set to true in development / debug. | |
| 142 | + /// </summary> | |
| 143 | + /// <param name="shouldEnable">shouldEnable boolean.</param> | |
| 144 | + public static void setIsDebug(bool shouldEnable) | |
| 145 | + { | |
| 146 | +#if UNITY_IOS && !UNITY_EDITOR | |
| 147 | + AppsFlyeriOS.setIsDebug(shouldEnable); | |
| 148 | +#elif UNITY_ANDROID && !UNITY_EDITOR | |
| 149 | + AppsFlyerAndroid.setIsDebug(shouldEnable); | |
| 150 | +#else | |
| 151 | + | |
| 152 | +#endif | |
| 153 | + } | |
| 154 | + | |
| 155 | + /// <summary> | |
| 156 | + /// Setting your own customer ID enables you to cross-reference your own unique ID with AppsFlyer’s unique ID and the other devices’ IDs. | |
| 157 | + /// This ID is available in AppsFlyer CSV reports along with Postback APIs for cross-referencing with your internal IDs. | |
| 158 | + /// </summary> | |
| 159 | + /// <param name="id">Customer ID for client.</param> | |
| 160 | + public static void setCustomerUserId(string id) | |
| 161 | + { | |
| 162 | +#if UNITY_IOS && !UNITY_EDITOR | |
| 163 | + AppsFlyeriOS.setCustomerUserID(id); | |
| 164 | +#elif UNITY_ANDROID && !UNITY_EDITOR | |
| 165 | + AppsFlyerAndroid.setCustomerUserId(id); | |
| 166 | +#else | |
| 167 | + | |
| 168 | +#endif | |
| 169 | + } | |
| 170 | + | |
| 171 | + /// <summary> | |
| 172 | + /// Set the OneLink ID that should be used for User-Invite-API. | |
| 173 | + /// The link that is generated for the user invite will use this OneLink as the base link. | |
| 174 | + /// </summary> | |
| 175 | + /// <param name="oneLinkId">OneLink ID obtained from the AppsFlyer Dashboard.</param> | |
| 176 | + public static void setAppInviteOneLinkID(string oneLinkId) | |
| 177 | + { | |
| 178 | +#if UNITY_IOS && !UNITY_EDITOR | |
| 179 | + AppsFlyeriOS.setAppInviteOneLinkID(oneLinkId); | |
| 180 | +#elif UNITY_ANDROID && !UNITY_EDITOR | |
| 181 | + AppsFlyerAndroid.setAppInviteOneLinkID(oneLinkId); | |
| 182 | +#else | |
| 183 | + | |
| 184 | +#endif | |
| 185 | + } | |
| 186 | + | |
| 187 | + /// <summary> | |
| 188 | + /// Set additional data to be sent to AppsFlyer. | |
| 189 | + /// </summary> | |
| 190 | + /// <param name="customData">additional data Dictionary.</param> | |
| 191 | + public static void setAdditionalData(Dictionary<string, string> customData) | |
| 192 | + { | |
| 193 | +#if UNITY_IOS && !UNITY_EDITOR | |
| 194 | + AppsFlyeriOS.setAdditionalData(customData); | |
| 195 | +#elif UNITY_ANDROID && !UNITY_EDITOR | |
| 196 | + AppsFlyerAndroid.setAdditionalData(customData); | |
| 197 | +#else | |
| 198 | + | |
| 199 | +#endif | |
| 200 | + } | |
| 201 | + | |
| 202 | + /// <summary> | |
| 203 | + /// Advertisers can wrap AppsFlyer OneLink within another Universal Link. | |
| 204 | + /// This Universal Link will invoke the app but any deep linking data will not propagate to AppsFlyer. | |
| 205 | + /// </summary> | |
| 206 | + /// <param name="urls">Array of urls.</param> | |
| 207 | + public static void setResolveDeepLinkURLs(params string[] urls) | |
| 208 | + { | |
| 209 | +#if UNITY_IOS && !UNITY_EDITOR | |
| 210 | + AppsFlyeriOS.setResolveDeepLinkURLs(urls); | |
| 211 | +#elif UNITY_ANDROID && !UNITY_EDITOR | |
| 212 | + AppsFlyerAndroid.setResolveDeepLinkURLs(urls); | |
| 213 | +#else | |
| 214 | + | |
| 215 | +#endif | |
| 216 | + } | |
| 217 | + | |
| 218 | + | |
| 219 | + /// <summary> | |
| 220 | + /// Advertisers can use this method to set vanity onelink domains. | |
| 221 | + /// </summary> | |
| 222 | + /// <param name="domains">Array of domains.</param> | |
| 223 | + public static void setOneLinkCustomDomain(params string[] domains) | |
| 224 | + { | |
| 225 | +#if UNITY_IOS && !UNITY_EDITOR | |
| 226 | + AppsFlyeriOS.setOneLinkCustomDomains(domains); | |
| 227 | +#elif UNITY_ANDROID && !UNITY_EDITOR | |
| 228 | + AppsFlyerAndroid.setOneLinkCustomDomain(domains); | |
| 229 | +#else | |
| 230 | + | |
| 231 | +#endif | |
| 232 | + } | |
| 233 | + | |
| 234 | + /// <summary> | |
| 235 | + /// Setting user local currency code for in-app purchases. | |
| 236 | + /// The currency code should be a 3 character ISO 4217 code. (default is USD). | |
| 237 | + /// You can set the currency code for all events by calling the following method. | |
| 238 | + /// </summary> | |
| 239 | + /// <param name="currencyCode">3 character ISO 4217 code.</param> | |
| 240 | + public static void setCurrencyCode(string currencyCode) | |
| 241 | + { | |
| 242 | +#if UNITY_IOS && !UNITY_EDITOR | |
| 243 | + AppsFlyeriOS.setCurrencyCode(currencyCode); | |
| 244 | +#elif UNITY_ANDROID && !UNITY_EDITOR | |
| 245 | + AppsFlyerAndroid.setCurrencyCode(currencyCode); | |
| 246 | +#else | |
| 247 | + | |
| 248 | +#endif | |
| 249 | + } | |
| 250 | + | |
| 251 | + /// <summary> | |
| 252 | + /// Manually record the location of the user. | |
| 253 | + /// </summary> | |
| 254 | + /// <param name="latitude">latitude as double.</param> | |
| 255 | + /// <param name="longitude">longitude as double.</param> | |
| 256 | + public static void recordLocation(double latitude, double longitude) | |
| 257 | + { | |
| 258 | +#if UNITY_IOS && !UNITY_EDITOR | |
| 259 | + AppsFlyeriOS.recordLocation(latitude, longitude); | |
| 260 | +#elif UNITY_ANDROID && !UNITY_EDITOR | |
| 261 | + AppsFlyerAndroid.recordLocation(latitude, longitude); | |
| 262 | +#else | |
| 263 | + | |
| 264 | +#endif | |
| 265 | + } | |
| 266 | + | |
| 267 | + /// <summary> | |
| 268 | + /// Anonymize user Data. | |
| 269 | + /// Use this API during the SDK Initialization to explicitly anonymize a user's installs, events and sessions. | |
| 270 | + /// Default is false. | |
| 271 | + /// </summary> | |
| 272 | + /// <param name = "shouldAnonymizeUser" >shouldAnonymizeUser boolean.</param> | |
| 273 | + public static void anonymizeUser(bool shouldAnonymizeUser) | |
| 274 | + { | |
| 275 | +#if UNITY_IOS && !UNITY_EDITOR | |
| 276 | + AppsFlyeriOS.anonymizeUser(shouldAnonymizeUser); | |
| 277 | +#elif UNITY_ANDROID && !UNITY_EDITOR | |
| 278 | + AppsFlyerAndroid.anonymizeUser(shouldAnonymizeUser); | |
| 279 | +#else | |
| 280 | + | |
| 281 | +#endif | |
| 282 | + } | |
| 283 | + | |
| 284 | + /// <summary> | |
| 285 | + /// Get AppsFlyer's unique device ID which is created for every new install of an app. | |
| 286 | + /// </summary> | |
| 287 | + /// <returns>AppsFlyer's unique device ID.</returns> | |
| 288 | + public static string getAppsFlyerId() | |
| 289 | + { | |
| 290 | +#if UNITY_IOS && !UNITY_EDITOR | |
| 291 | + return AppsFlyeriOS.getAppsFlyerId(); | |
| 292 | +#elif UNITY_ANDROID && !UNITY_EDITOR | |
| 293 | + return AppsFlyerAndroid.getAppsFlyerId(); | |
| 294 | +#else | |
| 295 | + return ""; | |
| 296 | +#endif | |
| 297 | + | |
| 298 | + } | |
| 299 | + | |
| 300 | + /// <summary> | |
| 301 | + /// Set a custom value for the minimum required time between sessions. | |
| 302 | + /// By default, at least 5 seconds must lapse between 2 app launches to count as separate 2 sessions. | |
| 303 | + /// </summary> | |
| 304 | + /// <param name="seconds">minimum time between 2 separate sessions in seconds.</param> | |
| 305 | + public static void setMinTimeBetweenSessions(int seconds) | |
| 306 | + { | |
| 307 | +#if UNITY_IOS && !UNITY_EDITOR | |
| 308 | + AppsFlyeriOS.setMinTimeBetweenSessions(seconds); | |
| 309 | +#elif UNITY_ANDROID && !UNITY_EDITOR | |
| 310 | + AppsFlyerAndroid.setMinTimeBetweenSessions(seconds); | |
| 311 | +#else | |
| 312 | + | |
| 313 | +#endif | |
| 314 | + } | |
| 315 | + | |
| 316 | + /// <summary> | |
| 317 | + /// Set a custom host. | |
| 318 | + /// </summary> | |
| 319 | + /// <param name="hostPrefixName">Host prefix.</param> | |
| 320 | + /// <param name="hostName">Host name.</param> | |
| 321 | + public static void setHost(string hostPrefixName, string hostName) | |
| 322 | + { | |
| 323 | +#if UNITY_IOS && !UNITY_EDITOR | |
| 324 | + AppsFlyeriOS.setHost(hostName, hostPrefixName); | |
| 325 | +#elif UNITY_ANDROID && !UNITY_EDITOR | |
| 326 | + AppsFlyerAndroid.setHost(hostPrefixName, hostName); | |
| 327 | +#else | |
| 328 | + | |
| 329 | +#endif | |
| 330 | + } | |
| 331 | + | |
| 332 | + /// <summary> | |
| 333 | + /// Set the user emails and encrypt them. | |
| 334 | + /// cryptMethod Encryption method: | |
| 335 | + /// EmailCryptType.EmailCryptTypeMD5 | |
| 336 | + /// EmailCryptType.EmailCryptTypeSHA1 | |
| 337 | + /// EmailCryptType.EmailCryptTypeSHA256 | |
| 338 | + /// EmailCryptType.EmailCryptTypeNone | |
| 339 | + /// </summary> | |
| 340 | + /// <param name="cryptMethod">Encryption method.</param> | |
| 341 | + /// <param name="emails">User emails.</param> | |
| 342 | + public static void setUserEmails(EmailCryptType cryptMethod, params string[] emails) | |
| 343 | + { | |
| 344 | +#if UNITY_IOS && !UNITY_EDITOR | |
| 345 | + AppsFlyeriOS.setUserEmails(cryptMethod, emails.Length, emails); | |
| 346 | +#elif UNITY_ANDROID && !UNITY_EDITOR | |
| 347 | + AppsFlyerAndroid.setUserEmails(cryptMethod, emails); | |
| 348 | +#else | |
| 349 | + | |
| 350 | +#endif | |
| 351 | + } | |
| 352 | + | |
| 353 | + /// <summary> | |
| 354 | + /// Set the user phone number. | |
| 355 | + /// </summary> | |
| 356 | + /// <param name="phoneNumber">phoneNumber string</param> | |
| 357 | + public static void setPhoneNumber(string phoneNumber) | |
| 358 | + { | |
| 359 | +#if UNITY_IOS && !UNITY_EDITOR | |
| 360 | + AppsFlyeriOS.setPhoneNumber(phoneNumber); | |
| 361 | +#elif UNITY_ANDROID && !UNITY_EDITOR | |
| 362 | + AppsFlyerAndroid.setPhoneNumber(phoneNumber); | |
| 363 | +#else | |
| 364 | + | |
| 365 | +#endif | |
| 366 | + } | |
| 367 | + | |
| 368 | + /// <summary> | |
| 369 | + /// Used by advertisers to exclude all networks/integrated partners from getting data. | |
| 370 | + /// </summary> | |
| 371 | + public static void setSharingFilterForAllPartners() | |
| 372 | + { | |
| 373 | +#if UNITY_IOS && !UNITY_EDITOR | |
| 374 | + AppsFlyeriOS.setSharingFilterForAllPartners(); | |
| 375 | +#elif UNITY_ANDROID && !UNITY_EDITOR | |
| 376 | + AppsFlyerAndroid.setSharingFilterForAllPartners(); | |
| 377 | +#else | |
| 378 | + | |
| 379 | +#endif | |
| 380 | + } | |
| 381 | + | |
| 382 | + /// <summary> | |
| 383 | + /// Used by advertisers to set some (one or more) networks/integrated partners to exclude from getting data. | |
| 384 | + /// </summary> | |
| 385 | + /// <param name="partners">partners to exclude from getting data</param> | |
| 386 | + public static void setSharingFilter(params string[] partners) | |
| 387 | + { | |
| 388 | +#if UNITY_IOS && !UNITY_EDITOR | |
| 389 | + AppsFlyeriOS.setSharingFilter(partners); | |
| 390 | +#elif UNITY_ANDROID && !UNITY_EDITOR | |
| 391 | + AppsFlyerAndroid.setSharingFilter(partners); | |
| 392 | +#else | |
| 393 | + | |
| 394 | +#endif | |
| 395 | + } | |
| 396 | + | |
| 397 | + /// <summary> | |
| 398 | + /// Register a Conversion Data Listener. | |
| 399 | + /// Allows the developer to access the user attribution data in real-time for every new install, directly from the SDK level. | |
| 400 | + /// By doing this you can serve users with personalized content or send them to specific activities within the app, | |
| 401 | + /// which can greatly enhance their engagement with your app. | |
| 402 | + /// </summary> | |
| 403 | + /// <example> | |
| 404 | + /// <code> | |
| 405 | + /// AppsFlyer.getConversionData(this.name); | |
| 406 | + /// </code> | |
| 407 | + /// </example> | |
| 408 | + public static void getConversionData(string objectName) | |
| 409 | + { | |
| 410 | +#if UNITY_IOS && !UNITY_EDITOR | |
| 411 | + AppsFlyeriOS.getConversionData(objectName); | |
| 412 | +#elif UNITY_ANDROID && !UNITY_EDITOR | |
| 413 | + AppsFlyerAndroid.getConversionData(objectName); | |
| 414 | +#else | |
| 415 | + | |
| 416 | +#endif | |
| 417 | + } | |
| 418 | + | |
| 419 | + | |
| 420 | + /// <summary> | |
| 421 | + /// Use the following API to attribute the click and launch the app store's app page. | |
| 422 | + /// </summary> | |
| 423 | + /// <param name="appID">promoted App ID</param> | |
| 424 | + /// <param name="campaign">cross promotion campaign</param> | |
| 425 | + /// <param name="userParams">additional user params</param> | |
| 426 | + /// <example> | |
| 427 | + /// <code> | |
| 428 | + /// Dictionary<string, string> parameters = new Dictionary<string, string>(); | |
| 429 | + /// parameters.Add("af_sub1", "val"); | |
| 430 | + /// parameters.Add("custom_param", "val2"); | |
| 431 | + /// AppsFlyer.attributeAndOpenStore("123456789", "test campaign", parameters, this); | |
| 432 | + /// </code> | |
| 433 | + /// </example> | |
| 434 | + public static void attributeAndOpenStore(string appID, string campaign, Dictionary<string, string> userParams, MonoBehaviour gameObject) | |
| 435 | + { | |
| 436 | +#if UNITY_IOS && !UNITY_EDITOR | |
| 437 | + AppsFlyeriOS.attributeAndOpenStore(appID, campaign, userParams, gameObject); | |
| 438 | +#elif UNITY_ANDROID && !UNITY_EDITOR | |
| 439 | + AppsFlyerAndroid.attributeAndOpenStore(appID, campaign, userParams); | |
| 440 | +#else | |
| 441 | + | |
| 442 | +#endif | |
| 443 | + } | |
| 444 | + | |
| 445 | + /// <summary> | |
| 446 | + /// To attribute an impression use the following API call. | |
| 447 | + /// Make sure to use the promoted App ID as it appears within the AppsFlyer dashboard. | |
| 448 | + /// </summary> | |
| 449 | + /// <param name="appID">promoted App ID.</param> | |
| 450 | + /// <param name="campaign">cross promotion campaign.</param> | |
| 451 | + /// <param name="parameters">parameters Dictionary.</param> | |
| 452 | + public static void recordCrossPromoteImpression(string appID, string campaign, Dictionary<string, string> parameters) | |
| 453 | + { | |
| 454 | +#if UNITY_IOS && !UNITY_EDITOR | |
| 455 | + AppsFlyeriOS.recordCrossPromoteImpression(appID, campaign, parameters); | |
| 456 | +#elif UNITY_ANDROID && !UNITY_EDITOR | |
| 457 | + AppsFlyerAndroid.recordCrossPromoteImpression(appID, campaign, parameters); | |
| 458 | +#else | |
| 459 | + | |
| 460 | +#endif | |
| 461 | + } | |
| 462 | + | |
| 463 | + /// <summary> | |
| 464 | + /// The LinkGenerator class builds the invite URL according to various setter methods which allow passing on additional information on the click. | |
| 465 | + /// See - https://support.appsflyer.com/hc/en-us/articles/115004480866-User-invite-attribution- | |
| 466 | + /// </summary> | |
| 467 | + /// <param name="parameters">parameters Dictionary.</param> | |
| 468 | + public static void generateUserInviteLink(Dictionary<string, string> parameters, MonoBehaviour gameObject) | |
| 469 | + { | |
| 470 | +#if UNITY_IOS && !UNITY_EDITOR | |
| 471 | + AppsFlyeriOS.generateUserInviteLink(parameters, gameObject); | |
| 472 | +#elif UNITY_ANDROID && !UNITY_EDITOR | |
| 473 | + AppsFlyerAndroid.generateUserInviteLink(parameters, gameObject); | |
| 474 | +#else | |
| 475 | + | |
| 476 | +#endif | |
| 477 | + } | |
| 478 | + | |
| 479 | + /// <summary> | |
| 480 | + /// Helper method to convert json strings to dictionary. | |
| 481 | + /// </summary> | |
| 482 | + /// <param name="str">json string</param> | |
| 483 | + /// <returns>dictionary representing the input json string.</returns> | |
| 484 | + public static Dictionary<string, object> CallbackStringToDictionary(string str) | |
| 485 | + { | |
| 486 | + return AFMiniJSON.Json.Deserialize(str) as Dictionary<string, object>; | |
| 487 | + } | |
| 488 | + | |
| 489 | + /// <summary> | |
| 490 | + /// Helper method to log AppsFlyer events and callbacks. | |
| 491 | + /// </summary> | |
| 492 | + /// <param name="methodName">method name</param> | |
| 493 | + /// <param name="str">message to log</param> | |
| 494 | + public static void AFLog(string methodName, string str) | |
| 495 | + { | |
| 496 | + Debug.Log(string.Format("AppsFlyer_Unity_v{0} {1} called with {2}", kAppsFlyerPluginVersion, methodName, str)); | |
| 497 | + } | |
| 498 | + } | |
| 499 | + | |
| 500 | + public enum EmailCryptType | |
| 501 | + { | |
| 502 | + // None | |
| 503 | + EmailCryptTypeNone = 0, | |
| 504 | + // SHA256 | |
| 505 | + EmailCryptTypeSHA256 = 1, | |
| 506 | + } | |
| 507 | + | |
| 508 | +} |
AppsFlyer.cs.meta
AppsFlyerAndroid.cs
| 1 | +using System; | |
| 2 | +using System.Collections.Generic; | |
| 3 | +using UnityEngine; | |
| 4 | + | |
| 5 | +namespace AppsFlyerSDK | |
| 6 | +{ | |
| 7 | + | |
| 8 | +#if UNITY_ANDROID | |
| 9 | + public class AppsFlyerAndroid | |
| 10 | + { | |
| 11 | + | |
| 12 | + private static AndroidJavaClass appsFlyerAndroid = new AndroidJavaClass("com.appsflyer.unity.AppsFlyerAndroidWrapper"); | |
| 13 | + | |
| 14 | + | |
| 15 | + /// <summary> | |
| 16 | + /// Use this method to init the sdk for the application. | |
| 17 | + /// Call this method before startSDK. | |
| 18 | + /// </summary> | |
| 19 | + /// <param name="devkey"> AppsFlyer's Dev-Key, which is accessible from your AppsFlyer account under 'App Settings' in the dashboard.</param> | |
| 20 | + /// <param name="gameObject">The current game object. This is used to get the conversion data callbacks. Pass null if you do not need the callbacks.</param> | |
| 21 | + public static void initSDK(string devkey, MonoBehaviour gameObject) | |
| 22 | + { | |
| 23 | +#if !UNITY_EDITOR | |
| 24 | + appsFlyerAndroid.CallStatic("initSDK", devkey, gameObject ? gameObject.name : null); | |
| 25 | +#endif | |
| 26 | + } | |
| 27 | + | |
| 28 | + /// <summary> | |
| 29 | + /// Use this method to start the sdk for the application. | |
| 30 | + /// The AppsFlyer's Dev-Key must be provided. | |
| 31 | + /// </summary> | |
| 32 | + /// <param name="devkey"> AppsFlyer's Dev-Key, which is accessible from your AppsFlyer account under 'App Settings' in the dashboard.</param> | |
| 33 | + public static void startSDK() | |
| 34 | + { | |
| 35 | +#if !UNITY_EDITOR | |
| 36 | + appsFlyerAndroid.CallStatic("startTracking"); | |
| 37 | +#endif | |
| 38 | + } | |
| 39 | + | |
| 40 | + /// <summary> | |
| 41 | + /// Once this API is invoked, our SDK no longer communicates with our servers and stops functioning. | |
| 42 | + /// In some extreme cases you might want to shut down all SDK activity due to legal and privacy compliance. | |
| 43 | + /// This can be achieved with the stopSDK API. | |
| 44 | + /// </summary> | |
| 45 | + /// <param name="isSDKStopped">boolean should SDK be stopped.</param> | |
| 46 | + public static void stopSDK(bool isSDKStopped) | |
| 47 | + { | |
| 48 | +#if !UNITY_EDITOR | |
| 49 | + appsFlyerAndroid.CallStatic("stopTracking", isSDKStopped); | |
| 50 | +#endif | |
| 51 | + } | |
| 52 | + | |
| 53 | + /// <summary> | |
| 54 | + /// Get the AppsFlyer SDK version used in app. | |
| 55 | + /// </summary> | |
| 56 | + /// <returns>AppsFlyer SDK version.</returns> | |
| 57 | + public static string getSdkVersion() | |
| 58 | + { | |
| 59 | +#if !UNITY_EDITOR | |
| 60 | + return appsFlyerAndroid.CallStatic<string>("getSdkVersion"); | |
| 61 | +#else | |
| 62 | + return ""; | |
| 63 | +#endif | |
| 64 | + } | |
| 65 | + | |
| 66 | + /// <summary> | |
| 67 | + /// Manually pass the Firebase / GCM Device Token for Uninstall measurement. | |
| 68 | + /// </summary> | |
| 69 | + /// <param name="token">Firebase Device Token.</param> | |
| 70 | + public static void updateServerUninstallToken(string token) | |
| 71 | + { | |
| 72 | +#if !UNITY_EDITOR | |
| 73 | + appsFlyerAndroid.CallStatic("updateServerUninstallToken", token); | |
| 74 | +#endif | |
| 75 | + } | |
| 76 | + | |
| 77 | + /// <summary> | |
| 78 | + /// Enables Debug logs for the AppsFlyer SDK. | |
| 79 | + /// Should only be set to true in development / debug. | |
| 80 | + /// </summary> | |
| 81 | + /// <param name="shouldEnable">shouldEnable boolean.</param> | |
| 82 | + public static void setIsDebug(bool shouldEnable) | |
| 83 | + { | |
| 84 | +#if !UNITY_EDITOR | |
| 85 | + appsFlyerAndroid.CallStatic("setIsDebug", shouldEnable); | |
| 86 | +#endif | |
| 87 | + } | |
| 88 | + | |
| 89 | + /// <summary> | |
| 90 | + /// By default, IMEI and Android ID are not collected by the SDK if the OS version is higher than KitKat (4.4) | |
| 91 | + /// and the device contains Google Play Services(on SDK versions 4.8.8 and below the specific app needed GPS). | |
| 92 | + /// Use this API to explicitly send IMEI to AppsFlyer. | |
| 93 | + /// </summary> | |
| 94 | + /// <param name="aImei">device's IMEI.</param> | |
| 95 | + public static void setImeiData(string aImei) | |
| 96 | + { | |
| 97 | +#if !UNITY_EDITOR | |
| 98 | + appsFlyerAndroid.CallStatic("setImeiData", aImei); | |
| 99 | +#endif | |
| 100 | + } | |
| 101 | + | |
| 102 | + /// <summary> | |
| 103 | + /// By default, IMEI and Android ID are not collected by the SDK if the OS version is higher than KitKat(4.4) | |
| 104 | + /// and the device contains Google Play Services(on SDK versions 4.8.8 and below the specific app needed GPS). | |
| 105 | + /// Use this API to explicitly send Android ID to AppsFlyer. | |
| 106 | + /// </summary> | |
| 107 | + /// <param name="aAndroidId">device's Android ID.</param> | |
| 108 | + public static void setAndroidIdData(string aAndroidId) | |
| 109 | + { | |
| 110 | +#if !UNITY_EDITOR | |
| 111 | + appsFlyerAndroid.CallStatic("setAndroidIdData", aAndroidId); | |
| 112 | +#endif | |
| 113 | + } | |
| 114 | + | |
| 115 | + /// <summary> | |
| 116 | + /// Setting your own customer ID enables you to cross-reference your own unique ID with AppsFlyer’s unique ID and the other devices’ IDs. | |
| 117 | + /// This ID is available in AppsFlyer CSV reports along with Postback APIs for cross-referencing with your internal IDs. | |
| 118 | + /// </summary> | |
| 119 | + /// <param name="id">Customer ID for client.</param> | |
| 120 | + public static void setCustomerUserId(string id) | |
| 121 | + { | |
| 122 | +#if !UNITY_EDITOR | |
| 123 | + appsFlyerAndroid.CallStatic("setCustomerUserId", id); | |
| 124 | +#endif | |
| 125 | + } | |
| 126 | + | |
| 127 | + /// <summary> | |
| 128 | + /// It is possible to delay the SDK Initialization until the customerUserID is set. | |
| 129 | + /// This feature makes sure that the SDK doesn't begin functioning until the customerUserID is provided. | |
| 130 | + /// If this API is used, all in-app events and any other SDK API calls are discarded, until the customerUserID is provided. | |
| 131 | + /// </summary> | |
| 132 | + /// <param name="wait">wait boolean.</param> | |
| 133 | + public static void waitForCustomerUserId(bool wait) | |
| 134 | + { | |
| 135 | +#if !UNITY_EDITOR | |
| 136 | + appsFlyerAndroid.CallStatic("waitForCustomerUserId", wait); | |
| 137 | +#endif | |
| 138 | + } | |
| 139 | + | |
| 140 | + /// <summary> | |
| 141 | + /// Use this API to provide the SDK with the relevant customer user id and trigger the SDK to begin its normal activity. | |
| 142 | + /// </summary> | |
| 143 | + /// <param name="id">Customer ID for client.</param> | |
| 144 | + public static void setCustomerIdAndStartSDK(string id) | |
| 145 | + { | |
| 146 | +#if !UNITY_EDITOR | |
| 147 | + appsFlyerAndroid.CallStatic("setCustomerIdAndTrack", id); | |
| 148 | +#endif | |
| 149 | + } | |
| 150 | + | |
| 151 | + /// <summary> | |
| 152 | + /// Get the current AF_STORE value. | |
| 153 | + /// </summary> | |
| 154 | + /// <returns>AF_Store value.</returns> | |
| 155 | + public static string getOutOfStore() | |
| 156 | + { | |
| 157 | +#if !UNITY_EDITOR | |
| 158 | + return appsFlyerAndroid.CallStatic<string>("getOutOfStore"); | |
| 159 | +#else | |
| 160 | + return ""; | |
| 161 | +#endif | |
| 162 | + } | |
| 163 | + | |
| 164 | + /// <summary> | |
| 165 | + /// Manually set the AF_STORE value. | |
| 166 | + /// </summary> | |
| 167 | + /// <param name="sourceName">value to be set.</param> | |
| 168 | + public static void setOutOfStore(string sourceName) | |
| 169 | + { | |
| 170 | +#if !UNITY_EDITOR | |
| 171 | + appsFlyerAndroid.CallStatic("setOutOfStore", sourceName); | |
| 172 | +#endif | |
| 173 | + } | |
| 174 | + | |
| 175 | + /// <summary> | |
| 176 | + /// Set the OneLink ID that should be used for User-Invites. | |
| 177 | + /// The link that is generated for the user invite will use this OneLink as the base link. | |
| 178 | + /// </summary> | |
| 179 | + /// <param name="oneLinkId">OneLink ID obtained from the AppsFlyer Dashboard.</param> | |
| 180 | + public static void setAppInviteOneLinkID(string oneLinkId) | |
| 181 | + { | |
| 182 | +#if !UNITY_EDITOR | |
| 183 | + appsFlyerAndroid.CallStatic("setAppInviteOneLinkID", oneLinkId); | |
| 184 | +#endif | |
| 185 | + } | |
| 186 | + | |
| 187 | + /// <summary> | |
| 188 | + /// Set additional data to be sent to AppsFlyer. | |
| 189 | + /// </summary> | |
| 190 | + /// <param name="customData">additional data Dictionary.</param> | |
| 191 | + public static void setAdditionalData(Dictionary<string, string> customData) | |
| 192 | + { | |
| 193 | +#if !UNITY_EDITOR | |
| 194 | + appsFlyerAndroid.CallStatic("setAdditionalData", convertDictionaryToJavaMap(customData)); | |
| 195 | +#endif | |
| 196 | + } | |
| 197 | + | |
| 198 | + /// <summary> | |
| 199 | + /// Set the user emails. | |
| 200 | + /// </summary> | |
| 201 | + /// <param name="emails">User emails.</param> | |
| 202 | + public static void setUserEmails(params string[] emails) | |
| 203 | + { | |
| 204 | +#if !UNITY_EDITOR | |
| 205 | + appsFlyerAndroid.CallStatic("setUserEmails", (object)emails); | |
| 206 | +#endif | |
| 207 | + } | |
| 208 | + | |
| 209 | + | |
| 210 | + /// <summary> | |
| 211 | + /// Set the user phone number. | |
| 212 | + /// </summary> | |
| 213 | + /// <param name="phoneNumber">User phoneNumber.</param> | |
| 214 | + public static void setPhoneNumber(string phoneNumber){ | |
| 215 | +#if !UNITY_EDITOR | |
| 216 | + appsFlyerAndroid.CallStatic("setPhoneNumber", phoneNumber); | |
| 217 | +#endif | |
| 218 | + } | |
| 219 | + | |
| 220 | + /// <summary> | |
| 221 | + /// Set the user emails and encrypt them. | |
| 222 | + /// cryptMethod Encryption method: | |
| 223 | + /// EmailCryptType.EmailCryptTypeMD5 | |
| 224 | + /// EmailCryptType.EmailCryptTypeSHA1 | |
| 225 | + /// EmailCryptType.EmailCryptTypeSHA256 | |
| 226 | + /// EmailCryptType.EmailCryptTypeNone | |
| 227 | + /// </summary> | |
| 228 | + /// <param name="cryptMethod">Encryption method.</param> | |
| 229 | + /// <param name="emails">User emails.</param> | |
| 230 | + public static void setUserEmails(EmailCryptType cryptMethod, params string[] emails) | |
| 231 | + { | |
| 232 | +#if !UNITY_EDITOR | |
| 233 | + appsFlyerAndroid.CallStatic("setUserEmails", getEmailType(cryptMethod), (object)emails); | |
| 234 | +#endif | |
| 235 | + } | |
| 236 | + | |
| 237 | + /// <summary> | |
| 238 | + /// Opt-out of collection of Android ID. | |
| 239 | + /// If the app does NOT contain Google Play Services, Android ID is collected by the SDK. | |
| 240 | + /// However, apps with Google play services should avoid Android ID collection as this is in violation of the Google Play policy. | |
| 241 | + /// </summary> | |
| 242 | + /// <param name="isCollect">boolean, false to opt-out.</param> | |
| 243 | + public static void setCollectAndroidID(bool isCollect) | |
| 244 | + { | |
| 245 | +#if !UNITY_EDITOR | |
| 246 | + appsFlyerAndroid.CallStatic("setCollectAndroidID", isCollect); | |
| 247 | +#endif | |
| 248 | + } | |
| 249 | + | |
| 250 | + /// <summary> | |
| 251 | + /// Opt-out of collection of IMEI. | |
| 252 | + /// If the app does NOT contain Google Play Services, device IMEI is collected by the SDK. | |
| 253 | + /// However, apps with Google play services should avoid IMEI collection as this is in violation of the Google Play policy. | |
| 254 | + /// </summary> | |
| 255 | + /// <param name="isCollect">boolean, false to opt-out.</param> | |
| 256 | + public static void setCollectIMEI(bool isCollect) | |
| 257 | + { | |
| 258 | +#if !UNITY_EDITOR | |
| 259 | + appsFlyerAndroid.CallStatic("setCollectIMEI", isCollect); | |
| 260 | +#endif | |
| 261 | + } | |
| 262 | + | |
| 263 | + /// <summary> | |
| 264 | + /// Advertisers can wrap AppsFlyer OneLink within another Universal Link. | |
| 265 | + /// This Universal Link will invoke the app but any deep linking data will not propagate to AppsFlyer. | |
| 266 | + /// </summary> | |
| 267 | + /// <param name="urls">Array of urls.</param> | |
| 268 | + public static void setResolveDeepLinkURLs(params string[] urls) | |
| 269 | + { | |
| 270 | +#if !UNITY_EDITOR | |
| 271 | + appsFlyerAndroid.CallStatic("setResolveDeepLinkURLs", (object)urls); | |
| 272 | +#endif | |
| 273 | + } | |
| 274 | + | |
| 275 | + | |
| 276 | + /// <summary> | |
| 277 | + /// Advertisers can use this method to set vanity onelink domains. | |
| 278 | + /// </summary> | |
| 279 | + /// <param name="domains">Array of domains.</param> | |
| 280 | + public static void setOneLinkCustomDomain(params string[] domains) | |
| 281 | + { | |
| 282 | +#if !UNITY_EDITOR | |
| 283 | + appsFlyerAndroid.CallStatic("setOneLinkCustomDomain", (object)domains); | |
| 284 | +#endif | |
| 285 | + } | |
| 286 | + | |
| 287 | + /// <summary> | |
| 288 | + /// Manually set that the application was updated. | |
| 289 | + /// </summary> | |
| 290 | + /// <param name="isUpdate">isUpdate boolean value.</param> | |
| 291 | + public static void setIsUpdate(bool isUpdate) | |
| 292 | + { | |
| 293 | +#if !UNITY_EDITOR | |
| 294 | + appsFlyerAndroid.CallStatic("setIsUpdate", isUpdate); | |
| 295 | +#endif | |
| 296 | + } | |
| 297 | + | |
| 298 | + /// <summary> | |
| 299 | + /// Setting user local currency code for in-app purchases. | |
| 300 | + /// The currency code should be a 3 character ISO 4217 code. (default is USD). | |
| 301 | + /// You can set the currency code for all events by calling the following method. | |
| 302 | + /// </summary> | |
| 303 | + /// <param name="currencyCode">3 character ISO 4217 code.</param> | |
| 304 | + public static void setCurrencyCode(string currencyCode) | |
| 305 | + { | |
| 306 | +#if !UNITY_EDITOR | |
| 307 | + appsFlyerAndroid.CallStatic("setCurrencyCode", currencyCode); | |
| 308 | +#endif | |
| 309 | + } | |
| 310 | + | |
| 311 | + /// <summary> | |
| 312 | + /// Manually record the location of the user. | |
| 313 | + /// </summary> | |
| 314 | + /// <param name="latitude">latitude as double.</param> | |
| 315 | + /// <param name="longitude">longitude as double.</param> | |
| 316 | + public static void recordLocation(double latitude, double longitude) | |
| 317 | + { | |
| 318 | +#if !UNITY_EDITOR | |
| 319 | + appsFlyerAndroid.CallStatic("trackLocation", latitude, longitude); | |
| 320 | +#endif | |
| 321 | + } | |
| 322 | + | |
| 323 | + /// <summary> | |
| 324 | + /// Send an In-App Event. | |
| 325 | + /// In-App Events provide insight on what is happening in your app. | |
| 326 | + /// </summary> | |
| 327 | + /// <param name="eventName">Event Name as String.</param> | |
| 328 | + /// <param name="eventValues">Event Values as Dictionary.</param> | |
| 329 | + public static void sendEvent(string eventName, Dictionary<string, string> eventValues) | |
| 330 | + { | |
| 331 | +#if !UNITY_EDITOR | |
| 332 | + appsFlyerAndroid.CallStatic("trackEvent", eventName, convertDictionaryToJavaMap(eventValues)); | |
| 333 | +#endif | |
| 334 | + } | |
| 335 | + | |
| 336 | + /// <summary> | |
| 337 | + /// Anonymize user Data. | |
| 338 | + /// Use this API during the SDK Initialization to explicitly anonymize a user's installs, events and sessions. | |
| 339 | + /// Default is false. | |
| 340 | + /// </summary> | |
| 341 | + /// <param name="isDisabled">isDisabled boolean.</param> | |
| 342 | + public static void anonymizeUser(bool isDisabled) | |
| 343 | + { | |
| 344 | +#if !UNITY_EDITOR | |
| 345 | + appsFlyerAndroid.CallStatic("setDeviceTrackingDisabled", isDisabled); | |
| 346 | +#endif | |
| 347 | + } | |
| 348 | + | |
| 349 | + /// <summary> | |
| 350 | + /// Enable the collection of Facebook Deferred AppLinks. | |
| 351 | + /// Requires Facebook SDK and Facebook app on target/client device. | |
| 352 | + /// This API must be invoked prior to initializing the AppsFlyer SDK in order to function properly. | |
| 353 | + /// </summary> | |
| 354 | + /// <param name="isEnabled">should Facebook's deferred app links be processed by the AppsFlyer SDK.</param> | |
| 355 | + public static void enableFacebookDeferredApplinks(bool isEnabled) | |
| 356 | + { | |
| 357 | +#if !UNITY_EDITOR | |
| 358 | + appsFlyerAndroid.CallStatic("enableFacebookDeferredApplinks", isEnabled); | |
| 359 | +#endif | |
| 360 | + } | |
| 361 | + | |
| 362 | + | |
| 363 | + /// <summary> | |
| 364 | + /// Restrict reengagement via deep-link to once per each unique deep-link. | |
| 365 | + /// Otherwise deep re-occurring deep-links will be permitted for non-singleTask Activities and deep-linking via AppsFlyer deep-links. | |
| 366 | + /// The default value is false. | |
| 367 | + /// </summary> | |
| 368 | + /// <param name="doConsume">doConsume boolean.</param> | |
| 369 | + public static void setConsumeAFDeepLinks(bool doConsume) | |
| 370 | + { | |
| 371 | +#if !UNITY_EDITOR | |
| 372 | + appsFlyerAndroid.CallStatic("setConsumeAFDeepLinks", doConsume); | |
| 373 | +#endif | |
| 374 | + } | |
| 375 | + | |
| 376 | + /// <summary> | |
| 377 | + /// Specify the manufacturer or media source name to which the preinstall is attributed. | |
| 378 | + /// </summary> | |
| 379 | + /// <param name="mediaSource">Manufacturer or media source name for preinstall attribution.</param> | |
| 380 | + /// <param name="campaign">Campaign name for preinstall attribution.</param> | |
| 381 | + /// <param name="siteId">Site ID for preinstall attribution.</param> | |
| 382 | + public static void setPreinstallAttribution(string mediaSource, string campaign, string siteId) | |
| 383 | + { | |
| 384 | +#if !UNITY_EDITOR | |
| 385 | + appsFlyerAndroid.CallStatic("setPreinstallAttribution", mediaSource, campaign, siteId); | |
| 386 | +#endif | |
| 387 | + } | |
| 388 | + | |
| 389 | + /// <summary> | |
| 390 | + /// Boolean indicator for preinstall by Manufacturer. | |
| 391 | + /// </summary> | |
| 392 | + /// <returns>boolean isPreInstalledApp.</returns> | |
| 393 | + public static bool isPreInstalledApp() | |
| 394 | + { | |
| 395 | +#if !UNITY_EDITOR | |
| 396 | + return appsFlyerAndroid.CallStatic<bool>("isPreInstalledApp"); | |
| 397 | +#else | |
| 398 | + return false; | |
| 399 | +#endif | |
| 400 | + } | |
| 401 | + | |
| 402 | + /// <summary> | |
| 403 | + /// Get the Facebook attribution ID, if one exists. | |
| 404 | + /// </summary> | |
| 405 | + /// <returns>string Facebook attribution ID.</returns> | |
| 406 | + public static string getAttributionId() | |
| 407 | + { | |
| 408 | +#if !UNITY_EDITOR | |
| 409 | + return appsFlyerAndroid.CallStatic<string>("getAttributionId"); | |
| 410 | +#else | |
| 411 | + return ""; | |
| 412 | +#endif | |
| 413 | + } | |
| 414 | + | |
| 415 | + /// <summary> | |
| 416 | + /// Get AppsFlyer's unique device ID is created for every new install of an app. | |
| 417 | + /// </summary> | |
| 418 | + /// <returns>AppsFlyer's unique device ID.</returns> | |
| 419 | + public static string getAppsFlyerId() | |
| 420 | + { | |
| 421 | +#if !UNITY_EDITOR | |
| 422 | + return appsFlyerAndroid.CallStatic<string>("getAppsFlyerId"); | |
| 423 | +#else | |
| 424 | + return ""; | |
| 425 | +#endif | |
| 426 | + } | |
| 427 | + | |
| 428 | + /// <summary> | |
| 429 | + /// API for server verification of in-app purchases. | |
| 430 | + /// An af_purchase event with the relevant values will be automatically sent if the validation is successful. | |
| 431 | + /// </summary> | |
| 432 | + /// <param name="publicKey">License Key obtained from the Google Play Console.</param> | |
| 433 | + /// <param name="signature"><code>data.INAPP_DATA_SIGNATURE</code> from <code>onActivityResult(int requestCode, int resultCode, Intent data)</code></param> | |
| 434 | + /// <param name="purchaseData"><code>data.INAPP_PURCHASE_DATA</code> from <code>onActivityResult(int requestCode, int resultCode, Intent data)</code></param> | |
| 435 | + /// <param name="price">Purchase price, should be derived from <code>skuDetails.getStringArrayList("DETAILS_LIST")</code></param> | |
| 436 | + /// <param name="currency">Purchase currency, should be derived from <code>skuDetails.getStringArrayList("DETAILS_LIST")</code></param> | |
| 437 | + /// <param name="additionalParameters">additionalParameters Freehand parameters to be sent with the purchase (if validated).</param> | |
| 438 | + public static void validateAndSendInAppPurchase(string publicKey, string signature, string purchaseData, string price, string currency, Dictionary<string, string> additionalParameters, MonoBehaviour gameObject) | |
| 439 | + { | |
| 440 | +#if !UNITY_EDITOR | |
| 441 | + appsFlyerAndroid.CallStatic("validateAndTrackInAppPurchase", publicKey, signature, purchaseData, price, currency, convertDictionaryToJavaMap(additionalParameters), gameObject ? gameObject.name : null); | |
| 442 | +#endif | |
| 443 | + } | |
| 444 | + | |
| 445 | + /// <summary> | |
| 446 | + /// Was the stopSDK(boolean) API set to true. | |
| 447 | + /// </summary> | |
| 448 | + /// <returns>boolean isSDKStopped.</returns> | |
| 449 | + public static bool isSDKStopped() | |
| 450 | + { | |
| 451 | +#if !UNITY_EDITOR | |
| 452 | + return appsFlyerAndroid.CallStatic<bool>("isTrackingStopped"); | |
| 453 | +#else | |
| 454 | + return false; | |
| 455 | +#endif | |
| 456 | + } | |
| 457 | + | |
| 458 | + /// <summary> | |
| 459 | + /// Set a custom value for the minimum required time between sessions. | |
| 460 | + /// By default, at least 5 seconds must lapse between 2 app launches to count as separate 2 sessions. | |
| 461 | + /// </summary> | |
| 462 | + /// <param name="seconds">minimum time between 2 separate sessions in seconds.</param> | |
| 463 | + public static void setMinTimeBetweenSessions(int seconds) | |
| 464 | + { | |
| 465 | +#if !UNITY_EDITOR | |
| 466 | + appsFlyerAndroid.CallStatic("setMinTimeBetweenSessions", seconds); | |
| 467 | +#endif | |
| 468 | + } | |
| 469 | + | |
| 470 | + /// <summary> | |
| 471 | + /// Set a custom host. | |
| 472 | + /// </summary> | |
| 473 | + /// <param name="hostPrefixName">Host prefix.</param> | |
| 474 | + /// <param name="hostName">Host name.</param> | |
| 475 | + public static void setHost(string hostPrefixName, string hostName) | |
| 476 | + { | |
| 477 | +#if !UNITY_EDITOR | |
| 478 | + appsFlyerAndroid.CallStatic("setHost", hostPrefixName, hostName); | |
| 479 | +#endif | |
| 480 | + } | |
| 481 | + | |
| 482 | + /// <summary> | |
| 483 | + /// Get the host name. | |
| 484 | + /// Default value is "appsflyer.com". | |
| 485 | + /// </summary> | |
| 486 | + /// <returns>Host name.</returns> | |
| 487 | + public static string getHostName() | |
| 488 | + { | |
| 489 | +#if !UNITY_EDITOR | |
| 490 | + return appsFlyerAndroid.CallStatic<string>("getHostName"); | |
| 491 | +#else | |
| 492 | + return ""; | |
| 493 | +#endif | |
| 494 | + } | |
| 495 | + | |
| 496 | + /// <summary> | |
| 497 | + /// Get the custom host prefix. | |
| 498 | + /// </summary> | |
| 499 | + /// <returns>Host prefix.</returns> | |
| 500 | + public static string getHostPrefix() | |
| 501 | + { | |
| 502 | +#if !UNITY_EDITOR | |
| 503 | + return appsFlyerAndroid.CallStatic<string>("getHostPrefix"); | |
| 504 | +#else | |
| 505 | + return ""; | |
| 506 | +#endif | |
| 507 | + } | |
| 508 | + | |
| 509 | + /// <summary> | |
| 510 | + /// Used by advertisers to exclude all networks/integrated partners from getting data. | |
| 511 | + /// </summary> | |
| 512 | + public static void setSharingFilterForAllPartners() | |
| 513 | + { | |
| 514 | +#if !UNITY_EDITOR | |
| 515 | + appsFlyerAndroid.CallStatic("setSharingFilterForAllPartners"); | |
| 516 | +#endif | |
| 517 | + } | |
| 518 | + | |
| 519 | + /// <summary> | |
| 520 | + /// Used by advertisers to set some (one or more) networks/integrated partners to exclude from getting data. | |
| 521 | + /// </summary> | |
| 522 | + /// <param name="partners">partners to exclude from getting data</param> | |
| 523 | + public static void setSharingFilter(params string[] partners) | |
| 524 | + { | |
| 525 | +#if !UNITY_EDITOR | |
| 526 | + appsFlyerAndroid.CallStatic("setSharingFilter", (object)partners); | |
| 527 | +#endif | |
| 528 | + } | |
| 529 | + | |
| 530 | + /// <summary> | |
| 531 | + /// Register a Conversion Data Listener. | |
| 532 | + /// Allows the developer to access the user attribution data in real-time for every new install, directly from the SDK level. | |
| 533 | + /// By doing this you can serve users with personalized content or send them to specific activities within the app, | |
| 534 | + /// which can greatly enhance their engagement with your app. | |
| 535 | + /// </summary> | |
| 536 | + public static void getConversionData(string objectName) | |
| 537 | + { | |
| 538 | +#if !UNITY_EDITOR | |
| 539 | + appsFlyerAndroid.CallStatic("getConversionData", objectName); | |
| 540 | +#endif | |
| 541 | + } | |
| 542 | + | |
| 543 | + /// <summary> | |
| 544 | + /// Register a validation listener for the validateAndSendInAppPurchase API. | |
| 545 | + /// </summary> | |
| 546 | + public static void initInAppPurchaseValidatorListener(MonoBehaviour gameObject) | |
| 547 | + { | |
| 548 | +#if !UNITY_EDITOR | |
| 549 | + appsFlyerAndroid.CallStatic("initInAppPurchaseValidatorListener", gameObject ? gameObject.name : null); | |
| 550 | +#endif | |
| 551 | + } | |
| 552 | + | |
| 553 | + /// <summary> | |
| 554 | + /// setCollectOaid | |
| 555 | + /// You must include the appsflyer oaid library for this api to work. | |
| 556 | + /// </summary> | |
| 557 | + /// <param name="isCollect">isCollect oaid - set fasle to opt out</param> | |
| 558 | + public static void setCollectOaid(bool isCollect) | |
| 559 | + { | |
| 560 | +#if !UNITY_EDITOR | |
| 561 | + appsFlyerAndroid.CallStatic("setCollectOaid", isCollect); | |
| 562 | +#endif | |
| 563 | + } | |
| 564 | + | |
| 565 | + /// <summary> | |
| 566 | + /// Use the following API to attribute the click and launch the app store's app page. | |
| 567 | + /// </summary> | |
| 568 | + /// <param name="promoted_app_id">promoted App ID</param> | |
| 569 | + /// <param name="campaign">cross promotion campaign</param> | |
| 570 | + /// <param name="userParams">additional user params</param> | |
| 571 | + public static void attributeAndOpenStore(string promoted_app_id, string campaign, Dictionary<string, string> userParams) | |
| 572 | + { | |
| 573 | +#if !UNITY_EDITOR | |
| 574 | + appsFlyerAndroid.CallStatic("attributeAndOpenStore", promoted_app_id, campaign, convertDictionaryToJavaMap(userParams)); | |
| 575 | +#endif | |
| 576 | + } | |
| 577 | + | |
| 578 | + /// <summary> | |
| 579 | + /// To attribute an impression use the following API call. | |
| 580 | + /// Make sure to use the promoted App ID as it appears within the AppsFlyer dashboard. | |
| 581 | + /// </summary> | |
| 582 | + /// <param name="appID">promoted App ID.</param> | |
| 583 | + /// <param name="campaign">cross promotion campaign.</param> | |
| 584 | + /// <param name="parameters">parameters Dictionary.</param> | |
| 585 | + public static void recordCrossPromoteImpression(string appID, string campaign, Dictionary<string, string> parameters) | |
| 586 | + { | |
| 587 | +#if !UNITY_EDITOR | |
| 588 | + appsFlyerAndroid.CallStatic("recordCrossPromoteImpression", appID, campaign, convertDictionaryToJavaMap(parameters)); | |
| 589 | +#endif | |
| 590 | + } | |
| 591 | + | |
| 592 | + /// <summary> | |
| 593 | + /// The LinkGenerator class builds the invite URL according to various setter methods which allow passing on additional information on the click. | |
| 594 | + /// See - https://support.appsflyer.com/hc/en-us/articles/115004480866-User-invite-attribution- | |
| 595 | + /// </summary> | |
| 596 | + /// <param name="parameters">parameters Dictionary.</param> | |
| 597 | + public static void generateUserInviteLink(Dictionary<string, string> parameters, MonoBehaviour gameObject) | |
| 598 | + { | |
| 599 | +#if !UNITY_EDITOR | |
| 600 | + appsFlyerAndroid.CallStatic("createOneLinkInviteListener", convertDictionaryToJavaMap(parameters), gameObject ? gameObject.name : null); | |
| 601 | +#endif | |
| 602 | + } | |
| 603 | + | |
| 604 | + /// <summary> | |
| 605 | + /// To measure push notifications as part of a retargeting campaign. | |
| 606 | + /// </summary> | |
| 607 | + public static void handlePushNotifications(){ | |
| 608 | +#if !UNITY_EDITOR | |
| 609 | + appsFlyerAndroid.CallStatic("handlePushNotifications"); | |
| 610 | +#endif | |
| 611 | + } | |
| 612 | + | |
| 613 | + /// <summary> | |
| 614 | + /// Internal Helper Method. | |
| 615 | + /// </summary> | |
| 616 | + private static AndroidJavaObject getEmailType(EmailCryptType cryptType) | |
| 617 | + { | |
| 618 | + AndroidJavaClass emailsCryptTypeEnum = new AndroidJavaClass("com.appsflyer.AppsFlyerProperties$EmailsCryptType"); | |
| 619 | + AndroidJavaObject emailsCryptType; | |
| 620 | + | |
| 621 | + switch (cryptType) | |
| 622 | + { | |
| 623 | + case EmailCryptType.EmailCryptTypeSHA256: | |
| 624 | + emailsCryptType = emailsCryptTypeEnum.GetStatic<AndroidJavaObject>("SHA256"); | |
| 625 | + break; | |
| 626 | + default: | |
| 627 | + emailsCryptType = emailsCryptTypeEnum.GetStatic<AndroidJavaObject>("NONE"); | |
| 628 | + break; | |
| 629 | + } | |
| 630 | + | |
| 631 | + return emailsCryptType; | |
| 632 | + } | |
| 633 | + | |
| 634 | + /// <summary> | |
| 635 | + /// Internal Helper Method. | |
| 636 | + /// </summary> | |
| 637 | + private static AndroidJavaObject convertDictionaryToJavaMap(Dictionary<string, string> dictionary) | |
| 638 | + { | |
| 639 | + AndroidJavaObject map = new AndroidJavaObject("java.util.HashMap"); | |
| 640 | + IntPtr putMethod = AndroidJNIHelper.GetMethodID(map.GetRawClass(), "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;"); | |
| 641 | + if (dictionary != null) | |
| 642 | + { | |
| 643 | + foreach (var entry in dictionary) | |
| 644 | + { | |
| 645 | + AndroidJNI.CallObjectMethod(map.GetRawObject(), putMethod, AndroidJNIHelper.CreateJNIArgArray(new object[] { entry.Key, entry.Value })); | |
| 646 | + } | |
| 647 | + } | |
| 648 | + | |
| 649 | + return map; | |
| 650 | + } | |
| 651 | + } | |
| 652 | + | |
| 653 | +#endif | |
| 654 | + | |
| 655 | + | |
| 656 | + | |
| 657 | +} |
AppsFlyerAndroid.cs.meta
AppsFlyerObject.prefab
| 1 | +%YAML 1.1 | |
| 2 | +%TAG !u! tag:unity3d.com,2011: | |
| 3 | +--- !u!1001 &100100000 | |
| 4 | +Prefab: | |
| 5 | + m_ObjectHideFlags: 1 | |
| 6 | + serializedVersion: 2 | |
| 7 | + m_Modification: | |
| 8 | + m_TransformParent: {fileID: 0} | |
| 9 | + m_Modifications: [] | |
| 10 | + m_RemovedComponents: [] | |
| 11 | + m_SourcePrefab: {fileID: 0} | |
| 12 | + m_RootGameObject: {fileID: 1562408896289314} | |
| 13 | + m_IsPrefabAsset: 1 | |
| 14 | +--- !u!1 &1562408896289314 | |
| 15 | +GameObject: | |
| 16 | + m_ObjectHideFlags: 0 | |
| 17 | + m_CorrespondingSourceObject: {fileID: 0} | |
| 18 | + m_PrefabInternal: {fileID: 100100000} | |
| 19 | + serializedVersion: 6 | |
| 20 | + m_Component: | |
| 21 | + - component: {fileID: 4294345628247858} | |
| 22 | + - component: {fileID: 114092076686766906} | |
| 23 | + m_Layer: 0 | |
| 24 | + m_Name: AppsFlyerObject | |
| 25 | + m_TagString: Untagged | |
| 26 | + m_Icon: {fileID: 0} | |
| 27 | + m_NavMeshLayer: 0 | |
| 28 | + m_StaticEditorFlags: 0 | |
| 29 | + m_IsActive: 1 | |
| 30 | +--- !u!4 &4294345628247858 | |
| 31 | +Transform: | |
| 32 | + m_ObjectHideFlags: 1 | |
| 33 | + m_CorrespondingSourceObject: {fileID: 0} | |
| 34 | + m_PrefabInternal: {fileID: 100100000} | |
| 35 | + m_GameObject: {fileID: 1562408896289314} | |
| 36 | + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} | |
| 37 | + m_LocalPosition: {x: 0, y: 0, z: 0} | |
| 38 | + m_LocalScale: {x: 1, y: 1, z: 1} | |
| 39 | + m_Children: [] | |
| 40 | + m_Father: {fileID: 0} | |
| 41 | + m_RootOrder: 0 | |
| 42 | + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} | |
| 43 | +--- !u!114 &114092076686766906 | |
| 44 | +MonoBehaviour: | |
| 45 | + m_ObjectHideFlags: 1 | |
| 46 | + m_CorrespondingSourceObject: {fileID: 0} | |
| 47 | + m_PrefabInternal: {fileID: 100100000} | |
| 48 | + m_GameObject: {fileID: 1562408896289314} | |
| 49 | + m_Enabled: 1 | |
| 50 | + m_EditorHideFlags: 0 | |
| 51 | + m_Script: {fileID: 11500000, guid: 2caf6a738ac024a48bd358f4cc91662a, type: 3} | |
| 52 | + m_Name: | |
| 53 | + m_EditorClassIdentifier: | |
| 54 | + devKey: | |
| 55 | + appID: | |
| 56 | + isDebug: 0 | |
| 57 | + getConversionData: 0 |
AppsFlyerObject.prefab.meta
AppsFlyerObjectScript.cs
| 1 | +using System.Collections; | |
| 2 | +using System.Collections.Generic; | |
| 3 | +using UnityEngine; | |
| 4 | +using AppsFlyerSDK; | |
| 5 | + | |
| 6 | +// This class is intended to be used the the AppsFlyerObject.prefab | |
| 7 | + | |
| 8 | +public class AppsFlyerObjectScript : MonoBehaviour , IAppsFlyerConversionData | |
| 9 | +{ | |
| 10 | + | |
| 11 | + // These fields are set from the editor so do not modify! | |
| 12 | + //******************************// | |
| 13 | + public string devKey; | |
| 14 | + public string appID; | |
| 15 | + public bool isDebug; | |
| 16 | + public bool getConversionData; | |
| 17 | + //******************************// | |
| 18 | + | |
| 19 | + void Start() | |
| 20 | + { | |
| 21 | + // These fields are set from the editor so do not modify! | |
| 22 | + //******************************// | |
| 23 | + AppsFlyer.setIsDebug(isDebug); | |
| 24 | + AppsFlyer.initSDK(devKey, appID, getConversionData ? this : null); | |
| 25 | + //******************************// | |
| 26 | + | |
| 27 | + AppsFlyer.startSDK(); | |
| 28 | + } | |
| 29 | + | |
| 30 | + void Update() | |
| 31 | + { | |
| 32 | + | |
| 33 | + } | |
| 34 | + | |
| 35 | + // Mark AppsFlyer CallBacks | |
| 36 | + public void onConversionDataSuccess(string conversionData) | |
| 37 | + { | |
| 38 | + AppsFlyer.AFLog("didReceiveConversionData", conversionData); | |
| 39 | + Dictionary<string, object> conversionDataDictionary = AppsFlyer.CallbackStringToDictionary(conversionData); | |
| 40 | + // add deferred deeplink logic here | |
| 41 | + } | |
| 42 | + | |
| 43 | + public void onConversionDataFail(string error) | |
| 44 | + { | |
| 45 | + AppsFlyer.AFLog("didReceiveConversionDataWithError", error); | |
| 46 | + } | |
| 47 | + | |
| 48 | + public void onAppOpenAttribution(string attributionData) | |
| 49 | + { | |
| 50 | + AppsFlyer.AFLog("onAppOpenAttribution", attributionData); | |
| 51 | + Dictionary<string, object> attributionDataDictionary = AppsFlyer.CallbackStringToDictionary(attributionData); | |
| 52 | + // add direct deeplink logic here | |
| 53 | + } | |
| 54 | + | |
| 55 | + public void onAppOpenAttributionFailure(string error) | |
| 56 | + { | |
| 57 | + AppsFlyer.AFLog("onAppOpenAttributionFailure", error); | |
| 58 | + } | |
| 59 | +} |
AppsFlyerObjectScript.cs.meta
AppsFlyeriOS.cs
| 1 | +using System.Collections.Generic; | |
| 2 | +using System.Runtime.InteropServices; | |
| 3 | +using UnityEngine; | |
| 4 | + | |
| 5 | +namespace AppsFlyerSDK | |
| 6 | +{ | |
| 7 | +#if UNITY_IOS | |
| 8 | + | |
| 9 | + public class AppsFlyeriOS | |
| 10 | + { | |
| 11 | + | |
| 12 | + /// <summary> | |
| 13 | + /// Start Session. | |
| 14 | + /// This will record a session and then record all background forground sessions during the lifecycle of the app. | |
| 15 | + /// </summary> | |
| 16 | + public static void startSDK() | |
| 17 | + { | |
| 18 | +#if !UNITY_EDITOR | |
| 19 | + _startSDK(); | |
| 20 | +#endif | |
| 21 | + } | |
| 22 | + | |
| 23 | + /// <summary> | |
| 24 | + /// Send an In-App Event. | |
| 25 | + /// In-App Events provide insight on what is happening in your app. | |
| 26 | + /// </summary> | |
| 27 | + /// <param name="eventName">Name of event.</param> | |
| 28 | + /// <param name="eventValues">Contains dictionary of values for handling by backend.</param> | |
| 29 | + public static void sendEvent(string eventName, Dictionary<string, string> eventValues) | |
| 30 | + { | |
| 31 | +#if !UNITY_EDITOR | |
| 32 | + _afSendEvent(eventName, AFMiniJSON.Json.Serialize(eventValues)); | |
| 33 | +#endif | |
| 34 | + } | |
| 35 | + | |
| 36 | + /// <summary> | |
| 37 | + /// Get the conversion data. | |
| 38 | + /// Allows the developer to access the user attribution data in real-time for every new install, directly from the SDK level. | |
| 39 | + /// By doing this you can serve users with personalized content or send them to specific activities within the app, | |
| 40 | + /// which can greatly enhance their engagement with your app. | |
| 41 | + /// </summary> | |
| 42 | + public static void getConversionData(string objectName) | |
| 43 | + { | |
| 44 | +#if !UNITY_EDITOR | |
| 45 | + _getConversionData(objectName); | |
| 46 | +#endif | |
| 47 | + } | |
| 48 | + | |
| 49 | + /// <summary> | |
| 50 | + /// In case you use your own user ID in your app, you can set this property to that ID. | |
| 51 | + /// Enables you to cross-reference your own unique ID with AppsFlyer’s unique ID and the other devices’ IDs. | |
| 52 | + /// </summary> | |
| 53 | + /// <param name="customerUserID">Customer ID for client.</param> | |
| 54 | + public static void setCustomerUserID(string customerUserID) | |
| 55 | + { | |
| 56 | +#if !UNITY_EDITOR | |
| 57 | + _setCustomerUserID(customerUserID); | |
| 58 | +#endif | |
| 59 | + } | |
| 60 | + | |
| 61 | + /// <summary> | |
| 62 | + /// In case you use custom data and you want to receive it in the raw reports. | |
| 63 | + /// see [Setting additional custom data] (https://support.appsflyer.com/hc/en-us/articles/207032066-AppsFlyer-SDK-Integration-iOS#setting-additional-custom-data) for more information. | |
| 64 | + /// </summary> | |
| 65 | + /// <param name="customData">additional data Dictionary.</param> | |
| 66 | + public static void setAdditionalData(Dictionary<string, string> customData) | |
| 67 | + { | |
| 68 | +#if !UNITY_EDITOR | |
| 69 | + _setAdditionalData(AFMiniJSON.Json.Serialize(customData)); | |
| 70 | +#endif | |
| 71 | + } | |
| 72 | + | |
| 73 | + /// <summary> | |
| 74 | + /// Use this method to set your AppsFlyer's dev key. | |
| 75 | + /// </summary> | |
| 76 | + /// <param name="appsFlyerDevKey">AppsFlyer's Dev-Key, which is accessible from your AppsFlyer account under 'App Settings' in the dashboard.</param> | |
| 77 | + public static void setAppsFlyerDevKey(string appsFlyerDevKey) | |
| 78 | + { | |
| 79 | +#if !UNITY_EDITOR | |
| 80 | + _setAppsFlyerDevKey(appsFlyerDevKey); | |
| 81 | +#endif | |
| 82 | + } | |
| 83 | + | |
| 84 | + /// <summary> | |
| 85 | + /// Use this method to set your app's Apple ID(taken from the app's page on iTunes Connect). | |
| 86 | + /// </summary> | |
| 87 | + /// <param name="appleAppID">your app's Apple ID.</param> | |
| 88 | + public static void setAppleAppID(string appleAppID) | |
| 89 | + { | |
| 90 | +#if !UNITY_EDITOR | |
| 91 | + _setAppleAppID(appleAppID); | |
| 92 | +#endif | |
| 93 | + } | |
| 94 | + | |
| 95 | + /// <summary> | |
| 96 | + /// Setting user local currency code for in-app purchases. | |
| 97 | + /// The currency code should be a 3 character ISO 4217 code. (default is USD). | |
| 98 | + /// You can set the currency code for all events by calling the following method. | |
| 99 | + /// </summary> | |
| 100 | + /// <param name="currencyCode">3 character ISO 4217 code.</param> | |
| 101 | + public static void setCurrencyCode(string currencyCode) | |
| 102 | + { | |
| 103 | +#if !UNITY_EDITOR | |
| 104 | + _setCurrencyCode(currencyCode); | |
| 105 | +#endif | |
| 106 | + } | |
| 107 | + | |
| 108 | + /// <summary> | |
| 109 | + /// AppsFlyer SDK collect Apple's `advertisingIdentifier` if the `AdSupport.framework` included in the SDK. | |
| 110 | + /// You can disable this behavior by setting the following property to true. | |
| 111 | + /// </summary> | |
| 112 | + /// <param name="disableCollectAppleAdSupport">boolean to disableCollectAppleAdSupport</param> | |
| 113 | + public static void setDisableCollectAppleAdSupport(bool disableCollectAppleAdSupport) | |
| 114 | + { | |
| 115 | +#if !UNITY_EDITOR | |
| 116 | + _setDisableCollectAppleAdSupport(disableCollectAppleAdSupport); | |
| 117 | +#endif | |
| 118 | + } | |
| 119 | + | |
| 120 | + /// <summary> | |
| 121 | + /// Enables Debug logs for the AppsFlyer SDK. | |
| 122 | + /// Should only be set to true in development / debug. | |
| 123 | + /// The default value is false. | |
| 124 | + /// </summary> | |
| 125 | + /// <param name="isDebug">shouldEnable boolean..</param> | |
| 126 | + public static void setIsDebug(bool isDebug) | |
| 127 | + { | |
| 128 | +#if !UNITY_EDITOR | |
| 129 | + _setIsDebug(isDebug); | |
| 130 | +#endif | |
| 131 | + } | |
| 132 | + | |
| 133 | + /// <summary> | |
| 134 | + /// Set this flag to true, to collect the current device name(e.g. "My iPhone"). Default value is false. | |
| 135 | + /// </summary> | |
| 136 | + /// <param name="shouldCollectDeviceName">boolean shouldCollectDeviceName.</param> | |
| 137 | + public static void setShouldCollectDeviceName(bool shouldCollectDeviceName) | |
| 138 | + { | |
| 139 | +#if !UNITY_EDITOR | |
| 140 | + _setShouldCollectDeviceName(shouldCollectDeviceName); | |
| 141 | +#endif | |
| 142 | + } | |
| 143 | + | |
| 144 | + /// <summary> | |
| 145 | + /// Set the OneLink ID that should be used for User-Invites. | |
| 146 | + /// The link that is generated for the user invite will use this OneLink as the base link. | |
| 147 | + /// </summary> | |
| 148 | + /// <param name="appInviteOneLinkID">OneLink ID obtained from the AppsFlyer Dashboard.</param> | |
| 149 | + public static void setAppInviteOneLinkID(string appInviteOneLinkID) | |
| 150 | + { | |
| 151 | +#if !UNITY_EDITOR | |
| 152 | + _setAppInviteOneLinkID(appInviteOneLinkID); | |
| 153 | +#endif | |
| 154 | + } | |
| 155 | + | |
| 156 | + /// <summary> | |
| 157 | + /// Anonymize user Data. | |
| 158 | + /// Use this API during the SDK Initialization to explicitly anonymize a user's installs, events and sessions. | |
| 159 | + /// Default is false | |
| 160 | + /// </summary> | |
| 161 | + /// <param name="shouldAnonymizeUser">boolean shouldAnonymizeUser.</param> | |
| 162 | + public static void anonymizeUser(bool shouldAnonymizeUser) | |
| 163 | + { | |
| 164 | +#if !UNITY_EDITOR | |
| 165 | + _anonymizeUser(shouldAnonymizeUser); | |
| 166 | +#endif | |
| 167 | + } | |
| 168 | + | |
| 169 | + /// <summary> | |
| 170 | + /// Opt-out for Apple Search Ads attributions. | |
| 171 | + /// </summary> | |
| 172 | + /// <param name="disableCollectIAd">boolean disableCollectIAd.</param> | |
| 173 | + public static void setDisableCollectIAd(bool disableCollectIAd) | |
| 174 | + { | |
| 175 | +#if !UNITY_EDITOR | |
| 176 | + _setDisableCollectIAd(disableCollectIAd); | |
| 177 | +#endif | |
| 178 | + } | |
| 179 | + | |
| 180 | + /// <summary> | |
| 181 | + /// In app purchase receipt validation Apple environment(production or sandbox). The default value is false. | |
| 182 | + /// </summary> | |
| 183 | + /// <param name="useReceiptValidationSandbox">boolean useReceiptValidationSandbox.</param> | |
| 184 | + public static void setUseReceiptValidationSandbox(bool useReceiptValidationSandbox) | |
| 185 | + { | |
| 186 | +#if !UNITY_EDITOR | |
| 187 | + _setUseReceiptValidationSandbox(useReceiptValidationSandbox); | |
| 188 | +#endif | |
| 189 | + } | |
| 190 | + | |
| 191 | + /// <summary> | |
| 192 | + /// Set this flag to test uninstall on Apple environment(production or sandbox). The default value is false. | |
| 193 | + /// </summary> | |
| 194 | + /// <param name="useUninstallSandbox">boolean useUninstallSandbox.</param> | |
| 195 | + public static void setUseUninstallSandbox(bool useUninstallSandbox) | |
| 196 | + { | |
| 197 | +#if !UNITY_EDITOR | |
| 198 | + _setUseUninstallSandbox(useUninstallSandbox); | |
| 199 | +#endif | |
| 200 | + } | |
| 201 | + | |
| 202 | + /// <summary> | |
| 203 | + /// For advertisers who wrap OneLink within another Universal Link. | |
| 204 | + /// An advertiser will be able to deeplink from a OneLink wrapped within another Universal Link and also record this retargeting conversion. | |
| 205 | + /// </summary> | |
| 206 | + /// <param name="resolveDeepLinkURLs">Array of urls.</param> | |
| 207 | + public static void setResolveDeepLinkURLs(params string[] resolveDeepLinkURLs) | |
| 208 | + { | |
| 209 | +#if !UNITY_EDITOR | |
| 210 | + _setResolveDeepLinkURLs(resolveDeepLinkURLs.Length,resolveDeepLinkURLs); | |
| 211 | +#endif | |
| 212 | + } | |
| 213 | + | |
| 214 | + /// <summary> | |
| 215 | + /// For advertisers who use vanity OneLinks. | |
| 216 | + /// </summary> | |
| 217 | + /// <param name="oneLinkCustomDomains">Array of domains.</param> | |
| 218 | + public static void setOneLinkCustomDomains(params string[] oneLinkCustomDomains) | |
| 219 | + { | |
| 220 | +#if !UNITY_EDITOR | |
| 221 | + _setOneLinkCustomDomains(oneLinkCustomDomains.Length, oneLinkCustomDomains); | |
| 222 | +#endif | |
| 223 | + } | |
| 224 | + | |
| 225 | + /// <summary> | |
| 226 | + /// Set the user emails and encrypt them. | |
| 227 | + /// cryptMethod Encryption method: | |
| 228 | + /// EmailCryptType.EmailCryptTypeMD5 | |
| 229 | + /// EmailCryptType.EmailCryptTypeSHA1 | |
| 230 | + /// EmailCryptType.EmailCryptTypeSHA256 | |
| 231 | + /// EmailCryptType.EmailCryptTypeNone | |
| 232 | + /// </summary> | |
| 233 | + /// <param name="cryptType">type Hash algoritm.</param> | |
| 234 | + /// <param name="length">length of userEmails array.</param> | |
| 235 | + /// <param name="userEmails">userEmails The list of strings that hold mails.</param> | |
| 236 | + public static void setUserEmails(EmailCryptType cryptType, int length, params string[] userEmails) | |
| 237 | + { | |
| 238 | +#if !UNITY_EDITOR | |
| 239 | + _setUserEmails(cryptType, length, userEmails); | |
| 240 | +#endif | |
| 241 | + } | |
| 242 | + | |
| 243 | + /// <summary> | |
| 244 | + /// Set the user phone number. | |
| 245 | + /// </summary> | |
| 246 | + /// <param name="phoneNumber">User phoneNumber.</param> | |
| 247 | + public static void setPhoneNumber(string phoneNumber){ | |
| 248 | +#if !UNITY_EDITOR | |
| 249 | + _setPhoneNumber(phoneNumber); | |
| 250 | +#endif | |
| 251 | + } | |
| 252 | + | |
| 253 | + /// <summary> | |
| 254 | + /// To send and validate in app purchases you can call this method from the processPurchase method. | |
| 255 | + /// </summary> | |
| 256 | + /// <param name="productIdentifier">The product identifier.</param> | |
| 257 | + /// <param name="price">The product price.</param> | |
| 258 | + /// <param name="currency">The product currency.</param> | |
| 259 | + /// <param name="tranactionId">The purchase transaction Id.</param> | |
| 260 | + /// <param name="additionalParameters">The additional param, which you want to receive it in the raw reports.</param> | |
| 261 | + public static void validateAndSendInAppPurchase(string productIdentifier, string price, string currency, string tranactionId, Dictionary<string, string> additionalParameters, MonoBehaviour gameObject) | |
| 262 | + { | |
| 263 | +#if !UNITY_EDITOR | |
| 264 | + _validateAndSendInAppPurchase(productIdentifier, price, currency, tranactionId, AFMiniJSON.Json.Serialize(additionalParameters), gameObject ? gameObject.name : null); | |
| 265 | +#endif | |
| 266 | + } | |
| 267 | + | |
| 268 | + /// <summary> | |
| 269 | + /// To record location for geo-fencing. Does the same as code below. | |
| 270 | + /// </summary> | |
| 271 | + /// <param name="longitude">The location longitude.</param> | |
| 272 | + /// <param name="latitude">The location latitude.</param> | |
| 273 | + public static void recordLocation(double longitude, double latitude) | |
| 274 | + { | |
| 275 | +#if !UNITY_EDITOR | |
| 276 | + _recordLocation(longitude, latitude); | |
| 277 | +#endif | |
| 278 | + } | |
| 279 | + | |
| 280 | + /// <summary> | |
| 281 | + /// Get AppsFlyer's unique device ID, which is created for every new install of an app. | |
| 282 | + /// </summary> | |
| 283 | + public static string getAppsFlyerId() | |
| 284 | + { | |
| 285 | +#if !UNITY_EDITOR | |
| 286 | + return _getAppsFlyerId(); | |
| 287 | +#else | |
| 288 | + return ""; | |
| 289 | +#endif | |
| 290 | + } | |
| 291 | + | |
| 292 | + /// <summary> | |
| 293 | + /// Register uninstall - you should register for remote notification and provide AppsFlyer the push device token. | |
| 294 | + /// </summary> | |
| 295 | + /// <param name="deviceToken">deviceToken The `deviceToken` from `-application:didRegisterForRemoteNotificationsWithDeviceToken:`.</param> | |
| 296 | + public static void registerUninstall(byte[] deviceToken) | |
| 297 | + { | |
| 298 | +#if !UNITY_EDITOR | |
| 299 | + _registerUninstall(deviceToken); | |
| 300 | +#endif | |
| 301 | + } | |
| 302 | + | |
| 303 | + /// <summary> | |
| 304 | + /// Enable AppsFlyer to handle a push notification. | |
| 305 | + /// </summary> | |
| 306 | + /// <param name="pushPayload">pushPayload The `userInfo` from received remote notification. One of root keys should be @"af"..</param> | |
| 307 | + public static void handlePushNotification(Dictionary<string, string> pushPayload) | |
| 308 | + { | |
| 309 | +#if !UNITY_EDITOR | |
| 310 | + _handlePushNotification(AFMiniJSON.Json.Serialize(pushPayload)); | |
| 311 | +#endif | |
| 312 | + } | |
| 313 | + | |
| 314 | + /// <summary> | |
| 315 | + /// Get SDK version. | |
| 316 | + /// </summary> | |
| 317 | + public static string getSDKVersion() | |
| 318 | + { | |
| 319 | +#if !UNITY_EDITOR | |
| 320 | + return _getSDKVersion(); | |
| 321 | +#else | |
| 322 | + return ""; | |
| 323 | +#endif | |
| 324 | + } | |
| 325 | + | |
| 326 | + /// <summary> | |
| 327 | + /// This property accepts a string value representing the host name for all endpoints. | |
| 328 | + /// Can be used to Zero rate your application’s data usage.Contact your CSM for more information. | |
| 329 | + /// </summary> | |
| 330 | + /// <param name="host">Host Name.</param> | |
| 331 | + /// <param name="host">Host prefix.</param> | |
| 332 | + public static void setHost(string host, string hostPrefix) | |
| 333 | + { | |
| 334 | +#if !UNITY_EDITOR | |
| 335 | + _setHost(host, hostPrefix); | |
| 336 | +#endif | |
| 337 | + } | |
| 338 | + | |
| 339 | + /// <summary> | |
| 340 | + /// This property is responsible for timeout between sessions in seconds. | |
| 341 | + /// Default value is 5 seconds. | |
| 342 | + /// </summary> | |
| 343 | + /// <param name="minTimeBetweenSessions">minimum time between 2 separate sessions in seconds.</param> | |
| 344 | + public static void setMinTimeBetweenSessions(int minTimeBetweenSessions) | |
| 345 | + { | |
| 346 | +#if !UNITY_EDITOR | |
| 347 | + _setMinTimeBetweenSessions(minTimeBetweenSessions); | |
| 348 | +#endif | |
| 349 | + } | |
| 350 | + | |
| 351 | + /// <summary> | |
| 352 | + /// Once this API is invoked, our SDK no longer communicates with our servers and stops functioning. | |
| 353 | + /// In some extreme cases you might want to shut down all SDK activity due to legal and privacy compliance. | |
| 354 | + /// This can be achieved with the stopSDK API. | |
| 355 | + /// </summary> | |
| 356 | + /// <param name="isSDKStopped">boolean isSDKStopped.</param> | |
| 357 | + public static void stopSDK(bool isSDKStopped) | |
| 358 | + { | |
| 359 | +#if !UNITY_EDITOR | |
| 360 | + _stopSDK(isSDKStopped); | |
| 361 | +#endif | |
| 362 | + } | |
| 363 | + | |
| 364 | + // <summary> | |
| 365 | + /// Was the stopSDK(boolean) API set to true. | |
| 366 | + /// </summary> | |
| 367 | + /// <returns>boolean isSDKStopped.</returns> | |
| 368 | + public static bool isSDKStopped() | |
| 369 | + { | |
| 370 | +#if !UNITY_EDITOR | |
| 371 | + return _isSDKStopped(); | |
| 372 | +#else | |
| 373 | + return false; | |
| 374 | +#endif | |
| 375 | + } | |
| 376 | + | |
| 377 | + /// <summary> | |
| 378 | + /// In case you want to track deep linking manually call handleOpenUrl. | |
| 379 | + /// The continueUserActivity and onOpenURL are implemented in the AppsFlyerAppController.mm class, so | |
| 380 | + /// only use this method if the other methods do not cover your apps deeplinking needs. | |
| 381 | + /// </summary> | |
| 382 | + /// <param name="url">The URL to be passed to your AppDelegate.</param> | |
| 383 | + /// <param name="sourceApplication">The sourceApplication to be passed to your AppDelegate.</param> | |
| 384 | + /// <param name="annotation">The annotation to be passed to your app delegate.</param> | |
| 385 | + public static void handleOpenUrl(string url, string sourceApplication, string annotation) | |
| 386 | + { | |
| 387 | +#if !UNITY_EDITOR | |
| 388 | + _handleOpenUrl(url, sourceApplication, annotation); | |
| 389 | +#endif | |
| 390 | + } | |
| 391 | + | |
| 392 | + /// <summary> | |
| 393 | + /// Used by advertisers to exclude all networks/integrated partners from getting data. | |
| 394 | + /// </summary> | |
| 395 | + public static void setSharingFilterForAllPartners() | |
| 396 | + { | |
| 397 | +#if !UNITY_EDITOR | |
| 398 | + _setSharingFilterForAllPartners(); | |
| 399 | +#endif | |
| 400 | + } | |
| 401 | + | |
| 402 | + /// <summary> | |
| 403 | + /// Used by advertisers to set some (one or more) networks/integrated partners to exclude from getting data. | |
| 404 | + /// </summary> | |
| 405 | + /// <param name="partners">partners to exclude from getting data</param> | |
| 406 | + public static void setSharingFilter(params string[] partners) | |
| 407 | + { | |
| 408 | +#if !UNITY_EDITOR | |
| 409 | + _setSharingFilter(partners.Length, partners); | |
| 410 | +#endif | |
| 411 | + } | |
| 412 | + | |
| 413 | + /// <summary> | |
| 414 | + /// To record an impression use the following API call. | |
| 415 | + /// Make sure to use the promoted App ID as it appears within the AppsFlyer dashboard. | |
| 416 | + /// </summary> | |
| 417 | + /// <param name="appID">promoted App ID.</param> | |
| 418 | + /// <param name="campaign">cross promotion campaign.</param> | |
| 419 | + /// <param name="parameters">parameters Dictionary.</param> | |
| 420 | + public static void recordCrossPromoteImpression(string appID, string campaign, Dictionary<string, string> parameters) | |
| 421 | + { | |
| 422 | +#if !UNITY_EDITOR | |
| 423 | + _recordCrossPromoteImpression(appID, campaign, AFMiniJSON.Json.Serialize(parameters)); | |
| 424 | +#endif | |
| 425 | + } | |
| 426 | + | |
| 427 | + /// <summary> | |
| 428 | + /// Use the following API to attribute the click and launch the app store's app page. | |
| 429 | + /// </summary> | |
| 430 | + /// <param name="appID">promoted App ID</param> | |
| 431 | + /// <param name="campaign">cross promotion campaign</param> | |
| 432 | + /// <param name="parameters">additional user params</param> | |
| 433 | + public static void attributeAndOpenStore(string appID, string campaign, Dictionary<string, string> parameters, MonoBehaviour gameObject) | |
| 434 | + { | |
| 435 | +#if !UNITY_EDITOR | |
| 436 | + _attributeAndOpenStore(appID, campaign, AFMiniJSON.Json.Serialize(parameters), gameObject ? gameObject.name : null); | |
| 437 | +#endif | |
| 438 | + } | |
| 439 | + | |
| 440 | + /// <summary> | |
| 441 | + /// The LinkGenerator class builds the invite URL according to various setter methods which allow passing on additional information on the click. | |
| 442 | + /// See - https://support.appsflyer.com/hc/en-us/articles/115004480866-User-invite-attribution- | |
| 443 | + /// </summary> | |
| 444 | + /// <param name="parameters">parameters Dictionary.</param> | |
| 445 | + public static void generateUserInviteLink(Dictionary<string, string> parameters, MonoBehaviour gameObject) | |
| 446 | + { | |
| 447 | +#if !UNITY_EDITOR | |
| 448 | + _generateUserInviteLink(AFMiniJSON.Json.Serialize(parameters), gameObject ? gameObject.name : null); | |
| 449 | +#endif | |
| 450 | + } | |
| 451 | + | |
| 452 | + /// <summary> | |
| 453 | + /// It is recommended to generate an in-app event after the invite is sent to record the invites from the senders' perspective. | |
| 454 | + /// This enables you to find the users that tend most to invite friends, and the media sources that get you these users. | |
| 455 | + /// </summary> | |
| 456 | + /// <param name="channel">channel string.</param> | |
| 457 | + /// <param name="parameters">parameters Dictionary..</param> | |
| 458 | + public static void recordInvite(string channel, Dictionary<string, string> parameters) | |
| 459 | + { | |
| 460 | +#if !UNITY_EDITOR | |
| 461 | + _recordInvite(channel, AFMiniJSON.Json.Serialize(parameters)); | |
| 462 | +#endif | |
| 463 | + } | |
| 464 | + | |
| 465 | + | |
| 466 | + /* | |
| 467 | + * AppsFlyer ios method mapping | |
| 468 | + */ | |
| 469 | + | |
| 470 | + [DllImport("__Internal")] | |
| 471 | + private static extern void _startSDK(); | |
| 472 | + | |
| 473 | + [DllImport("__Internal")] | |
| 474 | + private static extern void _getConversionData(string objectName); | |
| 475 | + | |
| 476 | + [DllImport("__Internal")] | |
| 477 | + private static extern void _setCustomerUserID(string customerUserID); | |
| 478 | + | |
| 479 | + [DllImport("__Internal")] | |
| 480 | + private static extern void _setAdditionalData(string customData); | |
| 481 | + | |
| 482 | + [DllImport("__Internal")] | |
| 483 | + private static extern void _setAppsFlyerDevKey(string appsFlyerDevKey); | |
| 484 | + | |
| 485 | + [DllImport("__Internal")] | |
| 486 | + private static extern void _setAppleAppID(string appleAppID); | |
| 487 | + | |
| 488 | + [DllImport("__Internal")] | |
| 489 | + private static extern void _setCurrencyCode(string currencyCode); | |
| 490 | + | |
| 491 | + [DllImport("__Internal")] | |
| 492 | + private static extern void _setDisableCollectAppleAdSupport(bool disableCollectAppleAdSupport); | |
| 493 | + | |
| 494 | + [DllImport("__Internal")] | |
| 495 | + private static extern void _setIsDebug(bool isDebug); | |
| 496 | + | |
| 497 | + [DllImport("__Internal")] | |
| 498 | + private static extern void _setShouldCollectDeviceName(bool shouldCollectDeviceName); | |
| 499 | + | |
| 500 | + [DllImport("__Internal")] | |
| 501 | + private static extern void _setAppInviteOneLinkID(string appInviteOneLinkID); | |
| 502 | + | |
| 503 | + [DllImport("__Internal")] | |
| 504 | + private static extern void _anonymizeUser(bool shouldAnonymizeUser); | |
| 505 | + | |
| 506 | + [DllImport("__Internal")] | |
| 507 | + private static extern void _setDisableCollectIAd(bool disableCollectIAd); | |
| 508 | + | |
| 509 | + [DllImport("__Internal")] | |
| 510 | + private static extern void _setUseReceiptValidationSandbox(bool useReceiptValidationSandbox); | |
| 511 | + | |
| 512 | + [DllImport("__Internal")] | |
| 513 | + private static extern void _setUseUninstallSandbox(bool useUninstallSandbox); | |
| 514 | + | |
| 515 | + [DllImport("__Internal")] | |
| 516 | + private static extern void _setResolveDeepLinkURLs(int length, params string[] resolveDeepLinkURLs); | |
| 517 | + | |
| 518 | + [DllImport("__Internal")] | |
| 519 | + private static extern void _setOneLinkCustomDomains(int length, params string[] oneLinkCustomDomains); | |
| 520 | + | |
| 521 | + [DllImport("__Internal")] | |
| 522 | + private static extern void _setUserEmails(EmailCryptType cryptType, int length, params string[] userEmails); | |
| 523 | + | |
| 524 | + [DllImport("__Internal")] | |
| 525 | + private static extern void _setPhoneNumber(string phoneNumber); | |
| 526 | + | |
| 527 | + [DllImport("__Internal")] | |
| 528 | + private static extern void _afSendEvent(string eventName, string eventValues); | |
| 529 | + | |
| 530 | + [DllImport("__Internal")] | |
| 531 | + private static extern void _validateAndSendInAppPurchase(string productIdentifier, string price, string currency, string tranactionId, string additionalParameters, string objectName); | |
| 532 | + | |
| 533 | + [DllImport("__Internal")] | |
| 534 | + private static extern void _recordLocation(double longitude, double latitude); | |
| 535 | + | |
| 536 | + [DllImport("__Internal")] | |
| 537 | + private static extern string _getAppsFlyerId(); | |
| 538 | + | |
| 539 | + [DllImport("__Internal")] | |
| 540 | + private static extern void _registerUninstall(byte[] deviceToken); | |
| 541 | + | |
| 542 | + [DllImport("__Internal")] | |
| 543 | + private static extern void _handlePushNotification(string pushPayload); | |
| 544 | + | |
| 545 | + [DllImport("__Internal")] | |
| 546 | + private static extern string _getSDKVersion(); | |
| 547 | + | |
| 548 | + [DllImport("__Internal")] | |
| 549 | + private static extern void _setHost(string host, string hostPrefix); | |
| 550 | + | |
| 551 | + [DllImport("__Internal")] | |
| 552 | + private static extern void _setMinTimeBetweenSessions(int minTimeBetweenSessions); | |
| 553 | + | |
| 554 | + [DllImport("__Internal")] | |
| 555 | + private static extern void _stopSDK(bool isStopSDK); | |
| 556 | + | |
| 557 | + [DllImport("__Internal")] | |
| 558 | + private static extern bool _isSDKStopped(); | |
| 559 | + | |
| 560 | + [DllImport("__Internal")] | |
| 561 | + private static extern void _handleOpenUrl(string url, string sourceApplication, string annotation); | |
| 562 | + | |
| 563 | + [DllImport("__Internal")] | |
| 564 | + private static extern void _setSharingFilterForAllPartners(); | |
| 565 | + | |
| 566 | + [DllImport("__Internal")] | |
| 567 | + private static extern void _setSharingFilter(int length, params string[] partners); | |
| 568 | + | |
| 569 | + [DllImport("__Internal")] | |
| 570 | + private static extern void _recordCrossPromoteImpression(string appID, string campaign, string parameters); | |
| 571 | + | |
| 572 | + [DllImport("__Internal")] | |
| 573 | + private static extern void _attributeAndOpenStore(string appID, string campaign, string parameters, string gameObject); | |
| 574 | + | |
| 575 | + [DllImport("__Internal")] | |
| 576 | + private static extern void _generateUserInviteLink(string parameters, string gameObject); | |
| 577 | + | |
| 578 | + [DllImport("__Internal")] | |
| 579 | + private static extern void _recordInvite(string channel, string parameters); | |
| 580 | + | |
| 581 | + } | |
| 582 | + | |
| 583 | +#endif | |
| 584 | + | |
| 585 | + | |
| 586 | +} |
AppsFlyeriOS.cs.meta
Editor/AppsFlyer.Editor.asmdef
| 1 | +{ | |
| 2 | + "name": "AppsFlyer.Editor", | |
| 3 | + "references": [ | |
| 4 | + "GUID:c3b2ad556d41d1441bfade97a3c348cd" | |
| 5 | + ], | |
| 6 | + "includePlatforms": [ | |
| 7 | + "Editor" | |
| 8 | + ], | |
| 9 | + "excludePlatforms": [], | |
| 10 | + "allowUnsafeCode": false, | |
| 11 | + "overrideReferences": false, | |
| 12 | + "precompiledReferences": [], | |
| 13 | + "autoReferenced": true, | |
| 14 | + "defineConstraints": [], | |
| 15 | + "versionDefines": [], | |
| 16 | + "noEngineReferences": false | |
| 17 | +} |
Editor/AppsFlyer.Editor.asmdef.meta
Editor/Unity.AppsFlyer.Editor.asmdef
| 1 | -{ | |
| 2 | - "name": "AppsFlyer.Editor", | |
| 3 | - "references": [ | |
| 4 | - "GUID:c3b2ad556d41d1441bfade97a3c348cd" | |
| 5 | - ], | |
| 6 | - "includePlatforms": [ | |
| 7 | - "Editor" | |
| 8 | - ], | |
| 9 | - "excludePlatforms": [], | |
| 10 | - "allowUnsafeCode": false, | |
| 11 | - "overrideReferences": false, | |
| 12 | - "precompiledReferences": [], | |
| 13 | - "autoReferenced": true, | |
| 14 | - "defineConstraints": [], | |
| 15 | - "versionDefines": [], | |
| 16 | - "noEngineReferences": false | |
| 17 | -} |
Editor/Unity.AppsFlyer.Editor.asmdef.meta
IAppsFlyerConversionData.cs
| 1 | +namespace AppsFlyerSDK | |
| 2 | +{ | |
| 3 | + public interface IAppsFlyerConversionData | |
| 4 | + { | |
| 5 | + /// <summary> | |
| 6 | + /// `conversionData` contains information about install. Organic/non-organic, etc. | |
| 7 | + /// <see>https://support.appsflyer.com/hc/en-us/articles/360000726098-Conversion-Data-Scenarios#Introduction</see> | |
| 8 | + /// </summary> | |
| 9 | + /// <param name="conversionData">JSON string of the returned conversion data.</param> | |
| 10 | + void onConversionDataSuccess(string conversionData); | |
| 11 | + | |
| 12 | + /// <summary> | |
| 13 | + /// Any errors that occurred during the conversion request. | |
| 14 | + /// </summary> | |
| 15 | + /// <param name="error">A string describing the error.</param> | |
| 16 | + void onConversionDataFail(string error); | |
| 17 | + | |
| 18 | + /// <summary> | |
| 19 | + /// `attributionData` contains information about OneLink, deeplink. | |
| 20 | + /// <see>https://support.appsflyer.com/hc/en-us/articles/208874366-OneLink-Deep-Linking-Guide#Intro</see> | |
| 21 | + /// </summary> | |
| 22 | + /// <param name="attributionData">JSON string of the returned deeplink data.</param> | |
| 23 | + void onAppOpenAttribution(string attributionData); | |
| 24 | + | |
| 25 | + /// <summary> | |
| 26 | + /// Any errors that occurred during the attribution request. | |
| 27 | + /// </summary> | |
| 28 | + /// <param name="error">A string describing the error.</param> | |
| 29 | + void onAppOpenAttributionFailure(string error); | |
| 30 | + } | |
| 31 | +} |
IAppsFlyerConversionData.cs.meta
IAppsFlyerUserInvite.cs
| 1 | +namespace AppsFlyerSDK | |
| 2 | +{ | |
| 3 | + public interface IAppsFlyerUserInvite | |
| 4 | + { | |
| 5 | + /// <summary> | |
| 6 | + /// The success callback for generating OneLink URLs. | |
| 7 | + /// </summary> | |
| 8 | + /// <param name="link">A string of the newly created url.</param> | |
| 9 | + void onInviteLinkGenerated(string link); | |
| 10 | + | |
| 11 | + /// <summary> | |
| 12 | + /// The error callback for generating OneLink URLs | |
| 13 | + /// </summary> | |
| 14 | + /// <param name="error">A string describing the error.</param> | |
| 15 | + void onInviteLinkGeneratedFailure(string error); | |
| 16 | + | |
| 17 | + /// <summary> | |
| 18 | + /// (ios only) iOS allows you to utilize the StoreKit component to open | |
| 19 | + /// the App Store while remaining in the context of your app. | |
| 20 | + /// More details at <see>https://support.appsflyer.com/hc/en-us/articles/115004481946-Cross-Promotion-Tracking#tracking-cross-promotion-impressions</see> | |
| 21 | + /// </summary> | |
| 22 | + /// <param name="link">openStore callback Contains promoted `clickURL`</param> | |
| 23 | + void onOpenStoreLinkGenerated(string link); | |
| 24 | + | |
| 25 | + } | |
| 26 | +} |
IAppsFlyerUserInvite.cs.meta
IAppsFlyerValidateReceipt.cs
| 1 | +namespace AppsFlyerSDK | |
| 2 | +{ | |
| 3 | + public interface IAppsFlyerValidateReceipt | |
| 4 | + { | |
| 5 | + /// <summary> | |
| 6 | + /// The success callback for validateAndSendInAppPurchase API. | |
| 7 | + /// For Android : the callback will return "Validate success". | |
| 8 | + /// For iOS : the callback will return a JSON string from apples verifyReceipt API. | |
| 9 | + /// </summary> | |
| 10 | + /// <param name="result"></param> | |
| 11 | + void didFinishValidateReceipt(string result); | |
| 12 | + | |
| 13 | + /// <summary> | |
| 14 | + /// The error callback for validateAndSendInAppPurchase API. | |
| 15 | + /// </summary> | |
| 16 | + /// <param name="error">A string describing the error.</param> | |
| 17 | + void didFinishValidateReceiptWithError(string error); | |
| 18 | + } | |
| 19 | +} |
IAppsFlyerValidateReceipt.cs.meta
Runtime.meta
Runtime/AFInAppEvents.cs
| 1 | -using UnityEngine; | |
| 2 | -using System.Collections; | |
| 3 | - | |
| 4 | -public class AFInAppEvents { | |
| 5 | - /** | |
| 6 | - * Event Type | |
| 7 | - * */ | |
| 8 | - public const string LEVEL_ACHIEVED = "af_level_achieved"; | |
| 9 | - public const string ADD_PAYMENT_INFO = "af_add_payment_info"; | |
| 10 | - public const string ADD_TO_CART = "af_add_to_cart"; | |
| 11 | - public const string ADD_TO_WISH_LIST = "af_add_to_wishlist"; | |
| 12 | - public const string COMPLETE_REGISTRATION = "af_complete_registration"; | |
| 13 | - public const string TUTORIAL_COMPLETION = "af_tutorial_completion"; | |
| 14 | - public const string INITIATED_CHECKOUT = "af_initiated_checkout"; | |
| 15 | - public const string PURCHASE = "af_purchase"; | |
| 16 | - public const string RATE = "af_rate"; | |
| 17 | - public const string SEARCH = "af_search"; | |
| 18 | - public const string SPENT_CREDIT = "af_spent_credits"; | |
| 19 | - public const string ACHIEVEMENT_UNLOCKED = "af_achievement_unlocked"; | |
| 20 | - public const string CONTENT_VIEW = "af_content_view"; | |
| 21 | - public const string TRAVEL_BOOKING = "af_travel_booking"; | |
| 22 | - public const string SHARE = "af_share"; | |
| 23 | - public const string INVITE = "af_invite"; | |
| 24 | - public const string LOGIN = "af_login"; | |
| 25 | - public const string RE_ENGAGE = "af_re_engage"; | |
| 26 | - public const string UPDATE = "af_update"; | |
| 27 | - public const string OPENED_FROM_PUSH_NOTIFICATION = "af_opened_from_push_notification"; | |
| 28 | - public const string LOCATION_CHANGED = "af_location_changed"; | |
| 29 | - public const string LOCATION_COORDINATES = "af_location_coordinates"; | |
| 30 | - public const string ORDER_ID = "af_order_id"; | |
| 31 | - /** | |
| 32 | - * Event Parameter Name | |
| 33 | - * **/ | |
| 34 | - public const string LEVEL = "af_level"; | |
| 35 | - public const string SCORE = "af_score"; | |
| 36 | - public const string SUCCESS = "af_success"; | |
| 37 | - public const string PRICE = "af_price"; | |
| 38 | - public const string CONTENT_TYPE = "af_content_type"; | |
| 39 | - public const string CONTENT_ID = "af_content_id"; | |
| 40 | - public const string CONTENT_LIST = "af_content_list"; | |
| 41 | - public const string CURRENCY = "af_currency"; | |
| 42 | - public const string QUANTITY = "af_quantity"; | |
| 43 | - public const string REGSITRATION_METHOD = "af_registration_method"; | |
| 44 | - public const string PAYMENT_INFO_AVAILIBLE = "af_payment_info_available"; | |
| 45 | - public const string MAX_RATING_VALUE = "af_max_rating_value"; | |
| 46 | - public const string RATING_VALUE = "af_rating_value"; | |
| 47 | - public const string SEARCH_STRING = "af_search_string"; | |
| 48 | - public const string DATE_A = "af_date_a"; | |
| 49 | - public const string DATE_B = "af_date_b"; | |
| 50 | - public const string DESTINATION_A = "af_destination_a"; | |
| 51 | - public const string DESTINATION_B = "af_destination_b"; | |
| 52 | - public const string DESCRIPTION = "af_description"; | |
| 53 | - public const string CLASS = "af_class"; | |
| 54 | - public const string EVENT_START = "af_event_start"; | |
| 55 | - public const string EVENT_END = "af_event_end"; | |
| 56 | - public const string LATITUDE = "af_lat"; | |
| 57 | - public const string LONGTITUDE = "af_long"; | |
| 58 | - public const string CUSTOMER_USER_ID = "af_customer_user_id"; | |
| 59 | - public const string VALIDATED = "af_validated"; | |
| 60 | - public const string REVENUE = "af_revenue"; | |
| 61 | - public const string RECEIPT_ID = "af_receipt_id"; | |
| 62 | - public const string PARAM_1 = "af_param_1"; | |
| 63 | - public const string PARAM_2 = "af_param_2"; | |
| 64 | - public const string PARAM_3 = "af_param_3"; | |
| 65 | - public const string PARAM_4 = "af_param_4"; | |
| 66 | - public const string PARAM_5 = "af_param_5"; | |
| 67 | - public const string PARAM_6 = "af_param_6"; | |
| 68 | - public const string PARAM_7 = "af_param_7"; | |
| 69 | - public const string PARAM_8 = "af_param_8"; | |
| 70 | - public const string PARAM_9 = "af_param_9"; | |
| 71 | - public const string PARAM_10 = "af_param_10"; | |
| 72 | -} |
Runtime/AFInAppEvents.cs.meta
Runtime/AFMiniJSON.cs
| 1 | -/* | |
| 2 | - * Copyright (c) 2013 Calvin Rien | |
| 3 | - * | |
| 4 | - * Based on the JSON parser by Patrick van Bergen | |
| 5 | - * http://techblog.procurios.nl/k/618/news/view/14605/14863/How-do-I-write-my-own-parser-for-JSON.html | |
| 6 | - * | |
| 7 | - * Simplified it so that it doesn't throw exceptions | |
| 8 | - * and can be used in Unity iPhone with maximum code stripping. | |
| 9 | - * | |
| 10 | - * Permission is hereby granted, free of charge, to any person obtaining | |
| 11 | - * a copy of this software and associated documentation files (the | |
| 12 | - * "Software"), to deal in the Software without restriction, including | |
| 13 | - * without limitation the rights to use, copy, modify, merge, publish, | |
| 14 | - * distribute, sublicense, and/or sell copies of the Software, and to | |
| 15 | - * permit persons to whom the Software is furnished to do so, subject to | |
| 16 | - * the following conditions: | |
| 17 | - * | |
| 18 | - * The above copyright notice and this permission notice shall be | |
| 19 | - * included in all copies or substantial portions of the Software. | |
| 20 | - * | |
| 21 | - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | |
| 22 | - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | |
| 23 | - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. | |
| 24 | - * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY | |
| 25 | - * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, | |
| 26 | - * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE | |
| 27 | - * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | |
| 28 | - */ | |
| 29 | -using System; | |
| 30 | -using System.Collections; | |
| 31 | -using System.Collections.Generic; | |
| 32 | -using System.IO; | |
| 33 | -using System.Text; | |
| 34 | - | |
| 35 | -namespace AFMiniJSON { | |
| 36 | - // Example usage: | |
| 37 | - // | |
| 38 | - // using UnityEngine; | |
| 39 | - // using System.Collections; | |
| 40 | - // using System.Collections.Generic; | |
| 41 | - // using MiniJSON; | |
| 42 | - // | |
| 43 | - // public class MiniJSONTest : MonoBehaviour { | |
| 44 | - // void Start () { | |
| 45 | - // var jsonString = "{ \"array\": [1.44,2,3], " + | |
| 46 | - // "\"object\": {\"key1\":\"value1\", \"key2\":256}, " + | |
| 47 | - // "\"string\": \"The quick brown fox \\\"jumps\\\" over the lazy dog \", " + | |
| 48 | - // "\"unicode\": \"\\u3041 Men\u00fa sesi\u00f3n\", " + | |
| 49 | - // "\"int\": 65536, " + | |
| 50 | - // "\"float\": 3.1415926, " + | |
| 51 | - // "\"bool\": true, " + | |
| 52 | - // "\"null\": null }"; | |
| 53 | - // | |
| 54 | - // var dict = Json.Deserialize(jsonString) as Dictionary<string,object>; | |
| 55 | - // | |
| 56 | - // Debug.Log("deserialized: " + dict.GetType()); | |
| 57 | - // Debug.Log("dict['array'][0]: " + ((List<object>) dict["array"])[0]); | |
| 58 | - // Debug.Log("dict['string']: " + (string) dict["string"]); | |
| 59 | - // Debug.Log("dict['float']: " + (double) dict["float"]); // floats come out as doubles | |
| 60 | - // Debug.Log("dict['int']: " + (long) dict["int"]); // ints come out as longs | |
| 61 | - // Debug.Log("dict['unicode']: " + (string) dict["unicode"]); | |
| 62 | - // | |
| 63 | - // var str = Json.Serialize(dict); | |
| 64 | - // | |
| 65 | - // Debug.Log("serialized: " + str); | |
| 66 | - // } | |
| 67 | - // } | |
| 68 | - | |
| 69 | - /// <summary> | |
| 70 | - /// This class encodes and decodes JSON strings. | |
| 71 | - /// Spec. details, see http://www.json.org/ | |
| 72 | - /// | |
| 73 | - /// JSON uses Arrays and Objects. These correspond here to the datatypes IList and IDictionary. | |
| 74 | - /// All numbers are parsed to doubles. | |
| 75 | - /// </summary> | |
| 76 | - public static class Json { | |
| 77 | - /// <summary> | |
| 78 | - /// Parses the string json into a value | |
| 79 | - /// </summary> | |
| 80 | - /// <param name="json">A JSON string.</param> | |
| 81 | - /// <returns>An List<object>, a Dictionary<string, object>, a double, an integer,a string, null, true, or false</returns> | |
| 82 | - public static object Deserialize(string json) { | |
| 83 | - // save the string for debug information | |
| 84 | - if (json == null) { | |
| 85 | - return null; | |
| 86 | - } | |
| 87 | - | |
| 88 | - return Parser.Parse(json); | |
| 89 | - } | |
| 90 | - | |
| 91 | - sealed class Parser : IDisposable { | |
| 92 | - const string WORD_BREAK = "{}[],:\""; | |
| 93 | - | |
| 94 | - public static bool IsWordBreak(char c) { | |
| 95 | - return Char.IsWhiteSpace(c) || WORD_BREAK.IndexOf(c) != -1; | |
| 96 | - } | |
| 97 | - | |
| 98 | - enum TOKEN { | |
| 99 | - NONE, | |
| 100 | - CURLY_OPEN, | |
| 101 | - CURLY_CLOSE, | |
| 102 | - SQUARED_OPEN, | |
| 103 | - SQUARED_CLOSE, | |
| 104 | - COLON, | |
| 105 | - COMMA, | |
| 106 | - STRING, | |
| 107 | - NUMBER, | |
| 108 | - TRUE, | |
| 109 | - FALSE, | |
| 110 | - NULL | |
| 111 | - }; | |
| 112 | - | |
| 113 | - StringReader json; | |
| 114 | - | |
| 115 | - Parser(string jsonString) { | |
| 116 | - json = new StringReader(jsonString); | |
| 117 | - } | |
| 118 | - | |
| 119 | - public static object Parse(string jsonString) { | |
| 120 | - using (var instance = new Parser(jsonString)) { | |
| 121 | - return instance.ParseValue(); | |
| 122 | - } | |
| 123 | - } | |
| 124 | - | |
| 125 | - public void Dispose() { | |
| 126 | - json.Dispose(); | |
| 127 | - json = null; | |
| 128 | - } | |
| 129 | - | |
| 130 | - Dictionary<string, object> ParseObject() { | |
| 131 | - Dictionary<string, object> table = new Dictionary<string, object>(); | |
| 132 | - | |
| 133 | - // ditch opening brace | |
| 134 | - json.Read(); | |
| 135 | - | |
| 136 | - // { | |
| 137 | - while (true) { | |
| 138 | - switch (NextToken) { | |
| 139 | - case TOKEN.NONE: | |
| 140 | - return null; | |
| 141 | - case TOKEN.COMMA: | |
| 142 | - continue; | |
| 143 | - case TOKEN.CURLY_CLOSE: | |
| 144 | - return table; | |
| 145 | - default: | |
| 146 | - // name | |
| 147 | - string name = ParseString(); | |
| 148 | - if (name == null) { | |
| 149 | - return null; | |
| 150 | - } | |
| 151 | - | |
| 152 | - // : | |
| 153 | - if (NextToken != TOKEN.COLON) { | |
| 154 | - return null; | |
| 155 | - } | |
| 156 | - // ditch the colon | |
| 157 | - json.Read(); | |
| 158 | - | |
| 159 | - // value | |
| 160 | - table[name] = ParseValue(); | |
| 161 | - break; | |
| 162 | - } | |
| 163 | - } | |
| 164 | - } | |
| 165 | - | |
| 166 | - List<object> ParseArray() { | |
| 167 | - List<object> array = new List<object>(); | |
| 168 | - | |
| 169 | - // ditch opening bracket | |
| 170 | - json.Read(); | |
| 171 | - | |
| 172 | - // [ | |
| 173 | - var parsing = true; | |
| 174 | - while (parsing) { | |
| 175 | - TOKEN nextToken = NextToken; | |
| 176 | - | |
| 177 | - switch (nextToken) { | |
| 178 | - case TOKEN.NONE: | |
| 179 | - return null; | |
| 180 | - case TOKEN.COMMA: | |
| 181 | - continue; | |
| 182 | - case TOKEN.SQUARED_CLOSE: | |
| 183 | - parsing = false; | |
| 184 | - break; | |
| 185 | - default: | |
| 186 | - object value = ParseByToken(nextToken); | |
| 187 | - | |
| 188 | - array.Add(value); | |
| 189 | - break; | |
| 190 | - } | |
| 191 | - } | |
| 192 | - | |
| 193 | - return array; | |
| 194 | - } | |
| 195 | - | |
| 196 | - object ParseValue() { | |
| 197 | - TOKEN nextToken = NextToken; | |
| 198 | - return ParseByToken(nextToken); | |
| 199 | - } | |
| 200 | - | |
| 201 | - object ParseByToken(TOKEN token) { | |
| 202 | - switch (token) { | |
| 203 | - case TOKEN.STRING: | |
| 204 | - return ParseString(); | |
| 205 | - case TOKEN.NUMBER: | |
| 206 | - return ParseNumber(); | |
| 207 | - case TOKEN.CURLY_OPEN: | |
| 208 | - return ParseObject(); | |
| 209 | - case TOKEN.SQUARED_OPEN: | |
| 210 | - return ParseArray(); | |
| 211 | - case TOKEN.TRUE: | |
| 212 | - return true; | |
| 213 | - case TOKEN.FALSE: | |
| 214 | - return false; | |
| 215 | - case TOKEN.NULL: | |
| 216 | - return null; | |
| 217 | - default: | |
| 218 | - return null; | |
| 219 | - } | |
| 220 | - } | |
| 221 | - | |
| 222 | - string ParseString() { | |
| 223 | - StringBuilder s = new StringBuilder(); | |
| 224 | - char c; | |
| 225 | - | |
| 226 | - // ditch opening quote | |
| 227 | - json.Read(); | |
| 228 | - | |
| 229 | - bool parsing = true; | |
| 230 | - while (parsing) { | |
| 231 | - | |
| 232 | - if (json.Peek() == -1) { | |
| 233 | - parsing = false; | |
| 234 | - break; | |
| 235 | - } | |
| 236 | - | |
| 237 | - c = NextChar; | |
| 238 | - switch (c) { | |
| 239 | - case '"': | |
| 240 | - parsing = false; | |
| 241 | - break; | |
| 242 | - case '\\': | |
| 243 | - if (json.Peek() == -1) { | |
| 244 | - parsing = false; | |
| 245 | - break; | |
| 246 | - } | |
| 247 | - | |
| 248 | - c = NextChar; | |
| 249 | - switch (c) { | |
| 250 | - case '"': | |
| 251 | - case '\\': | |
| 252 | - case '/': | |
| 253 | - s.Append(c); | |
| 254 | - break; | |
| 255 | - case 'b': | |
| 256 | - s.Append('\b'); | |
| 257 | - break; | |
| 258 | - case 'f': | |
| 259 | - s.Append('\f'); | |
| 260 | - break; | |
| 261 | - case 'n': | |
| 262 | - s.Append('\n'); | |
| 263 | - break; | |
| 264 | - case 'r': | |
| 265 | - s.Append('\r'); | |
| 266 | - break; | |
| 267 | - case 't': | |
| 268 | - s.Append('\t'); | |
| 269 | - break; | |
| 270 | - case 'u': | |
| 271 | - var hex = new char[4]; | |
| 272 | - | |
| 273 | - for (int i=0; i< 4; i++) { | |
| 274 | - hex[i] = NextChar; | |
| 275 | - } | |
| 276 | - | |
| 277 | - s.Append((char) Convert.ToInt32(new string(hex), 16)); | |
| 278 | - break; | |
| 279 | - } | |
| 280 | - break; | |
| 281 | - default: | |
| 282 | - s.Append(c); | |
| 283 | - break; | |
| 284 | - } | |
| 285 | - } | |
| 286 | - | |
| 287 | - return s.ToString(); | |
| 288 | - } | |
| 289 | - | |
| 290 | - object ParseNumber() { | |
| 291 | - string number = NextWord; | |
| 292 | - | |
| 293 | - if (number.IndexOf('.') == -1) { | |
| 294 | - long parsedInt; | |
| 295 | - Int64.TryParse(number, out parsedInt); | |
| 296 | - return parsedInt; | |
| 297 | - } | |
| 298 | - | |
| 299 | - double parsedDouble; | |
| 300 | - Double.TryParse(number, out parsedDouble); | |
| 301 | - return parsedDouble; | |
| 302 | - } | |
| 303 | - | |
| 304 | - void EatWhitespace() { | |
| 305 | - while (Char.IsWhiteSpace(PeekChar)) { | |
| 306 | - json.Read(); | |
| 307 | - | |
| 308 | - if (json.Peek() == -1) { | |
| 309 | - break; | |
| 310 | - } | |
| 311 | - } | |
| 312 | - } | |
| 313 | - | |
| 314 | - char PeekChar { | |
| 315 | - get { | |
| 316 | - return Convert.ToChar(json.Peek()); | |
| 317 | - } | |
| 318 | - } | |
| 319 | - | |
| 320 | - char NextChar { | |
| 321 | - get { | |
| 322 | - return Convert.ToChar(json.Read()); | |
| 323 | - } | |
| 324 | - } | |
| 325 | - | |
| 326 | - string NextWord { | |
| 327 | - get { | |
| 328 | - StringBuilder word = new StringBuilder(); | |
| 329 | - | |
| 330 | - while (!IsWordBreak(PeekChar)) { | |
| 331 | - word.Append(NextChar); | |
| 332 | - | |
| 333 | - if (json.Peek() == -1) { | |
| 334 | - break; | |
| 335 | - } | |
| 336 | - } | |
| 337 | - | |
| 338 | - return word.ToString(); | |
| 339 | - } | |
| 340 | - } | |
| 341 | - | |
| 342 | - TOKEN NextToken { | |
| 343 | - get { | |
| 344 | - EatWhitespace(); | |
| 345 | - | |
| 346 | - if (json.Peek() == -1) { | |
| 347 | - return TOKEN.NONE; | |
| 348 | - } | |
| 349 | - | |
| 350 | - switch (PeekChar) { | |
| 351 | - case '{': | |
| 352 | - return TOKEN.CURLY_OPEN; | |
| 353 | - case '}': | |
| 354 | - json.Read(); | |
| 355 | - return TOKEN.CURLY_CLOSE; | |
| 356 | - case '[': | |
| 357 | - return TOKEN.SQUARED_OPEN; | |
| 358 | - case ']': | |
| 359 | - json.Read(); | |
| 360 | - return TOKEN.SQUARED_CLOSE; | |
| 361 | - case ',': | |
| 362 | - json.Read(); | |
| 363 | - return TOKEN.COMMA; | |
| 364 | - case '"': | |
| 365 | - return TOKEN.STRING; | |
| 366 | - case ':': | |
| 367 | - return TOKEN.COLON; | |
| 368 | - case '0': | |
| 369 | - case '1': | |
| 370 | - case '2': | |
| 371 | - case '3': | |
| 372 | - case '4': | |
| 373 | - case '5': | |
| 374 | - case '6': | |
| 375 | - case '7': | |
| 376 | - case '8': | |
| 377 | - case '9': | |
| 378 | - case '-': | |
| 379 | - return TOKEN.NUMBER; | |
| 380 | - } | |
| 381 | - | |
| 382 | - switch (NextWord) { | |
| 383 | - case "false": | |
| 384 | - return TOKEN.FALSE; | |
| 385 | - case "true": | |
| 386 | - return TOKEN.TRUE; | |
| 387 | - case "null": | |
| 388 | - return TOKEN.NULL; | |
| 389 | - } | |
| 390 | - | |
| 391 | - return TOKEN.NONE; | |
| 392 | - } | |
| 393 | - } | |
| 394 | - } | |
| 395 | - | |
| 396 | - /// <summary> | |
| 397 | - /// Converts a IDictionary / IList object or a simple type (string, int, etc.) into a JSON string | |
| 398 | - /// </summary> | |
| 399 | - /// <param name="json">A Dictionary<string, object> / List<object></param> | |
| 400 | - /// <returns>A JSON encoded string, or null if object 'json' is not serializable</returns> | |
| 401 | - public static string Serialize(object obj) { | |
| 402 | - return Serializer.Serialize(obj); | |
| 403 | - } | |
| 404 | - | |
| 405 | - sealed class Serializer { | |
| 406 | - StringBuilder builder; | |
| 407 | - | |
| 408 | - Serializer() { | |
| 409 | - builder = new StringBuilder(); | |
| 410 | - } | |
| 411 | - | |
| 412 | - public static string Serialize(object obj) { | |
| 413 | - var instance = new Serializer(); | |
| 414 | - | |
| 415 | - instance.SerializeValue(obj); | |
| 416 | - | |
| 417 | - return instance.builder.ToString(); | |
| 418 | - } | |
| 419 | - | |
| 420 | - void SerializeValue(object value) { | |
| 421 | - IList asList; | |
| 422 | - IDictionary asDict; | |
| 423 | - string asStr; | |
| 424 | - | |
| 425 | - if (value == null) { | |
| 426 | - builder.Append("null"); | |
| 427 | - } else if ((asStr = value as string) != null) { | |
| 428 | - SerializeString(asStr); | |
| 429 | - } else if (value is bool) { | |
| 430 | - builder.Append((bool) value ? "true" : "false"); | |
| 431 | - } else if ((asList = value as IList) != null) { | |
| 432 | - SerializeArray(asList); | |
| 433 | - } else if ((asDict = value as IDictionary) != null) { | |
| 434 | - SerializeObject(asDict); | |
| 435 | - } else if (value is char) { | |
| 436 | - SerializeString(new string((char) value, 1)); | |
| 437 | - } else { | |
| 438 | - SerializeOther(value); | |
| 439 | - } | |
| 440 | - } | |
| 441 | - | |
| 442 | - void SerializeObject(IDictionary obj) { | |
| 443 | - bool first = true; | |
| 444 | - | |
| 445 | - builder.Append('{'); | |
| 446 | - | |
| 447 | - foreach (object e in obj.Keys) { | |
| 448 | - if (!first) { | |
| 449 | - builder.Append(','); | |
| 450 | - } | |
| 451 | - | |
| 452 | - SerializeString(e.ToString()); | |
| 453 | - builder.Append(':'); | |
| 454 | - | |
| 455 | - SerializeValue(obj[e]); | |
| 456 | - | |
| 457 | - first = false; | |
| 458 | - } | |
| 459 | - | |
| 460 | - builder.Append('}'); | |
| 461 | - } | |
| 462 | - | |
| 463 | - void SerializeArray(IList anArray) { | |
| 464 | - builder.Append('['); | |
| 465 | - | |
| 466 | - bool first = true; | |
| 467 | - | |
| 468 | - foreach (object obj in anArray) { | |
| 469 | - if (!first) { | |
| 470 | - builder.Append(','); | |
| 471 | - } | |
| 472 | - | |
| 473 | - SerializeValue(obj); | |
| 474 | - | |
| 475 | - first = false; | |
| 476 | - } | |
| 477 | - | |
| 478 | - builder.Append(']'); | |
| 479 | - } | |
| 480 | - | |
| 481 | - void SerializeString(string str) { | |
| 482 | - builder.Append('\"'); | |
| 483 | - | |
| 484 | - char[] charArray = str.ToCharArray(); | |
| 485 | - foreach (var c in charArray) { | |
| 486 | - switch (c) { | |
| 487 | - case '"': | |
| 488 | - builder.Append("\\\""); | |
| 489 | - break; | |
| 490 | - case '\\': | |
| 491 | - builder.Append("\\\\"); | |
| 492 | - break; | |
| 493 | - case '\b': | |
| 494 | - builder.Append("\\b"); | |
| 495 | - break; | |
| 496 | - case '\f': | |
| 497 | - builder.Append("\\f"); | |
| 498 | - break; | |
| 499 | - case '\n': | |
| 500 | - builder.Append("\\n"); | |
| 501 | - break; | |
| 502 | - case '\r': | |
| 503 | - builder.Append("\\r"); | |
| 504 | - break; | |
| 505 | - case '\t': | |
| 506 | - builder.Append("\\t"); | |
| 507 | - break; | |
| 508 | - default: | |
| 509 | - int codepoint = Convert.ToInt32(c); | |
| 510 | - if ((codepoint >= 32) && (codepoint <= 126)) { | |
| 511 | - builder.Append(c); | |
| 512 | - } else { | |
| 513 | - builder.Append("\\u"); | |
| 514 | - builder.Append(codepoint.ToString("x4")); | |
| 515 | - } | |
| 516 | - break; | |
| 517 | - } | |
| 518 | - } | |
| 519 | - | |
| 520 | - builder.Append('\"'); | |
| 521 | - } | |
| 522 | - | |
| 523 | - void SerializeOther(object value) { | |
| 524 | - // NOTE: decimals lose precision during serialization. | |
| 525 | - // They always have, I'm just letting you know. | |
| 526 | - // Previously floats and doubles lost precision too. | |
| 527 | - if (value is float) { | |
| 528 | - builder.Append(((float) value).ToString("R")); | |
| 529 | - } else if (value is int | |
| 530 | - || value is uint | |
| 531 | - || value is long | |
| 532 | - || value is sbyte | |
| 533 | - || value is byte | |
| 534 | - || value is short | |
| 535 | - || value is ushort | |
| 536 | - || value is ulong) { | |
| 537 | - builder.Append(value); | |
| 538 | - } else if (value is double | |
| 539 | - || value is decimal) { | |
| 540 | - builder.Append(Convert.ToDouble(value).ToString("R")); | |
| 541 | - } else { | |
| 542 | - SerializeString(value.ToString()); | |
| 543 | - } | |
| 544 | - } | |
| 545 | - } | |
| 546 | - } | |
| 547 | -} |
Runtime/AFMiniJSON.cs.meta
Runtime/AppsFlyer.cs
| 1 | -using System.Collections.Generic; | |
| 2 | -using UnityEngine; | |
| 3 | - | |
| 4 | -namespace AppsFlyerSDK | |
| 5 | -{ | |
| 6 | - public class AppsFlyer : MonoBehaviour | |
| 7 | - { | |
| 8 | - | |
| 9 | - public static readonly string kAppsFlyerPluginVersion = "5.4.2"; | |
| 10 | - | |
| 11 | - | |
| 12 | - /// <summary> | |
| 13 | - /// Initialize the AppsFlyer SDK with your devKey and appID. | |
| 14 | - /// The dev key is required on all platforms, and the appID is required for iOS. | |
| 15 | - /// If you app is for Android only pass null for the appID. | |
| 16 | - /// </summary> | |
| 17 | - /// <param name="devKey"> AppsFlyer's Dev-Key, which is accessible from your AppsFlyer account under 'App Settings' in the dashboard.</param> | |
| 18 | - /// <param name="appID">Your app's Apple ID.</param> | |
| 19 | - /// <example> | |
| 20 | - /// <code> | |
| 21 | - /// AppsFlyer.initSDK("K2***********99", "41*****44""); | |
| 22 | - /// </code> | |
| 23 | - /// </example> | |
| 24 | - public static void initSDK(string devKey, string appID) | |
| 25 | - { | |
| 26 | - initSDK(devKey, appID, null); | |
| 27 | - } | |
| 28 | - | |
| 29 | - /// <summary> | |
| 30 | - /// Initialize the AppsFlyer SDK with your devKey and appID. | |
| 31 | - /// The dev key is required on all platforms, and the appID is required for iOS. | |
| 32 | - /// If you app is for Android only pass null for the appID. | |
| 33 | - /// </summary> | |
| 34 | - /// <param name="devKey"> AppsFlyer's Dev-Key, which is accessible from your AppsFlyer account under 'App Settings' in the dashboard.</param> | |
| 35 | - /// <param name="appID">Your app's Apple ID.</param> | |
| 36 | - /// <param name="gameObject">pass the script of the game object being used.</param> | |
| 37 | - /// <example> | |
| 38 | - /// <code> | |
| 39 | - /// AppsFlyer.initSDK("K2***********99", 41*****44, this); | |
| 40 | - /// </code> | |
| 41 | - /// </example> | |
| 42 | - public static void initSDK(string devKey, string appID, MonoBehaviour gameObject) | |
| 43 | - { | |
| 44 | -#if UNITY_IOS && !UNITY_EDITOR | |
| 45 | - AppsFlyeriOS.setAppsFlyerDevKey(devKey); | |
| 46 | - AppsFlyeriOS.setAppleAppID(appID); | |
| 47 | - if(gameObject != null) | |
| 48 | - { | |
| 49 | - AppsFlyeriOS.getConversionData(gameObject.name); | |
| 50 | - } | |
| 51 | -#elif UNITY_ANDROID && !UNITY_EDITOR | |
| 52 | - AppsFlyerAndroid.initSDK(devKey, gameObject); | |
| 53 | -#else | |
| 54 | - | |
| 55 | -#endif | |
| 56 | - } | |
| 57 | - | |
| 58 | - | |
| 59 | - /// <summary> | |
| 60 | - /// Once this API is invoked, our SDK will start. | |
| 61 | - /// Once the API is called a sessions will be immediately sent, and all background forground transitions will send a session. | |
| 62 | - /// </summary> | |
| 63 | - public static void startSDK() | |
| 64 | - { | |
| 65 | -#if UNITY_IOS && !UNITY_EDITOR | |
| 66 | - AppsFlyeriOS.startSDK(); | |
| 67 | -#elif UNITY_ANDROID && !UNITY_EDITOR | |
| 68 | - AppsFlyerAndroid.startSDK(); | |
| 69 | -#else | |
| 70 | - | |
| 71 | -#endif | |
| 72 | - } | |
| 73 | - | |
| 74 | - /// <summary> | |
| 75 | - /// Send an In-App Event. | |
| 76 | - /// In-App Events provide insight on what is happening in your app. | |
| 77 | - /// </summary> | |
| 78 | - /// <param name="eventName">Event Name as String.</param> | |
| 79 | - /// <param name="eventValues">Event Values as Dictionary.</param> | |
| 80 | - public static void sendEvent(string eventName, Dictionary<string, string> eventValues) | |
| 81 | - { | |
| 82 | -#if UNITY_IOS && !UNITY_EDITOR | |
| 83 | - AppsFlyeriOS.sendEvent(eventName, eventValues); | |
| 84 | -#elif UNITY_ANDROID && !UNITY_EDITOR | |
| 85 | - AppsFlyerAndroid.sendEvent(eventName, eventValues); | |
| 86 | -#else | |
| 87 | - | |
| 88 | -#endif | |
| 89 | - } | |
| 90 | - | |
| 91 | - /// <summary> | |
| 92 | - /// Once this API is invoked, our SDK no longer communicates with our servers and stops functioning. | |
| 93 | - /// In some extreme cases you might want to shut down all SDK activity due to legal and privacy compliance. | |
| 94 | - /// This can be achieved with the stopSDK API. | |
| 95 | - /// </summary> | |
| 96 | - /// <param name="isSDKStopped"> should sdk be stopped.</param> | |
| 97 | - public static void stopSDK(bool isSDKStopped) | |
| 98 | - { | |
| 99 | -#if UNITY_IOS && !UNITY_EDITOR | |
| 100 | - AppsFlyeriOS.stopSDK(isSDKStopped); | |
| 101 | -#elif UNITY_ANDROID && !UNITY_EDITOR | |
| 102 | - AppsFlyerAndroid.stopSDK(isSDKStopped); | |
| 103 | -#else | |
| 104 | - | |
| 105 | -#endif | |
| 106 | - } | |
| 107 | - | |
| 108 | - // <summary> | |
| 109 | - /// Was the stopSDK(boolean) API set to true. | |
| 110 | - /// </summary> | |
| 111 | - /// <returns>boolean isSDKStopped.</returns> | |
| 112 | - public static bool isSDKStopped() | |
| 113 | - { | |
| 114 | -#if UNITY_IOS && !UNITY_EDITOR | |
| 115 | - return AppsFlyeriOS.isSDKStopped(); | |
| 116 | -#elif UNITY_ANDROID && !UNITY_EDITOR | |
| 117 | - return AppsFlyerAndroid.isSDKStopped(); | |
| 118 | -#else | |
| 119 | - return false; | |
| 120 | -#endif | |
| 121 | - } | |
| 122 | - | |
| 123 | - /// <summary> | |
| 124 | - /// Get the AppsFlyer SDK version used in app. | |
| 125 | - /// </summary> | |
| 126 | - /// <returns>The current SDK version.</returns> | |
| 127 | - public static string getSdkVersion() | |
| 128 | - { | |
| 129 | -#if UNITY_IOS && !UNITY_EDITOR | |
| 130 | - return AppsFlyeriOS.getSDKVersion(); | |
| 131 | -#elif UNITY_ANDROID && !UNITY_EDITOR | |
| 132 | - return AppsFlyerAndroid.getSdkVersion(); | |
| 133 | -#else | |
| 134 | - return ""; | |
| 135 | -#endif | |
| 136 | - | |
| 137 | - } | |
| 138 | - | |
| 139 | - /// <summary> | |
| 140 | - /// Enables Debug logs for the AppsFlyer SDK. | |
| 141 | - /// Should only be set to true in development / debug. | |
| 142 | - /// </summary> | |
| 143 | - /// <param name="shouldEnable">shouldEnable boolean.</param> | |
| 144 | - public static void setIsDebug(bool shouldEnable) | |
| 145 | - { | |
| 146 | -#if UNITY_IOS && !UNITY_EDITOR | |
| 147 | - AppsFlyeriOS.setIsDebug(shouldEnable); | |
| 148 | -#elif UNITY_ANDROID && !UNITY_EDITOR | |
| 149 | - AppsFlyerAndroid.setIsDebug(shouldEnable); | |
| 150 | -#else | |
| 151 | - | |
| 152 | -#endif | |
| 153 | - } | |
| 154 | - | |
| 155 | - /// <summary> | |
| 156 | - /// Setting your own customer ID enables you to cross-reference your own unique ID with AppsFlyer’s unique ID and the other devices’ IDs. | |
| 157 | - /// This ID is available in AppsFlyer CSV reports along with Postback APIs for cross-referencing with your internal IDs. | |
| 158 | - /// </summary> | |
| 159 | - /// <param name="id">Customer ID for client.</param> | |
| 160 | - public static void setCustomerUserId(string id) | |
| 161 | - { | |
| 162 | -#if UNITY_IOS && !UNITY_EDITOR | |
| 163 | - AppsFlyeriOS.setCustomerUserID(id); | |
| 164 | -#elif UNITY_ANDROID && !UNITY_EDITOR | |
| 165 | - AppsFlyerAndroid.setCustomerUserId(id); | |
| 166 | -#else | |
| 167 | - | |
| 168 | -#endif | |
| 169 | - } | |
| 170 | - | |
| 171 | - /// <summary> | |
| 172 | - /// Set the OneLink ID that should be used for User-Invite-API. | |
| 173 | - /// The link that is generated for the user invite will use this OneLink as the base link. | |
| 174 | - /// </summary> | |
| 175 | - /// <param name="oneLinkId">OneLink ID obtained from the AppsFlyer Dashboard.</param> | |
| 176 | - public static void setAppInviteOneLinkID(string oneLinkId) | |
| 177 | - { | |
| 178 | -#if UNITY_IOS && !UNITY_EDITOR | |
| 179 | - AppsFlyeriOS.setAppInviteOneLinkID(oneLinkId); | |
| 180 | -#elif UNITY_ANDROID && !UNITY_EDITOR | |
| 181 | - AppsFlyerAndroid.setAppInviteOneLinkID(oneLinkId); | |
| 182 | -#else | |
| 183 | - | |
| 184 | -#endif | |
| 185 | - } | |
| 186 | - | |
| 187 | - /// <summary> | |
| 188 | - /// Set additional data to be sent to AppsFlyer. | |
| 189 | - /// </summary> | |
| 190 | - /// <param name="customData">additional data Dictionary.</param> | |
| 191 | - public static void setAdditionalData(Dictionary<string, string> customData) | |
| 192 | - { | |
| 193 | -#if UNITY_IOS && !UNITY_EDITOR | |
| 194 | - AppsFlyeriOS.setAdditionalData(customData); | |
| 195 | -#elif UNITY_ANDROID && !UNITY_EDITOR | |
| 196 | - AppsFlyerAndroid.setAdditionalData(customData); | |
| 197 | -#else | |
| 198 | - | |
| 199 | -#endif | |
| 200 | - } | |
| 201 | - | |
| 202 | - /// <summary> | |
| 203 | - /// Advertisers can wrap AppsFlyer OneLink within another Universal Link. | |
| 204 | - /// This Universal Link will invoke the app but any deep linking data will not propagate to AppsFlyer. | |
| 205 | - /// </summary> | |
| 206 | - /// <param name="urls">Array of urls.</param> | |
| 207 | - public static void setResolveDeepLinkURLs(params string[] urls) | |
| 208 | - { | |
| 209 | -#if UNITY_IOS && !UNITY_EDITOR | |
| 210 | - AppsFlyeriOS.setResolveDeepLinkURLs(urls); | |
| 211 | -#elif UNITY_ANDROID && !UNITY_EDITOR | |
| 212 | - AppsFlyerAndroid.setResolveDeepLinkURLs(urls); | |
| 213 | -#else | |
| 214 | - | |
| 215 | -#endif | |
| 216 | - } | |
| 217 | - | |
| 218 | - | |
| 219 | - /// <summary> | |
| 220 | - /// Advertisers can use this method to set vanity onelink domains. | |
| 221 | - /// </summary> | |
| 222 | - /// <param name="domains">Array of domains.</param> | |
| 223 | - public static void setOneLinkCustomDomain(params string[] domains) | |
| 224 | - { | |
| 225 | -#if UNITY_IOS && !UNITY_EDITOR | |
| 226 | - AppsFlyeriOS.setOneLinkCustomDomains(domains); | |
| 227 | -#elif UNITY_ANDROID && !UNITY_EDITOR | |
| 228 | - AppsFlyerAndroid.setOneLinkCustomDomain(domains); | |
| 229 | -#else | |
| 230 | - | |
| 231 | -#endif | |
| 232 | - } | |
| 233 | - | |
| 234 | - /// <summary> | |
| 235 | - /// Setting user local currency code for in-app purchases. | |
| 236 | - /// The currency code should be a 3 character ISO 4217 code. (default is USD). | |
| 237 | - /// You can set the currency code for all events by calling the following method. | |
| 238 | - /// </summary> | |
| 239 | - /// <param name="currencyCode">3 character ISO 4217 code.</param> | |
| 240 | - public static void setCurrencyCode(string currencyCode) | |
| 241 | - { | |
| 242 | -#if UNITY_IOS && !UNITY_EDITOR | |
| 243 | - AppsFlyeriOS.setCurrencyCode(currencyCode); | |
| 244 | -#elif UNITY_ANDROID && !UNITY_EDITOR | |
| 245 | - AppsFlyerAndroid.setCurrencyCode(currencyCode); | |
| 246 | -#else | |
| 247 | - | |
| 248 | -#endif | |
| 249 | - } | |
| 250 | - | |
| 251 | - /// <summary> | |
| 252 | - /// Manually record the location of the user. | |
| 253 | - /// </summary> | |
| 254 | - /// <param name="latitude">latitude as double.</param> | |
| 255 | - /// <param name="longitude">longitude as double.</param> | |
| 256 | - public static void recordLocation(double latitude, double longitude) | |
| 257 | - { | |
| 258 | -#if UNITY_IOS && !UNITY_EDITOR | |
| 259 | - AppsFlyeriOS.recordLocation(latitude, longitude); | |
| 260 | -#elif UNITY_ANDROID && !UNITY_EDITOR | |
| 261 | - AppsFlyerAndroid.recordLocation(latitude, longitude); | |
| 262 | -#else | |
| 263 | - | |
| 264 | -#endif | |
| 265 | - } | |
| 266 | - | |
| 267 | - /// <summary> | |
| 268 | - /// Anonymize user Data. | |
| 269 | - /// Use this API during the SDK Initialization to explicitly anonymize a user's installs, events and sessions. | |
| 270 | - /// Default is false. | |
| 271 | - /// </summary> | |
| 272 | - /// <param name = "shouldAnonymizeUser" >shouldAnonymizeUser boolean.</param> | |
| 273 | - public static void anonymizeUser(bool shouldAnonymizeUser) | |
| 274 | - { | |
| 275 | -#if UNITY_IOS && !UNITY_EDITOR | |
| 276 | - AppsFlyeriOS.anonymizeUser(shouldAnonymizeUser); | |
| 277 | -#elif UNITY_ANDROID && !UNITY_EDITOR | |
| 278 | - AppsFlyerAndroid.anonymizeUser(shouldAnonymizeUser); | |
| 279 | -#else | |
| 280 | - | |
| 281 | -#endif | |
| 282 | - } | |
| 283 | - | |
| 284 | - /// <summary> | |
| 285 | - /// Get AppsFlyer's unique device ID which is created for every new install of an app. | |
| 286 | - /// </summary> | |
| 287 | - /// <returns>AppsFlyer's unique device ID.</returns> | |
| 288 | - public static string getAppsFlyerId() | |
| 289 | - { | |
| 290 | -#if UNITY_IOS && !UNITY_EDITOR | |
| 291 | - return AppsFlyeriOS.getAppsFlyerId(); | |
| 292 | -#elif UNITY_ANDROID && !UNITY_EDITOR | |
| 293 | - return AppsFlyerAndroid.getAppsFlyerId(); | |
| 294 | -#else | |
| 295 | - return ""; | |
| 296 | -#endif | |
| 297 | - | |
| 298 | - } | |
| 299 | - | |
| 300 | - /// <summary> | |
| 301 | - /// Set a custom value for the minimum required time between sessions. | |
| 302 | - /// By default, at least 5 seconds must lapse between 2 app launches to count as separate 2 sessions. | |
| 303 | - /// </summary> | |
| 304 | - /// <param name="seconds">minimum time between 2 separate sessions in seconds.</param> | |
| 305 | - public static void setMinTimeBetweenSessions(int seconds) | |
| 306 | - { | |
| 307 | -#if UNITY_IOS && !UNITY_EDITOR | |
| 308 | - AppsFlyeriOS.setMinTimeBetweenSessions(seconds); | |
| 309 | -#elif UNITY_ANDROID && !UNITY_EDITOR | |
| 310 | - AppsFlyerAndroid.setMinTimeBetweenSessions(seconds); | |
| 311 | -#else | |
| 312 | - | |
| 313 | -#endif | |
| 314 | - } | |
| 315 | - | |
| 316 | - /// <summary> | |
| 317 | - /// Set a custom host. | |
| 318 | - /// </summary> | |
| 319 | - /// <param name="hostPrefixName">Host prefix.</param> | |
| 320 | - /// <param name="hostName">Host name.</param> | |
| 321 | - public static void setHost(string hostPrefixName, string hostName) | |
| 322 | - { | |
| 323 | -#if UNITY_IOS && !UNITY_EDITOR | |
| 324 | - AppsFlyeriOS.setHost(hostName, hostPrefixName); | |
| 325 | -#elif UNITY_ANDROID && !UNITY_EDITOR | |
| 326 | - AppsFlyerAndroid.setHost(hostPrefixName, hostName); | |
| 327 | -#else | |
| 328 | - | |
| 329 | -#endif | |
| 330 | - } | |
| 331 | - | |
| 332 | - /// <summary> | |
| 333 | - /// Set the user emails and encrypt them. | |
| 334 | - /// cryptMethod Encryption method: | |
| 335 | - /// EmailCryptType.EmailCryptTypeMD5 | |
| 336 | - /// EmailCryptType.EmailCryptTypeSHA1 | |
| 337 | - /// EmailCryptType.EmailCryptTypeSHA256 | |
| 338 | - /// EmailCryptType.EmailCryptTypeNone | |
| 339 | - /// </summary> | |
| 340 | - /// <param name="cryptMethod">Encryption method.</param> | |
| 341 | - /// <param name="emails">User emails.</param> | |
| 342 | - public static void setUserEmails(EmailCryptType cryptMethod, params string[] emails) | |
| 343 | - { | |
| 344 | -#if UNITY_IOS && !UNITY_EDITOR | |
| 345 | - AppsFlyeriOS.setUserEmails(cryptMethod, emails.Length, emails); | |
| 346 | -#elif UNITY_ANDROID && !UNITY_EDITOR | |
| 347 | - AppsFlyerAndroid.setUserEmails(cryptMethod, emails); | |
| 348 | -#else | |
| 349 | - | |
| 350 | -#endif | |
| 351 | - } | |
| 352 | - | |
| 353 | - /// <summary> | |
| 354 | - /// Set the user phone number. | |
| 355 | - /// </summary> | |
| 356 | - /// <param name="phoneNumber">phoneNumber string</param> | |
| 357 | - public static void setPhoneNumber(string phoneNumber) | |
| 358 | - { | |
| 359 | -#if UNITY_IOS && !UNITY_EDITOR | |
| 360 | - AppsFlyeriOS.setPhoneNumber(phoneNumber); | |
| 361 | -#elif UNITY_ANDROID && !UNITY_EDITOR | |
| 362 | - AppsFlyerAndroid.setPhoneNumber(phoneNumber); | |
| 363 | -#else | |
| 364 | - | |
| 365 | -#endif | |
| 366 | - } | |
| 367 | - | |
| 368 | - /// <summary> | |
| 369 | - /// Used by advertisers to exclude all networks/integrated partners from getting data. | |
| 370 | - /// </summary> | |
| 371 | - public static void setSharingFilterForAllPartners() | |
| 372 | - { | |
| 373 | -#if UNITY_IOS && !UNITY_EDITOR | |
| 374 | - AppsFlyeriOS.setSharingFilterForAllPartners(); | |
| 375 | -#elif UNITY_ANDROID && !UNITY_EDITOR | |
| 376 | - AppsFlyerAndroid.setSharingFilterForAllPartners(); | |
| 377 | -#else | |
| 378 | - | |
| 379 | -#endif | |
| 380 | - } | |
| 381 | - | |
| 382 | - /// <summary> | |
| 383 | - /// Used by advertisers to set some (one or more) networks/integrated partners to exclude from getting data. | |
| 384 | - /// </summary> | |
| 385 | - /// <param name="partners">partners to exclude from getting data</param> | |
| 386 | - public static void setSharingFilter(params string[] partners) | |
| 387 | - { | |
| 388 | -#if UNITY_IOS && !UNITY_EDITOR | |
| 389 | - AppsFlyeriOS.setSharingFilter(partners); | |
| 390 | -#elif UNITY_ANDROID && !UNITY_EDITOR | |
| 391 | - AppsFlyerAndroid.setSharingFilter(partners); | |
| 392 | -#else | |
| 393 | - | |
| 394 | -#endif | |
| 395 | - } | |
| 396 | - | |
| 397 | - /// <summary> | |
| 398 | - /// Register a Conversion Data Listener. | |
| 399 | - /// Allows the developer to access the user attribution data in real-time for every new install, directly from the SDK level. | |
| 400 | - /// By doing this you can serve users with personalized content or send them to specific activities within the app, | |
| 401 | - /// which can greatly enhance their engagement with your app. | |
| 402 | - /// </summary> | |
| 403 | - /// <example> | |
| 404 | - /// <code> | |
| 405 | - /// AppsFlyer.getConversionData(this.name); | |
| 406 | - /// </code> | |
| 407 | - /// </example> | |
| 408 | - public static void getConversionData(string objectName) | |
| 409 | - { | |
| 410 | -#if UNITY_IOS && !UNITY_EDITOR | |
| 411 | - AppsFlyeriOS.getConversionData(objectName); | |
| 412 | -#elif UNITY_ANDROID && !UNITY_EDITOR | |
| 413 | - AppsFlyerAndroid.getConversionData(objectName); | |
| 414 | -#else | |
| 415 | - | |
| 416 | -#endif | |
| 417 | - } | |
| 418 | - | |
| 419 | - | |
| 420 | - /// <summary> | |
| 421 | - /// Use the following API to attribute the click and launch the app store's app page. | |
| 422 | - /// </summary> | |
| 423 | - /// <param name="appID">promoted App ID</param> | |
| 424 | - /// <param name="campaign">cross promotion campaign</param> | |
| 425 | - /// <param name="userParams">additional user params</param> | |
| 426 | - /// <example> | |
| 427 | - /// <code> | |
| 428 | - /// Dictionary<string, string> parameters = new Dictionary<string, string>(); | |
| 429 | - /// parameters.Add("af_sub1", "val"); | |
| 430 | - /// parameters.Add("custom_param", "val2"); | |
| 431 | - /// AppsFlyer.attributeAndOpenStore("123456789", "test campaign", parameters, this); | |
| 432 | - /// </code> | |
| 433 | - /// </example> | |
| 434 | - public static void attributeAndOpenStore(string appID, string campaign, Dictionary<string, string> userParams, MonoBehaviour gameObject) | |
| 435 | - { | |
| 436 | -#if UNITY_IOS && !UNITY_EDITOR | |
| 437 | - AppsFlyeriOS.attributeAndOpenStore(appID, campaign, userParams, gameObject); | |
| 438 | -#elif UNITY_ANDROID && !UNITY_EDITOR | |
| 439 | - AppsFlyerAndroid.attributeAndOpenStore(appID, campaign, userParams); | |
| 440 | -#else | |
| 441 | - | |
| 442 | -#endif | |
| 443 | - } | |
| 444 | - | |
| 445 | - /// <summary> | |
| 446 | - /// To attribute an impression use the following API call. | |
| 447 | - /// Make sure to use the promoted App ID as it appears within the AppsFlyer dashboard. | |
| 448 | - /// </summary> | |
| 449 | - /// <param name="appID">promoted App ID.</param> | |
| 450 | - /// <param name="campaign">cross promotion campaign.</param> | |
| 451 | - /// <param name="parameters">parameters Dictionary.</param> | |
| 452 | - public static void recordCrossPromoteImpression(string appID, string campaign, Dictionary<string, string> parameters) | |
| 453 | - { | |
| 454 | -#if UNITY_IOS && !UNITY_EDITOR | |
| 455 | - AppsFlyeriOS.recordCrossPromoteImpression(appID, campaign, parameters); | |
| 456 | -#elif UNITY_ANDROID && !UNITY_EDITOR | |
| 457 | - AppsFlyerAndroid.recordCrossPromoteImpression(appID, campaign, parameters); | |
| 458 | -#else | |
| 459 | - | |
| 460 | -#endif | |
| 461 | - } | |
| 462 | - | |
| 463 | - /// <summary> | |
| 464 | - /// The LinkGenerator class builds the invite URL according to various setter methods which allow passing on additional information on the click. | |
| 465 | - /// See - https://support.appsflyer.com/hc/en-us/articles/115004480866-User-invite-attribution- | |
| 466 | - /// </summary> | |
| 467 | - /// <param name="parameters">parameters Dictionary.</param> | |
| 468 | - public static void generateUserInviteLink(Dictionary<string, string> parameters, MonoBehaviour gameObject) | |
| 469 | - { | |
| 470 | -#if UNITY_IOS && !UNITY_EDITOR | |
| 471 | - AppsFlyeriOS.generateUserInviteLink(parameters, gameObject); | |
| 472 | -#elif UNITY_ANDROID && !UNITY_EDITOR | |
| 473 | - AppsFlyerAndroid.generateUserInviteLink(parameters, gameObject); | |
| 474 | -#else | |
| 475 | - | |
| 476 | -#endif | |
| 477 | - } | |
| 478 | - | |
| 479 | - /// <summary> | |
| 480 | - /// Helper method to convert json strings to dictionary. | |
| 481 | - /// </summary> | |
| 482 | - /// <param name="str">json string</param> | |
| 483 | - /// <returns>dictionary representing the input json string.</returns> | |
| 484 | - public static Dictionary<string, object> CallbackStringToDictionary(string str) | |
| 485 | - { | |
| 486 | - return AFMiniJSON.Json.Deserialize(str) as Dictionary<string, object>; | |
| 487 | - } | |
| 488 | - | |
| 489 | - /// <summary> | |
| 490 | - /// Helper method to log AppsFlyer events and callbacks. | |
| 491 | - /// </summary> | |
| 492 | - /// <param name="methodName">method name</param> | |
| 493 | - /// <param name="str">message to log</param> | |
| 494 | - public static void AFLog(string methodName, string str) | |
| 495 | - { | |
| 496 | - Debug.Log(string.Format("AppsFlyer_Unity_v{0} {1} called with {2}", kAppsFlyerPluginVersion, methodName, str)); | |
| 497 | - } | |
| 498 | - } | |
| 499 | - | |
| 500 | - public enum EmailCryptType | |
| 501 | - { | |
| 502 | - // None | |
| 503 | - EmailCryptTypeNone = 0, | |
| 504 | - // SHA256 | |
| 505 | - EmailCryptTypeSHA256 = 1, | |
| 506 | - } | |
| 507 | - | |
| 508 | -} |
Runtime/AppsFlyer.cs.meta
Runtime/AppsFlyerAndroid.cs
| 1 | -using System; | |
| 2 | -using System.Collections.Generic; | |
| 3 | -using UnityEngine; | |
| 4 | - | |
| 5 | -namespace AppsFlyerSDK | |
| 6 | -{ | |
| 7 | - | |
| 8 | -#if UNITY_ANDROID | |
| 9 | - public class AppsFlyerAndroid | |
| 10 | - { | |
| 11 | - | |
| 12 | - private static AndroidJavaClass appsFlyerAndroid = new AndroidJavaClass("com.appsflyer.unity.AppsFlyerAndroidWrapper"); | |
| 13 | - | |
| 14 | - | |
| 15 | - /// <summary> | |
| 16 | - /// Use this method to init the sdk for the application. | |
| 17 | - /// Call this method before startSDK. | |
| 18 | - /// </summary> | |
| 19 | - /// <param name="devkey"> AppsFlyer's Dev-Key, which is accessible from your AppsFlyer account under 'App Settings' in the dashboard.</param> | |
| 20 | - /// <param name="gameObject">The current game object. This is used to get the conversion data callbacks. Pass null if you do not need the callbacks.</param> | |
| 21 | - public static void initSDK(string devkey, MonoBehaviour gameObject) | |
| 22 | - { | |
| 23 | -#if !UNITY_EDITOR | |
| 24 | - appsFlyerAndroid.CallStatic("initSDK", devkey, gameObject ? gameObject.name : null); | |
| 25 | -#endif | |
| 26 | - } | |
| 27 | - | |
| 28 | - /// <summary> | |
| 29 | - /// Use this method to start the sdk for the application. | |
| 30 | - /// The AppsFlyer's Dev-Key must be provided. | |
| 31 | - /// </summary> | |
| 32 | - /// <param name="devkey"> AppsFlyer's Dev-Key, which is accessible from your AppsFlyer account under 'App Settings' in the dashboard.</param> | |
| 33 | - public static void startSDK() | |
| 34 | - { | |
| 35 | -#if !UNITY_EDITOR | |
| 36 | - appsFlyerAndroid.CallStatic("startTracking"); | |
| 37 | -#endif | |
| 38 | - } | |
| 39 | - | |
| 40 | - /// <summary> | |
| 41 | - /// Once this API is invoked, our SDK no longer communicates with our servers and stops functioning. | |
| 42 | - /// In some extreme cases you might want to shut down all SDK activity due to legal and privacy compliance. | |
| 43 | - /// This can be achieved with the stopSDK API. | |
| 44 | - /// </summary> | |
| 45 | - /// <param name="isSDKStopped">boolean should SDK be stopped.</param> | |
| 46 | - public static void stopSDK(bool isSDKStopped) | |
| 47 | - { | |
| 48 | -#if !UNITY_EDITOR | |
| 49 | - appsFlyerAndroid.CallStatic("stopTracking", isSDKStopped); | |
| 50 | -#endif | |
| 51 | - } | |
| 52 | - | |
| 53 | - /// <summary> | |
| 54 | - /// Get the AppsFlyer SDK version used in app. | |
| 55 | - /// </summary> | |
| 56 | - /// <returns>AppsFlyer SDK version.</returns> | |
| 57 | - public static string getSdkVersion() | |
| 58 | - { | |
| 59 | -#if !UNITY_EDITOR | |
| 60 | - return appsFlyerAndroid.CallStatic<string>("getSdkVersion"); | |
| 61 | -#else | |
| 62 | - return ""; | |
| 63 | -#endif | |
| 64 | - } | |
| 65 | - | |
| 66 | - /// <summary> | |
| 67 | - /// Manually pass the Firebase / GCM Device Token for Uninstall measurement. | |
| 68 | - /// </summary> | |
| 69 | - /// <param name="token">Firebase Device Token.</param> | |
| 70 | - public static void updateServerUninstallToken(string token) | |
| 71 | - { | |
| 72 | -#if !UNITY_EDITOR | |
| 73 | - appsFlyerAndroid.CallStatic("updateServerUninstallToken", token); | |
| 74 | -#endif | |
| 75 | - } | |
| 76 | - | |
| 77 | - /// <summary> | |
| 78 | - /// Enables Debug logs for the AppsFlyer SDK. | |
| 79 | - /// Should only be set to true in development / debug. | |
| 80 | - /// </summary> | |
| 81 | - /// <param name="shouldEnable">shouldEnable boolean.</param> | |
| 82 | - public static void setIsDebug(bool shouldEnable) | |
| 83 | - { | |
| 84 | -#if !UNITY_EDITOR | |
| 85 | - appsFlyerAndroid.CallStatic("setIsDebug", shouldEnable); | |
| 86 | -#endif | |
| 87 | - } | |
| 88 | - | |
| 89 | - /// <summary> | |
| 90 | - /// By default, IMEI and Android ID are not collected by the SDK if the OS version is higher than KitKat (4.4) | |
| 91 | - /// and the device contains Google Play Services(on SDK versions 4.8.8 and below the specific app needed GPS). | |
| 92 | - /// Use this API to explicitly send IMEI to AppsFlyer. | |
| 93 | - /// </summary> | |
| 94 | - /// <param name="aImei">device's IMEI.</param> | |
| 95 | - public static void setImeiData(string aImei) | |
| 96 | - { | |
| 97 | -#if !UNITY_EDITOR | |
| 98 | - appsFlyerAndroid.CallStatic("setImeiData", aImei); | |
| 99 | -#endif | |
| 100 | - } | |
| 101 | - | |
| 102 | - /// <summary> | |
| 103 | - /// By default, IMEI and Android ID are not collected by the SDK if the OS version is higher than KitKat(4.4) | |
| 104 | - /// and the device contains Google Play Services(on SDK versions 4.8.8 and below the specific app needed GPS). | |
| 105 | - /// Use this API to explicitly send Android ID to AppsFlyer. | |
| 106 | - /// </summary> | |
| 107 | - /// <param name="aAndroidId">device's Android ID.</param> | |
| 108 | - public static void setAndroidIdData(string aAndroidId) | |
| 109 | - { | |
| 110 | -#if !UNITY_EDITOR | |
| 111 | - appsFlyerAndroid.CallStatic("setAndroidIdData", aAndroidId); | |
| 112 | -#endif | |
| 113 | - } | |
| 114 | - | |
| 115 | - /// <summary> | |
| 116 | - /// Setting your own customer ID enables you to cross-reference your own unique ID with AppsFlyer’s unique ID and the other devices’ IDs. | |
| 117 | - /// This ID is available in AppsFlyer CSV reports along with Postback APIs for cross-referencing with your internal IDs. | |
| 118 | - /// </summary> | |
| 119 | - /// <param name="id">Customer ID for client.</param> | |
| 120 | - public static void setCustomerUserId(string id) | |
| 121 | - { | |
| 122 | -#if !UNITY_EDITOR | |
| 123 | - appsFlyerAndroid.CallStatic("setCustomerUserId", id); | |
| 124 | -#endif | |
| 125 | - } | |
| 126 | - | |
| 127 | - /// <summary> | |
| 128 | - /// It is possible to delay the SDK Initialization until the customerUserID is set. | |
| 129 | - /// This feature makes sure that the SDK doesn't begin functioning until the customerUserID is provided. | |
| 130 | - /// If this API is used, all in-app events and any other SDK API calls are discarded, until the customerUserID is provided. | |
| 131 | - /// </summary> | |
| 132 | - /// <param name="wait">wait boolean.</param> | |
| 133 | - public static void waitForCustomerUserId(bool wait) | |
| 134 | - { | |
| 135 | -#if !UNITY_EDITOR | |
| 136 | - appsFlyerAndroid.CallStatic("waitForCustomerUserId", wait); | |
| 137 | -#endif | |
| 138 | - } | |
| 139 | - | |
| 140 | - /// <summary> | |
| 141 | - /// Use this API to provide the SDK with the relevant customer user id and trigger the SDK to begin its normal activity. | |
| 142 | - /// </summary> | |
| 143 | - /// <param name="id">Customer ID for client.</param> | |
| 144 | - public static void setCustomerIdAndStartSDK(string id) | |
| 145 | - { | |
| 146 | -#if !UNITY_EDITOR | |
| 147 | - appsFlyerAndroid.CallStatic("setCustomerIdAndTrack", id); | |
| 148 | -#endif | |
| 149 | - } | |
| 150 | - | |
| 151 | - /// <summary> | |
| 152 | - /// Get the current AF_STORE value. | |
| 153 | - /// </summary> | |
| 154 | - /// <returns>AF_Store value.</returns> | |
| 155 | - public static string getOutOfStore() | |
| 156 | - { | |
| 157 | -#if !UNITY_EDITOR | |
| 158 | - return appsFlyerAndroid.CallStatic<string>("getOutOfStore"); | |
| 159 | -#else | |
| 160 | - return ""; | |
| 161 | -#endif | |
| 162 | - } | |
| 163 | - | |
| 164 | - /// <summary> | |
| 165 | - /// Manually set the AF_STORE value. | |
| 166 | - /// </summary> | |
| 167 | - /// <param name="sourceName">value to be set.</param> | |
| 168 | - public static void setOutOfStore(string sourceName) | |
| 169 | - { | |
| 170 | -#if !UNITY_EDITOR | |
| 171 | - appsFlyerAndroid.CallStatic("setOutOfStore", sourceName); | |
| 172 | -#endif | |
| 173 | - } | |
| 174 | - | |
| 175 | - /// <summary> | |
| 176 | - /// Set the OneLink ID that should be used for User-Invites. | |
| 177 | - /// The link that is generated for the user invite will use this OneLink as the base link. | |
| 178 | - /// </summary> | |
| 179 | - /// <param name="oneLinkId">OneLink ID obtained from the AppsFlyer Dashboard.</param> | |
| 180 | - public static void setAppInviteOneLinkID(string oneLinkId) | |
| 181 | - { | |
| 182 | -#if !UNITY_EDITOR | |
| 183 | - appsFlyerAndroid.CallStatic("setAppInviteOneLinkID", oneLinkId); | |
| 184 | -#endif | |
| 185 | - } | |
| 186 | - | |
| 187 | - /// <summary> | |
| 188 | - /// Set additional data to be sent to AppsFlyer. | |
| 189 | - /// </summary> | |
| 190 | - /// <param name="customData">additional data Dictionary.</param> | |
| 191 | - public static void setAdditionalData(Dictionary<string, string> customData) | |
| 192 | - { | |
| 193 | -#if !UNITY_EDITOR | |
| 194 | - appsFlyerAndroid.CallStatic("setAdditionalData", convertDictionaryToJavaMap(customData)); | |
| 195 | -#endif | |
| 196 | - } | |
| 197 | - | |
| 198 | - /// <summary> | |
| 199 | - /// Set the user emails. | |
| 200 | - /// </summary> | |
| 201 | - /// <param name="emails">User emails.</param> | |
| 202 | - public static void setUserEmails(params string[] emails) | |
| 203 | - { | |
| 204 | -#if !UNITY_EDITOR | |
| 205 | - appsFlyerAndroid.CallStatic("setUserEmails", (object)emails); | |
| 206 | -#endif | |
| 207 | - } | |
| 208 | - | |
| 209 | - | |
| 210 | - /// <summary> | |
| 211 | - /// Set the user phone number. | |
| 212 | - /// </summary> | |
| 213 | - /// <param name="phoneNumber">User phoneNumber.</param> | |
| 214 | - public static void setPhoneNumber(string phoneNumber){ | |
| 215 | -#if !UNITY_EDITOR | |
| 216 | - appsFlyerAndroid.CallStatic("setPhoneNumber", phoneNumber); | |
| 217 | -#endif | |
| 218 | - } | |
| 219 | - | |
| 220 | - /// <summary> | |
| 221 | - /// Set the user emails and encrypt them. | |
| 222 | - /// cryptMethod Encryption method: | |
| 223 | - /// EmailCryptType.EmailCryptTypeMD5 | |
| 224 | - /// EmailCryptType.EmailCryptTypeSHA1 | |
| 225 | - /// EmailCryptType.EmailCryptTypeSHA256 | |
| 226 | - /// EmailCryptType.EmailCryptTypeNone | |
| 227 | - /// </summary> | |
| 228 | - /// <param name="cryptMethod">Encryption method.</param> | |
| 229 | - /// <param name="emails">User emails.</param> | |
| 230 | - public static void setUserEmails(EmailCryptType cryptMethod, params string[] emails) | |
| 231 | - { | |
| 232 | -#if !UNITY_EDITOR | |
| 233 | - appsFlyerAndroid.CallStatic("setUserEmails", getEmailType(cryptMethod), (object)emails); | |
| 234 | -#endif | |
| 235 | - } | |
| 236 | - | |
| 237 | - /// <summary> | |
| 238 | - /// Opt-out of collection of Android ID. | |
| 239 | - /// If the app does NOT contain Google Play Services, Android ID is collected by the SDK. | |
| 240 | - /// However, apps with Google play services should avoid Android ID collection as this is in violation of the Google Play policy. | |
| 241 | - /// </summary> | |
| 242 | - /// <param name="isCollect">boolean, false to opt-out.</param> | |
| 243 | - public static void setCollectAndroidID(bool isCollect) | |
| 244 | - { | |
| 245 | -#if !UNITY_EDITOR | |
| 246 | - appsFlyerAndroid.CallStatic("setCollectAndroidID", isCollect); | |
| 247 | -#endif | |
| 248 | - } | |
| 249 | - | |
| 250 | - /// <summary> | |
| 251 | - /// Opt-out of collection of IMEI. | |
| 252 | - /// If the app does NOT contain Google Play Services, device IMEI is collected by the SDK. | |
| 253 | - /// However, apps with Google play services should avoid IMEI collection as this is in violation of the Google Play policy. | |
| 254 | - /// </summary> | |
| 255 | - /// <param name="isCollect">boolean, false to opt-out.</param> | |
| 256 | - public static void setCollectIMEI(bool isCollect) | |
| 257 | - { | |
| 258 | -#if !UNITY_EDITOR | |
| 259 | - appsFlyerAndroid.CallStatic("setCollectIMEI", isCollect); | |
| 260 | -#endif | |
| 261 | - } | |
| 262 | - | |
| 263 | - /// <summary> | |
| 264 | - /// Advertisers can wrap AppsFlyer OneLink within another Universal Link. | |
| 265 | - /// This Universal Link will invoke the app but any deep linking data will not propagate to AppsFlyer. | |
| 266 | - /// </summary> | |
| 267 | - /// <param name="urls">Array of urls.</param> | |
| 268 | - public static void setResolveDeepLinkURLs(params string[] urls) | |
| 269 | - { | |
| 270 | -#if !UNITY_EDITOR | |
| 271 | - appsFlyerAndroid.CallStatic("setResolveDeepLinkURLs", (object)urls); | |
| 272 | -#endif | |
| 273 | - } | |
| 274 | - | |
| 275 | - | |
| 276 | - /// <summary> | |
| 277 | - /// Advertisers can use this method to set vanity onelink domains. | |
| 278 | - /// </summary> | |
| 279 | - /// <param name="domains">Array of domains.</param> | |
| 280 | - public static void setOneLinkCustomDomain(params string[] domains) | |
| 281 | - { | |
| 282 | -#if !UNITY_EDITOR | |
| 283 | - appsFlyerAndroid.CallStatic("setOneLinkCustomDomain", (object)domains); | |
| 284 | -#endif | |
| 285 | - } | |
| 286 | - | |
| 287 | - /// <summary> | |
| 288 | - /// Manually set that the application was updated. | |
| 289 | - /// </summary> | |
| 290 | - /// <param name="isUpdate">isUpdate boolean value.</param> | |
| 291 | - public static void setIsUpdate(bool isUpdate) | |
| 292 | - { | |
| 293 | -#if !UNITY_EDITOR | |
| 294 | - appsFlyerAndroid.CallStatic("setIsUpdate", isUpdate); | |
| 295 | -#endif | |
| 296 | - } | |
| 297 | - | |
| 298 | - /// <summary> | |
| 299 | - /// Setting user local currency code for in-app purchases. | |
| 300 | - /// The currency code should be a 3 character ISO 4217 code. (default is USD). | |
| 301 | - /// You can set the currency code for all events by calling the following method. | |
| 302 | - /// </summary> | |
| 303 | - /// <param name="currencyCode">3 character ISO 4217 code.</param> | |
| 304 | - public static void setCurrencyCode(string currencyCode) | |
| 305 | - { | |
| 306 | -#if !UNITY_EDITOR | |
| 307 | - appsFlyerAndroid.CallStatic("setCurrencyCode", currencyCode); | |
| 308 | -#endif | |
| 309 | - } | |
| 310 | - | |
| 311 | - /// <summary> | |
| 312 | - /// Manually record the location of the user. | |
| 313 | - /// </summary> | |
| 314 | - /// <param name="latitude">latitude as double.</param> | |
| 315 | - /// <param name="longitude">longitude as double.</param> | |
| 316 | - public static void recordLocation(double latitude, double longitude) | |
| 317 | - { | |
| 318 | -#if !UNITY_EDITOR | |
| 319 | - appsFlyerAndroid.CallStatic("trackLocation", latitude, longitude); | |
| 320 | -#endif | |
| 321 | - } | |
| 322 | - | |
| 323 | - /// <summary> | |
| 324 | - /// Send an In-App Event. | |
| 325 | - /// In-App Events provide insight on what is happening in your app. | |
| 326 | - /// </summary> | |
| 327 | - /// <param name="eventName">Event Name as String.</param> | |
| 328 | - /// <param name="eventValues">Event Values as Dictionary.</param> | |
| 329 | - public static void sendEvent(string eventName, Dictionary<string, string> eventValues) | |
| 330 | - { | |
| 331 | -#if !UNITY_EDITOR | |
| 332 | - appsFlyerAndroid.CallStatic("trackEvent", eventName, convertDictionaryToJavaMap(eventValues)); | |
| 333 | -#endif | |
| 334 | - } | |
| 335 | - | |
| 336 | - /// <summary> | |
| 337 | - /// Anonymize user Data. | |
| 338 | - /// Use this API during the SDK Initialization to explicitly anonymize a user's installs, events and sessions. | |
| 339 | - /// Default is false. | |
| 340 | - /// </summary> | |
| 341 | - /// <param name="isDisabled">isDisabled boolean.</param> | |
| 342 | - public static void anonymizeUser(bool isDisabled) | |
| 343 | - { | |
| 344 | -#if !UNITY_EDITOR | |
| 345 | - appsFlyerAndroid.CallStatic("setDeviceTrackingDisabled", isDisabled); | |
| 346 | -#endif | |
| 347 | - } | |
| 348 | - | |
| 349 | - /// <summary> | |
| 350 | - /// Enable the collection of Facebook Deferred AppLinks. | |
| 351 | - /// Requires Facebook SDK and Facebook app on target/client device. | |
| 352 | - /// This API must be invoked prior to initializing the AppsFlyer SDK in order to function properly. | |
| 353 | - /// </summary> | |
| 354 | - /// <param name="isEnabled">should Facebook's deferred app links be processed by the AppsFlyer SDK.</param> | |
| 355 | - public static void enableFacebookDeferredApplinks(bool isEnabled) | |
| 356 | - { | |
| 357 | -#if !UNITY_EDITOR | |
| 358 | - appsFlyerAndroid.CallStatic("enableFacebookDeferredApplinks", isEnabled); | |
| 359 | -#endif | |
| 360 | - } | |
| 361 | - | |
| 362 | - | |
| 363 | - /// <summary> | |
| 364 | - /// Restrict reengagement via deep-link to once per each unique deep-link. | |
| 365 | - /// Otherwise deep re-occurring deep-links will be permitted for non-singleTask Activities and deep-linking via AppsFlyer deep-links. | |
| 366 | - /// The default value is false. | |
| 367 | - /// </summary> | |
| 368 | - /// <param name="doConsume">doConsume boolean.</param> | |
| 369 | - public static void setConsumeAFDeepLinks(bool doConsume) | |
| 370 | - { | |
| 371 | -#if !UNITY_EDITOR | |
| 372 | - appsFlyerAndroid.CallStatic("setConsumeAFDeepLinks", doConsume); | |
| 373 | -#endif | |
| 374 | - } | |
| 375 | - | |
| 376 | - /// <summary> | |
| 377 | - /// Specify the manufacturer or media source name to which the preinstall is attributed. | |
| 378 | - /// </summary> | |
| 379 | - /// <param name="mediaSource">Manufacturer or media source name for preinstall attribution.</param> | |
| 380 | - /// <param name="campaign">Campaign name for preinstall attribution.</param> | |
| 381 | - /// <param name="siteId">Site ID for preinstall attribution.</param> | |
| 382 | - public static void setPreinstallAttribution(string mediaSource, string campaign, string siteId) | |
| 383 | - { | |
| 384 | -#if !UNITY_EDITOR | |
| 385 | - appsFlyerAndroid.CallStatic("setPreinstallAttribution", mediaSource, campaign, siteId); | |
| 386 | -#endif | |
| 387 | - } | |
| 388 | - | |
| 389 | - /// <summary> | |
| 390 | - /// Boolean indicator for preinstall by Manufacturer. | |
| 391 | - /// </summary> | |
| 392 | - /// <returns>boolean isPreInstalledApp.</returns> | |
| 393 | - public static bool isPreInstalledApp() | |
| 394 | - { | |
| 395 | -#if !UNITY_EDITOR | |
| 396 | - return appsFlyerAndroid.CallStatic<bool>("isPreInstalledApp"); | |
| 397 | -#else | |
| 398 | - return false; | |
| 399 | -#endif | |
| 400 | - } | |
| 401 | - | |
| 402 | - /// <summary> | |
| 403 | - /// Get the Facebook attribution ID, if one exists. | |
| 404 | - /// </summary> | |
| 405 | - /// <returns>string Facebook attribution ID.</returns> | |
| 406 | - public static string getAttributionId() | |
| 407 | - { | |
| 408 | -#if !UNITY_EDITOR | |
| 409 | - return appsFlyerAndroid.CallStatic<string>("getAttributionId"); | |
| 410 | -#else | |
| 411 | - return ""; | |
| 412 | -#endif | |
| 413 | - } | |
| 414 | - | |
| 415 | - /// <summary> | |
| 416 | - /// Get AppsFlyer's unique device ID is created for every new install of an app. | |
| 417 | - /// </summary> | |
| 418 | - /// <returns>AppsFlyer's unique device ID.</returns> | |
| 419 | - public static string getAppsFlyerId() | |
| 420 | - { | |
| 421 | -#if !UNITY_EDITOR | |
| 422 | - return appsFlyerAndroid.CallStatic<string>("getAppsFlyerId"); | |
| 423 | -#else | |
| 424 | - return ""; | |
| 425 | -#endif | |
| 426 | - } | |
| 427 | - | |
| 428 | - /// <summary> | |
| 429 | - /// API for server verification of in-app purchases. | |
| 430 | - /// An af_purchase event with the relevant values will be automatically sent if the validation is successful. | |
| 431 | - /// </summary> | |
| 432 | - /// <param name="publicKey">License Key obtained from the Google Play Console.</param> | |
| 433 | - /// <param name="signature"><code>data.INAPP_DATA_SIGNATURE</code> from <code>onActivityResult(int requestCode, int resultCode, Intent data)</code></param> | |
| 434 | - /// <param name="purchaseData"><code>data.INAPP_PURCHASE_DATA</code> from <code>onActivityResult(int requestCode, int resultCode, Intent data)</code></param> | |
| 435 | - /// <param name="price">Purchase price, should be derived from <code>skuDetails.getStringArrayList("DETAILS_LIST")</code></param> | |
| 436 | - /// <param name="currency">Purchase currency, should be derived from <code>skuDetails.getStringArrayList("DETAILS_LIST")</code></param> | |
| 437 | - /// <param name="additionalParameters">additionalParameters Freehand parameters to be sent with the purchase (if validated).</param> | |
| 438 | - public static void validateAndSendInAppPurchase(string publicKey, string signature, string purchaseData, string price, string currency, Dictionary<string, string> additionalParameters, MonoBehaviour gameObject) | |
| 439 | - { | |
| 440 | -#if !UNITY_EDITOR | |
| 441 | - appsFlyerAndroid.CallStatic("validateAndTrackInAppPurchase", publicKey, signature, purchaseData, price, currency, convertDictionaryToJavaMap(additionalParameters), gameObject ? gameObject.name : null); | |
| 442 | -#endif | |
| 443 | - } | |
| 444 | - | |
| 445 | - /// <summary> | |
| 446 | - /// Was the stopSDK(boolean) API set to true. | |
| 447 | - /// </summary> | |
| 448 | - /// <returns>boolean isSDKStopped.</returns> | |
| 449 | - public static bool isSDKStopped() | |
| 450 | - { | |
| 451 | -#if !UNITY_EDITOR | |
| 452 | - return appsFlyerAndroid.CallStatic<bool>("isTrackingStopped"); | |
| 453 | -#else | |
| 454 | - return false; | |
| 455 | -#endif | |
| 456 | - } | |
| 457 | - | |
| 458 | - /// <summary> | |
| 459 | - /// Set a custom value for the minimum required time between sessions. | |
| 460 | - /// By default, at least 5 seconds must lapse between 2 app launches to count as separate 2 sessions. | |
| 461 | - /// </summary> | |
| 462 | - /// <param name="seconds">minimum time between 2 separate sessions in seconds.</param> | |
| 463 | - public static void setMinTimeBetweenSessions(int seconds) | |
| 464 | - { | |
| 465 | -#if !UNITY_EDITOR | |
| 466 | - appsFlyerAndroid.CallStatic("setMinTimeBetweenSessions", seconds); | |
| 467 | -#endif | |
| 468 | - } | |
| 469 | - | |
| 470 | - /// <summary> | |
| 471 | - /// Set a custom host. | |
| 472 | - /// </summary> | |
| 473 | - /// <param name="hostPrefixName">Host prefix.</param> | |
| 474 | - /// <param name="hostName">Host name.</param> | |
| 475 | - public static void setHost(string hostPrefixName, string hostName) | |
| 476 | - { | |
| 477 | -#if !UNITY_EDITOR | |
| 478 | - appsFlyerAndroid.CallStatic("setHost", hostPrefixName, hostName); | |
| 479 | -#endif | |
| 480 | - } | |
| 481 | - | |
| 482 | - /// <summary> | |
| 483 | - /// Get the host name. | |
| 484 | - /// Default value is "appsflyer.com". | |
| 485 | - /// </summary> | |
| 486 | - /// <returns>Host name.</returns> | |
| 487 | - public static string getHostName() | |
| 488 | - { | |
| 489 | -#if !UNITY_EDITOR | |
| 490 | - return appsFlyerAndroid.CallStatic<string>("getHostName"); | |
| 491 | -#else | |
| 492 | - return ""; | |
| 493 | -#endif | |
| 494 | - } | |
| 495 | - | |
| 496 | - /// <summary> | |
| 497 | - /// Get the custom host prefix. | |
| 498 | - /// </summary> | |
| 499 | - /// <returns>Host prefix.</returns> | |
| 500 | - public static string getHostPrefix() | |
| 501 | - { | |
| 502 | -#if !UNITY_EDITOR | |
| 503 | - return appsFlyerAndroid.CallStatic<string>("getHostPrefix"); | |
| 504 | -#else | |
| 505 | - return ""; | |
| 506 | -#endif | |
| 507 | - } | |
| 508 | - | |
| 509 | - /// <summary> | |
| 510 | - /// Used by advertisers to exclude all networks/integrated partners from getting data. | |
| 511 | - /// </summary> | |
| 512 | - public static void setSharingFilterForAllPartners() | |
| 513 | - { | |
| 514 | -#if !UNITY_EDITOR | |
| 515 | - appsFlyerAndroid.CallStatic("setSharingFilterForAllPartners"); | |
| 516 | -#endif | |
| 517 | - } | |
| 518 | - | |
| 519 | - /// <summary> | |
| 520 | - /// Used by advertisers to set some (one or more) networks/integrated partners to exclude from getting data. | |
| 521 | - /// </summary> | |
| 522 | - /// <param name="partners">partners to exclude from getting data</param> | |
| 523 | - public static void setSharingFilter(params string[] partners) | |
| 524 | - { | |
| 525 | -#if !UNITY_EDITOR | |
| 526 | - appsFlyerAndroid.CallStatic("setSharingFilter", (object)partners); | |
| 527 | -#endif | |
| 528 | - } | |
| 529 | - | |
| 530 | - /// <summary> | |
| 531 | - /// Register a Conversion Data Listener. | |
| 532 | - /// Allows the developer to access the user attribution data in real-time for every new install, directly from the SDK level. | |
| 533 | - /// By doing this you can serve users with personalized content or send them to specific activities within the app, | |
| 534 | - /// which can greatly enhance their engagement with your app. | |
| 535 | - /// </summary> | |
| 536 | - public static void getConversionData(string objectName) | |
| 537 | - { | |
| 538 | -#if !UNITY_EDITOR | |
| 539 | - appsFlyerAndroid.CallStatic("getConversionData", objectName); | |
| 540 | -#endif | |
| 541 | - } | |
| 542 | - | |
| 543 | - /// <summary> | |
| 544 | - /// Register a validation listener for the validateAndSendInAppPurchase API. | |
| 545 | - /// </summary> | |
| 546 | - public static void initInAppPurchaseValidatorListener(MonoBehaviour gameObject) | |
| 547 | - { | |
| 548 | -#if !UNITY_EDITOR | |
| 549 | - appsFlyerAndroid.CallStatic("initInAppPurchaseValidatorListener", gameObject ? gameObject.name : null); | |
| 550 | -#endif | |
| 551 | - } | |
| 552 | - | |
| 553 | - /// <summary> | |
| 554 | - /// setCollectOaid | |
| 555 | - /// You must include the appsflyer oaid library for this api to work. | |
| 556 | - /// </summary> | |
| 557 | - /// <param name="isCollect">isCollect oaid - set fasle to opt out</param> | |
| 558 | - public static void setCollectOaid(bool isCollect) | |
| 559 | - { | |
| 560 | -#if !UNITY_EDITOR | |
| 561 | - appsFlyerAndroid.CallStatic("setCollectOaid", isCollect); | |
| 562 | -#endif | |
| 563 | - } | |
| 564 | - | |
| 565 | - /// <summary> | |
| 566 | - /// Use the following API to attribute the click and launch the app store's app page. | |
| 567 | - /// </summary> | |
| 568 | - /// <param name="promoted_app_id">promoted App ID</param> | |
| 569 | - /// <param name="campaign">cross promotion campaign</param> | |
| 570 | - /// <param name="userParams">additional user params</param> | |
| 571 | - public static void attributeAndOpenStore(string promoted_app_id, string campaign, Dictionary<string, string> userParams) | |
| 572 | - { | |
| 573 | -#if !UNITY_EDITOR | |
| 574 | - appsFlyerAndroid.CallStatic("attributeAndOpenStore", promoted_app_id, campaign, convertDictionaryToJavaMap(userParams)); | |
| 575 | -#endif | |
| 576 | - } | |
| 577 | - | |
| 578 | - /// <summary> | |
| 579 | - /// To attribute an impression use the following API call. | |
| 580 | - /// Make sure to use the promoted App ID as it appears within the AppsFlyer dashboard. | |
| 581 | - /// </summary> | |
| 582 | - /// <param name="appID">promoted App ID.</param> | |
| 583 | - /// <param name="campaign">cross promotion campaign.</param> | |
| 584 | - /// <param name="parameters">parameters Dictionary.</param> | |
| 585 | - public static void recordCrossPromoteImpression(string appID, string campaign, Dictionary<string, string> parameters) | |
| 586 | - { | |
| 587 | -#if !UNITY_EDITOR | |
| 588 | - appsFlyerAndroid.CallStatic("recordCrossPromoteImpression", appID, campaign, convertDictionaryToJavaMap(parameters)); | |
| 589 | -#endif | |
| 590 | - } | |
| 591 | - | |
| 592 | - /// <summary> | |
| 593 | - /// The LinkGenerator class builds the invite URL according to various setter methods which allow passing on additional information on the click. | |
| 594 | - /// See - https://support.appsflyer.com/hc/en-us/articles/115004480866-User-invite-attribution- | |
| 595 | - /// </summary> | |
| 596 | - /// <param name="parameters">parameters Dictionary.</param> | |
| 597 | - public static void generateUserInviteLink(Dictionary<string, string> parameters, MonoBehaviour gameObject) | |
| 598 | - { | |
| 599 | -#if !UNITY_EDITOR | |
| 600 | - appsFlyerAndroid.CallStatic("createOneLinkInviteListener", convertDictionaryToJavaMap(parameters), gameObject ? gameObject.name : null); | |
| 601 | -#endif | |
| 602 | - } | |
| 603 | - | |
| 604 | - /// <summary> | |
| 605 | - /// To measure push notifications as part of a retargeting campaign. | |
| 606 | - /// </summary> | |
| 607 | - public static void handlePushNotifications(){ | |
| 608 | -#if !UNITY_EDITOR | |
| 609 | - appsFlyerAndroid.CallStatic("handlePushNotifications"); | |
| 610 | -#endif | |
| 611 | - } | |
| 612 | - | |
| 613 | - /// <summary> | |
| 614 | - /// Internal Helper Method. | |
| 615 | - /// </summary> | |
| 616 | - private static AndroidJavaObject getEmailType(EmailCryptType cryptType) | |
| 617 | - { | |
| 618 | - AndroidJavaClass emailsCryptTypeEnum = new AndroidJavaClass("com.appsflyer.AppsFlyerProperties$EmailsCryptType"); | |
| 619 | - AndroidJavaObject emailsCryptType; | |
| 620 | - | |
| 621 | - switch (cryptType) | |
| 622 | - { | |
| 623 | - case EmailCryptType.EmailCryptTypeSHA256: | |
| 624 | - emailsCryptType = emailsCryptTypeEnum.GetStatic<AndroidJavaObject>("SHA256"); | |
| 625 | - break; | |
| 626 | - default: | |
| 627 | - emailsCryptType = emailsCryptTypeEnum.GetStatic<AndroidJavaObject>("NONE"); | |
| 628 | - break; | |
| 629 | - } | |
| 630 | - | |
| 631 | - return emailsCryptType; | |
| 632 | - } | |
| 633 | - | |
| 634 | - /// <summary> | |
| 635 | - /// Internal Helper Method. | |
| 636 | - /// </summary> | |
| 637 | - private static AndroidJavaObject convertDictionaryToJavaMap(Dictionary<string, string> dictionary) | |
| 638 | - { | |
| 639 | - AndroidJavaObject map = new AndroidJavaObject("java.util.HashMap"); | |
| 640 | - IntPtr putMethod = AndroidJNIHelper.GetMethodID(map.GetRawClass(), "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;"); | |
| 641 | - if (dictionary != null) | |
| 642 | - { | |
| 643 | - foreach (var entry in dictionary) | |
| 644 | - { | |
| 645 | - AndroidJNI.CallObjectMethod(map.GetRawObject(), putMethod, AndroidJNIHelper.CreateJNIArgArray(new object[] { entry.Key, entry.Value })); | |
| 646 | - } | |
| 647 | - } | |
| 648 | - | |
| 649 | - return map; | |
| 650 | - } | |
| 651 | - } | |
| 652 | - | |
| 653 | -#endif | |
| 654 | - | |
| 655 | - | |
| 656 | - | |
| 657 | -} |
Runtime/AppsFlyerAndroid.cs.meta
Runtime/AppsFlyerObject.prefab
| 1 | -%YAML 1.1 | |
| 2 | -%TAG !u! tag:unity3d.com,2011: | |
| 3 | ---- !u!1001 &100100000 | |
| 4 | -Prefab: | |
| 5 | - m_ObjectHideFlags: 1 | |
| 6 | - serializedVersion: 2 | |
| 7 | - m_Modification: | |
| 8 | - m_TransformParent: {fileID: 0} | |
| 9 | - m_Modifications: [] | |
| 10 | - m_RemovedComponents: [] | |
| 11 | - m_SourcePrefab: {fileID: 0} | |
| 12 | - m_RootGameObject: {fileID: 1562408896289314} | |
| 13 | - m_IsPrefabAsset: 1 | |
| 14 | ---- !u!1 &1562408896289314 | |
| 15 | -GameObject: | |
| 16 | - m_ObjectHideFlags: 0 | |
| 17 | - m_CorrespondingSourceObject: {fileID: 0} | |
| 18 | - m_PrefabInternal: {fileID: 100100000} | |
| 19 | - serializedVersion: 6 | |
| 20 | - m_Component: | |
| 21 | - - component: {fileID: 4294345628247858} | |
| 22 | - - component: {fileID: 114092076686766906} | |
| 23 | - m_Layer: 0 | |
| 24 | - m_Name: AppsFlyerObject | |
| 25 | - m_TagString: Untagged | |
| 26 | - m_Icon: {fileID: 0} | |
| 27 | - m_NavMeshLayer: 0 | |
| 28 | - m_StaticEditorFlags: 0 | |
| 29 | - m_IsActive: 1 | |
| 30 | ---- !u!4 &4294345628247858 | |
| 31 | -Transform: | |
| 32 | - m_ObjectHideFlags: 1 | |
| 33 | - m_CorrespondingSourceObject: {fileID: 0} | |
| 34 | - m_PrefabInternal: {fileID: 100100000} | |
| 35 | - m_GameObject: {fileID: 1562408896289314} | |
| 36 | - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} | |
| 37 | - m_LocalPosition: {x: 0, y: 0, z: 0} | |
| 38 | - m_LocalScale: {x: 1, y: 1, z: 1} | |
| 39 | - m_Children: [] | |
| 40 | - m_Father: {fileID: 0} | |
| 41 | - m_RootOrder: 0 | |
| 42 | - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} | |
| 43 | ---- !u!114 &114092076686766906 | |
| 44 | -MonoBehaviour: | |
| 45 | - m_ObjectHideFlags: 1 | |
| 46 | - m_CorrespondingSourceObject: {fileID: 0} | |
| 47 | - m_PrefabInternal: {fileID: 100100000} | |
| 48 | - m_GameObject: {fileID: 1562408896289314} | |
| 49 | - m_Enabled: 1 | |
| 50 | - m_EditorHideFlags: 0 | |
| 51 | - m_Script: {fileID: 11500000, guid: 2caf6a738ac024a48bd358f4cc91662a, type: 3} | |
| 52 | - m_Name: | |
| 53 | - m_EditorClassIdentifier: | |
| 54 | - devKey: | |
| 55 | - appID: | |
| 56 | - isDebug: 0 | |
| 57 | - getConversionData: 0 |
Runtime/AppsFlyerObject.prefab.meta
Runtime/AppsFlyerObjectScript.cs
| 1 | -using System.Collections; | |
| 2 | -using System.Collections.Generic; | |
| 3 | -using UnityEngine; | |
| 4 | -using AppsFlyerSDK; | |
| 5 | - | |
| 6 | -// This class is intended to be used the the AppsFlyerObject.prefab | |
| 7 | - | |
| 8 | -public class AppsFlyerObjectScript : MonoBehaviour , IAppsFlyerConversionData | |
| 9 | -{ | |
| 10 | - | |
| 11 | - // These fields are set from the editor so do not modify! | |
| 12 | - //******************************// | |
| 13 | - public string devKey; | |
| 14 | - public string appID; | |
| 15 | - public bool isDebug; | |
| 16 | - public bool getConversionData; | |
| 17 | - //******************************// | |
| 18 | - | |
| 19 | - void Start() | |
| 20 | - { | |
| 21 | - // These fields are set from the editor so do not modify! | |
| 22 | - //******************************// | |
| 23 | - AppsFlyer.setIsDebug(isDebug); | |
| 24 | - AppsFlyer.initSDK(devKey, appID, getConversionData ? this : null); | |
| 25 | - //******************************// | |
| 26 | - | |
| 27 | - AppsFlyer.startSDK(); | |
| 28 | - } | |
| 29 | - | |
| 30 | - void Update() | |
| 31 | - { | |
| 32 | - | |
| 33 | - } | |
| 34 | - | |
| 35 | - // Mark AppsFlyer CallBacks | |
| 36 | - public void onConversionDataSuccess(string conversionData) | |
| 37 | - { | |
| 38 | - AppsFlyer.AFLog("didReceiveConversionData", conversionData); | |
| 39 | - Dictionary<string, object> conversionDataDictionary = AppsFlyer.CallbackStringToDictionary(conversionData); | |
| 40 | - // add deferred deeplink logic here | |
| 41 | - } | |
| 42 | - | |
| 43 | - public void onConversionDataFail(string error) | |
| 44 | - { | |
| 45 | - AppsFlyer.AFLog("didReceiveConversionDataWithError", error); | |
| 46 | - } | |
| 47 | - | |
| 48 | - public void onAppOpenAttribution(string attributionData) | |
| 49 | - { | |
| 50 | - AppsFlyer.AFLog("onAppOpenAttribution", attributionData); | |
| 51 | - Dictionary<string, object> attributionDataDictionary = AppsFlyer.CallbackStringToDictionary(attributionData); | |
| 52 | - // add direct deeplink logic here | |
| 53 | - } | |
| 54 | - | |
| 55 | - public void onAppOpenAttributionFailure(string error) | |
| 56 | - { | |
| 57 | - AppsFlyer.AFLog("onAppOpenAttributionFailure", error); | |
| 58 | - } | |
| 59 | -} |
Runtime/AppsFlyerObjectScript.cs.meta
Runtime/AppsFlyeriOS.cs
| 1 | -using System.Collections.Generic; | |
| 2 | -using System.Runtime.InteropServices; | |
| 3 | -using UnityEngine; | |
| 4 | - | |
| 5 | -namespace AppsFlyerSDK | |
| 6 | -{ | |
| 7 | -#if UNITY_IOS | |
| 8 | - | |
| 9 | - public class AppsFlyeriOS | |
| 10 | - { | |
| 11 | - | |
| 12 | - /// <summary> | |
| 13 | - /// Start Session. | |
| 14 | - /// This will record a session and then record all background forground sessions during the lifecycle of the app. | |
| 15 | - /// </summary> | |
| 16 | - public static void startSDK() | |
| 17 | - { | |
| 18 | -#if !UNITY_EDITOR | |
| 19 | - _startSDK(); | |
| 20 | -#endif | |
| 21 | - } | |
| 22 | - | |
| 23 | - /// <summary> | |
| 24 | - /// Send an In-App Event. | |
| 25 | - /// In-App Events provide insight on what is happening in your app. | |
| 26 | - /// </summary> | |
| 27 | - /// <param name="eventName">Name of event.</param> | |
| 28 | - /// <param name="eventValues">Contains dictionary of values for handling by backend.</param> | |
| 29 | - public static void sendEvent(string eventName, Dictionary<string, string> eventValues) | |
| 30 | - { | |
| 31 | -#if !UNITY_EDITOR | |
| 32 | - _afSendEvent(eventName, AFMiniJSON.Json.Serialize(eventValues)); | |
| 33 | -#endif | |
| 34 | - } | |
| 35 | - | |
| 36 | - /// <summary> | |
| 37 | - /// Get the conversion data. | |
| 38 | - /// Allows the developer to access the user attribution data in real-time for every new install, directly from the SDK level. | |
| 39 | - /// By doing this you can serve users with personalized content or send them to specific activities within the app, | |
| 40 | - /// which can greatly enhance their engagement with your app. | |
| 41 | - /// </summary> | |
| 42 | - public static void getConversionData(string objectName) | |
| 43 | - { | |
| 44 | -#if !UNITY_EDITOR | |
| 45 | - _getConversionData(objectName); | |
| 46 | -#endif | |
| 47 | - } | |
| 48 | - | |
| 49 | - /// <summary> | |
| 50 | - /// In case you use your own user ID in your app, you can set this property to that ID. | |
| 51 | - /// Enables you to cross-reference your own unique ID with AppsFlyer’s unique ID and the other devices’ IDs. | |
| 52 | - /// </summary> | |
| 53 | - /// <param name="customerUserID">Customer ID for client.</param> | |
| 54 | - public static void setCustomerUserID(string customerUserID) | |
| 55 | - { | |
| 56 | -#if !UNITY_EDITOR | |
| 57 | - _setCustomerUserID(customerUserID); | |
| 58 | -#endif | |
| 59 | - } | |
| 60 | - | |
| 61 | - /// <summary> | |
| 62 | - /// In case you use custom data and you want to receive it in the raw reports. | |
| 63 | - /// see [Setting additional custom data] (https://support.appsflyer.com/hc/en-us/articles/207032066-AppsFlyer-SDK-Integration-iOS#setting-additional-custom-data) for more information. | |
| 64 | - /// </summary> | |
| 65 | - /// <param name="customData">additional data Dictionary.</param> | |
| 66 | - public static void setAdditionalData(Dictionary<string, string> customData) | |
| 67 | - { | |
| 68 | -#if !UNITY_EDITOR | |
| 69 | - _setAdditionalData(AFMiniJSON.Json.Serialize(customData)); | |
| 70 | -#endif | |
| 71 | - } | |
| 72 | - | |
| 73 | - /// <summary> | |
| 74 | - /// Use this method to set your AppsFlyer's dev key. | |
| 75 | - /// </summary> | |
| 76 | - /// <param name="appsFlyerDevKey">AppsFlyer's Dev-Key, which is accessible from your AppsFlyer account under 'App Settings' in the dashboard.</param> | |
| 77 | - public static void setAppsFlyerDevKey(string appsFlyerDevKey) | |
| 78 | - { | |
| 79 | -#if !UNITY_EDITOR | |
| 80 | - _setAppsFlyerDevKey(appsFlyerDevKey); | |
| 81 | -#endif | |
| 82 | - } | |
| 83 | - | |
| 84 | - /// <summary> | |
| 85 | - /// Use this method to set your app's Apple ID(taken from the app's page on iTunes Connect). | |
| 86 | - /// </summary> | |
| 87 | - /// <param name="appleAppID">your app's Apple ID.</param> | |
| 88 | - public static void setAppleAppID(string appleAppID) | |
| 89 | - { | |
| 90 | -#if !UNITY_EDITOR | |
| 91 | - _setAppleAppID(appleAppID); | |
| 92 | -#endif | |
| 93 | - } | |
| 94 | - | |
| 95 | - /// <summary> | |
| 96 | - /// Setting user local currency code for in-app purchases. | |
| 97 | - /// The currency code should be a 3 character ISO 4217 code. (default is USD). | |
| 98 | - /// You can set the currency code for all events by calling the following method. | |
| 99 | - /// </summary> | |
| 100 | - /// <param name="currencyCode">3 character ISO 4217 code.</param> | |
| 101 | - public static void setCurrencyCode(string currencyCode) | |
| 102 | - { | |
| 103 | -#if !UNITY_EDITOR | |
| 104 | - _setCurrencyCode(currencyCode); | |
| 105 | -#endif | |
| 106 | - } | |
| 107 | - | |
| 108 | - /// <summary> | |
| 109 | - /// AppsFlyer SDK collect Apple's `advertisingIdentifier` if the `AdSupport.framework` included in the SDK. | |
| 110 | - /// You can disable this behavior by setting the following property to true. | |
| 111 | - /// </summary> | |
| 112 | - /// <param name="disableCollectAppleAdSupport">boolean to disableCollectAppleAdSupport</param> | |
| 113 | - public static void setDisableCollectAppleAdSupport(bool disableCollectAppleAdSupport) | |
| 114 | - { | |
| 115 | -#if !UNITY_EDITOR | |
| 116 | - _setDisableCollectAppleAdSupport(disableCollectAppleAdSupport); | |
| 117 | -#endif | |
| 118 | - } | |
| 119 | - | |
| 120 | - /// <summary> | |
| 121 | - /// Enables Debug logs for the AppsFlyer SDK. | |
| 122 | - /// Should only be set to true in development / debug. | |
| 123 | - /// The default value is false. | |
| 124 | - /// </summary> | |
| 125 | - /// <param name="isDebug">shouldEnable boolean..</param> | |
| 126 | - public static void setIsDebug(bool isDebug) | |
| 127 | - { | |
| 128 | -#if !UNITY_EDITOR | |
| 129 | - _setIsDebug(isDebug); | |
| 130 | -#endif | |
| 131 | - } | |
| 132 | - | |
| 133 | - /// <summary> | |
| 134 | - /// Set this flag to true, to collect the current device name(e.g. "My iPhone"). Default value is false. | |
| 135 | - /// </summary> | |
| 136 | - /// <param name="shouldCollectDeviceName">boolean shouldCollectDeviceName.</param> | |
| 137 | - public static void setShouldCollectDeviceName(bool shouldCollectDeviceName) | |
| 138 | - { | |
| 139 | -#if !UNITY_EDITOR | |
| 140 | - _setShouldCollectDeviceName(shouldCollectDeviceName); | |
| 141 | -#endif | |
| 142 | - } | |
| 143 | - | |
| 144 | - /// <summary> | |
| 145 | - /// Set the OneLink ID that should be used for User-Invites. | |
| 146 | - /// The link that is generated for the user invite will use this OneLink as the base link. | |
| 147 | - /// </summary> | |
| 148 | - /// <param name="appInviteOneLinkID">OneLink ID obtained from the AppsFlyer Dashboard.</param> | |
| 149 | - public static void setAppInviteOneLinkID(string appInviteOneLinkID) | |
| 150 | - { | |
| 151 | -#if !UNITY_EDITOR | |
| 152 | - _setAppInviteOneLinkID(appInviteOneLinkID); | |
| 153 | -#endif | |
| 154 | - } | |
| 155 | - | |
| 156 | - /// <summary> | |
| 157 | - /// Anonymize user Data. | |
| 158 | - /// Use this API during the SDK Initialization to explicitly anonymize a user's installs, events and sessions. | |
| 159 | - /// Default is false | |
| 160 | - /// </summary> | |
| 161 | - /// <param name="shouldAnonymizeUser">boolean shouldAnonymizeUser.</param> | |
| 162 | - public static void anonymizeUser(bool shouldAnonymizeUser) | |
| 163 | - { | |
| 164 | -#if !UNITY_EDITOR | |
| 165 | - _anonymizeUser(shouldAnonymizeUser); | |
| 166 | -#endif | |
| 167 | - } | |
| 168 | - | |
| 169 | - /// <summary> | |
| 170 | - /// Opt-out for Apple Search Ads attributions. | |
| 171 | - /// </summary> | |
| 172 | - /// <param name="disableCollectIAd">boolean disableCollectIAd.</param> | |
| 173 | - public static void setDisableCollectIAd(bool disableCollectIAd) | |
| 174 | - { | |
| 175 | -#if !UNITY_EDITOR | |
| 176 | - _setDisableCollectIAd(disableCollectIAd); | |
| 177 | -#endif | |
| 178 | - } | |
| 179 | - | |
| 180 | - /// <summary> | |
| 181 | - /// In app purchase receipt validation Apple environment(production or sandbox). The default value is false. | |
| 182 | - /// </summary> | |
| 183 | - /// <param name="useReceiptValidationSandbox">boolean useReceiptValidationSandbox.</param> | |
| 184 | - public static void setUseReceiptValidationSandbox(bool useReceiptValidationSandbox) | |
| 185 | - { | |
| 186 | -#if !UNITY_EDITOR | |
| 187 | - _setUseReceiptValidationSandbox(useReceiptValidationSandbox); | |
| 188 | -#endif | |
| 189 | - } | |
| 190 | - | |
| 191 | - /// <summary> | |
| 192 | - /// Set this flag to test uninstall on Apple environment(production or sandbox). The default value is false. | |
| 193 | - /// </summary> | |
| 194 | - /// <param name="useUninstallSandbox">boolean useUninstallSandbox.</param> | |
| 195 | - public static void setUseUninstallSandbox(bool useUninstallSandbox) | |
| 196 | - { | |
| 197 | -#if !UNITY_EDITOR | |
| 198 | - _setUseUninstallSandbox(useUninstallSandbox); | |
| 199 | -#endif | |
| 200 | - } | |
| 201 | - | |
| 202 | - /// <summary> | |
| 203 | - /// For advertisers who wrap OneLink within another Universal Link. | |
| 204 | - /// An advertiser will be able to deeplink from a OneLink wrapped within another Universal Link and also record this retargeting conversion. | |
| 205 | - /// </summary> | |
| 206 | - /// <param name="resolveDeepLinkURLs">Array of urls.</param> | |
| 207 | - public static void setResolveDeepLinkURLs(params string[] resolveDeepLinkURLs) | |
| 208 | - { | |
| 209 | -#if !UNITY_EDITOR | |
| 210 | - _setResolveDeepLinkURLs(resolveDeepLinkURLs.Length,resolveDeepLinkURLs); | |
| 211 | -#endif | |
| 212 | - } | |
| 213 | - | |
| 214 | - /// <summary> | |
| 215 | - /// For advertisers who use vanity OneLinks. | |
| 216 | - /// </summary> | |
| 217 | - /// <param name="oneLinkCustomDomains">Array of domains.</param> | |
| 218 | - public static void setOneLinkCustomDomains(params string[] oneLinkCustomDomains) | |
| 219 | - { | |
| 220 | -#if !UNITY_EDITOR | |
| 221 | - _setOneLinkCustomDomains(oneLinkCustomDomains.Length, oneLinkCustomDomains); | |
| 222 | -#endif | |
| 223 | - } | |
| 224 | - | |
| 225 | - /// <summary> | |
| 226 | - /// Set the user emails and encrypt them. | |
| 227 | - /// cryptMethod Encryption method: | |
| 228 | - /// EmailCryptType.EmailCryptTypeMD5 | |
| 229 | - /// EmailCryptType.EmailCryptTypeSHA1 | |
| 230 | - /// EmailCryptType.EmailCryptTypeSHA256 | |
| 231 | - /// EmailCryptType.EmailCryptTypeNone | |
| 232 | - /// </summary> | |
| 233 | - /// <param name="cryptType">type Hash algoritm.</param> | |
| 234 | - /// <param name="length">length of userEmails array.</param> | |
| 235 | - /// <param name="userEmails">userEmails The list of strings that hold mails.</param> | |
| 236 | - public static void setUserEmails(EmailCryptType cryptType, int length, params string[] userEmails) | |
| 237 | - { | |
| 238 | -#if !UNITY_EDITOR | |
| 239 | - _setUserEmails(cryptType, length, userEmails); | |
| 240 | -#endif | |
| 241 | - } | |
| 242 | - | |
| 243 | - /// <summary> | |
| 244 | - /// Set the user phone number. | |
| 245 | - /// </summary> | |
| 246 | - /// <param name="phoneNumber">User phoneNumber.</param> | |
| 247 | - public static void setPhoneNumber(string phoneNumber){ | |
| 248 | -#if !UNITY_EDITOR | |
| 249 | - _setPhoneNumber(phoneNumber); | |
| 250 | -#endif | |
| 251 | - } | |
| 252 | - | |
| 253 | - /// <summary> | |
| 254 | - /// To send and validate in app purchases you can call this method from the processPurchase method. | |
| 255 | - /// </summary> | |
| 256 | - /// <param name="productIdentifier">The product identifier.</param> | |
| 257 | - /// <param name="price">The product price.</param> | |
| 258 | - /// <param name="currency">The product currency.</param> | |
| 259 | - /// <param name="tranactionId">The purchase transaction Id.</param> | |
| 260 | - /// <param name="additionalParameters">The additional param, which you want to receive it in the raw reports.</param> | |
| 261 | - public static void validateAndSendInAppPurchase(string productIdentifier, string price, string currency, string tranactionId, Dictionary<string, string> additionalParameters, MonoBehaviour gameObject) | |
| 262 | - { | |
| 263 | -#if !UNITY_EDITOR | |
| 264 | - _validateAndSendInAppPurchase(productIdentifier, price, currency, tranactionId, AFMiniJSON.Json.Serialize(additionalParameters), gameObject ? gameObject.name : null); | |
| 265 | -#endif | |
| 266 | - } | |
| 267 | - | |
| 268 | - /// <summary> | |
| 269 | - /// To record location for geo-fencing. Does the same as code below. | |
| 270 | - /// </summary> | |
| 271 | - /// <param name="longitude">The location longitude.</param> | |
| 272 | - /// <param name="latitude">The location latitude.</param> | |
| 273 | - public static void recordLocation(double longitude, double latitude) | |
| 274 | - { | |
| 275 | -#if !UNITY_EDITOR | |
| 276 | - _recordLocation(longitude, latitude); | |
| 277 | -#endif | |
| 278 | - } | |
| 279 | - | |
| 280 | - /// <summary> | |
| 281 | - /// Get AppsFlyer's unique device ID, which is created for every new install of an app. | |
| 282 | - /// </summary> | |
| 283 | - public static string getAppsFlyerId() | |
| 284 | - { | |
| 285 | -#if !UNITY_EDITOR | |
| 286 | - return _getAppsFlyerId(); | |
| 287 | -#else | |
| 288 | - return ""; | |
| 289 | -#endif | |
| 290 | - } | |
| 291 | - | |
| 292 | - /// <summary> | |
| 293 | - /// Register uninstall - you should register for remote notification and provide AppsFlyer the push device token. | |
| 294 | - /// </summary> | |
| 295 | - /// <param name="deviceToken">deviceToken The `deviceToken` from `-application:didRegisterForRemoteNotificationsWithDeviceToken:`.</param> | |
| 296 | - public static void registerUninstall(byte[] deviceToken) | |
| 297 | - { | |
| 298 | -#if !UNITY_EDITOR | |
| 299 | - _registerUninstall(deviceToken); | |
| 300 | -#endif | |
| 301 | - } | |
| 302 | - | |
| 303 | - /// <summary> | |
| 304 | - /// Enable AppsFlyer to handle a push notification. | |
| 305 | - /// </summary> | |
| 306 | - /// <param name="pushPayload">pushPayload The `userInfo` from received remote notification. One of root keys should be @"af"..</param> | |
| 307 | - public static void handlePushNotification(Dictionary<string, string> pushPayload) | |
| 308 | - { | |
| 309 | -#if !UNITY_EDITOR | |
| 310 | - _handlePushNotification(AFMiniJSON.Json.Serialize(pushPayload)); | |
| 311 | -#endif | |
| 312 | - } | |
| 313 | - | |
| 314 | - /// <summary> | |
| 315 | - /// Get SDK version. | |
| 316 | - /// </summary> | |
| 317 | - public static string getSDKVersion() | |
| 318 | - { | |
| 319 | -#if !UNITY_EDITOR | |
| 320 | - return _getSDKVersion(); | |
| 321 | -#else | |
| 322 | - return ""; | |
| 323 | -#endif | |
| 324 | - } | |
| 325 | - | |
| 326 | - /// <summary> | |
| 327 | - /// This property accepts a string value representing the host name for all endpoints. | |
| 328 | - /// Can be used to Zero rate your application’s data usage.Contact your CSM for more information. | |
| 329 | - /// </summary> | |
| 330 | - /// <param name="host">Host Name.</param> | |
| 331 | - /// <param name="host">Host prefix.</param> | |
| 332 | - public static void setHost(string host, string hostPrefix) | |
| 333 | - { | |
| 334 | -#if !UNITY_EDITOR | |
| 335 | - _setHost(host, hostPrefix); | |
| 336 | -#endif | |
| 337 | - } | |
| 338 | - | |
| 339 | - /// <summary> | |
| 340 | - /// This property is responsible for timeout between sessions in seconds. | |
| 341 | - /// Default value is 5 seconds. | |
| 342 | - /// </summary> | |
| 343 | - /// <param name="minTimeBetweenSessions">minimum time between 2 separate sessions in seconds.</param> | |
| 344 | - public static void setMinTimeBetweenSessions(int minTimeBetweenSessions) | |
| 345 | - { | |
| 346 | -#if !UNITY_EDITOR | |
| 347 | - _setMinTimeBetweenSessions(minTimeBetweenSessions); | |
| 348 | -#endif | |
| 349 | - } | |
| 350 | - | |
| 351 | - /// <summary> | |
| 352 | - /// Once this API is invoked, our SDK no longer communicates with our servers and stops functioning. | |
| 353 | - /// In some extreme cases you might want to shut down all SDK activity due to legal and privacy compliance. | |
| 354 | - /// This can be achieved with the stopSDK API. | |
| 355 | - /// </summary> | |
| 356 | - /// <param name="isSDKStopped">boolean isSDKStopped.</param> | |
| 357 | - public static void stopSDK(bool isSDKStopped) | |
| 358 | - { | |
| 359 | -#if !UNITY_EDITOR | |
| 360 | - _stopSDK(isSDKStopped); | |
| 361 | -#endif | |
| 362 | - } | |
| 363 | - | |
| 364 | - // <summary> | |
| 365 | - /// Was the stopSDK(boolean) API set to true. | |
| 366 | - /// </summary> | |
| 367 | - /// <returns>boolean isSDKStopped.</returns> | |
| 368 | - public static bool isSDKStopped() | |
| 369 | - { | |
| 370 | -#if !UNITY_EDITOR | |
| 371 | - return _isSDKStopped(); | |
| 372 | -#else | |
| 373 | - return false; | |
| 374 | -#endif | |
| 375 | - } | |
| 376 | - | |
| 377 | - /// <summary> | |
| 378 | - /// In case you want to track deep linking manually call handleOpenUrl. | |
| 379 | - /// The continueUserActivity and onOpenURL are implemented in the AppsFlyerAppController.mm class, so | |
| 380 | - /// only use this method if the other methods do not cover your apps deeplinking needs. | |
| 381 | - /// </summary> | |
| 382 | - /// <param name="url">The URL to be passed to your AppDelegate.</param> | |
| 383 | - /// <param name="sourceApplication">The sourceApplication to be passed to your AppDelegate.</param> | |
| 384 | - /// <param name="annotation">The annotation to be passed to your app delegate.</param> | |
| 385 | - public static void handleOpenUrl(string url, string sourceApplication, string annotation) | |
| 386 | - { | |
| 387 | -#if !UNITY_EDITOR | |
| 388 | - _handleOpenUrl(url, sourceApplication, annotation); | |
| 389 | -#endif | |
| 390 | - } | |
| 391 | - | |
| 392 | - /// <summary> | |
| 393 | - /// Used by advertisers to exclude all networks/integrated partners from getting data. | |
| 394 | - /// </summary> | |
| 395 | - public static void setSharingFilterForAllPartners() | |
| 396 | - { | |
| 397 | -#if !UNITY_EDITOR | |
| 398 | - _setSharingFilterForAllPartners(); | |
| 399 | -#endif | |
| 400 | - } | |
| 401 | - | |
| 402 | - /// <summary> | |
| 403 | - /// Used by advertisers to set some (one or more) networks/integrated partners to exclude from getting data. | |
| 404 | - /// </summary> | |
| 405 | - /// <param name="partners">partners to exclude from getting data</param> | |
| 406 | - public static void setSharingFilter(params string[] partners) | |
| 407 | - { | |
| 408 | -#if !UNITY_EDITOR | |
| 409 | - _setSharingFilter(partners.Length, partners); | |
| 410 | -#endif | |
| 411 | - } | |
| 412 | - | |
| 413 | - /// <summary> | |
| 414 | - /// To record an impression use the following API call. | |
| 415 | - /// Make sure to use the promoted App ID as it appears within the AppsFlyer dashboard. | |
| 416 | - /// </summary> | |
| 417 | - /// <param name="appID">promoted App ID.</param> | |
| 418 | - /// <param name="campaign">cross promotion campaign.</param> | |
| 419 | - /// <param name="parameters">parameters Dictionary.</param> | |
| 420 | - public static void recordCrossPromoteImpression(string appID, string campaign, Dictionary<string, string> parameters) | |
| 421 | - { | |
| 422 | -#if !UNITY_EDITOR | |
| 423 | - _recordCrossPromoteImpression(appID, campaign, AFMiniJSON.Json.Serialize(parameters)); | |
| 424 | -#endif | |
| 425 | - } | |
| 426 | - | |
| 427 | - /// <summary> | |
| 428 | - /// Use the following API to attribute the click and launch the app store's app page. | |
| 429 | - /// </summary> | |
| 430 | - /// <param name="appID">promoted App ID</param> | |
| 431 | - /// <param name="campaign">cross promotion campaign</param> | |
| 432 | - /// <param name="parameters">additional user params</param> | |
| 433 | - public static void attributeAndOpenStore(string appID, string campaign, Dictionary<string, string> parameters, MonoBehaviour gameObject) | |
| 434 | - { | |
| 435 | -#if !UNITY_EDITOR | |
| 436 | - _attributeAndOpenStore(appID, campaign, AFMiniJSON.Json.Serialize(parameters), gameObject ? gameObject.name : null); | |
| 437 | -#endif | |
| 438 | - } | |
| 439 | - | |
| 440 | - /// <summary> | |
| 441 | - /// The LinkGenerator class builds the invite URL according to various setter methods which allow passing on additional information on the click. | |
| 442 | - /// See - https://support.appsflyer.com/hc/en-us/articles/115004480866-User-invite-attribution- | |
| 443 | - /// </summary> | |
| 444 | - /// <param name="parameters">parameters Dictionary.</param> | |
| 445 | - public static void generateUserInviteLink(Dictionary<string, string> parameters, MonoBehaviour gameObject) | |
| 446 | - { | |
| 447 | -#if !UNITY_EDITOR | |
| 448 | - _generateUserInviteLink(AFMiniJSON.Json.Serialize(parameters), gameObject ? gameObject.name : null); | |
| 449 | -#endif | |
| 450 | - } | |
| 451 | - | |
| 452 | - /// <summary> | |
| 453 | - /// It is recommended to generate an in-app event after the invite is sent to record the invites from the senders' perspective. | |
| 454 | - /// This enables you to find the users that tend most to invite friends, and the media sources that get you these users. | |
| 455 | - /// </summary> | |
| 456 | - /// <param name="channel">channel string.</param> | |
| 457 | - /// <param name="parameters">parameters Dictionary..</param> | |
| 458 | - public static void recordInvite(string channel, Dictionary<string, string> parameters) | |
| 459 | - { | |
| 460 | -#if !UNITY_EDITOR | |
| 461 | - _recordInvite(channel, AFMiniJSON.Json.Serialize(parameters)); | |
| 462 | -#endif | |
| 463 | - } | |
| 464 | - | |
| 465 | - | |
| 466 | - /* | |
| 467 | - * AppsFlyer ios method mapping | |
| 468 | - */ | |
| 469 | - | |
| 470 | - [DllImport("__Internal")] | |
| 471 | - private static extern void _startSDK(); | |
| 472 | - | |
| 473 | - [DllImport("__Internal")] | |
| 474 | - private static extern void _getConversionData(string objectName); | |
| 475 | - | |
| 476 | - [DllImport("__Internal")] | |
| 477 | - private static extern void _setCustomerUserID(string customerUserID); | |
| 478 | - | |
| 479 | - [DllImport("__Internal")] | |
| 480 | - private static extern void _setAdditionalData(string customData); | |
| 481 | - | |
| 482 | - [DllImport("__Internal")] | |
| 483 | - private static extern void _setAppsFlyerDevKey(string appsFlyerDevKey); | |
| 484 | - | |
| 485 | - [DllImport("__Internal")] | |
| 486 | - private static extern void _setAppleAppID(string appleAppID); | |
| 487 | - | |
| 488 | - [DllImport("__Internal")] | |
| 489 | - private static extern void _setCurrencyCode(string currencyCode); | |
| 490 | - | |
| 491 | - [DllImport("__Internal")] | |
| 492 | - private static extern void _setDisableCollectAppleAdSupport(bool disableCollectAppleAdSupport); | |
| 493 | - | |
| 494 | - [DllImport("__Internal")] | |
| 495 | - private static extern void _setIsDebug(bool isDebug); | |
| 496 | - | |
| 497 | - [DllImport("__Internal")] | |
| 498 | - private static extern void _setShouldCollectDeviceName(bool shouldCollectDeviceName); | |
| 499 | - | |
| 500 | - [DllImport("__Internal")] | |
| 501 | - private static extern void _setAppInviteOneLinkID(string appInviteOneLinkID); | |
| 502 | - | |
| 503 | - [DllImport("__Internal")] | |
| 504 | - private static extern void _anonymizeUser(bool shouldAnonymizeUser); | |
| 505 | - | |
| 506 | - [DllImport("__Internal")] | |
| 507 | - private static extern void _setDisableCollectIAd(bool disableCollectIAd); | |
| 508 | - | |
| 509 | - [DllImport("__Internal")] | |
| 510 | - private static extern void _setUseReceiptValidationSandbox(bool useReceiptValidationSandbox); | |
| 511 | - | |
| 512 | - [DllImport("__Internal")] | |
| 513 | - private static extern void _setUseUninstallSandbox(bool useUninstallSandbox); | |
| 514 | - | |
| 515 | - [DllImport("__Internal")] | |
| 516 | - private static extern void _setResolveDeepLinkURLs(int length, params string[] resolveDeepLinkURLs); | |
| 517 | - | |
| 518 | - [DllImport("__Internal")] | |
| 519 | - private static extern void _setOneLinkCustomDomains(int length, params string[] oneLinkCustomDomains); | |
| 520 | - | |
| 521 | - [DllImport("__Internal")] | |
| 522 | - private static extern void _setUserEmails(EmailCryptType cryptType, int length, params string[] userEmails); | |
| 523 | - | |
| 524 | - [DllImport("__Internal")] | |
| 525 | - private static extern void _setPhoneNumber(string phoneNumber); | |
| 526 | - | |
| 527 | - [DllImport("__Internal")] | |
| 528 | - private static extern void _afSendEvent(string eventName, string eventValues); | |
| 529 | - | |
| 530 | - [DllImport("__Internal")] | |
| 531 | - private static extern void _validateAndSendInAppPurchase(string productIdentifier, string price, string currency, string tranactionId, string additionalParameters, string objectName); | |
| 532 | - | |
| 533 | - [DllImport("__Internal")] | |
| 534 | - private static extern void _recordLocation(double longitude, double latitude); | |
| 535 | - | |
| 536 | - [DllImport("__Internal")] | |
| 537 | - private static extern string _getAppsFlyerId(); | |
| 538 | - | |
| 539 | - [DllImport("__Internal")] | |
| 540 | - private static extern void _registerUninstall(byte[] deviceToken); | |
| 541 | - | |
| 542 | - [DllImport("__Internal")] | |
| 543 | - private static extern void _handlePushNotification(string pushPayload); | |
| 544 | - | |
| 545 | - [DllImport("__Internal")] | |
| 546 | - private static extern string _getSDKVersion(); | |
| 547 | - | |
| 548 | - [DllImport("__Internal")] | |
| 549 | - private static extern void _setHost(string host, string hostPrefix); | |
| 550 | - | |
| 551 | - [DllImport("__Internal")] | |
| 552 | - private static extern void _setMinTimeBetweenSessions(int minTimeBetweenSessions); | |
| 553 | - | |
| 554 | - [DllImport("__Internal")] | |
| 555 | - private static extern void _stopSDK(bool isStopSDK); | |
| 556 | - | |
| 557 | - [DllImport("__Internal")] | |
| 558 | - private static extern bool _isSDKStopped(); | |
| 559 | - | |
| 560 | - [DllImport("__Internal")] | |
| 561 | - private static extern void _handleOpenUrl(string url, string sourceApplication, string annotation); | |
| 562 | - | |
| 563 | - [DllImport("__Internal")] | |
| 564 | - private static extern void _setSharingFilterForAllPartners(); | |
| 565 | - | |
| 566 | - [DllImport("__Internal")] | |
| 567 | - private static extern void _setSharingFilter(int length, params string[] partners); | |
| 568 | - | |
| 569 | - [DllImport("__Internal")] | |
| 570 | - private static extern void _recordCrossPromoteImpression(string appID, string campaign, string parameters); | |
| 571 | - | |
| 572 | - [DllImport("__Internal")] | |
| 573 | - private static extern void _attributeAndOpenStore(string appID, string campaign, string parameters, string gameObject); | |
| 574 | - | |
| 575 | - [DllImport("__Internal")] | |
| 576 | - private static extern void _generateUserInviteLink(string parameters, string gameObject); | |
| 577 | - | |
| 578 | - [DllImport("__Internal")] | |
| 579 | - private static extern void _recordInvite(string channel, string parameters); | |
| 580 | - | |
| 581 | - } | |
| 582 | - | |
| 583 | -#endif | |
| 584 | - | |
| 585 | - | |
| 586 | -} |
Runtime/AppsFlyeriOS.cs.meta
Runtime/IAppsFlyerConversionData.cs
| 1 | -namespace AppsFlyerSDK | |
| 2 | -{ | |
| 3 | - public interface IAppsFlyerConversionData | |
| 4 | - { | |
| 5 | - /// <summary> | |
| 6 | - /// `conversionData` contains information about install. Organic/non-organic, etc. | |
| 7 | - /// <see>https://support.appsflyer.com/hc/en-us/articles/360000726098-Conversion-Data-Scenarios#Introduction</see> | |
| 8 | - /// </summary> | |
| 9 | - /// <param name="conversionData">JSON string of the returned conversion data.</param> | |
| 10 | - void onConversionDataSuccess(string conversionData); | |
| 11 | - | |
| 12 | - /// <summary> | |
| 13 | - /// Any errors that occurred during the conversion request. | |
| 14 | - /// </summary> | |
| 15 | - /// <param name="error">A string describing the error.</param> | |
| 16 | - void onConversionDataFail(string error); | |
| 17 | - | |
| 18 | - /// <summary> | |
| 19 | - /// `attributionData` contains information about OneLink, deeplink. | |
| 20 | - /// <see>https://support.appsflyer.com/hc/en-us/articles/208874366-OneLink-Deep-Linking-Guide#Intro</see> | |
| 21 | - /// </summary> | |
| 22 | - /// <param name="attributionData">JSON string of the returned deeplink data.</param> | |
| 23 | - void onAppOpenAttribution(string attributionData); | |
| 24 | - | |
| 25 | - /// <summary> | |
| 26 | - /// Any errors that occurred during the attribution request. | |
| 27 | - /// </summary> | |
| 28 | - /// <param name="error">A string describing the error.</param> | |
| 29 | - void onAppOpenAttributionFailure(string error); | |
| 30 | - } | |
| 31 | -} |
Runtime/IAppsFlyerConversionData.cs.meta
Runtime/IAppsFlyerUserInvite.cs
| 1 | -namespace AppsFlyerSDK | |
| 2 | -{ | |
| 3 | - public interface IAppsFlyerUserInvite | |
| 4 | - { | |
| 5 | - /// <summary> | |
| 6 | - /// The success callback for generating OneLink URLs. | |
| 7 | - /// </summary> | |
| 8 | - /// <param name="link">A string of the newly created url.</param> | |
| 9 | - void onInviteLinkGenerated(string link); | |
| 10 | - | |
| 11 | - /// <summary> | |
| 12 | - /// The error callback for generating OneLink URLs | |
| 13 | - /// </summary> | |
| 14 | - /// <param name="error">A string describing the error.</param> | |
| 15 | - void onInviteLinkGeneratedFailure(string error); | |
| 16 | - | |
| 17 | - /// <summary> | |
| 18 | - /// (ios only) iOS allows you to utilize the StoreKit component to open | |
| 19 | - /// the App Store while remaining in the context of your app. | |
| 20 | - /// More details at <see>https://support.appsflyer.com/hc/en-us/articles/115004481946-Cross-Promotion-Tracking#tracking-cross-promotion-impressions</see> | |
| 21 | - /// </summary> | |
| 22 | - /// <param name="link">openStore callback Contains promoted `clickURL`</param> | |
| 23 | - void onOpenStoreLinkGenerated(string link); | |
| 24 | - | |
| 25 | - } | |
| 26 | -} |
Runtime/IAppsFlyerUserInvite.cs.meta
Runtime/IAppsFlyerValidateReceipt.cs
| 1 | -namespace AppsFlyerSDK | |
| 2 | -{ | |
| 3 | - public interface IAppsFlyerValidateReceipt | |
| 4 | - { | |
| 5 | - /// <summary> | |
| 6 | - /// The success callback for validateAndSendInAppPurchase API. | |
| 7 | - /// For Android : the callback will return "Validate success". | |
| 8 | - /// For iOS : the callback will return a JSON string from apples verifyReceipt API. | |
| 9 | - /// </summary> | |
| 10 | - /// <param name="result"></param> | |
| 11 | - void didFinishValidateReceipt(string result); | |
| 12 | - | |
| 13 | - /// <summary> | |
| 14 | - /// The error callback for validateAndSendInAppPurchase API. | |
| 15 | - /// </summary> | |
| 16 | - /// <param name="error">A string describing the error.</param> | |
| 17 | - void didFinishValidateReceiptWithError(string error); | |
| 18 | - } | |
| 19 | -} |
Runtime/IAppsFlyerValidateReceipt.cs.meta
Runtime/Unity.AppsFlyer.asmdef
Runtime/Unity.AppsFlyer.asmdef.meta
package.json