@tyrads.com/tyrads-sdk 3.0.0-beta.0 → 3.2.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/android/build.gradle +1 -1
- package/android/src/main/java/com/tyradssdk/TyradsSdkModule.kt +130 -29
- package/ios/Tyrads/AcmoAssets.swift +14 -0
- package/ios/Tyrads/ApiHeaders.swift +1 -0
- package/ios/Tyrads/InitModel.swift +3 -0
- package/ios/Tyrads/Tyrads.swift +255 -213
- package/ios/Tyrads/WebViewController.swift +195 -0
- package/ios/Tyrads/core/utils/AcmoKeyNames.swift +29 -0
- package/ios/Tyrads/core/utils/ColorExtension.swift +55 -0
- package/ios/Tyrads/core/utils/Services/LocalizationService.swift +175 -0
- package/ios/Tyrads/helpers/device_details.swift +160 -0
- package/ios/Tyrads/legal/AcmoPrivacyPage.swift +353 -0
- package/ios/Tyrads/legal/PrivacyPageController.swift +31 -0
- package/ios/Tyrads/user/AcmoUserUpdatePage.swift +302 -0
- package/ios/Tyrads/user/AcmoUsersUpdateController.swift +26 -0
- package/ios/Tyrads/user/Repository.swift +89 -0
- package/ios/TyradsSdk.mm +22 -4
- package/ios/TyradsSdk.swift +101 -31
- package/lib/commonjs/acmo/core/helpers/launcher.js +20 -0
- package/lib/commonjs/acmo/core/helpers/launcher.js.map +1 -0
- package/lib/commonjs/acmo/core/helpers/native_methods.js +37 -0
- package/lib/commonjs/acmo/core/helpers/native_methods.js.map +1 -0
- package/lib/commonjs/acmo/core/helpers/numeral.js +19 -0
- package/lib/commonjs/acmo/core/helpers/numeral.js.map +1 -0
- package/lib/commonjs/acmo/core/services/localization_service.js +164 -0
- package/lib/commonjs/acmo/core/services/localization_service.js.map +1 -0
- package/lib/commonjs/acmo/core/storage/storage.js +15 -1
- package/lib/commonjs/acmo/core/storage/storage.js.map +1 -1
- package/lib/commonjs/acmo/modules/dashboard/components/active_offers_button.js +79 -0
- package/lib/commonjs/acmo/modules/dashboard/components/active_offers_button.js.map +1 -0
- package/lib/commonjs/acmo/modules/dashboard/components/custom_card.js +7 -10
- package/lib/commonjs/acmo/modules/dashboard/components/custom_card.js.map +1 -1
- package/lib/commonjs/acmo/modules/dashboard/components/custom_scroller.js +141 -0
- package/lib/commonjs/acmo/modules/dashboard/components/custom_scroller.js.map +1 -0
- package/lib/commonjs/acmo/{core/marquee.js → modules/dashboard/components/custom_shimmer.js} +46 -34
- package/lib/commonjs/acmo/modules/dashboard/components/custom_shimmer.js.map +1 -0
- package/lib/commonjs/acmo/modules/dashboard/components/offer_card.js +263 -0
- package/lib/commonjs/acmo/modules/dashboard/components/offer_card.js.map +1 -0
- package/lib/commonjs/acmo/modules/dashboard/components/offer_list_item.js +203 -0
- package/lib/commonjs/acmo/modules/dashboard/components/offer_list_item.js.map +1 -0
- package/lib/commonjs/acmo/modules/dashboard/components/premium_empty_widget.js +87 -0
- package/lib/commonjs/acmo/modules/dashboard/components/premium_empty_widget.js.map +1 -0
- package/lib/commonjs/acmo/modules/dashboard/components/premium_header.js +16 -14
- package/lib/commonjs/acmo/modules/dashboard/components/premium_header.js.map +1 -1
- package/lib/commonjs/acmo/modules/dashboard/components/premium_loading.js +111 -0
- package/lib/commonjs/acmo/modules/dashboard/components/premium_loading.js.map +1 -0
- package/lib/commonjs/acmo/modules/dashboard/repository.js +108 -32
- package/lib/commonjs/acmo/modules/dashboard/repository.js.map +1 -1
- package/lib/commonjs/acmo/modules/dashboard/top_offers.js +85 -63
- package/lib/commonjs/acmo/modules/dashboard/top_offers.js.map +1 -1
- package/lib/commonjs/acmo/modules/localization/localization_context.js +56 -0
- package/lib/commonjs/acmo/modules/localization/localization_context.js.map +1 -0
- package/lib/commonjs/assets/images/angle_up.png +0 -0
- package/lib/commonjs/assets/images/diamond.png +0 -0
- package/lib/commonjs/assets/images/info.png +0 -0
- package/lib/commonjs/assets/images/info_icon.png +0 -0
- package/lib/commonjs/assets/images/premium-emptybg.jpeg +0 -0
- package/lib/commonjs/assets/images/rank_1.png +0 -0
- package/lib/commonjs/assets/images/rank_2.png +0 -0
- package/lib/commonjs/assets/images/rank_3.png +0 -0
- package/lib/commonjs/assets/images/rank_4.png +0 -0
- package/lib/commonjs/assets/images/rank_5.png +0 -0
- package/lib/commonjs/index.js +50 -16
- package/lib/commonjs/index.js.map +1 -1
- package/lib/module/acmo/core/helpers/launcher.js +15 -0
- package/lib/module/acmo/core/helpers/launcher.js.map +1 -0
- package/lib/module/acmo/core/helpers/native_methods.js +33 -0
- package/lib/module/acmo/core/helpers/native_methods.js.map +1 -0
- package/lib/module/acmo/core/helpers/numeral.js +14 -0
- package/lib/module/acmo/core/helpers/numeral.js.map +1 -0
- package/lib/module/acmo/core/services/localization_service.js +159 -0
- package/lib/module/acmo/core/services/localization_service.js.map +1 -0
- package/lib/module/acmo/core/storage/storage.js +13 -0
- package/lib/module/acmo/core/storage/storage.js.map +1 -1
- package/lib/module/acmo/modules/dashboard/components/active_offers_button.js +73 -0
- package/lib/module/acmo/modules/dashboard/components/active_offers_button.js.map +1 -0
- package/lib/module/acmo/modules/dashboard/components/custom_card.js +7 -10
- package/lib/module/acmo/modules/dashboard/components/custom_card.js.map +1 -1
- package/lib/module/acmo/modules/dashboard/components/custom_scroller.js +135 -0
- package/lib/module/acmo/modules/dashboard/components/custom_scroller.js.map +1 -0
- package/lib/module/acmo/modules/dashboard/components/custom_shimmer.js +66 -0
- package/lib/module/acmo/modules/dashboard/components/custom_shimmer.js.map +1 -0
- package/lib/module/acmo/modules/dashboard/components/offer_card.js +257 -0
- package/lib/module/acmo/modules/dashboard/components/offer_card.js.map +1 -0
- package/lib/module/acmo/modules/dashboard/components/offer_list_item.js +197 -0
- package/lib/module/acmo/modules/dashboard/components/offer_list_item.js.map +1 -0
- package/lib/module/acmo/modules/dashboard/components/premium_empty_widget.js +82 -0
- package/lib/module/acmo/modules/dashboard/components/premium_empty_widget.js.map +1 -0
- package/lib/module/acmo/modules/dashboard/components/premium_header.js +16 -14
- package/lib/module/acmo/modules/dashboard/components/premium_header.js.map +1 -1
- package/lib/module/acmo/modules/dashboard/components/premium_loading.js +106 -0
- package/lib/module/acmo/modules/dashboard/components/premium_loading.js.map +1 -0
- package/lib/module/acmo/modules/dashboard/repository.js +105 -30
- package/lib/module/acmo/modules/dashboard/repository.js.map +1 -1
- package/lib/module/acmo/modules/dashboard/top_offers.js +86 -64
- package/lib/module/acmo/modules/dashboard/top_offers.js.map +1 -1
- package/lib/module/acmo/modules/localization/localization_context.js +45 -0
- package/lib/module/acmo/modules/localization/localization_context.js.map +1 -0
- package/lib/module/assets/images/angle_up.png +0 -0
- package/lib/module/assets/images/diamond.png +0 -0
- package/lib/module/assets/images/info.png +0 -0
- package/lib/module/assets/images/info_icon.png +0 -0
- package/lib/module/assets/images/premium-emptybg.jpeg +0 -0
- package/lib/module/assets/images/rank_1.png +0 -0
- package/lib/module/assets/images/rank_2.png +0 -0
- package/lib/module/assets/images/rank_3.png +0 -0
- package/lib/module/assets/images/rank_4.png +0 -0
- package/lib/module/assets/images/rank_5.png +0 -0
- package/lib/module/index.js +49 -17
- package/lib/module/index.js.map +1 -1
- package/lib/typescript/commonjs/src/acmo/core/helpers/launcher.d.ts +3 -0
- package/lib/typescript/commonjs/src/acmo/core/helpers/launcher.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/acmo/core/helpers/native_methods.d.ts +6 -0
- package/lib/typescript/commonjs/src/acmo/core/helpers/native_methods.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/acmo/core/helpers/numeral.d.ts +2 -0
- package/lib/typescript/commonjs/src/acmo/core/helpers/numeral.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/acmo/core/services/localization_service.d.ts +18 -0
- package/lib/typescript/commonjs/src/acmo/core/services/localization_service.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/acmo/core/storage/storage.d.ts +1 -0
- package/lib/typescript/commonjs/src/acmo/core/storage/storage.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/acmo/modules/dashboard/components/active_offers_button.d.ts +9 -0
- package/lib/typescript/commonjs/src/acmo/modules/dashboard/components/active_offers_button.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/acmo/modules/dashboard/components/custom_card.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/acmo/modules/dashboard/components/custom_scroller.d.ts +17 -0
- package/lib/typescript/commonjs/src/acmo/modules/dashboard/components/custom_scroller.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/acmo/modules/dashboard/components/custom_shimmer.d.ts +11 -0
- package/lib/typescript/commonjs/src/acmo/modules/dashboard/components/custom_shimmer.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/acmo/modules/dashboard/components/offer_card.d.ts +12 -0
- package/lib/typescript/commonjs/src/acmo/modules/dashboard/components/offer_card.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/acmo/modules/dashboard/components/offer_list_item.d.ts +15 -0
- package/lib/typescript/commonjs/src/acmo/modules/dashboard/components/offer_list_item.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/acmo/modules/dashboard/components/premium_empty_widget.d.ts +7 -0
- package/lib/typescript/commonjs/src/acmo/modules/dashboard/components/premium_empty_widget.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/acmo/modules/dashboard/components/premium_header.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/acmo/modules/dashboard/components/premium_loading.d.ts +8 -0
- package/lib/typescript/commonjs/src/acmo/modules/dashboard/components/premium_loading.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/acmo/modules/dashboard/repository.d.ts +2 -1
- package/lib/typescript/commonjs/src/acmo/modules/dashboard/repository.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/acmo/modules/dashboard/top_offers.d.ts +8 -7
- package/lib/typescript/commonjs/src/acmo/modules/dashboard/top_offers.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/acmo/modules/localization/localization_context.d.ts +14 -0
- package/lib/typescript/commonjs/src/acmo/modules/localization/localization_context.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/index.d.ts +8 -6
- package/lib/typescript/commonjs/src/index.d.ts.map +1 -1
- package/lib/typescript/module/src/acmo/core/helpers/launcher.d.ts +3 -0
- package/lib/typescript/module/src/acmo/core/helpers/launcher.d.ts.map +1 -0
- package/lib/typescript/module/src/acmo/core/helpers/native_methods.d.ts +6 -0
- package/lib/typescript/module/src/acmo/core/helpers/native_methods.d.ts.map +1 -0
- package/lib/typescript/module/src/acmo/core/helpers/numeral.d.ts +2 -0
- package/lib/typescript/module/src/acmo/core/helpers/numeral.d.ts.map +1 -0
- package/lib/typescript/module/src/acmo/core/services/localization_service.d.ts +18 -0
- package/lib/typescript/module/src/acmo/core/services/localization_service.d.ts.map +1 -0
- package/lib/typescript/module/src/acmo/core/storage/storage.d.ts +1 -0
- package/lib/typescript/module/src/acmo/core/storage/storage.d.ts.map +1 -1
- package/lib/typescript/module/src/acmo/modules/dashboard/components/active_offers_button.d.ts +9 -0
- package/lib/typescript/module/src/acmo/modules/dashboard/components/active_offers_button.d.ts.map +1 -0
- package/lib/typescript/module/src/acmo/modules/dashboard/components/custom_card.d.ts.map +1 -1
- package/lib/typescript/module/src/acmo/modules/dashboard/components/custom_scroller.d.ts +17 -0
- package/lib/typescript/module/src/acmo/modules/dashboard/components/custom_scroller.d.ts.map +1 -0
- package/lib/typescript/module/src/acmo/modules/dashboard/components/custom_shimmer.d.ts +11 -0
- package/lib/typescript/module/src/acmo/modules/dashboard/components/custom_shimmer.d.ts.map +1 -0
- package/lib/typescript/module/src/acmo/modules/dashboard/components/offer_card.d.ts +12 -0
- package/lib/typescript/module/src/acmo/modules/dashboard/components/offer_card.d.ts.map +1 -0
- package/lib/typescript/module/src/acmo/modules/dashboard/components/offer_list_item.d.ts +15 -0
- package/lib/typescript/module/src/acmo/modules/dashboard/components/offer_list_item.d.ts.map +1 -0
- package/lib/typescript/module/src/acmo/modules/dashboard/components/premium_empty_widget.d.ts +7 -0
- package/lib/typescript/module/src/acmo/modules/dashboard/components/premium_empty_widget.d.ts.map +1 -0
- package/lib/typescript/module/src/acmo/modules/dashboard/components/premium_header.d.ts.map +1 -1
- package/lib/typescript/module/src/acmo/modules/dashboard/components/premium_loading.d.ts +8 -0
- package/lib/typescript/module/src/acmo/modules/dashboard/components/premium_loading.d.ts.map +1 -0
- package/lib/typescript/module/src/acmo/modules/dashboard/repository.d.ts +2 -1
- package/lib/typescript/module/src/acmo/modules/dashboard/repository.d.ts.map +1 -1
- package/lib/typescript/module/src/acmo/modules/dashboard/top_offers.d.ts +8 -7
- package/lib/typescript/module/src/acmo/modules/dashboard/top_offers.d.ts.map +1 -1
- package/lib/typescript/module/src/acmo/modules/localization/localization_context.d.ts +14 -0
- package/lib/typescript/module/src/acmo/modules/localization/localization_context.d.ts.map +1 -0
- package/lib/typescript/module/src/index.d.ts +8 -6
- package/lib/typescript/module/src/index.d.ts.map +1 -1
- package/package.json +3 -6
- package/readme.md +8 -8
- package/src/acmo/core/helpers/launcher.ts +14 -0
- package/src/acmo/core/helpers/native_methods.ts +43 -0
- package/src/acmo/core/helpers/numeral.ts +14 -0
- package/src/acmo/core/services/localization_service.ts +200 -0
- package/src/acmo/core/storage/storage.ts +14 -0
- package/src/acmo/core/types/types.d.ts +11 -13
- package/src/acmo/modules/dashboard/components/active_offers_button.tsx +62 -0
- package/src/acmo/modules/dashboard/components/custom_card.tsx +5 -8
- package/src/acmo/modules/dashboard/components/custom_scroller.tsx +164 -0
- package/src/acmo/modules/dashboard/components/custom_shimmer.tsx +75 -0
- package/src/acmo/modules/dashboard/components/offer_card.tsx +248 -0
- package/src/acmo/modules/dashboard/components/offer_list_item.tsx +228 -0
- package/src/acmo/modules/dashboard/components/premium_empty_widget.tsx +79 -0
- package/src/acmo/modules/dashboard/components/premium_header.tsx +14 -13
- package/src/acmo/modules/dashboard/components/premium_loading.tsx +72 -0
- package/src/acmo/modules/dashboard/repository.ts +121 -46
- package/src/acmo/modules/dashboard/top_offers.tsx +105 -53
- package/src/acmo/modules/localization/localization_context.tsx +52 -0
- package/src/assets/images/angle_up.png +0 -0
- package/src/assets/images/diamond.png +0 -0
- package/src/assets/images/info.png +0 -0
- package/src/assets/images/info_icon.png +0 -0
- package/src/assets/images/premium-emptybg.jpeg +0 -0
- package/src/assets/images/rank_1.png +0 -0
- package/src/assets/images/rank_2.png +0 -0
- package/src/assets/images/rank_3.png +0 -0
- package/src/assets/images/rank_4.png +0 -0
- package/src/assets/images/rank_5.png +0 -0
- package/src/index.tsx +76 -34
- package/lib/commonjs/acmo/core/marquee.js.map +0 -1
- package/lib/commonjs/acmo/modules/dashboard/components/auto_scroller.js +0 -87
- package/lib/commonjs/acmo/modules/dashboard/components/auto_scroller.js.map +0 -1
- package/lib/commonjs/acmo/modules/dashboard/components/my_games_button.js +0 -48
- package/lib/commonjs/acmo/modules/dashboard/components/my_games_button.js.map +0 -1
- package/lib/commonjs/acmo/modules/dashboard/components/offer_info_section.js +0 -158
- package/lib/commonjs/acmo/modules/dashboard/components/offer_info_section.js.map +0 -1
- package/lib/commonjs/acmo/modules/dashboard/components/premium_option_1.js +0 -180
- package/lib/commonjs/acmo/modules/dashboard/components/premium_option_1.js.map +0 -1
- package/lib/commonjs/acmo/modules/dashboard/components/premium_option_2.js +0 -102
- package/lib/commonjs/acmo/modules/dashboard/components/premium_option_2.js.map +0 -1
- package/lib/commonjs/acmo/modules/dashboard/components/premium_option_3.js +0 -41
- package/lib/commonjs/acmo/modules/dashboard/components/premium_option_3.js.map +0 -1
- package/lib/commonjs/acmo/modules/dashboard/components/premium_option_4.js +0 -214
- package/lib/commonjs/acmo/modules/dashboard/components/premium_option_4.js.map +0 -1
- package/lib/commonjs/i18n.js +0 -112
- package/lib/commonjs/i18n.js.map +0 -1
- package/lib/module/acmo/core/marquee.js +0 -54
- package/lib/module/acmo/core/marquee.js.map +0 -1
- package/lib/module/acmo/modules/dashboard/components/auto_scroller.js +0 -81
- package/lib/module/acmo/modules/dashboard/components/auto_scroller.js.map +0 -1
- package/lib/module/acmo/modules/dashboard/components/my_games_button.js +0 -43
- package/lib/module/acmo/modules/dashboard/components/my_games_button.js.map +0 -1
- package/lib/module/acmo/modules/dashboard/components/offer_info_section.js +0 -153
- package/lib/module/acmo/modules/dashboard/components/offer_info_section.js.map +0 -1
- package/lib/module/acmo/modules/dashboard/components/premium_option_1.js +0 -174
- package/lib/module/acmo/modules/dashboard/components/premium_option_1.js.map +0 -1
- package/lib/module/acmo/modules/dashboard/components/premium_option_2.js +0 -97
- package/lib/module/acmo/modules/dashboard/components/premium_option_2.js.map +0 -1
- package/lib/module/acmo/modules/dashboard/components/premium_option_3.js +0 -36
- package/lib/module/acmo/modules/dashboard/components/premium_option_3.js.map +0 -1
- package/lib/module/acmo/modules/dashboard/components/premium_option_4.js +0 -209
- package/lib/module/acmo/modules/dashboard/components/premium_option_4.js.map +0 -1
- package/lib/module/i18n.js +0 -107
- package/lib/module/i18n.js.map +0 -1
- package/lib/typescript/commonjs/src/acmo/core/marquee.d.ts +0 -11
- package/lib/typescript/commonjs/src/acmo/core/marquee.d.ts.map +0 -1
- package/lib/typescript/commonjs/src/acmo/modules/dashboard/components/auto_scroller.d.ts +0 -10
- package/lib/typescript/commonjs/src/acmo/modules/dashboard/components/auto_scroller.d.ts.map +0 -1
- package/lib/typescript/commonjs/src/acmo/modules/dashboard/components/my_games_button.d.ts +0 -8
- package/lib/typescript/commonjs/src/acmo/modules/dashboard/components/my_games_button.d.ts.map +0 -1
- package/lib/typescript/commonjs/src/acmo/modules/dashboard/components/offer_info_section.d.ts +0 -11
- package/lib/typescript/commonjs/src/acmo/modules/dashboard/components/offer_info_section.d.ts.map +0 -1
- package/lib/typescript/commonjs/src/acmo/modules/dashboard/components/premium_option_1.d.ts +0 -9
- package/lib/typescript/commonjs/src/acmo/modules/dashboard/components/premium_option_1.d.ts.map +0 -1
- package/lib/typescript/commonjs/src/acmo/modules/dashboard/components/premium_option_2.d.ts +0 -9
- package/lib/typescript/commonjs/src/acmo/modules/dashboard/components/premium_option_2.d.ts.map +0 -1
- package/lib/typescript/commonjs/src/acmo/modules/dashboard/components/premium_option_3.d.ts +0 -9
- package/lib/typescript/commonjs/src/acmo/modules/dashboard/components/premium_option_3.d.ts.map +0 -1
- package/lib/typescript/commonjs/src/acmo/modules/dashboard/components/premium_option_4.d.ts +0 -9
- package/lib/typescript/commonjs/src/acmo/modules/dashboard/components/premium_option_4.d.ts.map +0 -1
- package/lib/typescript/commonjs/src/i18n.d.ts +0 -3
- package/lib/typescript/commonjs/src/i18n.d.ts.map +0 -1
- package/lib/typescript/module/src/acmo/core/marquee.d.ts +0 -11
- package/lib/typescript/module/src/acmo/core/marquee.d.ts.map +0 -1
- package/lib/typescript/module/src/acmo/modules/dashboard/components/auto_scroller.d.ts +0 -10
- package/lib/typescript/module/src/acmo/modules/dashboard/components/auto_scroller.d.ts.map +0 -1
- package/lib/typescript/module/src/acmo/modules/dashboard/components/my_games_button.d.ts +0 -8
- package/lib/typescript/module/src/acmo/modules/dashboard/components/my_games_button.d.ts.map +0 -1
- package/lib/typescript/module/src/acmo/modules/dashboard/components/offer_info_section.d.ts +0 -11
- package/lib/typescript/module/src/acmo/modules/dashboard/components/offer_info_section.d.ts.map +0 -1
- package/lib/typescript/module/src/acmo/modules/dashboard/components/premium_option_1.d.ts +0 -9
- package/lib/typescript/module/src/acmo/modules/dashboard/components/premium_option_1.d.ts.map +0 -1
- package/lib/typescript/module/src/acmo/modules/dashboard/components/premium_option_2.d.ts +0 -9
- package/lib/typescript/module/src/acmo/modules/dashboard/components/premium_option_2.d.ts.map +0 -1
- package/lib/typescript/module/src/acmo/modules/dashboard/components/premium_option_3.d.ts +0 -9
- package/lib/typescript/module/src/acmo/modules/dashboard/components/premium_option_3.d.ts.map +0 -1
- package/lib/typescript/module/src/acmo/modules/dashboard/components/premium_option_4.d.ts +0 -9
- package/lib/typescript/module/src/acmo/modules/dashboard/components/premium_option_4.d.ts.map +0 -1
- package/lib/typescript/module/src/i18n.d.ts +0 -3
- package/lib/typescript/module/src/i18n.d.ts.map +0 -1
- package/src/acmo/core/marquee.tsx +0 -62
- package/src/acmo/modules/dashboard/components/auto_scroller.tsx +0 -85
- package/src/acmo/modules/dashboard/components/my_games_button.tsx +0 -40
- package/src/acmo/modules/dashboard/components/offer_info_section.tsx +0 -139
- package/src/acmo/modules/dashboard/components/premium_option_1.tsx +0 -163
- package/src/acmo/modules/dashboard/components/premium_option_2.tsx +0 -100
- package/src/acmo/modules/dashboard/components/premium_option_3.tsx +0 -42
- package/src/acmo/modules/dashboard/components/premium_option_4.tsx +0 -185
- package/src/i18n.ts +0 -115
@@ -0,0 +1,195 @@
|
|
1
|
+
import UIKit
|
2
|
+
@preconcurrency import WebKit
|
3
|
+
|
4
|
+
class AcmoWebViewController: UIViewController, WKNavigationDelegate, WKScriptMessageHandler, WKUIDelegate {
|
5
|
+
|
6
|
+
var webView: WKWebView!
|
7
|
+
var initialURL: URL
|
8
|
+
private var hasLoadedWithSkipParameter = false
|
9
|
+
|
10
|
+
private let internalDomains: [String] = ["sdk.tyrads.com", "acmo.in"]
|
11
|
+
|
12
|
+
private func log(_ message: String) {
|
13
|
+
NSLog("AcmoWebViewController: \(message)")
|
14
|
+
}
|
15
|
+
|
16
|
+
init(url: URL) {
|
17
|
+
self.initialURL = url
|
18
|
+
super.init(nibName: nil, bundle: nil)
|
19
|
+
}
|
20
|
+
|
21
|
+
required init?(coder: NSCoder) {
|
22
|
+
fatalError("init(coder:) has not been implemented")
|
23
|
+
}
|
24
|
+
|
25
|
+
override func viewDidLoad() {
|
26
|
+
super.viewDidLoad()
|
27
|
+
log("viewDidLoad called")
|
28
|
+
|
29
|
+
let config = WKWebViewConfiguration()
|
30
|
+
let userContentController = WKUserContentController()
|
31
|
+
|
32
|
+
userContentController.add(self, name: "clickHandler")
|
33
|
+
config.userContentController = userContentController
|
34
|
+
|
35
|
+
webView = WKWebView(frame: self.view.bounds, configuration: config)
|
36
|
+
webView.navigationDelegate = self
|
37
|
+
webView.uiDelegate = self
|
38
|
+
self.view.addSubview(webView)
|
39
|
+
|
40
|
+
webView.translatesAutoresizingMaskIntoConstraints = false
|
41
|
+
NSLayoutConstraint.activate([
|
42
|
+
webView.topAnchor.constraint(equalTo: self.view.topAnchor),
|
43
|
+
webView.bottomAnchor.constraint(equalTo: self.view.bottomAnchor),
|
44
|
+
webView.leadingAnchor.constraint(equalTo: self.view.leadingAnchor),
|
45
|
+
webView.trailingAnchor.constraint(equalTo: self.view.trailingAnchor)
|
46
|
+
])
|
47
|
+
|
48
|
+
if #available(iOS 16.4, *) {
|
49
|
+
webView.isInspectable = true
|
50
|
+
}
|
51
|
+
|
52
|
+
// webView.load(URLRequest(url: initialURL))
|
53
|
+
loadURL()
|
54
|
+
log("WebView loaded URL: \(initialURL.absoluteString)")
|
55
|
+
}
|
56
|
+
private func loadURL() {
|
57
|
+
var components = URLComponents(url: initialURL, resolvingAgainstBaseURL: false)
|
58
|
+
let skipUserUpdate = Tyrads.instance.getSkipUserUpdate()
|
59
|
+
let skipValue = skipUserUpdate ? "true" : "false"
|
60
|
+
|
61
|
+
components?.queryItems?.removeAll { $0.name == "skipUserInfo" }
|
62
|
+
components?.queryItems?.append(URLQueryItem(name: "skipUserInfo", value: skipValue))
|
63
|
+
|
64
|
+
if let updatedURL = components?.url {
|
65
|
+
log("Loading URL with skipUserInfo=\(skipValue): \(updatedURL.absoluteString)")
|
66
|
+
let request = URLRequest(url: updatedURL)
|
67
|
+
webView.load(request)
|
68
|
+
hasLoadedWithSkipParameter = true
|
69
|
+
} else {
|
70
|
+
log("Failed to create updated URL, loading original")
|
71
|
+
webView.load(URLRequest(url: initialURL))
|
72
|
+
}
|
73
|
+
}
|
74
|
+
|
75
|
+
public func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
|
76
|
+
guard message.name == "clickHandler",
|
77
|
+
let messageDict = message.body as? [String: Any] else {
|
78
|
+
log("Received unknown message or invalid format.")
|
79
|
+
return
|
80
|
+
}
|
81
|
+
|
82
|
+
log("Message data from webview: \(messageDict)")
|
83
|
+
|
84
|
+
if let action = messageDict["action"] as? String {
|
85
|
+
switch action {
|
86
|
+
case "closeWebView":
|
87
|
+
log("Action: closeWebView received. Dismissing view controller.")
|
88
|
+
DispatchQueue.main.async {
|
89
|
+
self.dismiss(animated: true) {
|
90
|
+
self.log("ViewController dismissed successfully.")
|
91
|
+
}
|
92
|
+
}
|
93
|
+
|
94
|
+
case "changeLanguage":
|
95
|
+
if let langCode = messageDict["value"] as? String {
|
96
|
+
log("Action: changeLanguage received. Language Code: \(langCode)")
|
97
|
+
Task{
|
98
|
+
await Tyrads.instance.changeLanguage(langCode)
|
99
|
+
}
|
100
|
+
// let value = UserDefaults.standard.string(forKey: "locale")
|
101
|
+
}
|
102
|
+
|
103
|
+
default:
|
104
|
+
log("Unknown command: \(action)")
|
105
|
+
}
|
106
|
+
}
|
107
|
+
}
|
108
|
+
|
109
|
+
public func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
|
110
|
+
if let url = webView.url {
|
111
|
+
print("Page loaded successfully. Final URL: \(url.absoluteString)")
|
112
|
+
}
|
113
|
+
|
114
|
+
let js = """
|
115
|
+
window.addEventListener('message', (event) => {
|
116
|
+
try {
|
117
|
+
// Safely parse JSON if event.data is a string, otherwise use directly
|
118
|
+
const message = typeof event.data === 'string'
|
119
|
+
? JSON.parse(event.data)
|
120
|
+
: event.data;
|
121
|
+
if (message) {
|
122
|
+
// Post the message to the native side using the registered handler name
|
123
|
+
window.webkit.messageHandlers.clickHandler.postMessage(message);
|
124
|
+
}
|
125
|
+
} catch (error) {
|
126
|
+
console.error('Error handling message from WebView:', error);
|
127
|
+
}
|
128
|
+
});
|
129
|
+
"""
|
130
|
+
|
131
|
+
webView.evaluateJavaScript(js) { _, error in
|
132
|
+
if let error = error {
|
133
|
+
self.log("JavaScript injection failed: \(error.localizedDescription)")
|
134
|
+
} else {
|
135
|
+
self.log("JavaScript listener injected successfully.")
|
136
|
+
}
|
137
|
+
}
|
138
|
+
}
|
139
|
+
|
140
|
+
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
|
141
|
+
|
142
|
+
guard let url = navigationAction.request.url, let host = url.host else {
|
143
|
+
decisionHandler(.cancel)
|
144
|
+
return
|
145
|
+
}
|
146
|
+
|
147
|
+
if host == "about:blank" {
|
148
|
+
decisionHandler(.allow)
|
149
|
+
return
|
150
|
+
}
|
151
|
+
|
152
|
+
let isInternalDomain = internalDomains.contains(where: { host.hasSuffix($0) })
|
153
|
+
|
154
|
+
if host != webView.url?.host && !isInternalDomain {
|
155
|
+
log("Intercepted external URL via navigation action: \(url.absoluteString). Opening externally.")
|
156
|
+
UIApplication.shared.open(url, options: [:], completionHandler: nil)
|
157
|
+
decisionHandler(.cancel)
|
158
|
+
return
|
159
|
+
}
|
160
|
+
|
161
|
+
log("Allowed navigation to: \(url.absoluteString)")
|
162
|
+
decisionHandler(.allow)
|
163
|
+
}
|
164
|
+
|
165
|
+
func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? {
|
166
|
+
|
167
|
+
guard let url = navigationAction.request.url else {
|
168
|
+
return nil
|
169
|
+
}
|
170
|
+
|
171
|
+
let isInternalDomain = internalDomains.contains(where: { url.host?.hasSuffix($0) ?? false })
|
172
|
+
|
173
|
+
if !isInternalDomain {
|
174
|
+
log("Intercepted new window via UI delegate: \(url.absoluteString). Opening externally.")
|
175
|
+
UIApplication.shared.open(url, options: [:], completionHandler: nil)
|
176
|
+
return nil
|
177
|
+
}
|
178
|
+
|
179
|
+
log("Allowed new window for internal domain: \(url.absoluteString)")
|
180
|
+
return nil
|
181
|
+
}
|
182
|
+
|
183
|
+
public func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) {
|
184
|
+
log("WebView navigation failed with error: \(error.localizedDescription)")
|
185
|
+
}
|
186
|
+
|
187
|
+
public func webView(_ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: Error) {
|
188
|
+
log("WebView provisional navigation failed with error: \(error.localizedDescription)")
|
189
|
+
}
|
190
|
+
|
191
|
+
deinit {
|
192
|
+
webView.configuration.userContentController.removeScriptMessageHandler(forName: "clickHandler")
|
193
|
+
log("AcmoWebViewController deinitialized. Message handler removed.")
|
194
|
+
}
|
195
|
+
}
|
@@ -0,0 +1,29 @@
|
|
1
|
+
//
|
2
|
+
// AcmoKeyNames.swift
|
3
|
+
// Pods
|
4
|
+
//
|
5
|
+
// Created by Basharat Mehdi on 30/09/25.
|
6
|
+
//
|
7
|
+
|
8
|
+
struct AcmoKeyNames {
|
9
|
+
static let PREFIX = "acmo_tyrads_sdk_"
|
10
|
+
|
11
|
+
static let INTRODUCTION_COMPLETE = "\(PREFIX)introduction_complete"
|
12
|
+
static let LOGGED_IN = "\(PREFIX)logged_in"
|
13
|
+
static let USER_ID = "\(PREFIX)user_id"
|
14
|
+
static let API_KEY = "\(PREFIX)api_key"
|
15
|
+
static let API_SECRET = "\(PREFIX)api_secret"
|
16
|
+
static let ENCRYPTION_KEY = "\(PREFIX)encryption_key"
|
17
|
+
static let PLAY_INTEGRITY_TOKEN = "\(PREFIX)play_integrity_token"
|
18
|
+
static let USERNAME = "\(PREFIX)username"
|
19
|
+
static let FCM_TOKEN = "\(PREFIX)fcm_token"
|
20
|
+
static let USER_DATA = "\(PREFIX)user_data"
|
21
|
+
static let ADVERTISING_ID = "\(PREFIX)advertising_id"
|
22
|
+
static let TRACKED_CAMPAIGNS_FOR_USER_ID = "\(PREFIX)tracked_campaigns_for_user_id_"
|
23
|
+
static let PLAY_PER_MINUTE_PACKAGES = "\(PREFIX)play_per_minute_packages"
|
24
|
+
static let PRIVACY_ACCEPTED_FOR_USER_ID = "\(PREFIX)privacy_accepted_for_user_id_"
|
25
|
+
static let SKIP_FOR_USER_ID = "\(PREFIX)skip_for_user_id_"
|
26
|
+
static let CUSTOM_AD_ID = "\(PREFIX)custom_ad_id"
|
27
|
+
static let LANGUAGE = "\(PREFIX)language"
|
28
|
+
static let TOKEN = "\(PREFIX)token"
|
29
|
+
}
|
@@ -0,0 +1,55 @@
|
|
1
|
+
//
|
2
|
+
// ColorExtension.swift
|
3
|
+
// Pods
|
4
|
+
//
|
5
|
+
// Created by Basharat Mehdi on 01/10/25.
|
6
|
+
//
|
7
|
+
import SwiftUI
|
8
|
+
import UIKit
|
9
|
+
|
10
|
+
extension Color {
|
11
|
+
init(hex: String) {
|
12
|
+
let hex = hex.trimmingCharacters(in: CharacterSet.alphanumerics.inverted)
|
13
|
+
var int: UInt64 = 0
|
14
|
+
Scanner(string: hex).scanHexInt64(&int)
|
15
|
+
let r, g, b: UInt64
|
16
|
+
switch hex.count {
|
17
|
+
case 3:
|
18
|
+
(r, g, b) = ((int >> 8) * 17, ((int >> 4) & 0xF) * 17, (int & 0xF) * 17)
|
19
|
+
case 6:
|
20
|
+
(r, g, b) = (int >> 16, (int >> 8) & 0xFF, int & 0xFF)
|
21
|
+
default:
|
22
|
+
(r, g, b) = (0, 0, 0)
|
23
|
+
}
|
24
|
+
self.init(
|
25
|
+
.sRGB,
|
26
|
+
red: Double(r) / 255,
|
27
|
+
green: Double(g) / 255,
|
28
|
+
blue: Double(b) / 255,
|
29
|
+
opacity: 1
|
30
|
+
)
|
31
|
+
}
|
32
|
+
}
|
33
|
+
|
34
|
+
extension UIColor {
|
35
|
+
convenience init(hex: String, alpha: CGFloat = 1.0) {
|
36
|
+
var hexSanitized = hex.trimmingCharacters(in: .whitespacesAndNewlines)
|
37
|
+
hexSanitized = hexSanitized.hasPrefix("#") ? String(hexSanitized.dropFirst()) : hexSanitized
|
38
|
+
|
39
|
+
var rgb: UInt64 = 0
|
40
|
+
Scanner(string: hexSanitized).scanHexInt64(&rgb)
|
41
|
+
|
42
|
+
let length = hexSanitized.count
|
43
|
+
let r, g, b: CGFloat
|
44
|
+
|
45
|
+
if length == 6 {
|
46
|
+
r = CGFloat((rgb & 0xFF0000) >> 16) / 255.0
|
47
|
+
g = CGFloat((rgb & 0x00FF00) >> 8) / 255.0
|
48
|
+
b = CGFloat(rgb & 0x0000FF) / 255.0
|
49
|
+
} else {
|
50
|
+
r = 0; g = 0; b = 0
|
51
|
+
}
|
52
|
+
|
53
|
+
self.init(red: r, green: g, blue: b, alpha: alpha)
|
54
|
+
}
|
55
|
+
}
|
@@ -0,0 +1,175 @@
|
|
1
|
+
//
|
2
|
+
// LocalizationService.swift
|
3
|
+
// Pods
|
4
|
+
//
|
5
|
+
// Created by Basharat Mehdi on 02/10/25.
|
6
|
+
//
|
7
|
+
|
8
|
+
import Foundation
|
9
|
+
|
10
|
+
final class LocalizationService {
|
11
|
+
|
12
|
+
static let shared = LocalizationService()
|
13
|
+
private init() {}
|
14
|
+
|
15
|
+
private var translations: [String: Any] = [:]
|
16
|
+
private var supportedLocales: [String] = []
|
17
|
+
|
18
|
+
private let userDefaults = UserDefaults.standard
|
19
|
+
private let fallbackLocale = "en"
|
20
|
+
|
21
|
+
// MARK: - Public Interface
|
22
|
+
func initialize(locale: String) async {
|
23
|
+
await loadTranslations(locale: locale)
|
24
|
+
}
|
25
|
+
|
26
|
+
func changeLanguage(locale: String, force: Bool = false) async {
|
27
|
+
await loadTranslations(locale: locale, force: force)
|
28
|
+
}
|
29
|
+
|
30
|
+
func translate(_ key: String, args: [String: String]? = nil) -> String {
|
31
|
+
let keys = key.split(separator: ".").map { String($0) }
|
32
|
+
var current: Any? = translations
|
33
|
+
|
34
|
+
for k in keys {
|
35
|
+
if let dict = current as? [String: Any], let next = dict[k] {
|
36
|
+
current = next
|
37
|
+
} else {
|
38
|
+
return key
|
39
|
+
}
|
40
|
+
}
|
41
|
+
|
42
|
+
guard var result = current as? String else {
|
43
|
+
return key
|
44
|
+
}
|
45
|
+
|
46
|
+
if let args = args {
|
47
|
+
for (argKey, argValue) in args {
|
48
|
+
let regex = try? NSRegularExpression(pattern: "\\{\(argKey)\\}", options: .caseInsensitive)
|
49
|
+
if let regex = regex {
|
50
|
+
result = regex.stringByReplacingMatches(in: result, range: NSRange(result.startIndex..., in: result), withTemplate: argValue)
|
51
|
+
}
|
52
|
+
}
|
53
|
+
}
|
54
|
+
|
55
|
+
return result
|
56
|
+
}
|
57
|
+
|
58
|
+
// MARK: - Private Loading Methods
|
59
|
+
private func loadTranslations(locale: String, force: Bool = false) async {
|
60
|
+
let hasUpdate = await checkForUpdate(locale: locale, force: force)
|
61
|
+
|
62
|
+
if !hasUpdate {
|
63
|
+
if let cachedData = userDefaults.data(forKey: "translations_\(locale)"),
|
64
|
+
let json = try? JSONSerialization.jsonObject(with: cachedData, options: []) as? [String: Any] {
|
65
|
+
translations = json
|
66
|
+
return
|
67
|
+
}
|
68
|
+
}
|
69
|
+
|
70
|
+
await fetchTranslations(locale: locale, force: force)
|
71
|
+
}
|
72
|
+
|
73
|
+
private func fetchTranslations(locale: String, force: Bool) async {
|
74
|
+
var currentLocale = locale
|
75
|
+
if !supportedLocales.contains(currentLocale) {
|
76
|
+
currentLocale = fallbackLocale
|
77
|
+
}
|
78
|
+
|
79
|
+
|
80
|
+
let urlString = "\(AcmoConfig.BASE_URL)translations/\(currentLocale)?force=\(force)&format=nested"
|
81
|
+
guard let url = URL(string: urlString) else {
|
82
|
+
print("LocalizationService: Invalid URL for translations")
|
83
|
+
return
|
84
|
+
}
|
85
|
+
|
86
|
+
var request = URLRequest(url: url)
|
87
|
+
request.httpMethod = "GET"
|
88
|
+
request.setTyradsHeaders(with: Tyrads.instance)
|
89
|
+
|
90
|
+
do {
|
91
|
+
let (data, response) = try await URLSession.shared.data(for: request)
|
92
|
+
|
93
|
+
guard let httpResponse = response as? HTTPURLResponse, httpResponse.statusCode == 200 else {
|
94
|
+
print("LocalizationService: Failed to load translations: \((response as? HTTPURLResponse)?.statusCode ?? -1)")
|
95
|
+
return
|
96
|
+
}
|
97
|
+
|
98
|
+
if let jsonResponse = try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] {
|
99
|
+
translations = jsonResponse
|
100
|
+
|
101
|
+
userDefaults.set(data, forKey: "translations_\(currentLocale)")
|
102
|
+
} else {
|
103
|
+
print("LocalizationService: Failed to parse JSON response.")
|
104
|
+
}
|
105
|
+
} catch {
|
106
|
+
print("LocalizationService: Network error fetching translations: \(error)")
|
107
|
+
}
|
108
|
+
}
|
109
|
+
|
110
|
+
private func checkForUpdate(locale: String, force: Bool) async -> Bool {
|
111
|
+
let urlString = "\(AcmoConfig.BASE_URL)translations/version?force=\(force)"
|
112
|
+
guard let url = URL(string: urlString) else {
|
113
|
+
print("LocalizationService: Invalid URL for version check")
|
114
|
+
return false
|
115
|
+
}
|
116
|
+
var request = URLRequest(url: url)
|
117
|
+
request.httpMethod = "GET"
|
118
|
+
request.setTyradsHeaders(with: Tyrads.instance)
|
119
|
+
|
120
|
+
do {
|
121
|
+
let (data, response) = try await URLSession.shared.data(for: request)
|
122
|
+
|
123
|
+
guard (response as? HTTPURLResponse)?.statusCode == 200 else {
|
124
|
+
print("LocalizationService: Failed to get version check response.")
|
125
|
+
return false
|
126
|
+
}
|
127
|
+
|
128
|
+
struct VersionData: Decodable {
|
129
|
+
let code: String
|
130
|
+
let sha256: String
|
131
|
+
}
|
132
|
+
struct VersionResponse: Decodable {
|
133
|
+
let data: [VersionData]
|
134
|
+
}
|
135
|
+
|
136
|
+
let jsonResponse = try JSONDecoder().decode(VersionResponse.self, from: data)
|
137
|
+
let versionData = jsonResponse.data
|
138
|
+
|
139
|
+
supportedLocales = versionData.map { $0.code }
|
140
|
+
|
141
|
+
guard supportedLocales.contains(locale) else {
|
142
|
+
return false
|
143
|
+
}
|
144
|
+
|
145
|
+
guard let currentLocaleVersion = versionData.first(where: { $0.code == locale }) else {
|
146
|
+
return false
|
147
|
+
}
|
148
|
+
|
149
|
+
let currentSha256 = currentLocaleVersion.sha256
|
150
|
+
let cachedVersion = userDefaults.string(forKey: "cached_version_\(locale)")
|
151
|
+
|
152
|
+
if currentSha256 != cachedVersion {
|
153
|
+
userDefaults.set(currentSha256, forKey: "cached_version_\(locale)")
|
154
|
+
return true
|
155
|
+
}
|
156
|
+
|
157
|
+
} catch {
|
158
|
+
print("LocalizationService: Error checking for update: \(error)")
|
159
|
+
}
|
160
|
+
|
161
|
+
return false
|
162
|
+
}
|
163
|
+
}
|
164
|
+
|
165
|
+
extension URLRequest {
|
166
|
+
mutating func setTyradsHeaders(with sdk: Tyrads) {
|
167
|
+
self.setValue("application/json", forHTTPHeaderField: "Content-Type")
|
168
|
+
|
169
|
+
self.setValue(sdk.apiKey, forHTTPHeaderField: "X-API-Key")
|
170
|
+
self.setValue(sdk.apiSecret, forHTTPHeaderField: "X-API-Secret")
|
171
|
+
|
172
|
+
self.setValue(AcmoConfig.SDK_PLATFORM, forHTTPHeaderField: "X-SDK-Platform")
|
173
|
+
self.setValue(AcmoConfig.SDK_VERSION, forHTTPHeaderField: "X-SDK-Version")
|
174
|
+
}
|
175
|
+
}
|
@@ -0,0 +1,160 @@
|
|
1
|
+
//
|
2
|
+
// device_details.swift
|
3
|
+
// Pods
|
4
|
+
//
|
5
|
+
// Created by Basharat Mehdi on 01/08/25.
|
6
|
+
//
|
7
|
+
import UIKit
|
8
|
+
import Foundation
|
9
|
+
|
10
|
+
func getDeviceDetails() -> [String: Any] {
|
11
|
+
var fd = [String: Any]()
|
12
|
+
|
13
|
+
let device = UIDevice.current
|
14
|
+
let bundle = Bundle.main
|
15
|
+
let locale = Locale.current
|
16
|
+
|
17
|
+
// Device basic info
|
18
|
+
fd["deviceId"] = device.identifierForVendor?.uuidString ?? "Unknown"
|
19
|
+
fd["device"] = device.model.lowercased().contains("ipad") ? "iPad" : "iPhone"
|
20
|
+
fd["deviceName"] = device.name
|
21
|
+
fd["brand"] = "Apple"
|
22
|
+
fd["model"] = device.model
|
23
|
+
fd["baseOs"] = device.systemName
|
24
|
+
fd["releaseVersion"] = device.systemVersion
|
25
|
+
fd["modelName"] = getModelName()
|
26
|
+
|
27
|
+
fd["product"] = "Darwin"
|
28
|
+
fd["platform"] = "iOS"
|
29
|
+
fd["apiVersion"] = AcmoConfig.API_VERSION
|
30
|
+
fd["sdkVersion"] = AcmoConfig.SDK_VERSION
|
31
|
+
fd["sdkPlatform"] = AcmoConfig.SDK_PLATFORM
|
32
|
+
|
33
|
+
// App info
|
34
|
+
fd["version"] = bundle.infoDictionary?["CFBundleShortVersionString"] as? String ?? "Unknown"
|
35
|
+
fd["build"] = bundle.infoDictionary?["CFBundleVersion"] as? String ?? "Unknown"
|
36
|
+
fd["package"] = bundle.bundleIdentifier ?? "Unknown"
|
37
|
+
fd["installerStore"] = "App Store"
|
38
|
+
|
39
|
+
fd["osLang"] = locale.languageCode ?? "en"
|
40
|
+
|
41
|
+
// security and virtual check
|
42
|
+
fd["rooted"] = isJailBroken()
|
43
|
+
fd["virtual"] = isRunningOnSimulator()
|
44
|
+
|
45
|
+
return fd
|
46
|
+
}
|
47
|
+
|
48
|
+
func isRunningOnSimulator() -> Bool {
|
49
|
+
return ProcessInfo().environment["SIMULATOR_DEVICE_NAME"] != nil
|
50
|
+
}
|
51
|
+
|
52
|
+
func isJailBroken() -> Bool {
|
53
|
+
#if targetEnvironment(simulator)
|
54
|
+
return false
|
55
|
+
#else
|
56
|
+
let paths = [
|
57
|
+
"/Applications/Cydia.app",
|
58
|
+
"/Library/MobileSubstrate/MobileSubstrate.dylib",
|
59
|
+
"/bin/bash",
|
60
|
+
"/usr/sbin/sshd",
|
61
|
+
"/etc/apt",
|
62
|
+
"/private/var/lib/apt/"
|
63
|
+
]
|
64
|
+
for path in paths {
|
65
|
+
if FileManager.default.fileExists(atPath: path) {
|
66
|
+
return true
|
67
|
+
}
|
68
|
+
}
|
69
|
+
return false
|
70
|
+
#endif
|
71
|
+
}
|
72
|
+
|
73
|
+
func deviceIdentifier() -> String {
|
74
|
+
#if targetEnvironment(simulator)
|
75
|
+
if let simIdentifier = ProcessInfo().environment["SIMULATOR_MODEL_IDENTIFIER"] {
|
76
|
+
return simIdentifier
|
77
|
+
}
|
78
|
+
return "Simulator"
|
79
|
+
#else
|
80
|
+
var systemInfo = utsname()
|
81
|
+
uname(&systemInfo)
|
82
|
+
let machineMirror = Mirror(reflecting: systemInfo.machine)
|
83
|
+
let identifier = machineMirror.children.reduce("") { identifier, element in
|
84
|
+
guard let value = element.value as? Int8, value != 0 else { return identifier }
|
85
|
+
return identifier + String(UnicodeScalar(UInt8(value)))
|
86
|
+
}
|
87
|
+
return identifier
|
88
|
+
#endif
|
89
|
+
}
|
90
|
+
|
91
|
+
|
92
|
+
func getModelName() -> String {
|
93
|
+
let identifier = deviceIdentifier()
|
94
|
+
|
95
|
+
let iphoneModelMapping: [String: String] = [
|
96
|
+
"iPhone1,1": "iPhone",
|
97
|
+
"iPhone1,2": "iPhone 3G",
|
98
|
+
"iPhone2,1": "iPhone 3GS",
|
99
|
+
"iPhone3,1": "iPhone 4",
|
100
|
+
"iPhone3,2": "iPhone 4 GSM Rev A",
|
101
|
+
"iPhone3,3": "iPhone 4 CDMA",
|
102
|
+
"iPhone4,1": "iPhone 4S",
|
103
|
+
"iPhone5,1": "iPhone 5 (GSM)",
|
104
|
+
"iPhone5,2": "iPhone 5 (GSM+CDMA)",
|
105
|
+
"iPhone5,3": "iPhone 5C (GSM)",
|
106
|
+
"iPhone5,4": "iPhone 5C (Global)",
|
107
|
+
"iPhone6,1": "iPhone 5S (GSM)",
|
108
|
+
"iPhone6,2": "iPhone 5S (Global)",
|
109
|
+
"iPhone7,1": "iPhone 6 Plus",
|
110
|
+
"iPhone7,2": "iPhone 6",
|
111
|
+
"iPhone8,1": "iPhone 6s",
|
112
|
+
"iPhone8,2": "iPhone 6s Plus",
|
113
|
+
"iPhone8,4": "iPhone SE (1st Gen)",
|
114
|
+
"iPhone9,1": "iPhone 7",
|
115
|
+
"iPhone9,2": "iPhone 7 Plus",
|
116
|
+
"iPhone9,3": "iPhone 7",
|
117
|
+
"iPhone9,4": "iPhone 7 Plus",
|
118
|
+
"iPhone10,1": "iPhone 8",
|
119
|
+
"iPhone10,2": "iPhone 8 Plus",
|
120
|
+
"iPhone10,3": "iPhone X Global",
|
121
|
+
"iPhone10,4": "iPhone 8",
|
122
|
+
"iPhone10,5": "iPhone 8 Plus",
|
123
|
+
"iPhone10,6": "iPhone X GSM",
|
124
|
+
"iPhone11,2": "iPhone XS",
|
125
|
+
"iPhone11,4": "iPhone XS Max",
|
126
|
+
"iPhone11,6": "iPhone XS Max Global",
|
127
|
+
"iPhone11,8": "iPhone XR",
|
128
|
+
"iPhone12,1": "iPhone 11",
|
129
|
+
"iPhone12,3": "iPhone 11 Pro",
|
130
|
+
"iPhone12,5": "iPhone 11 Pro Max",
|
131
|
+
"iPhone12,8": "iPhone SE (2nd Gen)",
|
132
|
+
"iPhone13,1": "iPhone 12 Mini",
|
133
|
+
"iPhone13,2": "iPhone 12",
|
134
|
+
"iPhone13,3": "iPhone 12 Pro",
|
135
|
+
"iPhone13,4": "iPhone 12 Pro Max",
|
136
|
+
"iPhone14,2": "iPhone 13 Pro",
|
137
|
+
"iPhone14,3": "iPhone 13 Pro Max",
|
138
|
+
"iPhone14,4": "iPhone 13 Mini",
|
139
|
+
"iPhone14,5": "iPhone 13",
|
140
|
+
"iPhone14,6": "iPhone SE (3rd Gen)",
|
141
|
+
"iPhone14,7": "iPhone 14",
|
142
|
+
"iPhone14,8": "iPhone 14 Plus",
|
143
|
+
"iPhone15,2": "iPhone 14 Pro",
|
144
|
+
"iPhone15,3": "iPhone 14 Pro Max",
|
145
|
+
"iPhone15,4": "iPhone 15",
|
146
|
+
"iPhone15,5": "iPhone 15 Plus",
|
147
|
+
"iPhone16,1": "iPhone 15 Pro",
|
148
|
+
"iPhone16,2": "iPhone 15 Pro Max",
|
149
|
+
"iPhone17,1": "iPhone 16 Pro",
|
150
|
+
"iPhone17,2": "iPhone 16 Pro Max",
|
151
|
+
"iPhone17,3": "iPhone 16",
|
152
|
+
"iPhone17,4": "iPhone 16 Plus",
|
153
|
+
"iPhone17,5": "iPhone 16e",
|
154
|
+
"iPhone18,1": "iPhone 17 Pro",
|
155
|
+
"iPhone18,2": "iPhone 17 Pro Max",
|
156
|
+
"iPhone18,3": "iPhone 17",
|
157
|
+
"iPhone18,4": "iPhone Air"
|
158
|
+
]
|
159
|
+
return iphoneModelMapping[identifier] ?? identifier
|
160
|
+
}
|