Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 1 addition & 3 deletions platforms/godot_editor/addons/admob/admob.gd
Original file line number Diff line number Diff line change
Expand Up @@ -32,9 +32,7 @@ const ProjectSettingsService := preload(
)

var _main_exporter := preload("res://addons/admob/internal/exporters/main_export_plugin.gd").new()
var _android_exporter := (
preload("res://addons/admob/internal/exporters/android/export_plugin.gd").new()
)
var _android_exporter := preload("res://addons/admob/internal/exporters/android/export_plugin.gd").new()
var _ios_exporter := preload("res://addons/admob/internal/exporters/ios/export_plugin.gd").new()


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,8 +55,13 @@ func _export_end() -> void:
print("AdMob iOS: _export_end fallback (pre-4.7 engine) with path='%s'" % _pending_export_path)
_apply_spm(_pending_export_path, true)


func _apply_spm(path: String, defer_patch: bool) -> void:
var version_info := Engine.get_version_info()
var is_lower_than_4_8: bool = (version_info.major < 4) or (version_info.major == 4 and version_info.minor < 8)
if not is_lower_than_4_8:
print("AdMob iOS: Godot 4.8+ detected, utilizing native SPM support. Skipping custom SPM export pipeline.")
return

_spm_applied = true
var activated_plugins := ExportService.get_activated_plugins("iOS")
if activated_plugins.is_empty():
Expand Down Expand Up @@ -130,26 +135,19 @@ func _collect_spm_dependencies(activated_plugins: Array[String]) -> Array[Dictio
if err == OK:
var plugin_name := config.get_value("config", "name", "")
if activated_plugins.has(plugin_name):
if config.has_section_key("dependencies", "admob_packages"):
var packages: Array = config.get_value("dependencies", "admob_packages", [])
for pkg_str: String in packages:
# url@mode:version|product
var main_parts := pkg_str.split("|")
var product := main_parts[1] if main_parts.size() > 1 else ""

var url_and_rules := main_parts[0].split("@")
var url := url_and_rules[0]

if url_and_rules.size() > 1:
var rules := url_and_rules[1].split(":")
if rules.size() > 1:
var dep := {
"url": url,
"version": rules[1],
"kind": rules[0],
"product": product
}
deps.append(dep)
if config.has_section_key("dependencies", "spm_packages"):
var packages: Array = config.get_value("dependencies", "spm_packages", [])
for pkg: Dictionary in packages:
var url: String = pkg.get("url", "")
var version: String = pkg.get("version", "")
var products: Array = pkg.get("products", [])
for product: String in products:
var dep := {
"url": url,
"version": version,
"product": product
}
deps.append(dep)
file_name = dir.get_next()
return deps

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

if not processed_urls.has(url):
processed_urls.append(url)
var version_rule := (
'exact: "%s"' % dep.version if dep.kind == "exact" else 'from: "%s"' % dep.version
)
var version_rule := 'exact: "%s"' % dep.version
package_deps_str += ' .package(url: "%s", %s),\n' % [url, version_rule]

if not processed_products.has(product):
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1 +1 @@
uid://b40k2rt37l86o
uid://nqvkeeah3wtc
Original file line number Diff line number Diff line change
@@ -1 +1 @@
uid://cnp62bnm8nvgn
uid://6ys84i6rthok
130 changes: 69 additions & 61 deletions platforms/ios/Package.swift
Original file line number Diff line number Diff line change
Expand Up @@ -24,59 +24,71 @@
import PackageDescription
import Foundation

struct DependencyInfo {
struct SPMPackageInfo {
let url: String
let version: String
let mode: String
let product: String
let products: [String]
}

func parseGDIPFile(at path: String) -> [DependencyInfo] {
func parseGDIPFile(at path: String) -> [SPMPackageInfo] {
let fileURL = URL(fileURLWithPath: path)
guard let content = try? String(contentsOf: fileURL, encoding: .utf8) else {
return []
}

// Regex to find admob_packages array content
let pattern = #"admob_packages\s*=\s*\[\s*([\s\S]*?)\s*\]"#
guard let regex = try? NSRegularExpression(pattern: pattern) else { return [] }

let range = NSRange(content.startIndex..., in: content)
guard let match = regex.firstMatch(in: content, options: [], range: range) else { return [] }

let arrayContent = String(content[Range(match.range(at: 1), in: content)!])

// Parse each line in the array: "url@mode:version|product"
let lines = arrayContent.components(separatedBy: ",")
var dependencies: [DependencyInfo] = []

for line in lines {
let trimmedLine = line.trimmingCharacters(in: .whitespacesAndNewlines)
.trimmingCharacters(in: CharacterSet(charactersIn: "\""))

if trimmedLine.isEmpty { continue }

// Split by @ and |
let mainParts = trimmedLine.components(separatedBy: "|")
let product = mainParts.count > 1 ? mainParts[1] : ""

let urlAndRules = mainParts[0].components(separatedBy: "@")
let url = urlAndRules[0]

if urlAndRules.count > 1 {
let rules = urlAndRules[1].components(separatedBy: ":")
if rules.count > 1 {
dependencies.append(DependencyInfo(
url: url,
version: rules[1],
mode: rules[0],
product: product
))
}

guard let spmStart = content.range(of: "spm_packages") else { return [] }
let afterSpm = String(content[spmStart.upperBound...])

let sectionPattern = #"\n\s*\[[a-zA-Z]"#
let nextSection: String
if let sectionRegex = try? NSRegularExpression(pattern: sectionPattern),
let sectionMatch = sectionRegex.firstMatch(in: afterSpm, range: NSRange(afterSpm.startIndex..., in: afterSpm)) {
nextSection = String(afterSpm[afterSpm.startIndex..<Range(sectionMatch.range, in: afterSpm)!.lowerBound])
} else {
nextSection = afterSpm
}

let dictPattern = #"\{([^}]+)\}"#
guard let dictRegex = try? NSRegularExpression(pattern: dictPattern) else { return [] }

let dictRange = NSRange(nextSection.startIndex..., in: nextSection)
let dictMatches = dictRegex.matches(in: nextSection, options: [], range: dictRange)

var packages: [SPMPackageInfo] = []

for dictMatch in dictMatches {
let dictContent = String(nextSection[Range(dictMatch.range(at: 1), in: nextSection)!])

let url = extractValue(from: dictContent, key: "url")
let version = extractValue(from: dictContent, key: "version")
let products = extractArray(from: dictContent, key: "products")

if !url.isEmpty && !version.isEmpty {
packages.append(SPMPackageInfo(url: url, version: version, products: products))
}
}

return dependencies

return packages
}

func extractValue(from text: String, key: String) -> String {
let pattern = #""\#(key)"\s*:\s*"([^"]+)""#
guard let regex = try? NSRegularExpression(pattern: pattern) else { return "" }
let range = NSRange(text.startIndex..., in: text)
guard let match = regex.firstMatch(in: text, options: [], range: range) else { return "" }
return String(text[Range(match.range(at: 1), in: text)!])
}

func extractArray(from text: String, key: String) -> [String] {
let pattern = #""\#(key)"\s*:\s*\[([^\]]*)\]"#
guard let regex = try? NSRegularExpression(pattern: pattern) else { return [] }
let range = NSRange(text.startIndex..., in: text)
guard let match = regex.firstMatch(in: text, options: [], range: range) else { return [] }

let arrayContent = String(text[Range(match.range(at: 1), in: text)!])
return arrayContent.components(separatedBy: ",")
.map { $0.trimmingCharacters(in: .whitespacesAndNewlines).trimmingCharacters(in: CharacterSet(charactersIn: "\"")) }
.filter { !$0.isEmpty }
}

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

for gdipFile in gdipFiles {
print("PoingAdMob: Parsing \(gdipFile)")
let deps = parseGDIPFile(at: gdipFile)
for dep in deps {
print("PoingAdMob: Found dependency \(dep.product) from \(dep.url)")
if !seenURLs.contains(dep.url) {
if dep.mode == "exact" {
packageDependencies.append(.package(url: dep.url, exact: Version(stringLiteral: dep.version)))
} else if dep.mode == "from" {
packageDependencies.append(.package(url: dep.url, from: Version(stringLiteral: dep.version)))
} else if dep.mode == "branch" {
packageDependencies.append(.package(url: dep.url, branch: dep.version))
}
seenURLs.insert(dep.url)
let spmPackages = parseGDIPFile(at: gdipFile)
for package in spmPackages {
print("PoingAdMob: Found package \(package.url) v\(package.version) → \(package.products)")
if !seenURLs.contains(package.url) {
packageDependencies.append(.package(url: package.url, exact: Version(stringLiteral: package.version)))
seenURLs.insert(package.url)
}

if !seenProducts.contains(dep.product) && !dep.product.isEmpty {
let packageName = dep.url.components(separatedBy: "/").last?
.replacingOccurrences(of: ".git", with: "") ?? ""
targetDependencies.append(.product(name: dep.product, package: packageName))
seenProducts.insert(dep.product)

let packageName = package.url.components(separatedBy: "/").last?
.replacingOccurrences(of: ".git", with: "") ?? ""
for product in package.products {
if !seenProducts.contains(product) {
targetDependencies.append(.product(name: product, package: packageName))
seenProducts.insert(product)
}
}
}
}
Expand Down
2 changes: 1 addition & 1 deletion platforms/ios/src/ads/config/package.gd
Original file line number Diff line number Diff line change
Expand Up @@ -27,4 +27,4 @@
## [br][b]Note:[/b] This file is READ-ONLY for manual edits during releases.

## Current version of the plugin in Semantic Versioning (SemVer) format.
const VERSION := "4.1.0" # READ-ONLY
const VERSION := "4.1.1" # READ-ONLY
14 changes: 11 additions & 3 deletions platforms/ios/src/ads/config/poing-godot-admob-ads.gdip
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,17 @@ system=["AppTrackingTransparency.framework"]
capabilities=[]
files=["poing-godot-admob/res/GADTMediumTemplateView.xib", "poing-godot-admob/res/GADTSmallTemplateView.xib"]
linker_flags=["-ObjC"]
admob_packages=[
"https://github.com/googleads/swift-package-manager-google-mobile-ads.git@exact:13.3.0|GoogleMobileAds",
"https://github.com/googleads/swift-package-manager-google-user-messaging-platform.git@exact:3.1.0|GoogleUserMessagingPlatform"
spm_packages=[
{
"url": "https://github.com/googleads/swift-package-manager-google-mobile-ads.git",
"version": "13.3.0",
"products": ["GoogleMobileAds"]
},
{
"url": "https://github.com/googleads/swift-package-manager-google-user-messaging-platform.git",
"version": "3.1.0",
"products": ["GoogleUserMessagingPlatform"]
}
]

[plist]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,12 @@ system=[]
capabilities=[]
files=[]
linker_flags=[]
admob_packages=[
"https://github.com/googleads/googleads-mobile-ios-mediation-applovin.git@exact:13.6.300|AppLovinAdapterTarget"
spm_packages=[
{
"url": "https://github.com/googleads/googleads-mobile-ios-mediation-applovin.git",
"version": "13.6.300",
"products": ["AppLovinAdapterTarget"]
}
]

[plist]
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,12 @@ system=[]
capabilities=[]
files=[]
linker_flags=[]
admob_packages=[
"https://github.com/googleads/googleads-mobile-ios-mediation-bidmachine.git@exact:3.7.000|BidMachineAdapterTarget"
spm_packages=[
{
"url": "https://github.com/googleads/googleads-mobile-ios-mediation-bidmachine.git",
"version": "3.7.000",
"products": ["BidMachineAdapterTarget"]
}
]

[plist]
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,12 @@ system=[]
capabilities=[]
files=[]
linker_flags=[]
admob_packages=[
"https://github.com/googleads/googleads-mobile-ios-mediation-chartboost.git@exact:9.12.0|ChartboostAdapterTarget"
spm_packages=[
{
"url": "https://github.com/googleads/googleads-mobile-ios-mediation-chartboost.git",
"version": "9.12.0",
"products": ["ChartboostAdapterTarget"]
}
]

[plist]
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,12 @@ system=[]
capabilities=[]
files=[]
linker_flags=[]
admob_packages=[
"https://github.com/googleads/googleads-mobile-ios-mediation-dtexchange.git@exact:8.4.701|DTExchangeAdapterTarget"
spm_packages=[
{
"url": "https://github.com/googleads/googleads-mobile-ios-mediation-dtexchange.git",
"version": "8.4.701",
"products": ["DTExchangeAdapterTarget"]
}
]

[plist]
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,12 @@ system=[]
capabilities=[]
files=[]
linker_flags=[]
admob_packages=[
"https://github.com/googleads/googleads-mobile-ios-mediation-imobile.git@exact:2.3.407|IMobileAdapterTarget"
spm_packages=[
{
"url": "https://github.com/googleads/googleads-mobile-ios-mediation-imobile.git",
"version": "2.3.407",
"products": ["IMobileAdapterTarget"]
}
]

[plist]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,12 @@ system=[]
capabilities=[]
files=[]
linker_flags=[]
admob_packages=[
"https://github.com/googleads/googleads-mobile-ios-mediation-inmobi.git@exact:11.3.000|InMobiAdapterTarget"
spm_packages=[
{
"url": "https://github.com/googleads/googleads-mobile-ios-mediation-inmobi.git",
"version": "11.3.000",
"products": ["InMobiAdapterTarget"]
}
]

[plist]
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,12 @@ system=[]
capabilities=[]
files=[]
linker_flags=[]
admob_packages=[
"https://github.com/googleads/googleads-mobile-ios-mediation-ironsource.git@exact:9.4.10001|IronSourceAdapterTarget"
spm_packages=[
{
"url": "https://github.com/googleads/googleads-mobile-ios-mediation-ironsource.git",
"version": "9.4.10001",
"products": ["IronSourceAdapterTarget"]
}
]

[plist]
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,12 @@ system=[]
capabilities=[]
files=[]
linker_flags=[]
admob_packages=[
"https://github.com/googleads/googleads-mobile-ios-mediation-line.git@exact:3.0.102|LineAdapterTarget"
spm_packages=[
{
"url": "https://github.com/googleads/googleads-mobile-ios-mediation-line.git",
"version": "3.0.102",
"products": ["LineAdapterTarget"]
}
]

[plist]
Expand Down
Loading
Loading