app_name: GuruApp app_category: app flavor: "guru_test" # App接入GuruApp的基础信息(下面内容必填) details: # 中台接口上报时的app_id,影响中台push接入和后期的中台打点接入(必填) saas_app_id: guruapp # 针对DynamicLink和Deeplink的判断(必填) authority: demo.gurugame.fun # 对应Firebase项目中的基础链接(必填) storage_prefix: https://firebasestorage.googleapis.com/v0/b/example.appspot.com/o # 对应CDN云控中的默认cdn链接(必填) default_cdn_prefix: https://cdn1.example.gurugame.fun # Android的商店链接,后期分享,用户反馈或PubMatic等广告源的使用(必填) android_gp_url: https://play.google.com/store/apps/details?id=app_package_id # IOS的商店链接,后期分享,用户反馈或PubMatic等广告源的使用(必填) ios_spp_store_url: # 隐私协议的链接(必填) policy_url: https://solitaire.fungame.studio/policy.html # 隐私条款的链接(必填) terms_url: https://solitaire.fungame.studio/termsofservice.html # 联系邮箱 (必填) email_url: demo@gurugame.fun # Android Package Name (必填) package_name: guru.app.demo # iOS Bundle Id (必填) bundle_id: guru.app.demo # Facebook App Id facebook_app_id: 123456789 deployment: # AppProperty Cache的大小,默认是256 property_cache_size: 512 # Paint.enableDithering,默认是true enable_dithering: false # 禁用激励视频,默认是false disable_rewards_ads: true # 是否启用 Analytics Statistic 统计 enable_analytics_statistic: true # 是否自动恢复IAP购买数据 auto_restore_iap: false # 初始的游戏币数量,默认是 0 init_igc: 500 # igc(游戏内货币) 验证密钥混,int类型,防止igc被外部修改 igc_balance_secret: 2654404609 # GuruApp Persistent Log 默认10M log_file_size_limit: 10485760 # GuruApp Persistent Log 保存的个数,默认7个 log_file_count: 7 # 使用persistent log的最小等级,最终 >= 该level的日志将会被存储到本地 # verbose: 0 # debug: 1 # info: 2 # warning: 3 # error: 4 # wtf: 5 # nothing: 6 persistent_log_level: 1 # ios 验证服务器的密码 ios_validate_receipt_password: aa998877665544332211bb00cc # 被标注的conversion点,在自打点库中将被以Emergency的优先级进行发送 conversion_events: - first_rads_rewarded - level_end_success_1 - level_end_success_6 - level_end_success_10 - level_end_success_12 - level_end_success_15 - level_up - level_up_1 - level_up_3 - level_up_5 - level_up_7 - level_up_10 - level_up_12 - level_up_15 - tch_ad_rev_roas_001 - tutorial_complete api_connect_timeout: 15000 api_receive_timeout: 15000 # # Sandbox lets you test subscription events, such as renewals, state changes, and interrupted purchases, # without having to wait the length of the subscription duration. Once you added testers in sandbox, # you can choose a subscription renewal speed for each tester to determine how quickly subscriptions renew. # By default, accounts are set to a speed equalization of 1 month = 5 minutes, # but you can slow down or speed up the renewal period, based on the options below. # Subscriptions renew up to 12 times before auto-renewal turns off on the thirteenth renewal attempt. # ┌───────────────┬────────────────┬────────────────┬────────────────┬────────────────┬────────────────┐ # │ Subscription │ Renewal every │ Renewal every │ Renewal every │ Renewal every │ Renewal every │ # │ Duration │ 3 Minutes │ 5 Minutes │ 15 Minutes │ 30 Minutes │ Hour │ # ├───────────────┼────────────────┼────────────────┼────────────────┼────────────────┼────────────────┤ # │ 1 Week │ 3 minutes │ 3 minutes │ 5 minutes │ 10 minutes │ 15 minutes │ # ├───────────────┼────────────────┼────────────────┼────────────────┼────────────────┼────────────────┤ # │ 1 Month │ 3 minutes │ 5 minutes │ 15 minutes │ 30 minutes │ 1 hour │ # ├───────────────┼────────────────┼────────────────┼────────────────┼────────────────┼────────────────┤ # │ 6 Months │ 18 minutes │ 30 minutes │ 90 minutes │ 3 hours │ 6 hours │ # ├───────────────┼────────────────┼────────────────┼────────────────┼────────────────┼────────────────┤ # │ 1 Year │ 36 minutes │ 1 hour │ 3 hours │ 6 hours │ 12 hours │ # └───────────────┴────────────────┴────────────────┴────────────────┴────────────────┴────────────────┘ # # level 1: Renewal every 3 minutes per month # level 2: Renewal every 5 minutes per month (default) # level 3: Renewal every 15 minutes per month # level 4: Renewal every 30 minutes per month # level 5: Renewal every 1 hour per month ios_sandbox_subs_renewal_speed: 2 # 是否使用广告合规初始化的逻辑,合规初始化是指先收集GDPR在初始化广告 ads_compliant_initialization: false # 自动请求通知栏权限,默认是false auto_request_notification_permission: false # 请求通知栏权限时的提示出发机制 # rationale: 依赖Android原生的shouldShowRequestRationale返回值来展示对应的Rationale页面 # request: 依赖请求的次数来展示对应的Rationale页面 notification_permission_prompt_trigger: rationale # 是否追踪通知栏权限的通过率,默认是false。 # 如果为true时将会上报对应noti_perm_req_`n`和noti_perm_pass_`n` # n: 表示第几次请求 # 注意!如果开启了追踪通知栏权限的通过率统计点位,那么firebase打点中将会出现`n`个noti_perm_req_`n`和noti_perm_pass_`n`这两个打点 # 这里的n的限制需要配置tracking_notification_permission_pass_limit_times tracking_notification_permission_pass: false # 如果追踪通知栏权限的通过率,这个值表示最大的追踪次数,超过最大次数后将不再追踪 tracking_notification_permission_pass_limit_times: 10 # 是否打开GuruAnalytics的策略,默认是false enabled_guru_analytics_strategy: false # 在RewardedAware中调用 showRewardedAd 方法时 # 在激励视频不可用时,是否允许使用插屏做为替代奖励,默认是 false # 注意:即使这里设置成 True,在你使用的页面 Controller中,要确保 with InterstitialAware allow_interstitial_as_alternative_reward: false # 在 Banner 广告未成功加载的期间,填充一个内部的广告,可以是一个推广,一个内部的广告。 # 它不会影响正常的广告展示逻辑,只要 Banner 广告正常加载,都会将其进行隐藏。 # 因此它的优先级永远不会大于正常的 Banner 广告, 默认值是 false show_internal_ads_when_banner_unavailable: true # 由于订阅订单比较重要,而从用户反馈的日志上来看,会存在接口返回异常的问题 # 因此针对这种情况,添加订阅的恢复宽限次数,默认为 3 次 # 当订阅订单恢复失败次数超过该次数,才会真正删除 subscription_restore_grace_count: 3 # 插屏在展示广告前,为了保证用户的体验,会有一个广告的保护时间, # 即:距上一次全屏广告(插屏广告和激励广告)的结束间隔时间, # 默认的间隔保护时间为 1 分钟(60 秒)单位为秒 fullscreen_ads_min_interval: 60 # 是否打开中台的 AccountProfile 同步机制 # 打开后,在登陆后(包括匿名登陆) 会启动向 Firestore 进行同步AccountProfile的机制 # Firestore 针对 AccountProfile的存储位置默认放在 users 表中 enabled_sync_account_profile: false # 根据 BI 的需求,对应的 Purchase事件只能报太极的 001 或 020的其中一个 # 因此添加 Purchase Event 的 trigger, 默认值为 1 # 1: 表示在发生购买时打 tch_ad_rev_roas_001 # 2: 表示在发生购买时打 tch_ad_rev_roas_020 # 在广告展示时也会依据该 trigger 的值,在不同的时机打对应的 purchase事件 purchase_event_trigger: 1 # tracking_notification_permission_pass_analytics_type : guru|firebase # 广告配置 ads_profile: # Banner广告ID(变现提供) banner_ad_unit_id: android: xxxxxxxxxxxxxxxx ios: xxxxxxxxxxxxxxxx # Interstitial广告ID(变现提供) interstitial_ad_unit_id: android: xxxxxxxxxxxxxxxx ios: xxxxxxxxxxxxxxxx # Rewards广告ID(变现提供) rewards_ad_unit_id: android: xxxxxxxxxxxxxxxx ios: xxxxxxxxxxxxxxxx # Amazon广告的AppId(变现提供) amz_app_id: android: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx ios: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx # Amazon广告的Banner Slot Id(变现提供) banner_amz_slot_id: android: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx ios: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx # Amazon广告的Interstitial Slot Id(变现提供) interstitial_amz_slot_id: android: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx ios: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx rewarded_amz_slot_id: android: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx ios: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx remote_config: # 保留配置,插屏广告相关配置 iads_config: '{"free_s":600,"win_count":4,"scene":"game_start","sp_scene":"new_block:120;reset_scs:120","retry_min_s":10,"retry_max_s":600,"amazon_enable":false,"imp_gap_s":120}' # 保留配置,激励广告相关配置 rads_config: '{"win_count":3}' # 保留配置,Banner广告相关配置 bads_config: '{"free_s":180,"win_count":1}' # 保留配置,打点相关配置 analytics_config: '{"cap":"firebase|facebook|guru", "init_delay_s": 10}' # # _mapping: # cdn_config: "cdn2_config" products: # sku # 商品的ID,如果同时指定了android和ios,优先级sku为主 # 支持参数定义,见下面的样例商品theme的sku # # android,ios # 各个平台的SKU,如果指定了sku将忽略这两个选择 # # attr # possessive: 购买后永久有效 # consumable: 可消耗商品 # subscriptions: 订阅类商品 # # method: # 购买的方式,支持iap,igc,reward # iap: 通过IAP购买的商品 # igc: 通过虚拟游戏币购买的商品 # reward: 通过奖励的方式获取的商品 # 如果这个商品支持多种方式购买,可以通过逗号的形式进行串联 # # capabilities: # 表示该商品的能力,现阶段只支持noAds # # manifest: # 指购买该商品后所获得的清单 # category: # 该manifest的种类,这个主要用于后面的打点 # 如果在guru_spec.yaml中定义相同的category,该category的名字必须能保证名字是不相似的, # 如果出现名字相似的情况下,将会视为冲突,如:noAds和no_ads这类相似的名字都将无法生成 # details,details1,details2...detailsN # 指该商品的获取明细,如igc多少个,道具多少个 # details中必须定义type和amount否则将无法生成 # details中的type,现阶段系统预定义了igc(表示游戏内货币) # 如果需要处理模板库不支持的类型,需要在使用模板库的时候添加相应的distributor # 自定义参数 # 可以指定不同的参数,也可以引用sku中的参数,见下面的样例商品theme的manifest # 如果在guru_spec.yaml中定义相同的category的商品,自定义参数必须一至, # 否则将无法生成 # no_ads: android: so.a.iap.noads.699 ios: so.i.iap.noads.699 attr: asset method: iap,reward,igc manifest: category: "no_ads" no_ads_coin_bundle: android: so.a.iap.noads.coin.799 ios: so.i.iap.noads.coin.799 attr: asset method: iap capabilities: noAds manifest: category: "no_ads" details: type: "igc" # in-game currency amount: 500 details1: type: "cup" amount: 1 details2: type: "frag" amount: 20 theme: sku: "theme_{theme_id}" method: igc,reward attr: possessive manifest: category: "theme_{1}" theme_id: "{1}" # theme2: # sku: "theme2_{theme_id}" # method: igc,reward # attr: possessive # manifest: # category: "theme" # theme_id: "{1}" # details: # type: "theme" # amount: 1 # details2: # type: "theme3" # amount: 1 prop: sku: "theme_{prop_id}_{pc_id}" method: igc,reward attr: possessive manifest: category: "prop" details: sku: "{1}_{2}" type: "prop" amount: 1 theme_id: "{1}" details2: type: "pc" amount: 1 theme_id: "{2}" no_ads2: android: so.a.iap.noads.699 ios: so.i.iap.noads.699 attr: possessive method: iap capabilities: noAds manifest: category: no_ads details: type: no_ads amount: 1 ignore_sales: true coin200: android: so.a.iapc.coin.200 ios: so.i.iapc.coin.200 method: iap attr: consumable points: true manifest: category: coin details: type: coin amount: 200 stage_pack: android: so.a.iap.stage.1 ios: so.i.iap.stage.1 attr: consumable method: iap manifest: category: "stage_1" details: type: "stage" # in-game currency amount: 1 stage: 1 premium_week: android: "m2.a.sub.premium" ios: "m2.i.sub.premium.p1w" attr: subscriptions method: iap capabilities: noAds base_plan: weekly group: premium offers: - freetrial - discount manifest: category: "sub" details: type: "igc" amount: 8000 premium_year: android: "m2.a.sub.premium" ios: "m2.i.sub.premium.p1y" attr: subscriptions method: iap capabilities: noAds base_plan: yearly group: premium offers: - freetrial - discount manifest: category: "sub" details: type: "igc" amount: 16000 # # theme_mul: # sku: "theme_{category}_{theme_id}" # attr: possessive # method: igc # manifest: # category: "{1}" # theme_id: "{2}" # cate: "{1}" # adjust 相关配置 adjust_profile: # 对应adjust的appToken,必填项 app_token: android: testapptoken ios: testapptoken # 如果有对应的事件映射在这里统一定义 event_map: level_start: android: hq0xzz ios: b8khry iap_purchase: android: yzy3uh ios: z0gje7 params: true sub_purchase: android: yzy3uh ios: z0gje7 params: true level_end: android: so63k4 ios: 1p8z5t tutorial_complete: android: 95fu7q ios: 1p8z5t experiments: test: start: 20240129T000000 end: 20240129T000000 audience: filters: - version: opt: lt mmp: 2.3.0 - country: included: "" excluded: "us,cn,en" - platform: android: opt: gte ver: 33 ios: opt: gte ver: 14 variant: 2 test2: start: 20240129T000000 end: 20240129T000000 audience: filters: - version: opt: lt mmp: 2.3.0 - country: included: "cn" excluded: "us" - platform: android: opt: lt ver: 24 ios: opt: gte ver: 14 - new_user: true variant: 5