暫無描述
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

PostProcessBuildPlist.cs 4.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. #if UNITY_2018_1_OR_NEWER && UNITY_IOS
  2. using System;
  3. using System.IO;
  4. using UnityEngine;
  5. using UnityEditor;
  6. using UnityEditor.Build;
  7. using UnityEditor.iOS.Xcode;
  8. using System.Collections.Generic;
  9. using System.Linq;
  10. using UnityEditor.Build.Reporting;
  11. namespace UnityEngine.Advertisements.Editor
  12. {
  13. internal class PostProcessBuildPlist : IPostprocessBuildWithReport
  14. {
  15. public int callbackOrder => 0;
  16. private const string k_SkAdNetworkIdentifier = "SKAdNetworkIdentifier";
  17. private const string k_SkAdNetworkItems = "SKAdNetworkItems";
  18. private const string k_SkAdNetworksFileName = "SKAdNetworks";
  19. private const string k_UnitySkAdNetworkId = "4DZT52R2T5.skadnetwork";
  20. public void OnPostprocessBuild(BuildReport report)
  21. {
  22. if (report.summary.platform != BuildTarget.iOS)
  23. {
  24. return;
  25. }
  26. UpdateInfoPlistWithSkAdNetworkIds(report.summary.outputPath);
  27. }
  28. internal static void UpdateInfoPlistWithSkAdNetworkIds(string pathToPlistFile) {
  29. var provider = new SkAdNetworkLocalSourceProvider();
  30. var ids = new HashSet<string>();
  31. try {
  32. SkAdNetworkParser.GetAllParsers().ToList().ForEach(parser => {
  33. provider.GetSources(k_SkAdNetworksFileName, parser.GetExtension()).ToList().ForEach(source => {
  34. ids.UnionWith(parser.ParseSource(source));
  35. });
  36. });
  37. }
  38. catch (Exception e) {
  39. Debug.LogError($"Failed to parse SKAdNetwork files due to following reason: {e.Message}");
  40. }
  41. if (!ids.Contains(k_UnitySkAdNetworkId)) {
  42. ids.Add(k_UnitySkAdNetworkId);
  43. }
  44. try {
  45. WriteSkAdNetworkIdsToInfoPlist(ids, pathToPlistFile);
  46. }
  47. catch (Exception e) {
  48. Debug.LogError($"Failed to update info.plist file due to following reason: {e.Message}");
  49. }
  50. }
  51. /// <summary>
  52. /// Write all plistValues to an existing Info.plist file
  53. /// </summary>
  54. internal static void WriteSkAdNetworkIdsToInfoPlist(HashSet<string> skAdNetworkIds, string outputPath)
  55. {
  56. var infoPlistPath = outputPath + "/Info.plist";
  57. var plist = new PlistDocument();
  58. plist.ReadFromString(File.ReadAllText(infoPlistPath));
  59. var root = plist.root;
  60. if (root == null) {
  61. Debug.LogWarning("[Unity SKAdNetwork Parser] Unable to parse info.plist. Unable to add SkAdNetwork Identifiers.");
  62. return;
  63. }
  64. if(!root.values?.ContainsKey(k_SkAdNetworkItems) ?? false) {
  65. root.CreateArray(k_SkAdNetworkItems);
  66. }
  67. var adNetworkItems = root[k_SkAdNetworkItems].AsArray();
  68. if (adNetworkItems == null) {
  69. Debug.LogWarning("[Unity SKAdNetwork Parser] Unable to modify existing info.plist. Unable to add SkAdNetwork Identifiers.");
  70. return;
  71. }
  72. foreach (var adNetworkId in skAdNetworkIds) {
  73. if (!PlistContainsAdNetworkId(adNetworkItems, adNetworkId)) {
  74. adNetworkItems.AddDict().SetString(k_SkAdNetworkIdentifier, adNetworkId);
  75. }
  76. }
  77. File.WriteAllText(infoPlistPath, plist.WriteToString());
  78. }
  79. /// <summary>
  80. /// Check if the value is already contained in the plist
  81. /// </summary>
  82. internal static bool PlistContainsAdNetworkId(PlistElementArray adNetworkItems, string adNetworkId)
  83. {
  84. foreach(var adNetworkItem in adNetworkItems.values)
  85. {
  86. var item = adNetworkItem.AsDict();
  87. if(item.values.TryGetValue(k_SkAdNetworkIdentifier, out var value))
  88. {
  89. if(value.AsString() == adNetworkId)
  90. {
  91. return true;
  92. }
  93. }
  94. }
  95. return false;
  96. }
  97. }
  98. }
  99. #endif //UNITY_2018_1_OR_NEWER