Skip to content

Commit b6e5b8a

Browse files
authored
Merge pull request #206 from poingstudios/205-prepare-for-spm-godot-47
refactor: remove custom iOS export plugin and update project to Godot 4.8
2 parents 0f4feed + fd6dbdc commit b6e5b8a

26 files changed

Lines changed: 210 additions & 130 deletions

platforms/godot_editor/addons/admob/admob.gd

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,7 @@ const ProjectSettingsService := preload(
3232
)
3333

3434
var _main_exporter := preload("res://addons/admob/internal/exporters/main_export_plugin.gd").new()
35-
var _android_exporter := (
36-
preload("res://addons/admob/internal/exporters/android/export_plugin.gd").new()
37-
)
35+
var _android_exporter := preload("res://addons/admob/internal/exporters/android/export_plugin.gd").new()
3836
var _ios_exporter := preload("res://addons/admob/internal/exporters/ios/export_plugin.gd").new()
3937

4038

platforms/godot_editor/addons/admob/internal/exporters/ios/export_plugin.gd

Lines changed: 20 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,13 @@ func _export_end() -> void:
5555
print("AdMob iOS: _export_end fallback (pre-4.7 engine) with path='%s'" % _pending_export_path)
5656
_apply_spm(_pending_export_path, true)
5757

58-
5958
func _apply_spm(path: String, defer_patch: bool) -> void:
59+
var version_info := Engine.get_version_info()
60+
var is_lower_than_4_8: bool = (version_info.major < 4) or (version_info.major == 4 and version_info.minor < 8)
61+
if not is_lower_than_4_8:
62+
print("AdMob iOS: Godot 4.8+ detected, utilizing native SPM support. Skipping custom SPM export pipeline.")
63+
return
64+
6065
_spm_applied = true
6166
var activated_plugins := ExportService.get_activated_plugins("iOS")
6267
if activated_plugins.is_empty():
@@ -130,26 +135,19 @@ func _collect_spm_dependencies(activated_plugins: Array[String]) -> Array[Dictio
130135
if err == OK:
131136
var plugin_name := config.get_value("config", "name", "")
132137
if activated_plugins.has(plugin_name):
133-
if config.has_section_key("dependencies", "admob_packages"):
134-
var packages: Array = config.get_value("dependencies", "admob_packages", [])
135-
for pkg_str: String in packages:
136-
# url@mode:version|product
137-
var main_parts := pkg_str.split("|")
138-
var product := main_parts[1] if main_parts.size() > 1 else ""
139-
140-
var url_and_rules := main_parts[0].split("@")
141-
var url := url_and_rules[0]
142-
143-
if url_and_rules.size() > 1:
144-
var rules := url_and_rules[1].split(":")
145-
if rules.size() > 1:
146-
var dep := {
147-
"url": url,
148-
"version": rules[1],
149-
"kind": rules[0],
150-
"product": product
151-
}
152-
deps.append(dep)
138+
if config.has_section_key("dependencies", "spm_packages"):
139+
var packages: Array = config.get_value("dependencies", "spm_packages", [])
140+
for pkg: Dictionary in packages:
141+
var url: String = pkg.get("url", "")
142+
var version: String = pkg.get("version", "")
143+
var products: Array = pkg.get("products", [])
144+
for product: String in products:
145+
var dep := {
146+
"url": url,
147+
"version": version,
148+
"product": product
149+
}
150+
deps.append(dep)
153151
file_name = dir.get_next()
154152
return deps
155153

@@ -171,9 +169,7 @@ func _generate_package_swift(export_dir: String, dependencies: Array[Dictionary]
171169

172170
if not processed_urls.has(url):
173171
processed_urls.append(url)
174-
var version_rule := (
175-
'exact: "%s"' % dep.version if dep.kind == "exact" else 'from: "%s"' % dep.version
176-
)
172+
var version_rule := 'exact: "%s"' % dep.version
177173
package_deps_str += ' .package(url: "%s", %s),\n' % [url, version_rule]
178174

179175
if not processed_products.has(product):

platforms/godot_editor/addons/admob/internal/exporters/ios/export_plugin.gd.uid

Lines changed: 0 additions & 1 deletion
This file was deleted.
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
uid://b40k2rt37l86o
1+
uid://nqvkeeah3wtc
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
uid://cnp62bnm8nvgn
1+
uid://6ys84i6rthok

platforms/ios/Package.swift

Lines changed: 69 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -24,59 +24,71 @@
2424
import PackageDescription
2525
import Foundation
2626

27-
struct DependencyInfo {
27+
struct SPMPackageInfo {
2828
let url: String
2929
let version: String
30-
let mode: String
31-
let product: String
30+
let products: [String]
3231
}
3332

34-
func parseGDIPFile(at path: String) -> [DependencyInfo] {
33+
func parseGDIPFile(at path: String) -> [SPMPackageInfo] {
3534
let fileURL = URL(fileURLWithPath: path)
3635
guard let content = try? String(contentsOf: fileURL, encoding: .utf8) else {
3736
return []
3837
}
39-
40-
// Regex to find admob_packages array content
41-
let pattern = #"admob_packages\s*=\s*\[\s*([\s\S]*?)\s*\]"#
42-
guard let regex = try? NSRegularExpression(pattern: pattern) else { return [] }
43-
44-
let range = NSRange(content.startIndex..., in: content)
45-
guard let match = regex.firstMatch(in: content, options: [], range: range) else { return [] }
46-
47-
let arrayContent = String(content[Range(match.range(at: 1), in: content)!])
48-
49-
// Parse each line in the array: "url@mode:version|product"
50-
let lines = arrayContent.components(separatedBy: ",")
51-
var dependencies: [DependencyInfo] = []
52-
53-
for line in lines {
54-
let trimmedLine = line.trimmingCharacters(in: .whitespacesAndNewlines)
55-
.trimmingCharacters(in: CharacterSet(charactersIn: "\""))
56-
57-
if trimmedLine.isEmpty { continue }
58-
59-
// Split by @ and |
60-
let mainParts = trimmedLine.components(separatedBy: "|")
61-
let product = mainParts.count > 1 ? mainParts[1] : ""
62-
63-
let urlAndRules = mainParts[0].components(separatedBy: "@")
64-
let url = urlAndRules[0]
65-
66-
if urlAndRules.count > 1 {
67-
let rules = urlAndRules[1].components(separatedBy: ":")
68-
if rules.count > 1 {
69-
dependencies.append(DependencyInfo(
70-
url: url,
71-
version: rules[1],
72-
mode: rules[0],
73-
product: product
74-
))
75-
}
38+
39+
guard let spmStart = content.range(of: "spm_packages") else { return [] }
40+
let afterSpm = String(content[spmStart.upperBound...])
41+
42+
let sectionPattern = #"\n\s*\[[a-zA-Z]"#
43+
let nextSection: String
44+
if let sectionRegex = try? NSRegularExpression(pattern: sectionPattern),
45+
let sectionMatch = sectionRegex.firstMatch(in: afterSpm, range: NSRange(afterSpm.startIndex..., in: afterSpm)) {
46+
nextSection = String(afterSpm[afterSpm.startIndex..<Range(sectionMatch.range, in: afterSpm)!.lowerBound])
47+
} else {
48+
nextSection = afterSpm
49+
}
50+
51+
let dictPattern = #"\{([^}]+)\}"#
52+
guard let dictRegex = try? NSRegularExpression(pattern: dictPattern) else { return [] }
53+
54+
let dictRange = NSRange(nextSection.startIndex..., in: nextSection)
55+
let dictMatches = dictRegex.matches(in: nextSection, options: [], range: dictRange)
56+
57+
var packages: [SPMPackageInfo] = []
58+
59+
for dictMatch in dictMatches {
60+
let dictContent = String(nextSection[Range(dictMatch.range(at: 1), in: nextSection)!])
61+
62+
let url = extractValue(from: dictContent, key: "url")
63+
let version = extractValue(from: dictContent, key: "version")
64+
let products = extractArray(from: dictContent, key: "products")
65+
66+
if !url.isEmpty && !version.isEmpty {
67+
packages.append(SPMPackageInfo(url: url, version: version, products: products))
7668
}
7769
}
78-
79-
return dependencies
70+
71+
return packages
72+
}
73+
74+
func extractValue(from text: String, key: String) -> String {
75+
let pattern = #""\#(key)"\s*:\s*"([^"]+)""#
76+
guard let regex = try? NSRegularExpression(pattern: pattern) else { return "" }
77+
let range = NSRange(text.startIndex..., in: text)
78+
guard let match = regex.firstMatch(in: text, options: [], range: range) else { return "" }
79+
return String(text[Range(match.range(at: 1), in: text)!])
80+
}
81+
82+
func extractArray(from text: String, key: String) -> [String] {
83+
let pattern = #""\#(key)"\s*:\s*\[([^\]]*)\]"#
84+
guard let regex = try? NSRegularExpression(pattern: pattern) else { return [] }
85+
let range = NSRange(text.startIndex..., in: text)
86+
guard let match = regex.firstMatch(in: text, options: [], range: range) else { return [] }
87+
88+
let arrayContent = String(text[Range(match.range(at: 1), in: text)!])
89+
return arrayContent.components(separatedBy: ",")
90+
.map { $0.trimmingCharacters(in: .whitespacesAndNewlines).trimmingCharacters(in: CharacterSet(charactersIn: "\"")) }
91+
.filter { !$0.isEmpty }
8092
}
8193

8294
var packageDependencies: [Package.Dependency] = []
@@ -110,25 +122,21 @@ if gdipFiles.isEmpty {
110122

111123
for gdipFile in gdipFiles {
112124
print("PoingAdMob: Parsing \(gdipFile)")
113-
let deps = parseGDIPFile(at: gdipFile)
114-
for dep in deps {
115-
print("PoingAdMob: Found dependency \(dep.product) from \(dep.url)")
116-
if !seenURLs.contains(dep.url) {
117-
if dep.mode == "exact" {
118-
packageDependencies.append(.package(url: dep.url, exact: Version(stringLiteral: dep.version)))
119-
} else if dep.mode == "from" {
120-
packageDependencies.append(.package(url: dep.url, from: Version(stringLiteral: dep.version)))
121-
} else if dep.mode == "branch" {
122-
packageDependencies.append(.package(url: dep.url, branch: dep.version))
123-
}
124-
seenURLs.insert(dep.url)
125+
let spmPackages = parseGDIPFile(at: gdipFile)
126+
for package in spmPackages {
127+
print("PoingAdMob: Found package \(package.url) v\(package.version)\(package.products)")
128+
if !seenURLs.contains(package.url) {
129+
packageDependencies.append(.package(url: package.url, exact: Version(stringLiteral: package.version)))
130+
seenURLs.insert(package.url)
125131
}
126-
127-
if !seenProducts.contains(dep.product) && !dep.product.isEmpty {
128-
let packageName = dep.url.components(separatedBy: "/").last?
129-
.replacingOccurrences(of: ".git", with: "") ?? ""
130-
targetDependencies.append(.product(name: dep.product, package: packageName))
131-
seenProducts.insert(dep.product)
132+
133+
let packageName = package.url.components(separatedBy: "/").last?
134+
.replacingOccurrences(of: ".git", with: "") ?? ""
135+
for product in package.products {
136+
if !seenProducts.contains(product) {
137+
targetDependencies.append(.product(name: product, package: packageName))
138+
seenProducts.insert(product)
139+
}
132140
}
133141
}
134142
}

platforms/ios/src/ads/config/package.gd

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,4 @@
2727
## [br][b]Note:[/b] This file is READ-ONLY for manual edits during releases.
2828

2929
## Current version of the plugin in Semantic Versioning (SemVer) format.
30-
const VERSION := "4.1.0" # READ-ONLY
30+
const VERSION := "4.1.1" # READ-ONLY

platforms/ios/src/ads/config/poing-godot-admob-ads.gdip

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,17 @@ system=["AppTrackingTransparency.framework"]
1212
capabilities=[]
1313
files=["poing-godot-admob/res/GADTMediumTemplateView.xib", "poing-godot-admob/res/GADTSmallTemplateView.xib"]
1414
linker_flags=["-ObjC"]
15-
admob_packages=[
16-
"https://github.com/googleads/swift-package-manager-google-mobile-ads.git@exact:13.3.0|GoogleMobileAds",
17-
"https://github.com/googleads/swift-package-manager-google-user-messaging-platform.git@exact:3.1.0|GoogleUserMessagingPlatform"
15+
spm_packages=[
16+
{
17+
"url": "https://github.com/googleads/swift-package-manager-google-mobile-ads.git",
18+
"version": "13.3.0",
19+
"products": ["GoogleMobileAds"]
20+
},
21+
{
22+
"url": "https://github.com/googleads/swift-package-manager-google-user-messaging-platform.git",
23+
"version": "3.1.0",
24+
"products": ["GoogleUserMessagingPlatform"]
25+
}
1826
]
1927

2028
[plist]

platforms/ios/src/mediation/applovin/config/poing-godot-admob-applovin.gdip

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,12 @@ system=[]
1212
capabilities=[]
1313
files=[]
1414
linker_flags=[]
15-
admob_packages=[
16-
"https://github.com/googleads/googleads-mobile-ios-mediation-applovin.git@exact:13.6.300|AppLovinAdapterTarget"
15+
spm_packages=[
16+
{
17+
"url": "https://github.com/googleads/googleads-mobile-ios-mediation-applovin.git",
18+
"version": "13.6.300",
19+
"products": ["AppLovinAdapterTarget"]
20+
}
1721
]
1822

1923
[plist]

platforms/ios/src/mediation/bidmachine/config/poing-godot-admob-bidmachine.gdip

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,12 @@ system=[]
1212
capabilities=[]
1313
files=[]
1414
linker_flags=[]
15-
admob_packages=[
16-
"https://github.com/googleads/googleads-mobile-ios-mediation-bidmachine.git@exact:3.7.000|BidMachineAdapterTarget"
15+
spm_packages=[
16+
{
17+
"url": "https://github.com/googleads/googleads-mobile-ios-mediation-bidmachine.git",
18+
"version": "3.7.000",
19+
"products": ["BidMachineAdapterTarget"]
20+
}
1721
]
1822

1923
[plist]

0 commit comments

Comments
 (0)