UMeng.pas 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370
  1. {*******************************************************}
  2. { }
  3. { Methods of UMeng }
  4. { }
  5. { CopyRight (C) 2018-2020 KngStr }
  6. { }
  7. {*******************************************************}
  8. unit UMeng;
  9. //https://developer.umeng.com/docs/66632/detail/66889
  10. //delphi 不支持Android 64,所以不能引用64位 so:arm64-v8a
  11. interface
  12. uses
  13. System.Sysutils, System.Generics.Collections;
  14. type
  15. TUMeng = class
  16. private
  17. class var FLastViewName: string;
  18. class function DeviceType(IsPhone: Boolean): Integer;
  19. class procedure Debug;
  20. public
  21. //注意: 即使您已经在AndroidManifest.xml中配置过appkey和channel值,
  22. //也需要在App代码中调用初始化接口(如需要使用AndroidManifest.xml中配置好的appkey和channel值,
  23. //UMConfigure.init调用中appkey和channel参数请置为null)。
  24. class procedure Init(appkey, channel: string; pushSecret: string = ''; IsPhone: Boolean = True); overload;
  25. //注意:如果您已经在AndroidManifest.xml中配置过appkey和channel值,可以调用此版本初始化函数。
  26. class procedure Init(pushSecret: string = ''; IsPhone: Boolean = True); overload;
  27. class procedure onResume;
  28. class procedure onPause;
  29. class procedure onPageStart(ViewName: string);
  30. class procedure onPageEnd(ViewName: string);
  31. class procedure onPageAutoChange(ViewName: string = ''; NeedPauseAndResume: Boolean = False);
  32. //普通事件
  33. class procedure onEvent(AID: string; ALabel: string = #0); overload;
  34. //多属性(K-V)事件
  35. class procedure onEvent(AID: string; AProperties: TArray<TPair<string, string>>); overload;
  36. //数值型
  37. class procedure onEventValue(AID: string; AProperties: TArray<TPair<string, string>>; ADuration: Integer = 0);
  38. //上次访问的页面名
  39. class property LastViewName: string read FLastViewName;
  40. //内部注册事件
  41. class procedure onEventRegister(AUserID: string);
  42. //内部登录事件
  43. class procedure onEventLogin(AUserID: string);
  44. //内部领取红包事件
  45. class procedure onEventReceiveCoupon(AAmount: Integer);
  46. //内部收藏事件
  47. class procedure onEventCollect(AItem: string);
  48. //内部加购物车事件
  49. class procedure onEventAddCart(AItem: string; AAmount: Integer);
  50. //内部拍下订单事件
  51. class procedure onEventSubmitPayment(AUserID, AOrderId, AItem: string; AAmount: Integer);
  52. //内部付费事件
  53. class procedure onEventFinishPayment(AUserID, AOrderId, AItem: string; AAmount: Integer);
  54. //内部自定义事件
  55. class procedure onEventCustom(AID: Integer);
  56. end;
  57. implementation
  58. uses
  59. {$IFDEF ANDROID}
  60. Androidapi.JNI.Os, Androidapi.JNI.Provider,
  61. Androidapi.JNIBridge, Androidapi.Helpers,
  62. Androidapi.JNI.JavaTypes, Androidapi.JNI.App,
  63. Androidapi.JNI.GraphicsContentViewText,
  64. Androidapi.JNI.umeng.common, Androidapi.JNI.umeng.analytics,
  65. {$ENDIF}
  66. FMX.Types;
  67. { TUMeng }
  68. class procedure TUMeng.Debug;
  69. {$IF DEFINED(ANDROID) && DEFINED(DEBUG)}
  70. var
  71. I: Integer;
  72. sDeviceInfo: string;
  73. arrInfo: TJavaObjectArray<JString>;
  74. {$ENDIF}
  75. begin
  76. {$IF DEFINED(ANDROID) && DEFINED(DEBUG)}
  77. (**
  78. * 设置组件化的Log开关
  79. * 参数: boolean 默认为false,如需查看LOG设置为true
  80. *)
  81. TJUMConfigure.JavaClass.setLogEnabled(True);
  82. TJMobclickAgent.JavaClass.setDebugMode(True);
  83. sDeviceInfo := '';
  84. arrInfo := TJUMConfigure.JavaClass.getTestDeviceInfo(
  85. {$IF CompilerVersion > 27}
  86. TAndroidHelper.Context
  87. {$ELSE}
  88. SharedActivityContext
  89. {$ENDIF}
  90. );
  91. for I := 0 to arrInfo.Length - 1 do
  92. sDeviceInfo := Format('%s %s', [sDeviceInfo, JStringToString(arrInfo.Items[I])]);
  93. Log.d('TUMeng-DeviceInfo:' + sDeviceInfo);
  94. //setCatchUncaughtExceptions can not be called in child process
  95. //TJMobclickAgent.JavaClass.setCatchUncaughtExceptions(True);
  96. {$ENDIF}
  97. end;
  98. class procedure TUMeng.onEvent(AID: string; ALabel: string = #0);
  99. begin
  100. {$IFDEF ANDROID}
  101. TJMobclickAgent.JavaClass.onEvent(
  102. {$IF CompilerVersion > 27}
  103. TAndroidHelper.Context
  104. {$ELSE}
  105. SharedActivityContext
  106. {$ENDIF},
  107. StringToJString(AID),
  108. StringToJString(ALabel)
  109. );
  110. {$ENDIF}
  111. end;
  112. class function TUMeng.DeviceType(IsPhone: Boolean): Integer;
  113. begin
  114. {$IFDEF ANDROID}
  115. if IsPhone then
  116. Result := TJUMConfigure.JavaClass.DEVICE_TYPE_PHONE
  117. else
  118. Result := TJUMConfigure.JavaClass.DEVICE_TYPE_BOX;
  119. {$ENDIF}
  120. end;
  121. (**
  122. * 初始化common库
  123. * 参数1:上下文,不能为空
  124. * 参数2:设备类型,UMConfigure.DEVICE_TYPE_PHONE为手机、UMConfigure.DEVICE_TYPE_BOX为盒子,默认为手机
  125. * 参数3:Push推送业务的secret
  126. *)
  127. class procedure TUMeng.Init(pushSecret: string; IsPhone: Boolean);
  128. begin
  129. {$IFDEF DEBUG}
  130. Debug;
  131. {$ENDIF}
  132. FLastViewName := '';
  133. {$IFDEF ANDROID}
  134. TJUMConfigure.TU2Fixinit(
  135. {$IF CompilerVersion > 27}
  136. TAndroidHelper.Context
  137. {$ELSE}
  138. SharedActivityContext
  139. {$ENDIF},
  140. DeviceType(IsPhone),
  141. StringToJString(pushSecret));
  142. {$ENDIF}
  143. end;
  144. (**
  145. * 初始化common库
  146. * 参数1:上下文,不能为空
  147. * 参数2:【友盟+】 AppKey
  148. * 参数3:【友盟+】 Channel
  149. * 参数4:设备类型,UMConfigure.DEVICE_TYPE_PHONE为手机、UMConfigure.DEVICE_TYPE_BOX为盒子,默认为手机
  150. * 参数5:Push推送业务的secret
  151. *)
  152. class procedure TUMeng.Init(appkey, channel, pushSecret: string;
  153. IsPhone: Boolean);
  154. begin
  155. {$IFDEF DEBUG}
  156. Debug;
  157. {$ENDIF}
  158. FLastViewName := '';
  159. {$IFDEF ANDROID}
  160. TJUMConfigure.TU2Fixinit(
  161. {$IF CompilerVersion > 27}
  162. TAndroidHelper.Context
  163. {$ELSE}
  164. SharedActivityContext
  165. {$ENDIF},
  166. StringToJString(appkey),
  167. StringToJString(channel),
  168. DeviceType(IsPhone),
  169. StringToJString(pushSecret));
  170. // 页面采集模式
  171. TJMobclickAgent.JavaClass.setPageCollectionMode(TJMobclickAgent_PageMode.JavaClass.AUTO);
  172. {$ENDIF}
  173. end;
  174. class procedure TUMeng.onEvent(AID: string;
  175. AProperties: TArray<TPair<string, string>>);
  176. begin
  177. onEventValue(AID, AProperties);
  178. end;
  179. class procedure TUMeng.onEventRegister(AUserID: string);
  180. begin
  181. TUMeng.onEventValue('__register', [TPair<string, string>.Create('userid', AUserID)]);
  182. end;
  183. class procedure TUMeng.onEventLogin(AUserID: string);
  184. begin
  185. TUMeng.onEventValue('__login', [TPair<string, string>.Create('userid', AUserID)]);
  186. end;
  187. class procedure TUMeng.onEventAddCart(AItem: string; AAmount: Integer);
  188. begin
  189. TUMeng.onEventValue('__add_cart', [
  190. TPair<string, string>.Create('item', AItem),
  191. TPair<string, string>.Create('amount', IntToStr(AAmount))
  192. ]);
  193. end;
  194. class procedure TUMeng.onEventReceiveCoupon(AAmount: Integer);
  195. begin
  196. TUMeng.onEventValue('__receive_coupon', [TPair<string, string>.Create('amount', IntToStr(AAmount))]);
  197. end;
  198. class procedure TUMeng.onEventSubmitPayment(AUserID, AOrderId, AItem: string;
  199. AAmount: Integer);
  200. begin
  201. TUMeng.onEventValue('__submit_payment', [
  202. TPair<string, string>.Create('userid', AUserID),
  203. TPair<string, string>.Create('orderid', AOrderId),
  204. TPair<string, string>.Create('item', AItem),
  205. TPair<string, string>.Create('amount', IntToStr(AAmount))
  206. ]);
  207. end;
  208. class procedure TUMeng.onEventFinishPayment(AUserID, AOrderId, AItem: string;
  209. AAmount: Integer);
  210. begin
  211. TUMeng.onEventValue('__finish_payment', [
  212. TPair<string, string>.Create('userid', AUserID),
  213. TPair<string, string>.Create('orderid', AOrderId),
  214. TPair<string, string>.Create('item', AItem),
  215. TPair<string, string>.Create('amount', IntToStr(AAmount))
  216. ]);
  217. end;
  218. class procedure TUMeng.onEventCollect(AItem: string);
  219. begin
  220. TUMeng.onEventValue('__collect', [TPair<string, string>.Create('item', AItem)]);
  221. end;
  222. class procedure TUMeng.onEventCustom(AID: Integer);
  223. begin
  224. TUMeng.onEvent('__cust_event_' + IntToStr(AID));
  225. end;
  226. class procedure TUMeng.onEventValue(AID: string;
  227. AProperties: TArray<TPair<string, string>>; ADuration: Integer);
  228. {$IFDEF ANDROID}
  229. var
  230. FJMap: JHashMap;
  231. I: Integer;
  232. LProperty: TPair<string, string>;
  233. {$ENDIF}
  234. begin
  235. {$IFDEF ANDROID}
  236. FJMap := TJHashMap.JavaClass.init;
  237. for I := 0 to Length(AProperties) - 1 do
  238. FJMap.put(StringToJString(AProperties[I].Key), StringToJString(AProperties[I].Value));
  239. if ADuration > 0 then
  240. TJMobclickAgent.JavaClass.onEventValue(
  241. {$IF CompilerVersion > 27}
  242. TAndroidHelper.Context
  243. {$ELSE}
  244. SharedActivityContext
  245. {$ENDIF},
  246. StringToJString(AID),
  247. Jmap(FJMap),
  248. ADuration
  249. )
  250. else
  251. TJMobclickAgent.JavaClass.onEvent(
  252. {$IF CompilerVersion > 27}
  253. TAndroidHelper.Context
  254. {$ELSE}
  255. SharedActivityContext
  256. {$ENDIF},
  257. StringToJString(AID),
  258. Jmap(FJMap)
  259. );
  260. {$ENDIF}
  261. end;
  262. class procedure TUMeng.onPageAutoChange(ViewName: string; NeedPauseAndResume: Boolean);
  263. begin
  264. {$IFDEF DEBUG}
  265. Log.d('---onPageAutoChange:' + FLastViewName + '/' + ViewName);
  266. {$ENDIF}
  267. if FLastViewName <> '' then begin
  268. onPageEnd(FLastViewName);
  269. if NeedPauseAndResume then
  270. onPause;
  271. end;
  272. if ViewName <> '' then begin
  273. onPageStart(ViewName);
  274. if NeedPauseAndResume then
  275. onResume;
  276. end;
  277. FLastViewName := ViewName;
  278. end;
  279. class procedure TUMeng.onPageEnd(ViewName: string);
  280. begin
  281. {$IFDEF DEBUG}
  282. Log.d('---onPageEnd:' + ViewName);
  283. {$ENDIF}
  284. {$IFDEF ANDROID}
  285. TJMobclickAgent.JavaClass.onPageEnd(StringToJString(ViewName));
  286. {$ENDIF}
  287. end;
  288. class procedure TUMeng.onPageStart(ViewName: string);
  289. begin
  290. {$IFDEF DEBUG}
  291. Log.d('---onPageStart:' + ViewName);
  292. {$ENDIF}
  293. {$IFDEF ANDROID}
  294. TJMobclickAgent.JavaClass.onPageStart(StringToJString(ViewName));
  295. {$ENDIF}
  296. end;
  297. class procedure TUMeng.onPause;
  298. begin
  299. {$IFDEF DEBUG}
  300. Log.d('---onPause');
  301. {$ENDIF}
  302. {$IFDEF ANDROID}
  303. TJMobclickAgent.JavaClass.onPause(
  304. {$IF CompilerVersion > 27}
  305. TAndroidHelper.Context
  306. {$ELSE}
  307. SharedActivityContext
  308. {$ENDIF}
  309. );
  310. {$ENDIF}
  311. end;
  312. class procedure TUMeng.onResume;
  313. begin
  314. {$IFDEF DEBUG}
  315. Log.d('---onResume');
  316. {$ENDIF}
  317. {$IFDEF ANDROID}
  318. TJMobclickAgent.JavaClass.onResume(
  319. {$IF CompilerVersion > 27}
  320. TAndroidHelper.Context
  321. {$ELSE}
  322. SharedActivityContext
  323. {$ENDIF}
  324. );
  325. {$ENDIF}
  326. end;
  327. end.