Nav apraksta
Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

ProjectCapabilityManagerExtension.cs 4.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. #if UNITY_IOS || UNITY_TVOS
  2. using System;
  3. using System.Reflection;
  4. using UnityEditor.iOS.Xcode;
  5. namespace AppleAuth.Editor
  6. {
  7. public static class ProjectCapabilityManagerExtension
  8. {
  9. private const string EntitlementsArrayKey = "com.apple.developer.applesignin";
  10. private const string DefaultAccessLevel = "Default";
  11. private const string AuthenticationServicesFramework = "AuthenticationServices.framework";
  12. private const BindingFlags NonPublicInstanceBinding = BindingFlags.NonPublic | BindingFlags.Instance;
  13. private const BindingFlags PublicInstanceBinding = BindingFlags.Public | BindingFlags.Instance;
  14. /// <summary>
  15. /// Extension method for ProjectCapabilityManager to add the Sign In With Apple capability in compatibility mode.
  16. /// In particular, adds the AuthenticationServices.framework as an Optional framework, preventing crashes in
  17. /// iOS versions previous to 13.0
  18. /// </summary>
  19. /// <param name="manager">The manager for the main target to use when adding the Sign In With Apple capability.</param>
  20. /// <param name="unityFrameworkTargetGuid">The GUID for the UnityFramework target. If null, it will use the main target GUID.</param>
  21. public static void AddSignInWithAppleWithCompatibility(this ProjectCapabilityManager manager, string unityFrameworkTargetGuid = null)
  22. {
  23. var managerType = typeof(ProjectCapabilityManager);
  24. var projectField = managerType.GetField("project", NonPublicInstanceBinding);
  25. var targetGuidField = managerType.GetField("m_TargetGuid", NonPublicInstanceBinding);
  26. var entitlementFilePathField = managerType.GetField("m_EntitlementFilePath", NonPublicInstanceBinding);
  27. var getOrCreateEntitlementDocMethod = managerType.GetMethod("GetOrCreateEntitlementDoc", NonPublicInstanceBinding);
  28. // in old unity versions PBXCapabilityType had internal ctor; that was changed to public afterwards - try both
  29. var constructorInfo = GetPBXCapabilityTypeConstructor(PublicInstanceBinding) ??
  30. GetPBXCapabilityTypeConstructor(NonPublicInstanceBinding);
  31. if (projectField == null || targetGuidField == null || entitlementFilePathField == null ||
  32. getOrCreateEntitlementDocMethod == null || constructorInfo == null)
  33. throw new Exception("Can't Add Sign In With Apple programatically in this Unity version");
  34. var entitlementFilePath = entitlementFilePathField.GetValue(manager) as string;
  35. var entitlementDoc = getOrCreateEntitlementDocMethod.Invoke(manager, new object[] { }) as PlistDocument;
  36. if (entitlementDoc != null)
  37. {
  38. var plistArray = new PlistElementArray();
  39. plistArray.AddString(DefaultAccessLevel);
  40. entitlementDoc.root[EntitlementsArrayKey] = plistArray;
  41. }
  42. var project = projectField.GetValue(manager) as PBXProject;
  43. if (project != null)
  44. {
  45. var mainTargetGuid = targetGuidField.GetValue(manager) as string;
  46. var capabilityType = constructorInfo.Invoke(new object[] { "com.apple.developer.applesignin.custom", true, string.Empty, true }) as PBXCapabilityType;
  47. var targetGuidToAddFramework = unityFrameworkTargetGuid;
  48. if (targetGuidToAddFramework == null)
  49. {
  50. targetGuidToAddFramework = mainTargetGuid;
  51. }
  52. project.AddFrameworkToProject(targetGuidToAddFramework, AuthenticationServicesFramework, true);
  53. project.AddCapability(mainTargetGuid, capabilityType, entitlementFilePath, false);
  54. }
  55. }
  56. private static ConstructorInfo GetPBXCapabilityTypeConstructor(BindingFlags flags)
  57. {
  58. return typeof(PBXCapabilityType).GetConstructor(
  59. flags,
  60. null,
  61. new[] {typeof(string), typeof(bool), typeof(string), typeof(bool)},
  62. null);
  63. }
  64. }
  65. }
  66. #endif