라이브오퍼레이션 서비스
라이브오퍼레이션 서비스는 앱 사용자를 필터링하여 타겟팅 된 푸시를 발송할 수 있는 타겟푸시 서비스 기능과
사용자에게 알려야할 내용이 있을 때 팝업 형태의 공지창을 이용하여 안내 내용을 노출하는 공지팝업 기능을 제공하는 서비스입니다.
푸시 연동을 통해 앱 운영자는 고도화된 푸시 시스템을 이용하여 운영을 할 수 있으며 , 공지팝업 기능을 통해 진행 중인 이벤트나 신규 기능 출시 등의 안내를 진행할 수 있습니다.
라이브오퍼레이션 서비스 소개나 이용방법 안내는 아래의 아티클을 통해 확인할 수 있습니다.
서비스 이용 중 도움이 필요한 경우에는 아래 메일 주소로 연락 부탁 드립니다.
기술 문의 - 기술지원팀 (tech_support@igaworks.com)
[라이브오퍼레이션 연동 : 안드로이드 ]
주의사항
- 라이브오퍼레이션 연동을 위해서는 Google Play Services 연동이 되어 있어야 합니다. [Google Play Services 설정]
- 라이브오퍼레이션 연동을 위해서는 android-support-v4.jar 최신 버전이 프로젝트에 포함되어 있어야 합니다. (ver26 이상 필요) [Google 가이드]
- 이클립스 환경에서의 FCM 사용을 위한 가이드는 준비 중입니다.
SDK 다운로드 및 설치
라이브러리 다운로드
아래 링크를 클릭하여 이클립스 용 라이브오퍼레이션 안드로이드 라이브러리를 다운로드 하고 압축을 해제합니다.
라이브러리 추가
압축해제한 파일 중 jar 파일들을 프로젝트의 libs 폴더에 복사합니다.
이미지 리소스 추가
압축 해제한 파일 중 drawble 폴더에 포함된 이미지 파일을 안드로이드 프로젝트의 /res/drawable 폴더로 복사합니다.
안드로이드 매니페스트 설정
라이브오퍼레이션을 이용하기 위한 내용을 AndroidManifest.xml 파일에 추가합니다.
앱키 & 해시키 추가
Igaworks 홈페이지에서 애드브릭스 앱 등록 후 발급받은 앱키, 해시키를 <application></application> 태그 안에 추가합니다.
<application>
...
<meta-data android:name="igaworks_app_key" android:value="이곳에_앱키를_입력하세요" />
<meta-data android:name="igaworks_hash_key" android:value="이곳에_해시키를_입력하세요" />
...
</application>
퍼미션 추가
<manifest></manifest> 태그 안에 필수 퍼미션을 추가합니다.
<manifest>
...
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.VIBRATE"/>
<!-- LiveOps v1.3.6 부터는 필요하지 않습니다. -->
<uses-permission android:name="android.permission.GET_TASKS"/>
<!-- C2DM Permission -->
<permission android:name="MY_PACKAGE_NAME.permission.C2D_MESSAGE" android:protectionLevel = "signature"/>
<uses-permission android:name="MY_PACKAGE_NAME.permission.C2D_MESSAGE"/>
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE"/>
...
</manifest>
+ C2DM 퍼미션 설정의 MY_PACKAGE_NAME 에는 연동 중인 프로젝트의 패키지 네임을 입력합니다.
리시버 추가
<application></application> 태그 안에 라이브오퍼레이션을 위한 필수 리시버와 서비스를 등록합니다.
<!-- IGAWorks GCM Broadcast Receiver -->
<receiver android:name="com.igaworks.liveops.pushservice.LiveOpsGCMBroadcastReceiver"
android:permission="com.google.android.c2dm.permission.SEND" >
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<action android:name="com.google.android.c2dm.intent.REGISTRATION" />
<category android:name="MY_PACKAGE_NAME" />
</intent-filter>
</receiver>
<!-- IGAWorks Push Service -->
<service android:enabled="true" android:name="com.igaworks.liveops.pushservice.GCMIntentService" />
<!-- Client Push App Receiver -->
<receiver android:name="com.igaworks.liveops.pushservice.LiveOpsReceiver"
android:permission="MY_PACKAGE_NAME.permission.C2D_MESSAGE">
<intent-filter>
<action android:name="com.igaworks.liveops.pushservice.CLIENT_PUSH_RECEIVE"/>
</intent-filter>
</receiver>
+ 리시버 설정의 MY_PACKAGE_NAME 에는 연동 중인 프로젝트의 패키지 네임을 입력합니다.
구글 플레이 서비스 meta tag 추가
<application></application> 태그 안에 Google Play Services 를 연동하기 위해 meta tag를 추가 합니다.
<meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version"/>
OREO 지원 API 추가
<manifest></manifest> 태그 안에 안드로이드 8.0 OREO 버전을 지원 하는 API를 추가합니다.
<uses-sdk
android:minSdkVersion="14"
android:targetSdkVersion="26"/>
프로가드 설정
안드로이드 스튜디오의 app/proguard-rules.pro 파일에 애드팝콘 SDK에 대한 난독화 예외설정을 추가합니다.
##---------------Begin: proguard configuration for Igaworks Common ----------
-keep class com.igaworks.** { *; }
-dontwarn com.igaworks.**
##---------------End: proguard configuration for Igaworks Common ----------
##---------------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
-keep class sun.misc.Unsafe { *; }
-keep class com.igaworks.gson.stream.** { *; }
# Application classes that will be serialized/deserialized over Gson
-keep class com.igaworks.adbrix.model.** { *; }
##---------------End: proguard configuration for Gson ----------
Caution!!! 이클립스 프로젝트의 경우에는 Project/proguard-project.txt 파일을 수정합니다.
기본 연동
세션 트래킹 : 자동
<application
android:name="com.igaworks.IgawDefaultApplication"
... 중략 ...
>
</application>
자체 application 클래스를 사용하고 있는 경우
<!-- AndroidManifest.xml -->
<application
android:name="PACKAGE_NAME.YourCustomApplication"
... 중략 ...
>
</application>
/* YourCustomApplication.java */
public class YourCustomApplication extends Application{
@Override
public void onCreate(){
super.onCreate();
IgawCommon.autoSessionTracking(YourCustomApplication.this);
// 어플리케이션 클래스에서는 autoSessionTracking API 외의 어떤 애드브릭스 API도 호출해서는 안됩니다.
}
}
세션 트래킹 : 수동
@Override
protected void onResume() {
super.onResume();
IgawCommon.startSession(MainActivity.this);
}
@Override
protected void onPause() {
super.onPause();
IgawCommon.endSession();
}
푸시 연동 : 서버 푸시
SDK 초기화
- IgawCommon.setUserId(String userId);
- IgawLiveOps.initialize(Context context);
- IgawLiveOps.resume(Context context);
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//반드시 유저식별값을 설정해야 합니다.
IgawCommon.setUserId(MainActivity.this,"user10001");
// 라이브오퍼레이션 SDK를 초기화 합니다.
IgawLiveOps.initialize(MainActivity.this);
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
IgawLiveOps.resume(MainActivity.this);
}
}
유저식별값 입력
유저식별값은 라이브오퍼레이션에서 유저를 판단하기 위해 사용되는 정보입니다.
주의 사항
- 1명의 유저는 1개의 고유한 유저식별값을 가져야하며, 가변적인 값을 사용해서는 안됩니다.
- 개인정보(이메일, 이름, 전화번호, 식별가능한 유저아이디 등)이 포함되어서는 안됩니다.
- 한글, 특수문자, 공백 등이 포함된 경우에는 반드시 URL 인코딩 처리를 하여 사용하여야 합니다.
- IgawLiveOps.initialize API가 호출되기 전에 설정되어야 합니다.
위 주의사항에 유의하여 유저 식별값을 입력합니다.
IgawCommon.setUserId(getApplicationContext(),"user10001");
딥링크 연동 / 서버 푸시
종류 | 형식 |
URL (Http 타입) | http://www.igaworks.com |
URL (Custom Scheme 타입) | myApp://activity.com |
Json 타입 | {"key":"value", "igaworks":"sample"} |
- URL (http 타입) 및 Json
public class MainActivity extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
IgawCommon.setUserId(MainActivity.this"userid_123123123");
IgawLiveOps.initialize(MainActivity.this);
//onNewIntent 리스너로 intent를 전달합니다.
onNewIntent(getIntent());
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
/* 딥링크 타입에 따라 아래를 참고하여 구현합니다. */
/* 1. 앱 스키마 타입(myApp://deepLinkAction) 딥링크 구현
*
* 딥링크로 전달된 앱스키마 액션을 실행합니다.
* IgawLiveOps.onNewIntent(MainActivity.this, intent);
*/
/* 2. Json 문자열 타입({“url”:”deepLinkAction”}) 딥링크 구현
*
* 딥링크로 전달된 Json 문자열을 추출하고 Json 오브젝트로 변환합니다.
* String jsonStr = intent.getStringExtra("com.igaworks.liveops.deepLink");
* JSONObject jsonObj;
* try {
* jsonObj = new JSONObject(jsonStr);
* //Json 오브젝트를 파싱하여 액션을 실행하도록 구현합니다.
* } catch (Exception e) {
* // TODO: handle exception
* }
*/
}
}
- URL (Custom Scheme 타입)
<!-- IgawLiveOpsPushMessageLauncherActivity 를 추가합니다. -->
<activity
android:name="com.igaworks.liveops.pushservice.IgawLiveOpsPushMessageLauncherActivity"
android:permission="MY_PACKAGE_NAME.permission.C2D_MESSAGE"
android:noHistory="true"/>
<!-- 딥링크를 적용할 Activity에 설정합니다. -->
<activity android:name="com.example.DeeplinkActivity">
<intent-filter>
<data android:scheme="myApp" android:host="activity.com" />
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
</intent-filter>
</activity>
푸시 연동 : 클라이언트 푸시
일반 클라이언트 푸시
IgawLiveOps.setNormalClientPushEvent(
this, // Application Context
1, // Delay seconds. 몇 초 뒤에 보낼지 설정
"Let’s play now!", // 전송할 메시지
1, // Event ID, 취소할 때 쓰기 위한 값.
false // 앱이 실행 중일 때에도 보이게 할 것인지 설정
);
빅 텍스트 클라이언트 푸시
IgawLiveOps.setBigTextClientPushEvent(
this, // Application Context
1, // Delay seconds, 몇 초 뒤에 보낼지 설정
"contentText", // contents
"bigContentTitle", // 일반 푸시 내용
"Let's play now! WoooooooW!!", // 푸시에 표시될 빅 텍스트
"summaryText", // 푸시에 표시될 요약 텍스트
1, // Event ID, 취소할 때 쓰기 위한 것
false // 앱이 실행 중일 때에도 보이게 할 것인지 설정
);
푸시 추가 옵션
푸시 유저 타겟팅
타겟팅 데이터 설정
//IgawLiveOps.setTargetingData(Context applicationContext, final String userCustomDataKey, final Object userCustomData);
IgawLiveOps.setTargetingData(context, "purchaseCount", purchaseCount);
타겟팅 데이터 동기화
@Override
protected void onPause() {
super.onPause();
IgawLiveOps.resume();
}
타겟팅 데이터 수동 동기화
IgawLiveOps.flush(MainActivity.this);
푸시 수신 on/off
푸시 수신 설정
- true : 푸시를 수신함.
- false : 푸시를 수신하지 않음.
IgawLiveOps.enableService(MainActivity.this, true);
푸시 아이콘 이미지 교체
타겟푸시에서 사용하는 푸시 아이콘 이미지는 Launcher Icon으로 등록된 앱 아이콘 이미지를 사용합니다.
구글 피쳐드를 받기 위해 이미지 교체가 필요하신 경우에는 setNotificationIconStyle api를 호출하여 이미지를 교체할 수 있습니다.
//IgawLiveOps.setNotificationIconStyle(Context context, String small_icon_name, String large_icon_name, int argb);
IgawLiveOps.setNotificationIconStyle(getApplicationContext(), "ic_small_filename", "ic_large_filename", 0xFFE90F0F);
알림 설정
안드로이드 5.0이상에서 헤드업 알림과 잠금 화면 알림을 설정할 수 있습니다.
헤드업 알람은 기기가 활성 상태일 때 알림을 노출하는 기능입니다. 잠금 화면 알람은 알림이 잠금화면에 노출하는 기능입니다.
(더 자세한 내용은 구글 문서를 확인합니다. [구글 문서 확인하기])
setNotificationOption api를 호출하여 헤드업/잠금 화면 알람을 설정합니다.
헤드업 알림 설정 (priority)
- PRIORITY_MAX (int:2), 헤드업 알림 사용
- PRIORITY_HIGH (int:1), 헤드업 알림 사용
- PRIORITY_DEFAULT (int:0), 헤드업 알림 사용하지 않음
- PRIORITY_LOW (int:-1), 헤드업 알림 사용하지 않음
- PRIORITY_MIN (int:-2), 헤드업 알림 사용하지 않음
잠금 화면 알림 설정 (visibility)
- VISIBILITY_SECRET (int:-1), 락스크린 알림 사용하지 않음
- VISIBILITY_PRIVATE (int:0), 내용을 표시하지 않고 락스크린 알림
- VISIBILITY_PUBLIC (int:1), 전체 내용을 락스크린에 알림
// public static void setNotificationOption(Context context, int priority, int visibility)
IgawLiveOps.setNotificationOption(getApplicationContext(), NotificationCompat.PRIORITY_HIGH, NotificationCompat.VISIBILITY_SECRET);
알림 요약 (InboxStyle)
여러가지의 알림을 하나의 요약 알림으로 결합합니다. Inbox Style은 서버푸시에서만 작동합니다.
(*클라이언트 푸시의 경우 푸시ID를 알 수 없기 때문에 Inbox Style을 지원하지 않습니다.)
setStackingNotificationOption api를 호출하여 설정합니다.
알림 요약 설정 (useStacking)
- true : 알림 요약기능을 사용하여 노출합니다.
- false : 알림 요약기능을 사용하지 않습니다.
요약 알림 노출 설정 (useTitleForStacking)
- true : 요약된 알람을 펼칠 때, 제목을 노출합니다.
- false : 요약된 알림을 펼칠 때, 내용을 노출합니다.
요약된 알람의 제목, 내용 설정 (ContentTitle, ContentText)
- empty : 가장 최근의 알람의 제목과 내용을 노출합니다.
- your_custom_message : api에 호출한 제목과 내용을 노출합니다.
요약 알림 펼칠 때, 노출 제목 설정 (bigContentTitle)
- empty : ContentTitle을 노출합니다.
- your_custom_message : api에 호출한 제목을 노출합니다.
요약 알림 펼칠 때, 요약 내용 설정 (bigContentSummaryText)
- empty : 컨텐츠 요약부분을 사용하지 않습니다.
- your_custom_message : api에 호출한 내용을 노출합니다.
// public static void setStackingNotificationOption(Context context, boolean useStacking, boolean useTitleForStacking, String ContentTitle, String ContentText, String bigContentTitle, String bigContentSummaryText)
IgawLiveOps.setStackingNotificationOption(getApplicationContext(), true, false, "More events are waiting for you", "See detail", "All events", "For Summary Text");
공지팝업 연동
공지팝업 서비스를 이용하기 위해서 다음의 단계에 따라서 초기화를 진행합니다.
아래의 초기화 API들은 어플리케이션이 시작되는 시점에서 호출하시는 것을 권장합니다.
유저식별값 입력
유저식별값은 라이브오퍼레이션에서 유저를 판단하기 위해 사용되는 정보입니다.
주의 사항
- 1명의 유저는 1개의 고유한 유저식별값을 가져야하며, 가변적인 값을 사용해서는 안됩니다.
- 개인정보(이메일, 이름, 전화번호, 식별가능한 유저아이디 등)이 포함되어서는 안됩니다.
- 한글, 특수문자, 공백 등이 포함된 경우에는 반드시 URL 인코딩 처리를 하여 사용하여야 합니다.
- requestPopupResources API가 호출되기 전에 설정되어야 합니다.
위 주의사항에 유의하여 유저 식별값을 입력합니다.
IgawCommon.setUserId(getApplicationContext(),"user10001");
공지팝업 데이터로드
requestPopupResources api를 호출하여 라이브오퍼레이션 관리페이지에서 설정한 공지팝업 데이터를 로드합니다.
데이터 로드를 진행하기 전에 반드시 유저식별값이 설정되어 있어야 합니다.
주의사항
- 유저식별값이 입력되지 않으면 공지팝업 데이터로드가 불가능합니다.
- 라이브오퍼레이션 공지팝업 관리페이지에서 새로운 공지를 추가했어도, 데이터로드가 진행되지 않으면 SDK에서는 새로운 공지를 확인할 수 없습니다.
위 주의사항에 유의하여 공지팝업 데이터를 로드합니다.
//공지팝업 데이터로드
IgawLiveOps.requestPopupResource(mainContext, new LiveOpsPopupResourceEventListener() {
@Override
public void onReceiveResource(boolean isReceive) {
Log.d("liveops", "isReceivePopupResource? :: " + isReceive);
}
});
공지팝업 노출 API
showPopup api를 호출하여 공지팝업을 노출하고자 하는 시점에서 팝업 형태의 공지를 노출합니다.
공지에 표현되는 내용은 공지팝업 관리페이지에서 설정한 겂이어야 합니다.
아래의 예시는 showPopupNotiBtn 버튼을 클릭했을 때, 공지팝업을 노출하는 것을 가정으로 하여 작성하였습니다.
Button showPopupNotiBtn;
showPopupNotiBtn = (Button)findViewById(R.id.showPopupNotiBtn);
showPopupNotiBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//공지팝업을 노출합니다.
//showPopup(Context context, String popup_spacekey, LiveOpsDeepLinkEventListener listener);
IgawLiveOps.showPopUp(MainActivity.this, "공지팝업스페이스키", null);
}
});
+ 공지팝업스페이스키는 공지팝업 관리페이지에서만 발급 받을 수 있습니다.
+ LiveOpsDeepLinkEventListener 는 공지팝업 딥링크 기능을 사용할 때에만 사용합니다.
공지팝업 딥링크
공지팝업의 딥링크 기능을 이용하여 공지팝업을 통해 다양한 액션을 수행하도록 처리할 수 있습니다.
Button showPopupNotiBtn;
showPopupNotiBtn = (Button)findViewById(R.id.showPopupNotiBtn);
showPopupNotiBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
IgawLiveOps.showPopUp(mainContext, "공지팝업스페이스키", new LiveOpsDeepLinkEventListener() {
@Override
public void onReceiveDeeplinkData(String deepLinkDataString) {
Log.d("liveops", "LiveOpsPopUp DeepLinkData :::: " + deepLinkDataString);
//딥링크 데이터를 이용하여 추가 액션을 수행하도록 구현합니다.
}
});
}
});
+ 공지팝업 스페이스키는 공지팝업 관리페이지에서 발급받을 수 있습니다.
+ 딥링크는 공지팝업 관리페이지에서 등록할 수 있습니다.
+ 딥링크의 형태는 Json 형태를 지원합니다.
공지팝업 유저타겟팅
유저그룹을 설정하여 공지팝업의 노출 대상을 직접 선택하실 수 있습니다.
유저 그룹을 설정하기 위한 데이터는 직접 세팅하여 확보할 수 있습니다.
타겟팅 데이터 설정
타겟팅 된 유저에게만 공지팝업을 노출하기 위해서 커스텀 유저 데이터를 세팅할 수 있습니다.
세팅된 커스텀 유저 데이터는 공지팝업 관리페이지에서 확인할 수 있습니다. 아래 예시는 구매 횟수를 커스텀 데이터로 수집하는 것입니다.
//IgawLiveOps.setTargetingData(Context applicationContext, final String customUserDataKey, final Object customUserData);
IgawLiveOps.setTargetingData(MainActivity.this, "purchaseCount", purchaseCount);
+ customUserData : 타겟팅을 위한 유저 데이터를 입력합니다. bool, int, long, float, String을 지원합니다.
+ customUserDataKey : 유저 커스텀 데이터 키를 설정합니다.
타겟팅 데이터 동기화
resume api 를 호출하여 설정된 타겟팅 데이터를 라이브옵스 서버와 동기화합니다.
액티비티의 onResume()에 아래와 같이 추가합니다.
@Override
protected void onResume() {
super.onResume();
IgawLiveOps.resume(MainActivity.this);
//… 이하 생략
}
공지팝업 추가옵션
공지팝업 이벤트 리스너
공지팝업에서 발생하는 클릭 이벤트에 대한 리스너를 제공합니다.
- onCancelPopupBtnClick : 공지팝업 닫기 이벤트
- onPopupClick : 공지팝업 클릭 이벤트
setLiveOpsPopupEventListener api를 이용하여 이벤트리스너를 등록하고 구현합니다.
IgawLiveOps.setLiveOpsPopupEventListener(new LiveOpsPopupEventListener() {
@Override
public void onCancelPopupBtnClick() {
// 공지팝업 닫기 버튼 클릭
}
@Override
public void onPopupClick() {
// 공지팝업 오픈 이벤트
}
});
공지팝업 강제 종료
유저의 클릭 이벤트 없이 api를 이용하여 동적으로 공지팝업을 종료 처리할 수 있습니다.
현재 공지 팝업 종료
destroyPopup api 를 호출하여 현재 노출되어 있는 최상위 공지 팝업만을 종료 처리합니다.
IgawLiveOps.destroyPopup();
모든 공지 팝업 종료
destroyAllPopups api를 호출하여 현재 노출되어 있는 최상위 공지 팝업 외의 다른 대기 중인 팝업도 모두 종료 처리 합니다.
IgawLiveOps.destroyAllPopups()