콘텐츠로 이동

Unreal iOS

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

  1. Unreal Editor의 메뉴에서 편집 > 프로젝트 세팅 메뉴를 클릭하세요. 프로젝트 설정 창이 화면에 나타납니다.
  2. 프로젝트 설정 창의 좌측 패널에서 플랫폼 제목 아래의 iOS 메뉴를 선택하세요. iOS 설정 화면이 나타나면, 그룹 별로 안내된 항목을 설정하세요.

그룹별 설정

그룹별 설정 안내입니다.

  • Bundle Information 그룹: 번들 식별자(Bundle Identifier) 필드에 게임의 AppID를 입력하세요.

  • OS Info 그룹: Unreal Engine 4.25부터 지원하는 OS 버전이 11.0 이상으로 변경되었습니다. Minimum OSVersion 필드 값을 11.0으로 설정하세요.

  • Build 그룹: Additional Non-Shipping Linker Flags 필드와 Additional Shipping Linker Flags 필드에 -ObjC를 입력하세요.

    ]

Extra PList Data 그룹 설정

Additional PList Data 필드에 아래에서 안내하는 각 설정 항목에 따라 코드 라인들을 입력하세요. 아래 모든 코드들을 합쳐 한 줄로 입력해야 합니다.

접근 권한 요청 설정

접근 권한 요청 설정을 위해 Additional PList Data 필드에 다음 코드를 추가하세요.

<key>NSCameraUsageDescription</key>
<string>Approval required to take pictures.</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>Approval required to upload image files.</string>
<key>NSUserTrackingUsageDescription</key>
<string>We need your permission to use the Advertising Identifiers (IDFA) for promotion targeting and tracking analysis.</string>

인증: Facebook, QQ, VK, WeChat, Line 설정

Facebook, QQ, VK, WeChat, Line 인증을 이용할 경우, 서버 Whitelist를 설정하기 위해 Additional PList Data 필드에 다음 코드를 추가하세요.

<key>LSApplicationQueriesSchemes</key>
<array>
    <string>weixin</string>
    <string>vk-share</string>
    <string>vkauthorize</string>
    <string>vk</string>
    <string>weixinULAPI</string>
    <string>fbapi</string>
    <string>fb-messenger-api</string>
    <string>fbauth2</string>
    <string>fbshareextension</string>
    <string>mqqOpensdkSSoLogin</string>
    <string>mqqopensdkapiV2</string>
    <string>lineauth2</string>
    <string>mqqopensdkapiV3</string>
    <string>wtloginmqq2</string>
    <string>mqq</string>
    <string>mqqapi</string>
</array>

Facebook 이용 시 다음의 코드를 이용하여 Facebook AppID와 ClientToken을 추가하세요. 반드시 여러분 게임에 대한 Facebook AppID와 ClientToken 값을 입력하세요.

<key>FacebookAppID</key><string>926000000000000</string>
<key>FacebookClientToken</key><string>d123783h7sdfyh8031h23unf81h3</string>

각 IdP별로 URL Scheme을 설정합니다.

<key>CFBundleURLTypes</key>
<array>

<!--Facebook 이용을 위함. 여러분의 앱의 Facebook App ID 값을 넣어 주세요-->
<dict><key>CFBundleTypeRole</key><string>Editor</string><key>CFBundleURLSchemes</key><array><string>fb926000000000000</string></array></dict>

<!--Hive 플랫폼에서 딥링크 사용을 위함. 여러분의 AppID 값을 넣어 주세요-->
<dict><key>CFBundleTypeRole</key><string>Editor</string><key>CFBundleURLSchemes</key><array><string>com.com2us.misample.normal.freefull.apple.global.ios.universal</string></array></dict>

<!--Google Sign-in을 위함. 여러분 앱의 Google Sign-in 키 값을 넣어 주세요-->
<dict><key>CFBundleTypeRole</key><string>Editor</string><key>CFBundleURLSchemes</key><array><string>com.googleusercontent.apps.270000000000-0m7r8tb2co1q00000000000000000000</string></array></dict>

<!--QQ Sign-in을 위함. 여러분 앱의 QQ 키 값을 넣어 주세요-->
<dict><key>CFBundleTypeRole</key><string>Editor</string><key>CFBundleURLName</key><string>tencent</string>
<key>CFBundleURLSchemes</key><array><string>tencent1106227203</string></array></dict>

<!--Wechat Sign-in을 위함. 여러분 앱의 Wechat 키 값을 넣어 주세요-->
<dict><key>CFBundleTypeRole</key><string>Editor</string><key>CFBundleURLName</key><string>weixin</string><key>CFBundleURLSchemes</key><array><string>wx78176cf0c698c0f9</string></array></dict>

<!--VK Sign-in을 위함. 여러분 앱의 VK 키 값을 넣어 주세요-->
<dict><key>CFBundleTypeRole</key><string>Editor</string><key>CFBundleURLName</key><string>vk6270065</string><key>CFBundleURLSchemes</key><array><string>vk6270065</string></array></dict>

<!--Line Sign-in을 위함-->
<dict><key>CFBundleTypeRole</key><string>Editor</string>
<key>CFBundleURLSchemes</key><array><string>line3rdp.$(PRODUCT_BUNDLE_IDENTIFIER)</string></array></dict>

</array>

다음은 위 안내의 모든 값을 Additional PList Data 필드에 넣은 값의 예제입니다.

<key>NSCameraUsageDescription</key>
<string>Approval required to take pictures.</string>
<key>NSContactsUsageDescription</key>
<string>You must agree to add friends from your Contacts.</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>Approval required to upload image files.</string>
<key>NSUserTrackingUsageDescription</key>
<string>We need your permission to use the Advertising Identifiers (IDFA) for promotion targeting and tracking analysis.</string>
<key>FacebookAppID</key>
<string>1809615065921877</string>
<key>FacebookClientToken</key>
<string>c41e47ba5512ea3fb5bfb29d5cfeb244</string>
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLSchemes</key>
<array>
<string>line3rdp.$(PRODUCT_BUNDLE_IDENTIFIER)</string>
</array>
</dict>
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLSchemes</key>
<array>
<string>fb926000000000000</string>
</array>
</dict>
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLSchemes</key>
<array>
<string>com.com2us.hivesdk.normal.freefull.apple.global.ios.universal</string>
</array>
</dict>
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLSchemes</key>
<array>
<string>com.googleusercontent.apps.331526026701-s41n272jsv6c0f72kt5o7of0jns350gl</string>
</array>
</dict>
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLName</key>
<string>tencent</string>
<key>CFBundleURLSchemes</key>
<array>
<string>tencent1106227203</string>
</array>
</dict>
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLName</key>
<string>weixin</string>
<key>CFBundleURLSchemes</key>
<array>
<string>wx78176cf0c698c0f9</string>
</array>
</dict>
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLName</key>
<string>vk6270065</string>
<key>CFBundleURLSchemes</key>
<array>
<string>vk6270065</string>
</array>
</dict>
</array>
<key>LSApplicationQueriesSchemes</key>
<array>
<string>weixin</string>
<string>vk-share</string>
<string>vkauthorize</string>
<string>vk</string>
<string>weixinULAPI</string>
<string>fbapi</string>
<string>fb-messenger-api</string>
<string>fbauth2</string>
<string>fbshareextension</string>
<string>mqqOpensdkSSoLogin</string>
<string>mqqopensdkapiV2</string>
<string>lineauth2</string>
<string>mqqopensdkapiV3</string>
<string>wtloginmqq2</string>
<string>mqq</string>
<string>mqqapi</string>
</array>

Apple SignIn 설정

Apple SignIn 지원을 위해 프로젝트 폴더 > Config > DefaultEngine.ini 파일 내 아래 코드를 추가하세요.

bEnableSignInWithAppleSupport=True

다국어 설정

앱을 다국어로 서비스하려면 위해서는 다국어 설정 파일을 추가해야 합니다. 다국어 설정 파일을 다운로드 후 압축을 풀고 localize 폴더 하위에 있는 내용을 /Plugins/HIVESDK/Source/HIVESDK/ThirdParty/iOS/resource에 복사하세요.

HIVEAppDelegate 적용하기

iOS 빌드의 경우 AppDelegate 메서드 수정이 필요합니다. Unreal Engine의 경우 Swizzling을 이용하여 AppDelegate에 접근합니다. 앱 시작 시 앱을 초기화하는 단계에서 아래 코드를 추가해주세요.

// IOSAppDelegate.h 헤더 추가
#if PLATFORM_IOS
#include "Runtime/ApplicationCore/Public/iOS/IOSAppDelegate.h"
#endif


// AppDelegate 코드 추가
#if PLATFORM_IOS
UIApplication * dummyApplication = [UIApplication sharedApplication];
Class clzHIVEAppDelegate = NSClassFromString(@"HIVEAppDelegate");
SEL selApplicationDidFinishLaunchingWithOptions = NSSelectorFromString(@"application:didFinishLaunchingWithOptions:");
if( clzHIVEAppDelegate != nil && [clzHIVEAppDelegate respondsToSelector:selApplicationDidFinishLaunchingWithOptions] ) {
NSMethodSignature *method = [clzHIVEAppDelegate methodSignatureForSelector:selApplicationDidFinishLaunchingWithOptions];
if (method != nil) {

    NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:method];
    [invocation setSelector:selApplicationDidFinishLaunchingWithOptions];
    [invocation setTarget:clzHIVEAppDelegate];
    [invocation setArgument:(void*)&dummyApplication atIndex:2];
    NSDictionary *localLaunchOptions = [IOSAppDelegate GetDelegate].launchOptions;
    if( localLaunchOptions != nil ) {
        [invocation setArgument:(void*)&localLaunchOptions atIndex:3];
    }
    [invocation invoke];
}
}
#endif

iOS FMallocAnsi 설정

Unreal Engine iOS 환경과 C++ 표준 템플릿 라이브러리가 정상적으로 호환되려면 아래와 같이 FMallocAnsi 설정이 필요합니다. 앱 프로젝트의 {YourProject}.Target.cs 파일에 다음 코드를 추가합니다.

public class YourProjectTarget : TargetRules
{
   public YourProjectTarget(TargetInfo Target) : base(Target)
   {  
       // 게임 클라이언트에 대한 ANSI 할당자 강제 실행
       if(Target.Platform == UnrealTargetPlatform.IOS)
       {
           GlobalDefinitions.Add("FORCE_ANSI_ALLOCATOR=1");
       }
   }
}