+^I!&5O5Ug4InDyE@L+R)=ElIA(-UC0(tMjdM2M$i~7aUZoU(~B+
zTM#QLONisOs(4t`K+Nh*1dUjf<=HonJ!|kAfwKq%KDL(=Y{)q)v*@6{!XJ0D0fAoXs
zY5F@owT0C5jM?(jgksGUnK@9w#$?>ubHn;Dl&y_q$tr6ltY295-uF(ocIf<
zIQT3M)pCoCtt^t&mMC2}1H)PMa9yX1#37D0)zQ=cGQ0m6W1G^0g;J#kZqew*eGBR@
zv)mibid^12(N=p}SpWUek8mY9Tz$Uv<(E~hG0``rK0P+b=Kz@3?aVAW
zOCA4R)P>vN*~pn^oGyuGrbaTmVSaQj{!d#w1TeF|HcV2H!p+@=80-)lmW?{ZN$U{}
zoA0WOD80Ab{$5fKES+eE_l^;k4V-BeUVCA_MZ$V`UbnsJllYLdvimArIpQ}K;l+bg
zDLj{Q225z7#vasnWN~WFf#Ik@{qyl{-Q?M|`4_9sZP#~rHCUc>i!CXqMs~W)SR&;X
z+DE_lL?gtLw%4LZT++>|xL~s<41zN{rmYQ#Se`(gBSxy-njM%gE%skWZ`!tD69#7W
zn6>!_svNZsE!~!H9=C*1DkAX?+a+Q1kW?iGN8X}IdDdHL3CdLXk*^q;VJT^jP}sPP<&KR8cPV+>$Zeh^e5%)MV#VO@T!
z>K*%Sw4vdWxdEqI)BD(?>Geliah`zHn}=kD<+(1f#yq1YtbfY|e15=E(h+;3R}8O;
zEj9l!Xc`5dadCUxpIiVo5tnH4z{Uw$_tYRVbjCifau8RTTimTPO0(Wu^X+dC!?r)4
zt}S2FBGIaG5BMMsmGc2DAtmIs1+gTI2;sWyB%YOHy{X%4z6nC7c2$_p=l#T8d4EYH
z*+cGT(n;hl0fkG$RkFm8OOvYMg;uH=XvOPCz8yb7E&-XVfU!oyUSuL4lBUBcwsTvl_XL_4Z#Vf6a`?hJ$kwH5~EY)8yP8NwY=R>uP?XSF8vF?N;P`j;k
z;`XpAw4-oMER7g;Bl?
zkZbyfMtGM?ybS}5XIQ+@Fg&29^7%F?FF%pT#(>tD{i2x|(e$JSiB56cSUL0*^L_dG
zbqnXj`3#zFQD{97zZE#lyzbH87y6bDZK$J*OtTm}?w}b&WA`YIs2{iry7>}_{K(Q1
zWTzyeJuYb0Bcj}>p}C;vPrud_CRcj)M{uc9U_G$xBAE`iw{$vuv?=Xw3Gc>r-AeDo
z=~Uem`)kiTCxs?=qV$vWl&$Ba_Se7Dr01(?S|_mwtEUmxQnjaV>!?Plo!~Lc6Lo^p
zJ;TSpPl6WHnp*PWFNApRmJnaL7Em2cL#@*-6$==q@iDIGPRtM=r!M;$%^Ic9(L-PX
z?R==qzK;+?{(f8hm1Y%Kf+rMOt5#(z`xW?EqSrBY+`;vltOj5iGbbENr{KkvD5=G*
zt7iN3-TI+-MN2!*ayCd|U|SfNJbO9C$YP+UP+%Pdb?u>JR
zov>$R%;!aLvxWAg$~5*o86|PCMt%!1RcExg{Y-5+Ve$T3{AY+;0frpED~%9vUu$F;
z?8bCbNohSXi0{7fO;2Vl&5wN6V>O)Bkw@^t?+sW)@1@RL%v1PIHM;UF2Dpm?Xd~so
z@T8#6>Qpsf0Hoi%DBY|io_#W29gm<7E35uIDA9gqRiulc7BAs&Hr=#%pDFq06ONN4
zBN3Tph@uXzYoU{tJv(*L?nb*nyw=u{sI%#yX)YnHI?}gsB(+i>?830>c&=vTM9Xlr
zNH>TkG(AR?6{fJCe!LH+VH$a;^)oRw
zka1DkAai96!+QIHN_nX&gEQqcZAZR9k^>L9k8!CYy`1-95{5Zi&0=%>?9WpM$oU1W
zm=+i^?D%|7?3ZEYD<7)UsgGWoG4kU@#G}$b(+O?=d#5LtdAv7*D_RbrAuMhCe)5Or
z)AY7=i`Y03p)dQl$T0oR6kL(%-(|8#E^5#Az`DZoKef8Hs~T87ki-!fS1EVC|B0MR
z-x8fk{dA0{xXP*A-9kEL5_t#Q81{8s>+HzcY-AGWo!+sHQS#h!mPbVA@%ur`qLE7W
zp>i3vHD~Zz-xKC6V2jKFuf8G9JCXU%l19*o`Awz$Od40ZcJq=^q>9UpqPJ(AjynDa
zx<7i}0$o<8U%JD10X=8LKq#Y;3KuQZZeu{LC*w
zOj9tGye}`em_~-3r)DFN1Gv8>Nv2gh4YHM()V((FQ*(B~
zC%&_h>(fqYgYR)}&`CZ>Sj(KVdYJm+L?>5y!{D?PvhkFn!ZZ`
z*%5yZ|HT1k)d!m*QbR|q@AQR`l$5Jj^kv}4A7S*F{VZacoi0*4WCu9mn2}FiH!MFb
zSxR&d^17{eaLskm4~|SZQc`4!Y3jHgD>Iuw=1$ybV*N8C4DOSVNWpzwMNJ^C(bHZ#
zyoShf6`tA4(bHeIl(H3MlNQ*X+`J5Pju06ND9aVL*j>LK#VKwrqt(A
zyt=8s*y4QAZKY^+xVm$*siUuO}MSB@C*1`ZUOSIZ1-C(pUOi9&U^g|0Ew9GWxo
z56(59D$^&Ae8Uvic`p_KsLB!
z@@x0PXj0B
zhYJIrrto!8?MD$WTD$l-Ge&B}JW_%$2>%JoVBg-JwT0}Oc{&9;f}a1_lQuw??NzC3
zt{4&xJyrdhLzj6fdIN(qe!cPpCLJ+#4yK6jr`SFYe)u!B{b-MW6l{ax
zO3iBlY=>4y4epE?Bjqj>3=+O0(qvI6krCqR!<51z0>2=JnOm2HCtO53#!@C}WWxo-
z0lJq6VR!p~K}AyWNDq{s(K_|5;k4IL`g48L(#M;~^`PVdwKL^6L$!80pURYZT6i0KDnST$a7kLU)wUjd!3n6dfkaqpki?jUIPBeuK
zJ~-p5qNn?&Htr#%9bVZ+7UN+|NS~uOiVNfm{b;x`p#bv4`6RKSD4&=SA72J{lQQ
zw{eZn!i}q<_CDmf@n{vuQLK?16`g^>Jyk0Vihb-{M}j_WbiKOf@pd&m{d7yAR~jl@(*1ZeXji`2_KsDT
z`DyJ2avVE{N@HJx0$ZKk17nBm*H)k}j~e&=ce}hR3DHiI=%qOU1>~{EG!g{y0Pt-;
zeL$lgXVh6JJRJ?^Zl-XFZkMx`tFLW8EqGV3^jBcn)!45vx0H0-T6}o^(x|}irzT=3
zGLgnX@re;RrC*czksJVA1RSrZVV?z%XQfj=$68CDQ%l*P-adNz{6Aq#=jlla6kkm^
zT$;=!Jmzbjy7XV*GM29=oq^5GB}_8-G4Tf&x|ASy9QXJs8#L{@@)VaW&9zXY;do9Q
zfXe?xBK8#6Y0jT}niJ~7{_}DD;3pX_L)B1FiXS&V+SJTpHXW>0{iwV9&Bm{Y>OsDL
z(jj7{P4;Hi?Ejj2T|&RpMj{}#&g0%Ola6bATI3IzV2-inltDwo9X2+MuG
zwU({tYfC#S=4VI_yOgHV82mV?S{P2iEKCCk6!UUZFWRAeQmh-dqP-)R?WaCJ37<{A
z*u{(Y#S<9V;(yptD37&AT(BP@_yxc@a9!+QWLZB`WJ{H-G1D_JUYM%eh8EFs
z=-wK(r}j3{hLu5V2^6z3f^^Qt=a~oHxL_W4a9k1P
zUoI!xn;p5G6&2&iGA#$6TK=BvK-??=ox*E7;2@_{Bp)uErqiONnSeM?3Htf=xU^LD
zA79azH9^!O##&COav&xHm{zF3iMQ7!BF25~!?vPw)m1MR2I`BdrT
zuYJwQKS>@CW3OveUtS3flm(LiJ2!jP{6ggW3~_aBn@~p6qL)i&sULT|6Ey|DuT2pP
zB>6sNLhr~dEG#~n(s2GuYJ@&BGMoQ(Z2pRA%D>9*&KuO`&Xhxb4BOM$xj!PZ@j~YE
z)*k(GKX~WYyjddkA;}ELm36RYaFH{cE>#8gdu{XlC;YiZm)}l+5)t`_9|;~}8iW5B
zbRR#7DBxjat!3KYT-2+FPA~e>NZ-b0%;dZC_{V212#viIMu?RsizZAQed;fcz~dl3aw|@E
z*4g4WaCo@}!#&red7UX(j7MA*w>-z*`ERncjrE;Nz&j|vE&8CZPNwO&8uw54bj7F1
zmOtKwf)Ij9)Qz6L<(Ux57j8!lUsay*Vf=vqy2%)B0VXF5@AC+*l?_8(mOwEN42=z&
zd%D4yh)?LfD71+)LZfdR=2j#OTdbAY)u6bs3a~GefH;N5+(YDtYG
z()P4DBbA_sC#iL&YlpOQnLJ^Ab>ax|NHLqeT#;I6^>UBtq$c_?R$~xJg7Ak`b*KUK
z?(k}teem1ylP*EXadz^IykEJ{c_q*&>Ut3k68uX!>iJRj)_m%=edW2!LFe=X@(kyX-JZiEhs~YW
z3*&Sf8sQuL-+6g5O@9Xa%a5r|Y+l<7F?0%t$46_!Gve?+qgk`DC
z_)n*CO${+DSjm|fN7R~9TVsT}3(NX)ku%4$bujh>5xV7_W=aVya0xQ3up|^Y%`W!v
zjhs4@azpBV=M2o5LNE9ZdD^w`2u^Q5Gga#-GB1d;E9YD3o-|bX3i5U5WZ6+C^B6^|
zc0-gPRobuXLt4TOv0dU7dl-`j
z)Y-1e;gQ5XYDYb_j=oQ`sq^W~P4cUD18)#44HN~C%qEg2nLtC&-Z<3hMPUdkk+@j#B7c-3QX&>Xm{xhoA?J|oD7Se1L#8pYaYqR^tv=Q{h<;mbl
z?{1hE#wjRU&xJ&_X=Bg?W!bI5mA+e%V_pkR!f-+JF(j!LijIRDz4D6)%uoJ!li@Lku=Dsel
z89v~u3GaIwhDv=f;q=+j-sy9BUoPyOkta`pI$!9&IfVESGOww7e_I*xI2TuFhE)%AiUq?67{T
z;FTSl$=*0gZY%Eg?k7KaUwC(+Sc`re
z@2k`S2bt_Z!u3e1il;O5g0nRiNCq{siQ(t`e!i(oF+c|Y>RM%RUJF2soa_-~P-`pk
z^)Ds%k9Xne$)0ovt|ET+j{|uYks7a*NxN|FAaU+Se;Un-v@c4&E{vw8=r-2q
zV+euhU}-xty@#F*F)J@#J%p~-I%vlXXgm7-%G|-JeRZp2Q9%~IadvVG#_RuNT{$lP
z2<|aA$@$S6emQ{%oab=o2(>;6wbs6QrIWKV-v3#@f9YbL&{*#8LT@8B3j@om4(ovG
zOP8g-X$JNb1e_DYa$J`6^29^b%Og-NX26wZ2A3&bK~G67i?!RwWthn<0sJdX`DNw0
zuaugkvTYcu-adVeNwRXWWH+O4UWNAC^f#x@#@A~W4GtS9Ixp7ZtgogJxwc`%5UyX0
zmVx+@pxs1*Cg<=^69s^gTUVKzm-*(!-tWu`jU+_C4Swsg?v<>(ydCtLcYK%VI_DmQ
zA>&w5A`+6PEbo)^zgg~`VN{;xRW4+7)z2!2q%RJm-MqC@;;68AA3nEdkw-b1-7|F1hdb_056t4SR67@KnKm(Vl$}P~
zcIkOjG1sJFs7LSF38w>5co*x(4On@C9yhwi{Y=dH;158~e2mnfR|~28`C1MOjBs2V
zys%P&ri^3>ko-)0sQ1F0S}c`;oEXbjaMviVNeu9{8C3PC>Q1YT(D1Y0=&*fKh96|I
zmpM6px_t}aIIu`qEhxzfEq^pEHP`=al6UbHo80zrCpDV*d3<>3
za~ghux$eQOvHZlR
z)1r!n-2F3|UmH=_=vMuhGcB_`-7BP%CT!cTfg%w$E;`khx*pTA7=3a@S?+yB&zx~0
z;ujdLFY%qO>t;W}ZK9NXLY3ya-I|DgH8yFt@*JEv-+-C?q7&tuif
zJ`jFGDezIW8yQ^&aJ6>&0JF%Tn>LUk3d!5|V(zii5oDcW40OAzO6U%J?L;bZhv>V?!2|A%~g9ie!MDQ8%
z|DU)%Zua6V{Uv2VCkjDBOCjC@
zc~by~Do9}=5F>NX*Om<=&^qpP=-%_Tj96hP&_p`BJfPltKGinZ`zUU7qm`=+1`5FY`h~nE)0;BK9H#CNx7HgQjz1LhS3}uTn
zDALFmru@AvIRx;+^kJxV&Y`q`zRF#mtQYTU4JC~4s}%}~Eykh^Wy??0eJeTkxLzqc
zr*!q#3yIY(Lw2g=3?PvFy?WYLW0Y+CufSRm8C;(1cDkROO1p+HA|9@FXg?u8>i}k?V1pK`K0Itjmi9|Al
z#+IcTW|}Z=y;-0*g!d7A#bo;AlW+Ybp9CO=G7Kf7d-Kg|P{aeWlUXNU!5FDCL)TUP;I2VVnaFCvfMD*!BxVT_kiyXMZACQxvr
z8`5W8gRmzDPzM5OQGwy)I{?pYbCMz>Jt@exUlK?GQ2L}`_#~l_Z*2D(;1JI+)K_&_
zX;KlR|7{UhJz!l8BV?-cY#t>Qg#v(2_XsYe<$X9bu9?pd00szorIZu`J`A|c|NoYf
zGeM@TfvN*lJ@$nE_xFAQnJPB7OzBd?1?q$Dq2QD|IV~5d?_TVe0Jx@x88YQ&Zq=E7Z(q~}!!Hmdz
z^?Tb$>A>(Ovv1Rya_-&p`AHnA-kIRLAR8cUlo_HZj|p0&)bo{2^ov!O2C5$zwGHEM
Zqz@UJ#ov8pVgr-_sVHd3m&v{h{U4`cTj~G+
literal 0
HcmV?d00001
diff --git a/Editor/logo.png.meta b/Editor/logo.png.meta
new file mode 100644
index 0000000..dff741e
--- /dev/null
+++ b/Editor/logo.png.meta
@@ -0,0 +1,90 @@
+fileFormatVersion: 2
+guid: 473067080fc4c40af95704043da99f96
+TextureImporter:
+ internalIDToNameTable: []
+ externalObjects: {}
+ serializedVersion: 10
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 1
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: -1
+ aniso: -1
+ mipBias: -100
+ wrapU: -1
+ wrapV: -1
+ wrapW: -1
+ nPOTScale: 1
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 0
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spritePixelsToUnits: 100
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 0
+ spriteTessellationDetail: -1
+ textureType: 0
+ textureShape: 1
+ singleChannelComponent: 0
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ platformSettings:
+ - serializedVersion: 2
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ androidETC2FallbackOverride: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites: []
+ outline: []
+ physicsShape: []
+ bones: []
+ spriteID:
+ internalID: 0
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ spritePackingTag:
+ pSDRemoveMatte: 0
+ pSDShowRemoveMatteOption: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/LICENSE.md b/LICENSE.md
new file mode 100644
index 0000000..58d6be4
--- /dev/null
+++ b/LICENSE.md
@@ -0,0 +1,2 @@
+# WTFPL
+Do whatever the fuck you want with this
\ No newline at end of file
diff --git a/LICENSE.md.meta b/LICENSE.md.meta
new file mode 100644
index 0000000..a7d9402
--- /dev/null
+++ b/LICENSE.md.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: d549868ce7709584c862065ae73f29cd
+TextScriptImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Plugins.meta b/Plugins.meta
new file mode 100644
index 0000000..be984c0
--- /dev/null
+++ b/Plugins.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 0518f4b43994d374aaa3e77220a77f58
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Plugins/iOS.meta b/Plugins/iOS.meta
new file mode 100644
index 0000000..792ac5a
--- /dev/null
+++ b/Plugins/iOS.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 0f28460dd63504fd788e321ebe417c9e
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Plugins/iOS/AFUnityUtils.mm b/Plugins/iOS/AFUnityUtils.mm
new file mode 100644
index 0000000..6ca9c96
--- /dev/null
+++ b/Plugins/iOS/AFUnityUtils.mm
@@ -0,0 +1,100 @@
+//
+// AFUnityUtils.mm
+// Unity-iPhone
+//
+// Created by Jonathan Wesfield on 24/07/2019.
+//
+
+#if __has_include()
+#import
+#else
+#import "AppsFlyerTracker.h"
+#endif
+
+
+static NSString* stringFromChar(const char *str) {
+ return str ? [NSString stringWithUTF8String:str] : nil;
+}
+
+static NSDictionary* dictionaryFromJson(const char *jsonString) {
+ if(jsonString){
+ NSData *jsonData = [[NSData alloc] initWithBytes:jsonString length:strlen(jsonString)];
+ NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:jsonData options:kNilOptions error:nil];
+ return dictionary;
+ }
+
+ return nil;
+}
+
+static const char* stringFromdictionary(NSDictionary* dictionary) {
+ if(dictionary){
+ NSError * err;
+ NSData * jsonData = [NSJSONSerialization dataWithJSONObject:dictionary options:0 error:&err];
+ NSString * myString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
+ return [myString UTF8String];
+ }
+
+ return nil;
+}
+
+
+static NSArray *NSArrayFromCArray(int length, const char **arr) {
+ NSMutableArray *res = [[NSMutableArray alloc] init];
+ for(int i = 0; i < length; i++) {
+ if (arr[i]) {
+ [res addObject:[NSString stringWithUTF8String:arr[i]]];
+ }
+ }
+
+ return res;
+}
+
+static char* getCString(const char* string){
+ if (string == NULL){
+ return NULL;
+ }
+
+ char* res = (char*)malloc(strlen(string) + 1);
+ strcpy(res, string);
+
+ return res;
+}
+
+static AppsFlyerLinkGenerator* generatorFromDictionary(NSDictionary* dictionary, AppsFlyerLinkGenerator* generator) {
+
+ NSArray* generatorKeys = @[@"channel", @"customerID", @"campaign", @"referrerName", @"referrerImageUrl", @"deeplinkPath", @"baseDeeplink", @"brandDomain"];
+
+ NSMutableDictionary* mutableDictionary = [dictionary mutableCopy];
+
+ [generator setChannel:[dictionary objectForKey: @"channel"]];
+ [generator setReferrerCustomerId:[dictionary objectForKey: @"customerID"]];
+ [generator setCampaign:[dictionary objectForKey: @"campaign"]];
+ [generator setReferrerName:[dictionary objectForKey: @"referrerName"]];
+ [generator setReferrerImageURL:[dictionary objectForKey: @"referrerImageUrl"]];
+ [generator setDeeplinkPath:[dictionary objectForKey: @"deeplinkPath"]];
+ [generator setBaseDeeplink:[dictionary objectForKey: @"baseDeeplink"]];
+ [generator setBrandDomain:[dictionary objectForKey: @"brandDomain"]];
+
+
+ [mutableDictionary removeObjectsForKeys:generatorKeys];
+
+ [generator addParameters:mutableDictionary];
+
+ return generator;
+}
+
+static EmailCryptType emailCryptTypeFromInt(int emailCryptTypeInt){
+
+ EmailCryptType emailCryptType;
+ switch (emailCryptTypeInt){
+ case 1:
+ emailCryptType = EmailCryptTypeSHA256;
+ break;
+ default:
+ emailCryptType = EmailCryptTypeNone;
+ break;
+ }
+
+ return emailCryptType;
+}
+
diff --git a/Plugins/iOS/AFUnityUtils.mm.meta b/Plugins/iOS/AFUnityUtils.mm.meta
new file mode 100644
index 0000000..14b3343
--- /dev/null
+++ b/Plugins/iOS/AFUnityUtils.mm.meta
@@ -0,0 +1,37 @@
+fileFormatVersion: 2
+guid: af70a8605208f4a56bea5aecf826811d
+PluginImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ iconMap: {}
+ executionOrder: {}
+ defineConstraints: []
+ isPreloaded: 0
+ isOverridable: 0
+ isExplicitlyReferenced: 0
+ validateReferences: 1
+ platformData:
+ - first:
+ Any:
+ second:
+ enabled: 0
+ settings: {}
+ - first:
+ Editor: Editor
+ second:
+ enabled: 0
+ settings:
+ DefaultValueInitialized: true
+ - first:
+ iPhone: iOS
+ second:
+ enabled: 1
+ settings: {}
+ - first:
+ tvOS: tvOS
+ second:
+ enabled: 1
+ settings: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Plugins/iOS/AppsFlyer+AppController.m b/Plugins/iOS/AppsFlyer+AppController.m
new file mode 100644
index 0000000..a8471c8
--- /dev/null
+++ b/Plugins/iOS/AppsFlyer+AppController.m
@@ -0,0 +1,140 @@
+//
+// AppsFlyer+AppController.m
+// Unity-iPhone
+//
+// Created by Jonathan Wesfield on 24/07/2019.
+//
+
+#import
+#import "UnityAppController.h"
+#if __has_include()
+#import
+#else
+#import "AppsFlyerTracker.h"
+#endif
+
+
+@implementation UnityAppController (AppsFlyerSwizzledAppController)
+
+static BOOL didEnteredBackGround __unused;
+static IMP __original_applicationDidBecomeActive_Imp __unused;
+static IMP __original_applicationDidEnterBackground_Imp __unused;
+static IMP __original_didReceiveRemoteNotification_Imp __unused;
+static IMP __original_continueUserActivity_Imp __unused;
+static IMP __original_openUrl_Imp __unused;
+
+
++ (void)load {
+ static dispatch_once_t onceToken;
+ dispatch_once(&onceToken, ^{
+
+ /**
+ Method method1 = class_getInstanceMethod([self class], @selector(applicationDidBecomeActive:));
+ __original_applicationDidBecomeActive_Imp = method_setImplementation(method1, (IMP)__swizzled_applicationDidBecomeActive);
+ */
+
+ /**
+ Method method2 = class_getInstanceMethod([self class], @selector(applicationDidEnterBackground:));
+ __original_applicationDidEnterBackground_Imp = method_setImplementation(method2, (IMP)__swizzled_applicationDidEnterBackground);
+ */
+
+ /**
+ Method method3 = class_getInstanceMethod([self class], @selector(didReceiveRemoteNotification:));
+ __original_didReceiveRemoteNotification_Imp = method_setImplementation(method3, (IMP)__swizzled_didReceiveRemoteNotification);
+ */
+
+ /**
+ Method method4 = class_getInstanceMethod([self class], @selector(application:openURL:options:));
+ __original_openUrl_Imp = method_setImplementation(method4, (IMP)__swizzled_openURL);
+ */
+
+ /**
+ [self swizzleContinueUserActivity:[self class]];
+ */
+
+ });
+}
+
+/**
++(void)swizzleContinueUserActivity:(Class)class {
+
+ SEL originalSelector = @selector(application:continueUserActivity:restorationHandler:);
+
+ Method defaultMethod = class_getInstanceMethod(class, originalSelector);
+ Method swizzledMethod = class_getInstanceMethod(class, @selector(__swizzled_continueUserActivity));
+
+ BOOL isMethodExists = !class_addMethod(class, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod));
+
+ if (isMethodExists) {
+ __original_continueUserActivity_Imp = method_setImplementation(defaultMethod, (IMP)__swizzled_continueUserActivity);
+ } else {
+ class_replaceMethod(class, originalSelector, (IMP)__swizzled_continueUserActivity, method_getTypeEncoding(swizzledMethod));
+ }
+}
+
+ BOOL __swizzled_continueUserActivity(id self, SEL _cmd, UIApplication* application, NSUserActivity* userActivity, void (^restorationHandler)(NSArray*)) {
+ NSLog(@"swizzled continueUserActivity");
+ [[AppsFlyerTracker sharedTracker] continueUserActivity:userActivity restorationHandler:restorationHandler];
+
+ if(__original_continueUserActivity_Imp){
+ return ((BOOL(*)(id, SEL, UIApplication*, NSUserActivity*))__original_continueUserActivity_Imp)(self, _cmd, application, userActivity);
+ }
+
+ return YES;
+ }
+
+*/
+
+/**
+void __swizzled_applicationDidBecomeActive(id self, SEL _cmd, UIApplication* launchOptions) {
+ NSLog(@"swizzled applicationDidBecomeActive");
+
+ if(didEnteredBackGround){
+ [[AppsFlyerTracker sharedTracker] trackAppLaunch];
+ }
+
+ if(__original_applicationDidBecomeActive_Imp){
+ ((void(*)(id,SEL, UIApplication*))__original_applicationDidBecomeActive_Imp)(self, _cmd, launchOptions);
+ }
+}
+ */
+
+/**
+void __swizzled_applicationDidEnterBackground(id self, SEL _cmd, UIApplication* application) {
+ NSLog(@"swizzled applicationDidEnterBackground");
+ didEnteredBackGround = YES;
+ if(__original_applicationDidEnterBackground_Imp){
+ ((void(*)(id,SEL, UIApplication*))__original_applicationDidEnterBackground_Imp)(self, _cmd, application);
+ }
+}
+ */
+
+/**
+BOOL __swizzled_didReceiveRemoteNotification(id self, SEL _cmd, UIApplication* application, NSDictionary* userInfo,void (^UIBackgroundFetchResult)(void) ) {
+ NSLog(@"swizzled didReceiveRemoteNotification");
+
+ [[AppsFlyerTracker sharedTracker] handlePushNotification:userInfo];
+
+ if(__original_didReceiveRemoteNotification_Imp){
+ return ((BOOL(*)(id, SEL, UIApplication*, NSDictionary*, (UIBackgroundFetchResult)))__original_didReceiveRemoteNotification_Imp)(self, _cmd, application, userInfo, nil);
+ }
+ return YES;
+}
+ */
+
+/**
+BOOL __swizzled_openURL(id self, SEL _cmd, UIApplication* application, NSURL* url, NSDictionary * options) {
+ NSLog(@"swizzled openURL");
+ [[AppsFlyerTracker sharedTracker] handleOpenUrl:url options:options];
+ if(__original_openUrl_Imp){
+ return ((BOOL(*)(id, SEL, UIApplication*, NSURL*, NSDictionary*))__original_openUrl_Imp)(self, _cmd, application, url, options);
+ }
+ return YES;
+}
+*/
+
+@end
+
+
+
+
diff --git a/Plugins/iOS/AppsFlyer+AppController.m.meta b/Plugins/iOS/AppsFlyer+AppController.m.meta
new file mode 100644
index 0000000..b342cf8
--- /dev/null
+++ b/Plugins/iOS/AppsFlyer+AppController.m.meta
@@ -0,0 +1,37 @@
+fileFormatVersion: 2
+guid: 55a0a9d0e05fe48158b3cb8cee7b6aaa
+PluginImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ iconMap: {}
+ executionOrder: {}
+ defineConstraints: []
+ isPreloaded: 0
+ isOverridable: 0
+ isExplicitlyReferenced: 0
+ validateReferences: 1
+ platformData:
+ - first:
+ Any:
+ second:
+ enabled: 0
+ settings: {}
+ - first:
+ Editor: Editor
+ second:
+ enabled: 0
+ settings:
+ DefaultValueInitialized: true
+ - first:
+ iPhone: iOS
+ second:
+ enabled: 1
+ settings: {}
+ - first:
+ tvOS: tvOS
+ second:
+ enabled: 1
+ settings: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Plugins/iOS/AppsFlyerAppController.mm b/Plugins/iOS/AppsFlyerAppController.mm
new file mode 100644
index 0000000..eb93d8f
--- /dev/null
+++ b/Plugins/iOS/AppsFlyerAppController.mm
@@ -0,0 +1,119 @@
+//
+// AppsFlyerAppController.mm
+// Unity-iPhone
+//
+// Created by Jonathan Wesfield on 30/07/2019.
+//
+
+#import
+#import "UnityAppController.h"
+#import "AppDelegateListener.h"
+#if __has_include()
+#import
+#else
+#import "AppsFlyerTracker.h"
+#endif
+
+/**
+ Note if you would like to use method swizzeling see AppsFlyer+AppController.m
+ If you are using swizzeling then comment out the method that is being swizzeled in AppsFlyerAppController.mm
+ Only use swizzeling if there are conflicts with other plugins that needs to be resolved.
+*/
+
+@interface AppsFlyerAppController : UnityAppController
+{
+ BOOL didEnteredBackGround;
+}
+@end
+
+@implementation AppsFlyerAppController
+
+- (instancetype)init
+{
+ self = [super init];
+ if (self) {
+ UnityRegisterAppDelegateListener(self);
+ }
+ return self;
+}
+
+- (void)didFinishLaunching:(NSNotification*)notification {
+ NSLog(@"got didFinishLaunching = %@",notification.userInfo);
+ if (notification.userInfo[@"url"]) {
+ [self onOpenURL:notification];
+ }
+}
+
+-(void)didBecomeActive:(NSNotification*)notification {
+ NSLog(@"got didBecomeActive(out) = %@", notification.userInfo);
+ if (didEnteredBackGround == YES) {
+ [[AppsFlyerTracker sharedTracker] trackAppLaunch];
+ didEnteredBackGround = NO;
+ }
+}
+
+- (void)didEnterBackground:(NSNotification*)notification {
+ NSLog(@"got didEnterBackground = %@", notification.userInfo);
+ didEnteredBackGround = YES;
+}
+
+- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray *))restorationHandler {
+ [super application:application continueUserActivity:userActivity restorationHandler:restorationHandler];
+ [[AppsFlyerTracker sharedTracker] continueUserActivity:userActivity restorationHandler:restorationHandler];
+ return YES;
+}
+
+-(BOOL) application:(UIApplication *)application openUrl:(NSURL *)url options:(NSDictionary *)options {
+ NSLog(@"got openUrl: %@",url);
+ [[AppsFlyerTracker sharedTracker] handleOpenUrl:url options:options];
+ return YES;
+}
+
+- (void)onOpenURL:(NSNotification*)notification {
+ NSLog(@"got onOpenURL = %@", notification.userInfo);
+ NSURL *url = notification.userInfo[@"url"];
+ NSString *sourceApplication = notification.userInfo[@"sourceApplication"];
+
+ if (sourceApplication == nil) {
+ sourceApplication = @"";
+ }
+
+ if (url != nil) {
+ [[AppsFlyerTracker sharedTracker] handleOpenURL:url sourceApplication:sourceApplication withAnnotation:nil];
+ }
+
+}
+
+- (void)didReceiveRemoteNotification:(NSNotification*)notification {
+ NSLog(@"got didReceiveRemoteNotification = %@", notification.userInfo);
+ [[AppsFlyerTracker sharedTracker] handlePushNotification:notification.userInfo];
+}
+
+@end
+
+IMPL_APP_CONTROLLER_SUBCLASS(AppsFlyerAppController)
+
+
+/**
+Note if you would not like to use IMPL_APP_CONTROLLER_SUBCLASS you can replace it with the code below.
+
+ +(void)load
+ {
+ [AppsFlyerAppController plugin];
+ }
+
+ // Singleton accessor.
+ + (AppsFlyerAppController *)plugin
+ {
+ static AppsFlyerAppController *sharedInstance = nil;
+ static dispatch_once_t onceToken;
+
+ dispatch_once(&onceToken, ^{
+
+ sharedInstance = [[AppsFlyerAppController alloc] init];
+ });
+
+ return sharedInstance;
+ }
+
+ **/
diff --git a/Plugins/iOS/AppsFlyerAppController.mm.meta b/Plugins/iOS/AppsFlyerAppController.mm.meta
new file mode 100644
index 0000000..50360f9
--- /dev/null
+++ b/Plugins/iOS/AppsFlyerAppController.mm.meta
@@ -0,0 +1,37 @@
+fileFormatVersion: 2
+guid: f78009dc77e7c4608a9b13a0cf6c63e4
+PluginImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ iconMap: {}
+ executionOrder: {}
+ defineConstraints: []
+ isPreloaded: 0
+ isOverridable: 0
+ isExplicitlyReferenced: 0
+ validateReferences: 1
+ platformData:
+ - first:
+ Any:
+ second:
+ enabled: 0
+ settings: {}
+ - first:
+ Editor: Editor
+ second:
+ enabled: 0
+ settings:
+ DefaultValueInitialized: true
+ - first:
+ iPhone: iOS
+ second:
+ enabled: 1
+ settings: {}
+ - first:
+ tvOS: tvOS
+ second:
+ enabled: 1
+ settings: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Plugins/iOS/AppsFlyeriOSWrapper.h b/Plugins/iOS/AppsFlyeriOSWrapper.h
new file mode 100644
index 0000000..03ab106
--- /dev/null
+++ b/Plugins/iOS/AppsFlyeriOSWrapper.h
@@ -0,0 +1,35 @@
+//
+// AppsFlyeriOSWarpper.h
+// Unity-iPhone
+//
+// Created by Jonathan Wesfield on 24/07/2019.
+//
+
+#import "AFUnityUtils.mm"
+#import "UnityAppController.h"
+#if __has_include()
+#import
+#else
+#import "AppsFlyerTracker.h"
+#endif
+
+@interface AppsFlyeriOSWarpper : NSObject
+
+@end
+
+
+static AppsFlyeriOSWarpper *_AppsFlyerdelegate;
+static const int kPushNotificationSize = 32;
+
+NSString* ConversionDataCallbackObject;
+
+static const char* VALIDATE_CALLBACK = "didFinishValidateReceipt";
+static const char* VALIDATE_ERROR_CALLBACK = "didFinishValidateReceiptWithError";
+static const char* GCD_CALLBACK = "onConversionDataSuccess";
+static const char* GCD_ERROR_CALLBACK = "onConversionDataFail";
+static const char* OAOA_CALLBACK = "onAppOpenAttribution";
+static const char* OAOA_ERROR_CALLBACK = "onAppOpenAttributionFailure";
+static const char* GENERATE_LINK_CALLBACK = "onInviteLinkGenerated";
+static const char* OPEN_STORE_LINK_CALLBACK = "onOpenStoreLinkGenerated";
+
+static NSString* validateObjectName = @"";
diff --git a/Plugins/iOS/AppsFlyeriOSWrapper.h.meta b/Plugins/iOS/AppsFlyeriOSWrapper.h.meta
new file mode 100644
index 0000000..04eeeb5
--- /dev/null
+++ b/Plugins/iOS/AppsFlyeriOSWrapper.h.meta
@@ -0,0 +1,27 @@
+fileFormatVersion: 2
+guid: 88eb2a3b8d60c4e1cab4d78d813b2b91
+PluginImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ iconMap: {}
+ executionOrder: {}
+ defineConstraints: []
+ isPreloaded: 0
+ isOverridable: 0
+ isExplicitlyReferenced: 0
+ validateReferences: 1
+ platformData:
+ - first:
+ Any:
+ second:
+ enabled: 1
+ settings: {}
+ - first:
+ Editor: Editor
+ second:
+ enabled: 0
+ settings:
+ DefaultValueInitialized: true
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Plugins/iOS/AppsFlyeriOSWrapper.mm b/Plugins/iOS/AppsFlyeriOSWrapper.mm
new file mode 100644
index 0000000..f312934
--- /dev/null
+++ b/Plugins/iOS/AppsFlyeriOSWrapper.mm
@@ -0,0 +1,226 @@
+//
+// AppsFlyeriOSWarpper.mm
+// Unity-iPhone
+//
+// Created by Jonathan Wesfield on 24/07/2019.
+//
+
+#import "AppsFlyeriOSWrapper.h"
+
+
+static void unityCallBack(NSString* objectName, const char* method, const char* msg) {
+ if(objectName){
+ UnitySendMessage([objectName UTF8String], method, msg);
+ }
+}
+
+extern "C" {
+
+ const void _startSDK() {
+ [[AppsFlyerTracker sharedTracker] trackAppLaunch];
+ }
+
+ const void _setCustomerUserID (const char* customerUserID) {
+ [[AppsFlyerTracker sharedTracker] setCustomerUserID:stringFromChar(customerUserID)];
+ }
+
+ const void _setAdditionalData (const char* customData) {
+ [[AppsFlyerTracker sharedTracker] setAdditionalData:dictionaryFromJson(customData)];
+ }
+
+ const void _setAppsFlyerDevKey (const char* appsFlyerDevKey) {
+ [AppsFlyerTracker sharedTracker].appsFlyerDevKey = stringFromChar(appsFlyerDevKey);
+ }
+
+ const void _setAppleAppID (const char* appleAppID) {
+ [AppsFlyerTracker sharedTracker].appleAppID = stringFromChar(appleAppID);
+ }
+
+ const void _setCurrencyCode (const char* currencyCode) {
+ [[AppsFlyerTracker sharedTracker] setCurrencyCode:stringFromChar(currencyCode)];
+ }
+
+ const void _setDisableCollectAppleAdSupport (bool disableAppleAdSupportTracking) {
+ [AppsFlyerTracker sharedTracker].disableAppleAdSupportTracking = disableAppleAdSupportTracking;
+ }
+
+ const void _setIsDebug (bool isDebug) {
+ [AppsFlyerTracker sharedTracker].isDebug = isDebug;
+ }
+
+ const void _setShouldCollectDeviceName (bool shouldCollectDeviceName) {
+ [AppsFlyerTracker sharedTracker].shouldCollectDeviceName = shouldCollectDeviceName;
+ }
+
+ const void _setAppInviteOneLinkID (const char* appInviteOneLinkID) {
+ [[AppsFlyerTracker sharedTracker] setAppInviteOneLink:stringFromChar(appInviteOneLinkID)];
+ }
+
+ const void _anonymizeUser (bool deviceTrackingDisabled) {
+ [AppsFlyerTracker sharedTracker].deviceTrackingDisabled = deviceTrackingDisabled;
+ }
+
+ const void _setDisableCollectIAd (bool disableIAdTracking) {
+ [AppsFlyerTracker sharedTracker].disableIAdTracking = disableIAdTracking;
+ }
+
+ const void _setUseReceiptValidationSandbox (bool useReceiptValidationSandbox) {
+ [AppsFlyerTracker sharedTracker].useReceiptValidationSandbox = useReceiptValidationSandbox;
+ }
+
+ const void _setUseUninstallSandbox (bool useUninstallSandbox) {
+ [AppsFlyerTracker sharedTracker].useUninstallSandbox = useUninstallSandbox;
+ }
+
+ const void _setResolveDeepLinkURLs (int length, const char **resolveDeepLinkURLs) {
+ if(length > 0 && resolveDeepLinkURLs) {
+ [[AppsFlyerTracker sharedTracker] setResolveDeepLinkURLs:NSArrayFromCArray(length, resolveDeepLinkURLs)];
+ }
+ }
+
+ const void _setOneLinkCustomDomains (int length, const char **oneLinkCustomDomains) {
+ if(length > 0 && oneLinkCustomDomains) {
+ [[AppsFlyerTracker sharedTracker] setResolveDeepLinkURLs:NSArrayFromCArray(length, oneLinkCustomDomains)];
+ }
+ }
+
+ const void _afSendEvent (const char* eventName, const char* eventValues) {
+ [[AppsFlyerTracker sharedTracker] trackEvent:stringFromChar(eventName) withValues:dictionaryFromJson(eventValues)];
+ }
+
+ const void _recordLocation (double longitude, double latitude) {
+ [[AppsFlyerTracker sharedTracker] trackLocation:longitude latitude:latitude];
+ }
+
+ const char* _getAppsFlyerId () {
+ return getCString([[[AppsFlyerTracker sharedTracker] getAppsFlyerUID] UTF8String]);
+ }
+
+ const void _registerUninstall (unsigned char* deviceToken) {
+ if(deviceToken){
+ NSData* tokenData = [NSData dataWithBytes:(const void *)deviceToken length:sizeof(unsigned char)*kPushNotificationSize];
+ [[AppsFlyerTracker sharedTracker] registerUninstall:tokenData];
+ }
+ }
+
+ const void _handlePushNotification (const char* pushPayload) {
+ [[AppsFlyerTracker sharedTracker] handlePushNotification:dictionaryFromJson(pushPayload)];
+ }
+
+ const char* _getSDKVersion () {
+ return getCString([[[AppsFlyerTracker sharedTracker] getSDKVersion] UTF8String]);
+ }
+
+ const void _setHost (const char* host, const char* hostPrefix) {
+ [[AppsFlyerTracker sharedTracker] setHost:stringFromChar(host) withHostPrefix:stringFromChar(hostPrefix)];
+ }
+
+ const void _setMinTimeBetweenSessions (int minTimeBetweenSessions) {
+ [AppsFlyerTracker sharedTracker].minTimeBetweenSessions = minTimeBetweenSessions;
+ }
+
+ const void _stopSDK (bool isStopTracking) {
+ [AppsFlyerTracker sharedTracker].isStopTracking = isStopTracking;
+ }
+
+ const BOOL _isSDKStopped () {
+ return [AppsFlyerTracker sharedTracker].isStopTracking;
+ }
+
+ const void _handleOpenUrl(const char *url, const char *sourceApplication, const char *annotation) {
+ [[AppsFlyerTracker sharedTracker] handleOpenURL:[NSURL URLWithString:stringFromChar(url)] sourceApplication:stringFromChar(sourceApplication) withAnnotation:stringFromChar(annotation)];
+ }
+
+ const void _recordCrossPromoteImpression (const char* appID, const char* campaign, const char* parameters) {
+ [AppsFlyerCrossPromotionHelper trackCrossPromoteImpression:stringFromChar(appID) campaign:stringFromChar(campaign) parameters:dictionaryFromJson(parameters)];
+ }
+
+ const void _attributeAndOpenStore (const char* appID, const char* campaign, const char* parameters, const char* objectName) {
+ [AppsFlyerCrossPromotionHelper
+ trackAndOpenStore:stringFromChar(appID)
+ campaign:stringFromChar(campaign)
+ paramters:dictionaryFromJson(parameters)
+ openStore:^(NSURLSession * _Nonnull urlSession, NSURL * _Nonnull clickURL) {
+ unityCallBack(stringFromChar(objectName), OPEN_STORE_LINK_CALLBACK, [clickURL.absoluteString UTF8String]);
+
+ }];
+ }
+
+ const void _generateUserInviteLink (const char* parameters, const char* objectName) {
+ [AppsFlyerShareInviteHelper generateInviteUrlWithLinkGenerator:^AppsFlyerLinkGenerator * _Nonnull(AppsFlyerLinkGenerator * _Nonnull generator) {
+ return generatorFromDictionary(dictionaryFromJson(parameters), generator);
+ } completionHandler:^(NSURL * _Nullable url) {
+ unityCallBack(stringFromChar(objectName), GENERATE_LINK_CALLBACK, [url.absoluteString UTF8String]);
+ }];
+ }
+
+ const void _recordInvite (const char* channel, const char* parameters) {
+ [AppsFlyerShareInviteHelper trackInvite:stringFromChar(channel) parameters:dictionaryFromJson(parameters)];
+ }
+
+ const void _setUserEmails (int emailCryptTypeInt , int length, const char **userEmails) {
+ if(length > 0 && userEmails) {
+ [[AppsFlyerTracker sharedTracker] setUserEmails:NSArrayFromCArray(length, userEmails) withCryptType:emailCryptTypeFromInt(emailCryptTypeInt)];
+ }
+ }
+
+ const void _setPhoneNumber (const char* phoneNumber) {
+ [[AppsFlyerTracker sharedTracker] setPhoneNumber:stringFromChar(phoneNumber)];
+ }
+
+ const void _setSharingFilterForAllPartners () {
+ [[AppsFlyerTracker sharedTracker] setSharingFilterForAllPartners];
+ }
+
+ const void _setSharingFilter (int length, const char **partners) {
+ if(length > 0 && partners) {
+ [[AppsFlyerTracker sharedTracker] setSharingFilter:NSArrayFromCArray(length, partners)];
+ }
+ }
+
+ const void _validateAndSendInAppPurchase (const char* productIdentifier, const char* price, const char* currency, const char* tranactionId, const char* additionalParameters, const char* objectName) {
+
+ validateObjectName = stringFromChar(objectName);
+
+ [[AppsFlyerTracker sharedTracker]
+ validateAndTrackInAppPurchase:stringFromChar(productIdentifier)
+ price:stringFromChar(price)
+ currency:stringFromChar(currency)
+ transactionId:stringFromChar(tranactionId)
+ additionalParameters:dictionaryFromJson(additionalParameters)
+ success:^(NSDictionary *result){
+ unityCallBack(validateObjectName, VALIDATE_CALLBACK, stringFromdictionary(result));
+ } failure:^(NSError *error, id response) {
+ unityCallBack(validateObjectName, VALIDATE_ERROR_CALLBACK, error ? [[error localizedDescription] UTF8String] : "error");
+ }];
+ }
+
+ const void _getConversionData(const char* objectName) {
+ if (_AppsFlyerdelegate == nil) {
+ _AppsFlyerdelegate = [[AppsFlyeriOSWarpper alloc] init];
+ }
+ ConversionDataCallbackObject = stringFromChar(objectName);
+ [[AppsFlyerTracker sharedTracker] setDelegate:_AppsFlyerdelegate];
+ }
+}
+
+@implementation AppsFlyeriOSWarpper
+
+- (void)onConversionDataSuccess:(NSDictionary *)installData {
+ unityCallBack(ConversionDataCallbackObject, GCD_CALLBACK, stringFromdictionary(installData));
+}
+
+- (void)onConversionDataFail:(NSError *)error {
+ unityCallBack(ConversionDataCallbackObject, GCD_ERROR_CALLBACK, [[error localizedDescription] UTF8String]);
+}
+
+- (void)onAppOpenAttribution:(NSDictionary *)attributionData {
+ unityCallBack(ConversionDataCallbackObject, OAOA_CALLBACK, stringFromdictionary(attributionData));
+}
+
+- (void)onAppOpenAttributionFailure:(NSError *)error {
+ unityCallBack(ConversionDataCallbackObject, OAOA_ERROR_CALLBACK, [[error localizedDescription] UTF8String]);
+}
+
+@end
+
diff --git a/Plugins/iOS/AppsFlyeriOSWrapper.mm.meta b/Plugins/iOS/AppsFlyeriOSWrapper.mm.meta
new file mode 100644
index 0000000..ae5d681
--- /dev/null
+++ b/Plugins/iOS/AppsFlyeriOSWrapper.mm.meta
@@ -0,0 +1,37 @@
+fileFormatVersion: 2
+guid: dc4c1abadcf544375aabe22e4337d6ee
+PluginImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ iconMap: {}
+ executionOrder: {}
+ defineConstraints: []
+ isPreloaded: 0
+ isOverridable: 0
+ isExplicitlyReferenced: 0
+ validateReferences: 1
+ platformData:
+ - first:
+ Any:
+ second:
+ enabled: 0
+ settings: {}
+ - first:
+ Editor: Editor
+ second:
+ enabled: 0
+ settings:
+ DefaultValueInitialized: true
+ - first:
+ iPhone: iOS
+ second:
+ enabled: 1
+ settings: {}
+ - first:
+ tvOS: tvOS
+ second:
+ enabled: 1
+ settings: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..c53ed93
--- /dev/null
+++ b/README.md
@@ -0,0 +1,2 @@
+# Readme
+Lorem ipsum
\ No newline at end of file
diff --git a/README.md.meta b/README.md.meta
new file mode 100644
index 0000000..148c65e
--- /dev/null
+++ b/README.md.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 96b1ab8c7c887bc4c8337802e5d97ee9
+TextScriptImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Runtime.meta b/Runtime.meta
new file mode 100644
index 0000000..f1af900
--- /dev/null
+++ b/Runtime.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 131e67461dec612468ec544abeac63e8
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Runtime/AFInAppEvents.cs b/Runtime/AFInAppEvents.cs
new file mode 100644
index 0000000..1f6d1fe
--- /dev/null
+++ b/Runtime/AFInAppEvents.cs
@@ -0,0 +1,72 @@
+using UnityEngine;
+using System.Collections;
+
+public class AFInAppEvents {
+ /**
+ * Event Type
+ * */
+ public const string LEVEL_ACHIEVED = "af_level_achieved";
+ public const string ADD_PAYMENT_INFO = "af_add_payment_info";
+ public const string ADD_TO_CART = "af_add_to_cart";
+ public const string ADD_TO_WISH_LIST = "af_add_to_wishlist";
+ public const string COMPLETE_REGISTRATION = "af_complete_registration";
+ public const string TUTORIAL_COMPLETION = "af_tutorial_completion";
+ public const string INITIATED_CHECKOUT = "af_initiated_checkout";
+ public const string PURCHASE = "af_purchase";
+ public const string RATE = "af_rate";
+ public const string SEARCH = "af_search";
+ public const string SPENT_CREDIT = "af_spent_credits";
+ public const string ACHIEVEMENT_UNLOCKED = "af_achievement_unlocked";
+ public const string CONTENT_VIEW = "af_content_view";
+ public const string TRAVEL_BOOKING = "af_travel_booking";
+ public const string SHARE = "af_share";
+ public const string INVITE = "af_invite";
+ public const string LOGIN = "af_login";
+ public const string RE_ENGAGE = "af_re_engage";
+ public const string UPDATE = "af_update";
+ public const string OPENED_FROM_PUSH_NOTIFICATION = "af_opened_from_push_notification";
+ public const string LOCATION_CHANGED = "af_location_changed";
+ public const string LOCATION_COORDINATES = "af_location_coordinates";
+ public const string ORDER_ID = "af_order_id";
+ /**
+ * Event Parameter Name
+ * **/
+ public const string LEVEL = "af_level";
+ public const string SCORE = "af_score";
+ public const string SUCCESS = "af_success";
+ public const string PRICE = "af_price";
+ public const string CONTENT_TYPE = "af_content_type";
+ public const string CONTENT_ID = "af_content_id";
+ public const string CONTENT_LIST = "af_content_list";
+ public const string CURRENCY = "af_currency";
+ public const string QUANTITY = "af_quantity";
+ public const string REGSITRATION_METHOD = "af_registration_method";
+ public const string PAYMENT_INFO_AVAILIBLE = "af_payment_info_available";
+ public const string MAX_RATING_VALUE = "af_max_rating_value";
+ public const string RATING_VALUE = "af_rating_value";
+ public const string SEARCH_STRING = "af_search_string";
+ public const string DATE_A = "af_date_a";
+ public const string DATE_B = "af_date_b";
+ public const string DESTINATION_A = "af_destination_a";
+ public const string DESTINATION_B = "af_destination_b";
+ public const string DESCRIPTION = "af_description";
+ public const string CLASS = "af_class";
+ public const string EVENT_START = "af_event_start";
+ public const string EVENT_END = "af_event_end";
+ public const string LATITUDE = "af_lat";
+ public const string LONGTITUDE = "af_long";
+ public const string CUSTOMER_USER_ID = "af_customer_user_id";
+ public const string VALIDATED = "af_validated";
+ public const string REVENUE = "af_revenue";
+ public const string RECEIPT_ID = "af_receipt_id";
+ public const string PARAM_1 = "af_param_1";
+ public const string PARAM_2 = "af_param_2";
+ public const string PARAM_3 = "af_param_3";
+ public const string PARAM_4 = "af_param_4";
+ public const string PARAM_5 = "af_param_5";
+ public const string PARAM_6 = "af_param_6";
+ public const string PARAM_7 = "af_param_7";
+ public const string PARAM_8 = "af_param_8";
+ public const string PARAM_9 = "af_param_9";
+ public const string PARAM_10 = "af_param_10";
+}
\ No newline at end of file
diff --git a/Runtime/AFInAppEvents.cs.meta b/Runtime/AFInAppEvents.cs.meta
new file mode 100644
index 0000000..f21eba3
--- /dev/null
+++ b/Runtime/AFInAppEvents.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 4bda50a55ee3549dcb21fc684c4776c2
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Runtime/AFMiniJSON.cs b/Runtime/AFMiniJSON.cs
new file mode 100644
index 0000000..d02bf2f
--- /dev/null
+++ b/Runtime/AFMiniJSON.cs
@@ -0,0 +1,547 @@
+/*
+ * Copyright (c) 2013 Calvin Rien
+ *
+ * Based on the JSON parser by Patrick van Bergen
+ * http://techblog.procurios.nl/k/618/news/view/14605/14863/How-do-I-write-my-own-parser-for-JSON.html
+ *
+ * Simplified it so that it doesn't throw exceptions
+ * and can be used in Unity iPhone with maximum code stripping.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sublicense, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.IO;
+using System.Text;
+
+namespace AFMiniJSON {
+ // Example usage:
+ //
+ // using UnityEngine;
+ // using System.Collections;
+ // using System.Collections.Generic;
+ // using MiniJSON;
+ //
+ // public class MiniJSONTest : MonoBehaviour {
+ // void Start () {
+ // var jsonString = "{ \"array\": [1.44,2,3], " +
+ // "\"object\": {\"key1\":\"value1\", \"key2\":256}, " +
+ // "\"string\": \"The quick brown fox \\\"jumps\\\" over the lazy dog \", " +
+ // "\"unicode\": \"\\u3041 Men\u00fa sesi\u00f3n\", " +
+ // "\"int\": 65536, " +
+ // "\"float\": 3.1415926, " +
+ // "\"bool\": true, " +
+ // "\"null\": null }";
+ //
+ // var dict = Json.Deserialize(jsonString) as Dictionary;
+ //
+ // Debug.Log("deserialized: " + dict.GetType());
+ // Debug.Log("dict['array'][0]: " + ((List