라이브러리 호환성을 위하여 minSdkVersion을 19로 설정하였지만 OkHttp 3.14.7 버전의 targetSdk30 이슈(https://github.com/square/okhttp/issues/5162)로 인해 21 버전 이상을 사용 하셔야 하며,
21 미만 지원을 위해서는 별도의 설정을 추가해야 하고 Gradle 빌드에서만 지원 합니다.
NaverGameSDK 1.3.2 버전부터는 라이브러리 충돌 (duplicate class) 이슈를 회피하기 위하여 Unity 2020 버전부터 지원하는 [Android 라이브러리 프로젝트] 방식으로 제공되며 unityproject 파일을 임포트시 자동으로 포함됩니다. 예전 방식으로의 라이브러리 설치를 원하시는 경우 별도 가이드 를 참조 부탁드립니다.
유니티 에서는 2019 버전부터 지원된다고 가이드 하고 있으나 내부 테스트시 여러가지 문제점이 발견되어 2022.3.13f 버전을 기준으로 테스트 되고 있습니다.
Unity 2019 이하 버전에 대한 설정은 별도 가이드 에서 당분간 제공되지만 빌드에러에 대한 기술적 지원은 어렵습니다.
2-3. Unity 2022.2 이후 버전의 라이브러리 설치
Android targetsdk 34 설정시 AGP(Android Gradle Plugin) 7.0 이상의 사용이 요구되며, Unity 2022.2 이후버전부터 AGP 7.0.0 버전을 공식적으로 지원하고 있습니다. 원활한 빌드를 위하여 2022.2 이후 버전을 사용해 주시기 바랍니다.
2-4. Gradle 빌드 설정
Project Settings > Player Settings > Android > Publishing Settings 를 열어 Custom Gradle Properties Template 와 Custom Main Manifest 를 체크합니다.
Custom Grale Build 설정
Assets/Plugins/Android/gradleTemplate.properties 항목을 열어 다음과 같이 android.useAndroidX, android.enableJetifier항목을 true 로 추가 해줍니다.
Assets/Plugins/Android/AndroidManifest.xml 항목을 열어 <activity> 항목에 android:exported = "true" 를 추가합니다.
NaverGameSDK Android 라이브러리 프로젝트의 targetSDK 를 변경하려면 NGSDK>Plugins>Android>navergamesdk.androidlib>build.gradle 파일을 수정하여 라이브러리 설정을 변경 할 수 있습니다.
2-5. Minify 설정
Release 빌드를 위한 Minify(proguard) 설정을 합니다
Build Settings > Player Settings > AndroidTab > Publishing Settings > Custom Proguard File 설정을 체크하여 새로운 proguard-user.txt 파일을 생성합니다.
Build Settings > Player Settings > AndroidTab > Publishing Settings > Minify 에서 Release를 활성화 합니다.
proguard-user.txt 파일을 열고 다음과 같은 프로가드 설정을 추가 합니다
3. iOS 추가설정
네이버 게임 iOS SDK는 iOS 12.0 버전부터 지원합니다.
iOS용 게임을 개발할 때에는 다음과 같은 사항을 추가로 설정해야 합니다.
3-1. Xcode 설정
Xcode에서 다음과 같이 개발 환경을 설정합니다.
TARGETS 항목 중 프레임 워크를 선택합니다.
Build Setting 탭을 선택하고 Linking 항목에서 Other Linker Flags를 찾습니다.
Basic 또는 Customized모드 인 경우 Other Linker Flag가 보이지 않는 경우도 있습니다.이 경우 All 모드를 선택합니다.
우상단에 위치한 검색창에 Other Linker Flag를 입력하면 쉽게 찾을 수 있습니다.
General -> Framework and Libraries 에 NNGSDK.xcframework 를 추가합니다.
Embed 설정은 Embed&Sign 으로 설정합니다.
NaverThirdPartyLogin.xcframework 을 Unity-iPhone 타겟으로 링크해 줍니다.
NaverThirdPartyLogin.xcframework 파일은 NaverThirdPartyLogin.xcframework 으로 사용 합니다.
Embed 설정은 Embed&Sign 으로 설정합니다.
Unity 6 ( 6000.2.x 이후 버전) 에서
Cycle inside Unity-iPhone; building could produce unreliable results. 빌드 에러가 발생한다면
Unity-iPhone > Build Phases 에서 Unity Process symbols for Unity-iPhone 을 맨 아래로 이동합니다.
(Unity 6에서 빌드 단계 순서가 바뀌며 .xcframework 복사와 심볼 처리 단계가 서로 참조하게 되는 이슈)
NaverGameSDK 사용
NaverGameSDK를 사용하기 전에 먼저 init 메서드를 호출해야 사용이 가능합니다.
init() 메서드
init() 메서드는 NaverGameSDK 을 셋팅하는 메서드 입니다. 필요한 인자는 다음과 같습니다.
terminateSdk() 메서드는 NaverGameSDK 를 종료시키는 메서드입니다. 특정 상황에서 sdk 를 종료시켜야 할때 호출합니다. 예를들어 GLinkDelegate 콜백을 통해서 전달되는 인게임메뉴코드 를 실행할때에는 반드시 terminateSdk() 메서드를 호출하여 sdk를 닫아주어야 합니다.
다음은 terminateSdk() 메서드를 구현한 예입니다.
executeHomeBanner() 메서드
등록한 배너창을 띄우는 메서드 입니다.
다음은 executeHomeBanner() 메서드를 구현한 예입니다.
executeSorryBanner() 메서드
점검용 또는 특정 공지사항 페이지를 띄운다. 이 페이지에서는 다른 화면으로 이동하는것이 제한됩니다
다음은 executeSorryBanner() 메서드를 구현한 예입니다.
executeBoard(int boardId) 메서드
특정 게시판을 바로 실행하는 메서드 입니다. boardId 는 웹에서 게시판 접속 시 보이는 https://game.naver.com/lounge/{loungeId}/board/{boardId} 형태의 URL에서 알 수 있습니다.
다음은 executeBoard() 메서드를 구현한 예입니다.
executeFeed(long feedId, bool isTempFeedId) 메서드
등록된 글의 번호로 바로 실행하는 메서드 입니다. 만약 예약노출을 통해서 등록한 예약 게시글의 경우에는 예약글의 번호를 feedId 에 입력하고 IsTempFeedId 를 true 로 입력해야 합니다.
예약글이 게시되기 전에는 메서드를 실행하더라도 글이 노출되지 않습니다.
feedId: 게시글 또는 예약게시글의 번호
isTempFeedId: FeedId 가 게시글 인 경우 false, feedId가 예약게시글 인 경우 true
인증 오류 발생 시 살펴봐야 할 디버그 용도의 문자열입니다. Client ID, Client Secret, 앱 이름, 앱 스킴이 포함되어 있습니다. 각 값이 두 번씩 출력되는데, 괄호 없이 출력되는 내용은 실제 인증에 사용된 값이며 괄호로 싸인 내용은 SDK에서 캐시하고 있는 값입니다. 실제 인증에 사용된 값, SDK에 캐시된 값, 그리고 네이버 아이디로 로그인 개발자 센터에 등록된 값이 모두 일치해야 합니다.
다음은 getAuthSettingDescription() 메서드를 구현한 예입니다.
getCountryCode() 메서드
단말기의 countryCode를 얻어옵니다.
countryCode는 두 개의 알파벳으로 이루어진 국가코드(ISO 3166-1 alpha-2)입니다. 이를 활용하면 코드 내에서 국가별 분기처리가 가능합니다. 주요 국가코드는 다음과 같으며이외의 국가 코드는 링크를 참고하십시오.
국가코드
국가
CN
중국
JP
일본
KR
대한민국
TH
태국
US
미국
다음은 getCountryCode() 메서드를 사용하여 대한민국의 경우에만 SDK 를 초기화 하고 배너를 호출하는 예입니다.
GLinkDelegate 딜리게이트
Sdk 내부에서 특정 이벤트가 발생했을때 event 를 통해서 이를 GameEngine 에 알립니다.
SdkOpenedDelegate 이벤트
NaverGameSdk 가 실행되었을때 발생합니다.
등록방식은 다음과 같습니다.
SdkClosedDelegate 이벤트
NaverGameSdk 가 종료되었을 때 발생합니다.
등록방식은 다음과 같습니다.
SdkCallInGameMenuCode 딜리게이트
NaverGameSdk 에서 인게임메뉴코드 를 실행해야 할 때 발생합니다. 공식 라운지 관리페이지 > SDK 관리> 배너관리 페이지에서 배너에 '인게임 메뉴' 를 등록했을때 사용합니다. Android 와 iOS 각각의 플랫폼에 따라 등록한 값이 각자 전달되므로 다른 값을 입력했다면 각차 처리해 주셔야 합니다.
GooglePlayStore 정책 (https://support.google.com/googleplay/android-developer/answer/11926878?hl=ko) 에 따라 2022년 11월부터 targetSDK 31이 강제됩니다. 이에따라 NaverGameSDK도 targetSDK31 버전을 기준으로 가이드되며, Unity 2019 이하 버전은 여러가지 제약사항이 많아 빌드가 실패하는 경우가 많습니다. Unity2020 이후 버전의 사용을 권장해 드리며 Unity2019 이하 버전의 빌드에러에 대한 기술적 지원은 힘든 점 양해 부탁드립니다.
2-0. Unity 2019 버전에서 targetSDK31 이상으로 gradle 빌드 설정
Unity 2019 버전에서 targetSDK31 이상을 컴파일 하기 위해서는 커스텀 그래들을 설정해 주셔야 합니다.
링크를 참조하여 그래들 설정을 진행해 주시기 바랍니다.
2-1. Unity 2019 버전을 위한 NaverGameSDK Android 설정
Unity 2020 이후 라이브러리 패키지의 'NGSDK/Plugins/Android/navergamesdk.androidlib/libs 폴더에서 [navergame-sdk-gradle-x.x.x.aar] 파일을 'NGSDK/Plugins/Android/' 폴더로 이동하고 [navergamesdk.androidlib] 폴더는 삭제합니다.
Project Settings > Player > Android Tab > Publishing Settings > Build로 이동하여 Custom Main Gradle Template 와 Custom Gradle Properties Template를 선택합니다.
옵션이 체크되었다면 Assets/Plugins/Android 폴더에 mainTemplate.gradle 파일이 생성되었을 것입니다. 해당 파일을 편집기로 열어 dependencies 항목에 다음과 같이 종속 라이브러리를 추가합니다.
1.2.0 버전부터 글쓰기 기능을 위하여 naveridlogin-android-sdk 가 추가되었고, kotlin-stdlib, retrofit, converter-gson 의 버전이 변경되었으니 1.x.x 버전에서 업그레이드시에는 반드시 확인 부탁드립니다.
그리고 gradleTemplate.properties 항목도 열어 다음과 같이 android.useAndroidX, android.enableJetifier항목을 true 로 추가 해줍니다.
가로 모드, 세로 모드
NaverGameSDK는 가로 모드와 세로 모드를 모두 지원한다.
Android, iOS 환경 모두 별도로 설정하지 않아도 화면의 가로, 세로 상태에 따라 가로 모드, 세로 모드가 자동으로 적용된다.
#retrofit 2
# Retrofit does reflection on generic parameters. InnerClasses is required to use Signature and
# EnclosingMethod is required to use InnerClasses.
-keepattributes Signature, InnerClasses, EnclosingMethod
# Retrofit does reflection on method and parameter annotations.
-keepattributes RuntimeVisibleAnnotations, RuntimeVisibleParameterAnnotations
# Retain service method parameters when optimizing.
-keepclassmembers,allowshrinking,allowobfuscation interface * {
@retrofit2.http.* <methods>;
}
# Ignore annotation used for build tooling.
-dontwarn org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement
# Ignore JSR 305 annotations for embedding nullability information.
-dontwarn javax.annotation.**
# Guarded by a NoClassDefFoundError try/catch and only used when on the classpath.
-dontwarn kotlin.Unit
# Top-level functions that can only be used by Kotlin.
-dontwarn retrofit2.KotlinExtensions
#end of retrofit2
#gson
##---------------Begin: proguard configuration for Gson ----------
# Gson uses generic type information stored in a class file when working with fields. Proguard
# removes such information by default, so configure it to keep all of it.
-keepattributes Signature
# For using GSON @Expose annotation
-keepattributes *Annotation*
# Gson specific classes
-dontwarn sun.misc.**
#-keep class com.google.gson.stream.** { *; }
# Prevent proguard from stripping interface information from TypeAdapterFactory,
# JsonSerializer, JsonDeserializer instances (so they can be used in @JsonAdapter)
-keep class * implements com.google.gson.TypeAdapterFactory
-keep class * implements com.google.gson.JsonSerializer
-keep class * implements com.google.gson.JsonDeserializer
##---------------End: proguard configuration for Gson ----------
#end of gson
#glide
-keep public class * implements com.bumptech.glide.module.GlideModule
-keep public class * extends com.bumptech.glide.module.AppGlideModule
-keep public enum com.bumptech.glide.load.ImageHeaderParser$** {
**[] $VALUES;
public *;
}
#end of glide
#kotlin
-keep class kotlin.** { *; }
-keep class kotlin.Metadata { *; }
-dontwarn kotlin.**
-keepclassmembers class **$WhenMappings {
<fields>;
}
-keepclassmembers class kotlin.Metadata {
public <fields>;
public <methods>;
}
#End of kotlin
#navergame sdk
# Application classes that will be serialized/deserialized over Gson
-keep class com.navercorp.nng.android.sdk.api.Host** { *; }
-keep class com.navercorp.nng.android.sdk.api.service** { *; }
-keep class com.navercorp.nng.android.sdk.api.entity** { *; }
-keep class com.navercorp.nng.android.sdk.NngNdkWrapper** { *; }
-keepclassmembers class com.navercorp.nng.android.sdk.NngNdkWrapper { *; }
-keep class com.navercorp.nng.android.sdk.NNGLink** { *; }
-keep class com.navercorp.nng.android.sdk.NNGLink$Companion { *; }
-keepclassmembers class com.navercorp.nng.android.sdk.NNGLink {
public static ** Companion;
}
-keep public interface com.navercorp.nng.android.sdk.NNGCallbackListener {*;}
-keep class com.navercorp.nng.android.sdk.NNGConfig** { *; }
#end of sdk
public void init(string loungeId, string clientId, string clientSecret);