콘텐츠로 이동

Unity iOS

Hive SDK Unity iOS로 앱을 개발 완료 후 앱을 빌드할 때 다음 항목을 설정해야 합니다.

Xcode Signing & Capabilities에 권한 추가

Hive > ExternalDependency에서 선택한 기능들을 사용하기 위한 권한을 Xcode 프로젝트에 추가합니다. Hive PostProcess 에디터 또는 HivePostProcess.cs로 추가할 수 있습니다.

Hive PostProcess 에디터로 추가

Unity 개발 환경에서 Hive > Build project post process settings > iOS 또는 Hive > Edit Config > Build iOS project post process settings로 Hive PostProcess 에디터를 실행하면 Hive SDK 기능중 원하는 기능만 선택해 Xcode Signing & Capabilities 항목에 권한을 추가할 수 있습니다.

추가할 수 있는 Hive SDK 기능들은 다음과 같습니다.

  • 푸시 알림(Push Notifications): 로컬, 리모트 푸시 기능 활성화 여부
    • Development Mode: 개발용 프로비저닝 프로파일 인증서 사용 시 설정
    • Release Mode: 배포용 프로비저닝 프로파일 인증서 사용 시 설정
  • 백그라운드 모드(Remote Notifications): 앱이 백그라운드에 있을 때 리모트 푸시 알림을 수신할 것인지의 여부
  • Apple 로그인(Sign In Apple): Sign In Apple 로그인 기능 활성화 여부
  • Associated Domains(웹상에서 앱을 설치, 실행하도록 허용하는 도메인 주소): 앱의 Universal Link로 사용할 허용 도메인 리스트
  • 인앱 구매(In-App Purchase): 인앱 구매 기능 활성화 여부
  • 게임 센터(Game Center): Game Center 로그인 및 관련 기능 활성화 여부


Apply를 클릭하면 Xcode Signing & Capabilities에 선택한 기능들을 추가합니다. Reset을 클릭하면 설정값을 기본값으로 초기화합니다.

이 때, 설정한 값들은 JSON String 형식으로 Assets > Hive_SDK_v4 > PostProcess > iOS > HivePostProcessSettingIOS.txt에 저장됩니다.

Note

Hive PostProcess Editor를 사용하지 않고 HivePostProcessSettingiOS.txt 파일 내용을 직접 수정해도 Xcode 프로젝트 Capabilities를 수정할 수 있습니다.

HivePostProcess.cs로 추가

Unity에서 Xcode 프로젝트를 빌드하기 전에, HivePostProcess.cs 파일에 있는 주석을 해제하면 Hive SDK 기능 권한들을 Xcode Signing & Capabilities에 자동으로 추가합니다. 주석 처리를 하면 권한을 제거할 수 있습니다.

아래 코드에서 특정 라인을 주석 처리하면, 해당 권한은 Signing & Capabilities에 추가되지 않습니다. 사용하려는 권한 외에는 주석 처리를 권장합니다.

private static void iOSSettingCapabilites(string path, HivePostProcessSettingIOS setting) {
   #if UNITY_IOS
   Debug.Log("iOSSettingCapabilites : OnPostProcessBuild -\n path: "+path);

   var projPath = PBXProject.GetPBXProjectPath(path);
   var mainTargetName = "Unity-iPhone";
   var entitlementsFileName = "Entitlements.entitlements";

   ProjectCapabilityManager capabilityManager = new ProjectCapabilityManager(projPath, entitlementsFileName, mainTargetName);
    if (setting.isAddInAppPurchase) {
       capabilityManager.AddInAppPurchase();
   }
    if (setting.isAddPushNotifications) {
       // 푸시 알림(Hive SDK 노티피키션) 기능을 사용하지 않는 경우에는 아래 라인을 주석 처리해야 함.
       capabilityManager.AddPushNotifications(setting.isPushNotificationsDevelopment);
   }
    if (setting.isAddBackGroundModesRemoteNotifications) {
       capabilityManager.AddBackgroundModes(iOS.Xcode.BackgroundModesOptions.RemoteNotifications);
   }
    if (setting.isAddSignInWithApple) {
       // Apple 로그인 기능을 사용하지 않는 경우에는 아래 라인을 주석 처리해야 함.
       capabilityManager.AddSignInWithApple();
   }
    if (setting.isAddAssociatedDomains) {
       var associatedDomains = setting.associatedDomains;
       capabilityManager.AddAssociatedDomains(associatedDomains.ToArray());
   }
    capabilityManager.WriteToFile();

   if (setting.isAddGameCenter) {
       var entitlementsModifier = new HiveEntitlementsModifier(path, entitlementsFileName);
       entitlementsModifier.AddGameCenter();
   }
   #endif
}
Warning

HivePostProcess.cs를 수정해 Hive SDK 기능들을 info.plist 파일들과 Signing & Capabilities에 자동으로 추가/제거하는 것은 현재 사용중인 Hive SDK 버전에서만 가능합니다. HivePostProcess.cs를 수정한 상태에서 Hive SDK Manager로 Hive SDK 버전을 업데이트하면 충돌이 발생합니다. Hive SDK 버전과 상관없이 이 기능을 이용하려면, HivePostProcess.cs를 수정하지 말고 PBX 프로젝트 API를 바탕으로 게임사만의 후처리 스크립트(GamePostProcess.cs 등)를 별도로 구현해 사용해야 합니다.

Xcode info.plist 파일에 세부 설정 추가

Hive > ExternalDependency에서 선택한 기능들을 사용할 때 필요한 세부 설정들을 추가합니다. Unity에서 Xcode 프로젝트를 빌드하기 전에, HivePostProcess.cs 파일에 있는 주석을 해제하면 Hive SDK 사용을 위한 세부 설정을 info.plist 파일에 자동으로 추가합니다. 주석 처리를 하면 설정을 제거할 수 있습니다.

아래 코드에서 특정 라인을 주석 처리하면, 해당 설정은 info.plist 파일에 추가되지 않습니다.

private static void iOSSettingInfoPlist(string buildPath) {
   #if UNITY_IOS
    var PlistPath = buildPath + "/Info.plist";
   PlistDocument plist = new PlistDocument();
   plist.ReadFromFile(PlistPath);
    var rootDict = plist.root;
   rootDict.SetBoolean("UIViewControllerBasedStatusBarAppearance",false);
   if( hasFacebookAppId() )
       rootDict.SetString("FacebookAppID",getFacebookAppID());
   if (hasFacebookClientToken())
       rootDict.SetString("FacebookClientToken", getFacebookClientToken());
    rootDict.SetString("CFBundleIdentifier",getBundleIdentifier());
    //facebook white list
   var LSApplicationQueriesSchemes = rootDict.CreateArray("LSApplicationQueriesSchemes");
   LSApplicationQueriesSchemes.AddString("fbapi");
   LSApplicationQueriesSchemes.AddString("fb-messenger-share-api");
    // for vk
   LSApplicationQueriesSchemes.AddString("vk");
   LSApplicationQueriesSchemes.AddString("vkauthorize");
   LSApplicationQueriesSchemes.AddString("vk-share");
    // for WeChat
   LSApplicationQueriesSchemes.AddString("weixin");
   LSApplicationQueriesSchemes.AddString("weixinULAPI");

    // for QQ
   LSApplicationQueriesSchemes.AddString("mqqOpensdkSSoLogin");
   LSApplicationQueriesSchemes.AddString("mqqopensdkapiV2");
   LSApplicationQueriesSchemes.AddString("mqqopensdkapiV3");
   LSApplicationQueriesSchemes.AddString("wtloginmqq2");
   LSApplicationQueriesSchemes.AddString("mqq");
   LSApplicationQueriesSchemes.AddString("mqqapi");
   LSApplicationQueriesSchemes.AddString("mqqopensdknopasteboard");
   LSApplicationQueriesSchemes.AddString("mqqopensdknopasteboardios16");
   LSApplicationQueriesSchemes.AddString("lineauth2");
    //URL Types settings
   var CFBundleURLTypes = rootDict.CreateArray("CFBundleURLTypes");
    var facebookURLType = CFBundleURLTypes.AddDict();
   facebookURLType.SetString("CFBundleTypeRole","Editor");
   if( hasFacebookAppId() )
       facebookURLType.CreateArray("CFBundleURLSchemes").AddString("fb"+getFacebookAppID());
    // add Google reversed client id
   if (hasGoogleReversedClientId()){
       var googleReversedClientId = CFBundleURLTypes.AddDict();
       googleReversedClientId.SetString("CFBundleTypeRole","Editor");
       googleReversedClientId.CreateArray("CFBundleURLSchemes").AddString(getGoogleReversedClientId());
   }
   // add tencent appid
   if (hasQQAppId()){
       var qqAppId = CFBundleURLTypes.AddDict();
       qqAppId.SetString("CFBundleTypeRole","Editor");
       qqAppId.CreateArray("CFBundleURLSchemes").AddString("tencent"+getQQAppId());
   }
   // add VK appid
   if (hasVKAppId()) {
       var vkAppId = CFBundleURLTypes.AddDict();
       vkAppId.SetString("CFBundleTypeRole","Editor");
       vkAppId.CreateArray("CFBundleURLSchemes").AddString("vk"+getVKAppId());
   }
    // add wechat appid
   if (hasWeChatAppId()) {
       var weChatAppId = CFBundleURLTypes.AddDict();
       weChatAppId.SetString("CFBundleTypeRole","Editor");
       weChatAppId.CreateArray("CFBundleURLSchemes").AddString(getWeChatAppId());
   }
    // add line channel id
   if (hasLineChannelId()) {
       var lineChannelId = CFBundleURLTypes.AddDict();
       lineChannelId.SetString("CFBundleTypeRole","Editor");
       lineChannelId.CreateArray("CFBundleURLSchemes").AddString("line3rdp."+getBundleIdentifier());
   }
    var urlSchemes = CFBundleURLTypes.AddDict();
   urlSchemes.SetString("CFBundleTypeRole","Editor");
   urlSchemes.SetString("CFBundleIdentifier",getBundleIdentifier());
   urlSchemes.CreateArray("CFBundleURLSchemes").AddString(getBundleIdentifier());
    // remove exit on suspend if it exists.
   string exitsOnSuspendKey = "UIApplicationExitsOnSuspend";
   if(rootDict.values.ContainsKey(exitsOnSuspendKey))
   {
       rootDict.values.Remove(exitsOnSuspendKey);
   }
    // Set encryption usage boolean
   string encryptKey = "ITSAppUsesNonExemptEncryption";
   rootDict.SetBoolean(encryptKey, false);
    // ATS
   var ATSDict = rootDict.CreateDict("NSAppTransportSecurity");
   ATSDict.SetBoolean("NSAllowsArbitraryLoads",true);
    plist.WriteToFile(PlistPath);
    #endif
}
Warning

HivePostProcess.cs를 수정해 Hive SDK 기능들을 info.plist 파일들과 Signing & Capabilities에 자동으로 추가/제거하는 것은 현재 사용중인 Hive SDK 버전에서만 가능합니다. HivePostProcess.cs를 수정한 상태에서 Hive SDK Manager로 Hive SDK 버전을 업데이트하면 충돌이 발생합니다. Hive SDK 버전과 상관없이 이 기능을 이용하려면, HivePostProcess.cs를 수정하지 말고 PBX 프로젝트 API를 바탕으로 게임사만의 후처리 스크립트(GamePostProcess.cs 등)를 별도로 구현해 사용해야 합니다.


HivePostProcess.cs는 특정 파일을 연결할 때에도 사용할 수 있습니다. 예를 들어 Hive SDK 애널리틱스 사용 시, Unity > Hive Dependencies에서 Firebase를 사용하도록 하고, Google Firebase 콘솔에서 다운로드한 GoogleService-Info.plist 파일을 Assets/ExternalResources/iOS 경로에 넣은 후, HivePostProcess.cs에 아래 코드를 작성하면, Unity로 빌드한 Xcode 프로젝트에 GoogleService-Info.plist 파일을 자동으로 연결합니다.

private static void iOSSettingProject(string buildPath) {
   ...
   // GoogleService-Info.plist 파일을 Xcode 프로젝트에 자동으로 추가하는 기능을 비활성화하려면 아래 라인을 주석 처리해야함.
   iOSAddGoogleServiceInfoPlist(buildPath, project, targets[mainTarget]);
   ...
}

#if UNITY_IOS
public static void iOSAddGoogleServiceInfoPlist(string buildPath, PBXProject project, string target) {

   var isUseFirebase = ExternalDependencyDictionaryManager.isUseDependency(ExternalDependencyType.Firebase);

   if (!isUseFirebase) {
       Debug.Log("[iOSAddGoogleServiceInfoPlist] ExternalDependencyType Firebase not use. Skip process.");
       return;
   }

   string[] filesToCopy = new string[]
   {
       "GoogleService-Info.plist",
   };

   foreach (string file in filesToCopy) {
       var srcPath = Path.Combine("Assets/ExternalResources/iOS", file);
       var relativePath = Path.Combine("", file);
       var physicalPath = Path.Combine(buildPath, relativePath);

       if (!File.Exists(srcPath)) {
           Debug.Log("[iOSAddGoogleServiceInfoPlist] " + file + " not exist. Skip process.");
           continue;
       }

       Debug.Log("[iOSAddGoogleServiceInfoPlist] srcPath = " + srcPath);
       Debug.Log("[iOSAddGoogleServiceInfoPlist] relativePath = " + relativePath);
       Debug.Log("[iOSAddGoogleServiceInfoPlist] physicalPath = " + physicalPath);

       File.Copy(srcPath, physicalPath, true);
       var fileGuid = project.AddFile(physicalPath, relativePath);
       Debug.Log("[iOSAddGoogleServiceInfoPlist] fileGuid = " + fileGuid);

       project.AddFileToBuild(target, fileGuid);
   }
} 
#endif

미사용 XML 파일 삭제

Hive SDK Manager가 아니라 Unity 패키지로 Hive SDK Unity를 설치 또는 업데이트하는 경우, 앱을 빌드하기 전에 아래 경로에 있는 HIVESDK_{라이브러리_이름}Dependencies.xml 파일을 모두 삭제해야 합니다.

  • Assets/Hive_SDK_v4/Dependencies
  • Assets/Hive_SDK_v4/Editor

삭제해야할 파일 예시들은 다음과 같습니다.

  • HIVESDK_DefaultDependencies.xml
  • HIVESDK_HerculesDependencies.xml
  • HIVESDK_HiveAnalyticsConsentModeDependencies.xml
  • HIVESDK_HiveDataStoreDependencies.xml
  • HIVESDK_HiveDeviceManagementDependencies.xml
  • HIVESDK_HiveGoogleInAppReviewDependencies.xml
  • HIVESDK_HiveGoogleInAppUpdateDependencies.xml
  • HIVESDK_HivePromotionDependencies.xml
  • HIVESDK_HiveRealNameVerificationDependencies.xml
  • HIVESDK_MarketAmazonDependencies.xml
  • HIVESDK_MarketAppleDependencies.xml
  • HIVESDK_MarketGoogleDependencies.xml
  • HIVESDK_MarketHiveStoreDependencies.xml
  • HIVESDK_MarketHuaweiDependencies.xml
  • HIVESDK_MarketLebiDependencies.xml
  • HIVESDK_MarketOneStoreDependencies.xml
  • HIVESDK_MarketSamsungDependencies.xml
  • HIVESDK_ProviderAdjustDependencies.xml
  • HIVESDK_ProviderAppleDependencies.xml
  • HIVESDK_ProviderAppleSignInDependencies.xml
  • HIVESDK_ProviderAppsFlyerDependencies.xml
  • HIVESDK_ProviderFacebookDependencies.xml
  • HIVESDK_ProviderFirebaseDependencies.xml
  • HIVESDK_ProviderGoogleDependencies.xml
  • HIVESDK_ProviderGooglePlayGamesDependencies.xml
  • HIVESDK_ProviderHiveMembershipDependencies.xml
  • HIVESDK_ProviderHuaweiDependencies.xml
  • HIVESDK_ProviderLineDependencies.xml
  • HIVESDK_ProviderQQDependencies.xml
  • HIVESDK_ProviderRecaptchaDependencies.xml
  • HIVESDK_ProviderSingularDependencies.xml
  • HIVESDK_ProviderVKDependencies.xml
  • HIVESDK_ProviderWechatDependencies.xml
  • HIVESDK_ProviderWeverseDependencies.xml
  • HIVESDK_PushAmazonAdmDependencies.xml
  • HIVESDK_PushGoogleFcmDependencies.xml