com.xd.sdk.oversea 7.3.4 → 7.6.1

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.
@@ -2,7 +2,7 @@
2
2
  "name": "XD.SDK.Oversea.Editor",
3
3
  "rootNamespace": "",
4
4
  "references": [
5
- "GUID:11227cad437d44898c9c5389c8672caa"
5
+ "XD.SDK.Foundation.Editor"
6
6
  ],
7
7
  "includePlatforms": [
8
8
  "Editor"
@@ -1,5 +1,8 @@
1
+ using System;
1
2
  using System.Collections.Generic;
2
3
  using System.IO;
4
+ using System.Linq;
5
+ using System.Xml.Linq;
3
6
  using UnityEditor.Build;
4
7
  using UnityEditor.Build.Reporting;
5
8
  using UnityEngine;
@@ -10,6 +13,18 @@ namespace XD.SDK.Oversea.Editor
10
13
  {
11
14
  public class XDOverseaAndroidGradleProcessor : XDAndroidProjectProcessor, IPreprocessBuildWithReport
12
15
  {
16
+ private const string RegionTypeGlobal = "global";
17
+ private const string FacebookActivityName = "com.facebook.FacebookActivity";
18
+ private const string FacebookCustomTabActivityName = "com.facebook.CustomTabActivity";
19
+ private const string FacebookContentProviderName = "com.facebook.FacebookContentProvider";
20
+ private const string FacebookContentProviderAuthorityPrefix = "com.facebook.app.FacebookContentProvider";
21
+ private const string FacebookApplicationIdMetaDataName = "com.facebook.sdk.ApplicationId";
22
+ private const string FacebookClientTokenMetaDataName = "com.facebook.sdk.ClientToken";
23
+ private const string AndroidConfigChanges = "keyboard|keyboardHidden|screenLayout|screenSize|orientation";
24
+ private const string AndroidActionView = "android.intent.action.VIEW";
25
+ private const string AndroidCategoryDefault = "android.intent.category.DEFAULT";
26
+ private const string AndroidCategoryBrowsable = "android.intent.category.BROWSABLE";
27
+ private static readonly XNamespace AndroidNs = "http://schemas.android.com/apk/res/android";
13
28
 
14
29
  public new int callbackOrder => 1050;
15
30
 
@@ -45,10 +60,7 @@ namespace XD.SDK.Oversea.Editor
45
60
  {
46
61
  var result = new List<AndroidGradleProjectConfig.Dependency>
47
62
  {
48
- // 添加基础依赖
49
- new AndroidGradleProjectConfig.Dependency(group: "com.google.android.gms", module: "play-services-ads-identifier", version: VersionCatalog.GoogleAdsIdentifier),
50
- new AndroidGradleProjectConfig.Dependency(group: "com.android.billingclient", module: "billing", version: VersionCatalog.BillingClient),
51
- new AndroidGradleProjectConfig.Dependency(group: "androidx.browser", module: "browser", version: VersionCatalog.CustomTabsBrowser)
63
+ new AndroidGradleProjectConfig.Dependency(group: "com.xd.sdk.android", module: "analytics-global", version: VersionCatalog.XDAndroidSdkVersion),
52
64
  };
53
65
 
54
66
  // Firebase依赖
@@ -108,6 +120,180 @@ namespace XD.SDK.Oversea.Editor
108
120
  return result;
109
121
  }
110
122
 
123
+ protected override void OnProcessAndroidProject(string path)
124
+ {
125
+ base.OnProcessAndroidProject(path);
126
+ AddFacebookManifestConfig(path);
127
+ }
128
+
129
+ private void AddFacebookManifestConfig(string path)
130
+ {
131
+ if (!IsGlobalRegion()) return;
132
+
133
+ var facebookAppId = configModel?.facebook?.app_id;
134
+ if (string.IsNullOrWhiteSpace(facebookAppId)) return;
135
+ if (string.IsNullOrWhiteSpace(configModel?.facebook?.client_token))
136
+ {
137
+ Debug.LogWarning("XDConfig.json 中 facebook.client_token 为空,无法自动配置 Facebook ClientToken");
138
+ }
139
+
140
+ var androidManifest = Path.Combine(path, "src", "main", "AndroidManifest.xml");
141
+ if (!File.Exists(androidManifest))
142
+ {
143
+ Debug.LogWarning($"AndroidManifest.xml 文件不存在: {androidManifest}, 无法自动配置 Facebook");
144
+ return;
145
+ }
146
+
147
+ var manifest = XDocument.Load(androidManifest);
148
+ var applicationRoot = manifest
149
+ .Element("manifest")
150
+ ?.Element("application");
151
+ if (applicationRoot == null)
152
+ {
153
+ Debug.LogWarning("AndroidManifest.xml 文件格式不正确, 无法自动配置 Facebook");
154
+ return;
155
+ }
156
+
157
+ AddFacebookManifestConfig(applicationRoot, configModel);
158
+ manifest.Save(androidManifest);
159
+ }
160
+
161
+ internal static void AddFacebookManifestConfig(XElement applicationRoot, XDConfigModel configModel)
162
+ {
163
+ var facebookAppId = NormalizeFacebookAppId(configModel?.facebook?.app_id);
164
+ if (applicationRoot == null || string.IsNullOrEmpty(facebookAppId)) return;
165
+
166
+ AddOrUpdateMetaData(applicationRoot, FacebookApplicationIdMetaDataName, $"\\{facebookAppId}");
167
+ AddOrUpdateMetaData(applicationRoot, FacebookClientTokenMetaDataName, configModel?.facebook?.client_token);
168
+ AddOrUpdateFacebookActivity(applicationRoot, configModel?.game_name);
169
+ AddOrUpdateCustomTabActivity(applicationRoot, facebookAppId);
170
+ AddOrUpdateFacebookContentProvider(applicationRoot, facebookAppId);
171
+ }
172
+
173
+ private bool IsGlobalRegion()
174
+ {
175
+ return string.Equals(configModel?.region_type?.Trim(), RegionTypeGlobal, StringComparison.OrdinalIgnoreCase);
176
+ }
177
+
178
+ private static void AddOrUpdateMetaData(XElement applicationRoot, string name, string value)
179
+ {
180
+ if (string.IsNullOrWhiteSpace(value)) return;
181
+
182
+ var metaData = applicationRoot.Elements("meta-data")
183
+ .FirstOrDefault(element => GetAndroidAttribute(element, "name") == name);
184
+ if (metaData == null)
185
+ {
186
+ metaData = new XElement("meta-data");
187
+ applicationRoot.Add(metaData);
188
+ }
189
+
190
+ SetAndroidAttribute(metaData, "name", name);
191
+ SetAndroidAttribute(metaData, "value", value.Trim());
192
+ }
193
+
194
+ private static string NormalizeFacebookAppId(string appId)
195
+ {
196
+ return appId?.Trim().TrimStart('\\');
197
+ }
198
+
199
+ private static void AddOrUpdateFacebookActivity(XElement applicationRoot, string gameName)
200
+ {
201
+ var activity = FindOrCreateActivity(applicationRoot, FacebookActivityName);
202
+ SetAndroidAttribute(activity, "configChanges", AndroidConfigChanges);
203
+ SetAndroidAttribute(activity, "label",
204
+ string.IsNullOrWhiteSpace(gameName) ? "@string/app_name" : gameName.Trim());
205
+ }
206
+
207
+ private static void AddOrUpdateCustomTabActivity(XElement applicationRoot, string facebookAppId)
208
+ {
209
+ var activity = FindOrCreateActivity(applicationRoot, FacebookCustomTabActivityName);
210
+ SetAndroidAttribute(activity, "configChanges", AndroidConfigChanges);
211
+ SetAndroidAttribute(activity, "exported", "true");
212
+
213
+ var intentFilter = activity.Elements("intent-filter")
214
+ .FirstOrDefault(IsCustomTabIntentFilter);
215
+ if (intentFilter == null)
216
+ {
217
+ intentFilter = new XElement("intent-filter");
218
+ activity.Add(intentFilter);
219
+ }
220
+
221
+ AddChildWithAndroidNameIfMissing(intentFilter, "action", AndroidActionView);
222
+ AddChildWithAndroidNameIfMissing(intentFilter, "category", AndroidCategoryDefault);
223
+ AddChildWithAndroidNameIfMissing(intentFilter, "category", AndroidCategoryBrowsable);
224
+ AddOrUpdateDataScheme(intentFilter, $"fb{facebookAppId}");
225
+ }
226
+
227
+ private static void AddOrUpdateFacebookContentProvider(XElement applicationRoot, string facebookAppId)
228
+ {
229
+ var provider = applicationRoot.Elements("provider")
230
+ .FirstOrDefault(element => GetAndroidAttribute(element, "name") == FacebookContentProviderName);
231
+ if (provider == null)
232
+ {
233
+ provider = new XElement("provider");
234
+ applicationRoot.Add(provider);
235
+ }
236
+
237
+ SetAndroidAttribute(provider, "name", FacebookContentProviderName);
238
+ SetAndroidAttribute(provider, "authorities", $"{FacebookContentProviderAuthorityPrefix}{facebookAppId}");
239
+ SetAndroidAttribute(provider, "exported", "true");
240
+ }
241
+
242
+ private static XElement FindOrCreateActivity(XElement applicationRoot, string activityName)
243
+ {
244
+ var activity = applicationRoot.Elements("activity")
245
+ .FirstOrDefault(element => GetAndroidAttribute(element, "name") == activityName);
246
+ if (activity != null) return activity;
247
+
248
+ activity = new XElement("activity");
249
+ SetAndroidAttribute(activity, "name", activityName);
250
+ applicationRoot.Add(activity);
251
+ return activity;
252
+ }
253
+
254
+ private static bool IsCustomTabIntentFilter(XElement intentFilter)
255
+ {
256
+ return HasChildWithAndroidName(intentFilter, "action", AndroidActionView)
257
+ && HasChildWithAndroidName(intentFilter, "category", AndroidCategoryDefault)
258
+ && HasChildWithAndroidName(intentFilter, "category", AndroidCategoryBrowsable);
259
+ }
260
+
261
+ private static bool HasChildWithAndroidName(XElement root, string childName, string name)
262
+ {
263
+ return root.Elements(childName).Any(element => GetAndroidAttribute(element, "name") == name);
264
+ }
265
+
266
+ private static void AddChildWithAndroidNameIfMissing(XElement root, string childName, string name)
267
+ {
268
+ if (HasChildWithAndroidName(root, childName, name)) return;
269
+
270
+ var child = new XElement(childName);
271
+ SetAndroidAttribute(child, "name", name);
272
+ root.Add(child);
273
+ }
274
+
275
+ private static void AddOrUpdateDataScheme(XElement intentFilter, string scheme)
276
+ {
277
+ var data = intentFilter.Elements("data").FirstOrDefault();
278
+ if (data == null)
279
+ {
280
+ data = new XElement("data");
281
+ intentFilter.Add(data);
282
+ }
283
+
284
+ SetAndroidAttribute(data, "scheme", scheme);
285
+ }
286
+
287
+ private static string GetAndroidAttribute(XElement element, string attributeName)
288
+ {
289
+ return (string)element.Attribute(AndroidNs + attributeName);
290
+ }
291
+
292
+ private static void SetAndroidAttribute(XElement element, string attributeName, string value)
293
+ {
294
+ element.SetAttributeValue(AndroidNs + attributeName, value);
295
+ }
296
+
111
297
  public void OnPreprocessBuild(BuildReport report)
112
298
  {
113
299
  // 删除旧版本添加的内容
@@ -118,4 +304,4 @@ namespace XD.SDK.Oversea.Editor
118
304
  if (File.Exists(targetPath)) File.Delete(targetPath);
119
305
  }
120
306
  }
121
- }
307
+ }
@@ -15,6 +15,6 @@ FOUNDATION_EXPORT const unsigned char XDGlobalWrapperVersionString[];
15
15
 
16
16
  // In this header, you should import all the public headers of your framework using statements like #import <XDGlobalWrapper/PublicHeader.h>
17
17
 
18
- #define XDGlobal_VERSION @"7.3.1"
19
- #define XDGlobal_VERSION_CODE @"7030100"
20
- // HASH e51483ce
18
+ #define XDGlobal_VERSION @"7.6.1"
19
+ #define XDGlobal_VERSION_CODE @"7060100"
20
+ // HASH fbff8e7e
package/package.json CHANGED
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "name": "com.xd.sdk.oversea",
3
3
  "displayName": "XDGSDK Oversea",
4
- "version": "7.3.4",
4
+ "version": "7.6.1",
5
5
  "description": "XDGSDK",
6
6
  "unity": "2019.3",
7
7
  "license": "MIT",
8
8
  "dependencies": {
9
- "com.xd.sdk.common": "7.3.4"
9
+ "com.xd.sdk.common": "7.6.1"
10
10
  }
11
- }
11
+ }
@@ -1,32 +0,0 @@
1
- fileFormatVersion: 2
2
- guid: 6a5d89219f5a41628820d2c42b95b544
3
- PluginImporter:
4
- externalObjects: {}
5
- serializedVersion: 2
6
- iconMap: {}
7
- executionOrder: {}
8
- defineConstraints: []
9
- isPreloaded: 0
10
- isOverridable: 1
11
- isExplicitlyReferenced: 0
12
- validateReferences: 1
13
- platformData:
14
- - first:
15
- Android: Android
16
- second:
17
- enabled: 1
18
- settings: {}
19
- - first:
20
- Any:
21
- second:
22
- enabled: 0
23
- settings: {}
24
- - first:
25
- Editor: Editor
26
- second:
27
- enabled: 0
28
- settings:
29
- DefaultValueInitialized: true
30
- userData:
31
- assetBundleName:
32
- assetBundleVariant:
@@ -1,32 +0,0 @@
1
- fileFormatVersion: 2
2
- guid: 38236b5ea1a9478293ffde1a95ac870d
3
- PluginImporter:
4
- externalObjects: {}
5
- serializedVersion: 2
6
- iconMap: {}
7
- executionOrder: {}
8
- defineConstraints: []
9
- isPreloaded: 0
10
- isOverridable: 0
11
- isExplicitlyReferenced: 0
12
- validateReferences: 1
13
- platformData:
14
- - first:
15
- Android: Android
16
- second:
17
- enabled: 1
18
- settings: {}
19
- - first:
20
- Any:
21
- second:
22
- enabled: 0
23
- settings: {}
24
- - first:
25
- Editor: Editor
26
- second:
27
- enabled: 0
28
- settings:
29
- DefaultValueInitialized: true
30
- userData:
31
- assetBundleName:
32
- assetBundleVariant:
@@ -1,32 +0,0 @@
1
- fileFormatVersion: 2
2
- guid: 3c53804fb42c4e468c9d3d29eb75bc33
3
- PluginImporter:
4
- externalObjects: {}
5
- serializedVersion: 2
6
- iconMap: {}
7
- executionOrder: {}
8
- defineConstraints: []
9
- isPreloaded: 0
10
- isOverridable: 0
11
- isExplicitlyReferenced: 0
12
- validateReferences: 1
13
- platformData:
14
- - first:
15
- Android: Android
16
- second:
17
- enabled: 1
18
- settings: {}
19
- - first:
20
- Any:
21
- second:
22
- enabled: 0
23
- settings: {}
24
- - first:
25
- Editor: Editor
26
- second:
27
- enabled: 0
28
- settings:
29
- DefaultValueInitialized: true
30
- userData:
31
- assetBundleName:
32
- assetBundleVariant: