Class: Pindo::ApplovinXcodeHelper

Inherits:
Object
  • Object
show all
Defined in:
lib/pindo/module/xcode/applovin_xcode_helper.rb

Overview

Applovin Xcode 辅助类封装 Applovin 相关的操作,包括:

  • 获取 SKAdNetwork IDs

  • 更新 Info.plist 文件

  • 运行 Applovin 安装脚本

Class Method Summary collapse

Class Method Details

.fetch_skadnetwork_ids(upload_config: false) ⇒ Array<String>

获取 SKAdNetwork IDs

Parameters:

  • upload_config (Boolean) (defaults to: false)

    是否保存配置到远程

Returns:

  • (Array<String>)

    SKAdNetwork IDs 数组



50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
# File 'lib/pindo/module/xcode/applovin_xcode_helper.rb', line 50

def fetch_skadnetwork_ids(upload_config: false)
  skadnetwork_ids = []

  puts "正在请求 Applovin 数据..."

  # 1. 请求 Applovin SKAdNetwork IDs
  applovin_data = request_applovin_skadnetwork_ids
  if applovin_data && applovin_data["skadnetwork_ids"]
    applovin_data["skadnetwork_ids"].each do |network_id|
      skadnetwork_ids << network_id["skadnetwork_id"]
    end
  end

  # 2. 请求 Applovin Mediation SKAdNetwork IDs
  mediation_data = request_applovin_mediation_skadnetwork_ids
  if mediation_data && mediation_data["mediationSKAdnetworkIdsSpecs"]
    mediation_data["mediationSKAdnetworkIdsSpecs"].each do |media_item|
      skadnetwork_ids += media_item["skAdnetworkIds"]
    end
  end

  # 3. 去重
  skadnetwork_ids = skadnetwork_ids.uniq

  puts "✓ 从网络获取到 #{skadnetwork_ids.size} 条数据"

  # 4. 如果数据太少,从配置文件读取
  if skadnetwork_ids.size <= 50
    puts "网络数据太少,从缓存中获取..."
    cached_ids = load_cached_skadnetwork_ids
    skadnetwork_ids += cached_ids
    skadnetwork_ids = skadnetwork_ids.uniq
    puts "✓ 从缓存获取到 #{skadnetwork_ids.size} 条数据"
  elsif upload_config
    # 5. 保存到配置文件
    save_skadnetwork_ids_to_config(skadnetwork_ids)
  end

  skadnetwork_ids
end

.run_applovin_install_script(project_dir:, appstore_mode: false) ⇒ Object

运行 Applovin 安装脚本

Parameters:

  • project_dir (String)

    项目目录

  • appstore_mode (Boolean) (defaults to: false)

    是否为 AppStore 模式



135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
# File 'lib/pindo/module/xcode/applovin_xcode_helper.rb', line 135

def run_applovin_install_script(project_dir:, appstore_mode: false)
  xcodeproj_file = Dir.glob(File.join(project_dir, "/*.xcodeproj")).max_by { |f| File.mtime(f) }
  return unless xcodeproj_file && File.exist?(xcodeproj_file)

  pindo_common_dir = Pindoconfig.instance.pindo_common_configdir

  # 选择脚本文件
  script_name = appstore_mode ? "AppLovinQualityServiceSetup-ios.rb" : "AppLovinQualityServiceSetup-ios-dev.rb"
  source_script = File.join(pindo_common_dir, script_name)

  return unless File.exist?(source_script)

  # 复制脚本到项目目录
  project_script = File.join(project_dir, "AppLovinQualityServiceSetup-ios.rb")
  FileUtils.cp_r(source_script, project_script)

  # 运行脚本
  puts "正在运行 Applovin 安装脚本..."
  system("ruby #{project_script}")
  puts "✓ Applovin 安装脚本执行完成"
end

.update_applovin_config(project_dir: nil, appstore_mode: false, install_script: false, upload_config: false) ⇒ Boolean

更新 Xcode 工程的 Applovin 配置

Parameters:

  • project_dir (String) (defaults to: nil)

    项目目录,默认为当前目录

  • appstore_mode (Boolean) (defaults to: false)

    是否为 AppStore 模式

  • install_script (Boolean) (defaults to: false)

    是否运行安装脚本

  • upload_config (Boolean) (defaults to: false)

    是否保存配置到远程

Returns:

  • (Boolean)

    是否成功



23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/pindo/module/xcode/applovin_xcode_helper.rb', line 23

def update_applovin_config(project_dir: nil, appstore_mode: false, install_script: false, upload_config: false)
  project_dir ||= Dir.pwd

  # 1. 获取 SKAdNetwork IDs
  skadnetwork_ids = fetch_skadnetwork_ids(upload_config: upload_config)

  if skadnetwork_ids.nil? || skadnetwork_ids.empty?
    puts "⚠ 未能获取 SKAdNetwork IDs"
    return false
  end

  puts "✓ 获取到 #{skadnetwork_ids.size} 条 SKAdNetwork IDs"

  # 2. 更新 Info.plist
  update_info_plist(project_dir: project_dir, skadnetwork_ids: skadnetwork_ids)

  # 3. 运行安装脚本(可选)
  if install_script
    run_applovin_install_script(project_dir: project_dir, appstore_mode: appstore_mode)
  end

  true
end

.update_info_plist(project_dir:, skadnetwork_ids:) ⇒ Object

更新 Info.plist 文件

Parameters:

  • project_dir (String)

    项目目录

  • skadnetwork_ids (Array<String>)

    SKAdNetwork IDs



94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
# File 'lib/pindo/module/xcode/applovin_xcode_helper.rb', line 94

def update_info_plist(project_dir:, skadnetwork_ids:)
  puts "正在更新 Xcode Info.plist..."

  # 1. 查找 Info.plist 文件
  plist_file = find_info_plist(project_dir: project_dir)

  unless File.exist?(plist_file)
    puts "⚠ 未找到 Info.plist 文件: #{plist_file}"
    return false
  end

  # 2. 读取 Info.plist
  info_plist_dict = Xcodeproj::Plist.read_from_path(plist_file)

  # 3. 更新配置
  info_plist_dict["NSAdvertisingAttributionReportEndpoint"] ||= "https://postbacks-app.com"

  if !info_plist_dict.has_key?("NSAppTransportSecurity")
    info_plist_dict["NSAppTransportSecurity"] = {}
    info_plist_dict["NSAppTransportSecurity"]["NSAllowsArbitraryLoads"] = true
  end

  # 4. 更新 SKAdNetworkItems
  if skadnetwork_ids && skadnetwork_ids.size > 0
    info_plist_dict["SKAdNetworkItems"] = []
    skadnetwork_ids.each do |network_id|
      item = { "SKAdNetworkIdentifier" => network_id }
      info_plist_dict["SKAdNetworkItems"] << item
    end
  end

  # 5. 写回 Info.plist
  Xcodeproj::Plist.write_to_path(info_plist_dict, plist_file)

  puts "✓ Info.plist 更新完成"
  true
end