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