Unity SDK

SDK μ„€μΉ˜

πŸ“˜

μ—μ–΄λΈŒλ¦Ώμ§€ μœ λ‹ˆν‹° SDKλŠ” μ΅œμ†Œ 2018.4 버전 μ΄μƒμ˜ μœ λ‹ˆν‹° 버전을 ν•„μš”λ‘œ ν•©λ‹ˆλ‹€.

🚧

μ—μ–΄λΈŒλ¦Ώμ§€ μœ λ‹ˆν‹° SDKλŠ” unity-jar-resolver(External Dependency Manager for Unity)λ₯Ό 톡해 라이브러리 쒅속성을 κ΄€λ¦¬ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.
Airbridge Unity SDK 1.9.3 미만의 버전을 μ‚¬μš©ν•˜λŠ” 경우 λ‹€μŒ νŽ˜μ΄μ§€λ₯Ό 톡해 미리 ν•΄λ‹Ή μœ λ‹ˆν‹° νŒ¨ν‚€μ§€ 섀정을 μ™„λ£Œν•΄ μ£Όμ„Έμš”.

Airbridge Unity SDK 1.9.3 μ΄μƒμ˜ λ²„μ „λΆ€ν„°λŠ” Airbridge Plugin κ³Ό EDM4U 에셋을 λͺ¨λ‘ μžλ™μœΌλ‘œ κ°€μ Έμ˜€κΈ° λ•Œλ¬Έμ— λ³„λ„μ˜ μœ λ‹ˆν‹° νŒ¨ν‚€μ§€ 섀정을 ν•˜μ‹€ ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€.

νŒ¨ν‚€μ§€ μ„€μΉ˜

  1. μ΅œμ‹  λ²„μ „μ˜ Airbridge Unity SDKλ₯Ό λ‹€μš΄λ‘œλ“œ λ°›μ•„μ£Όμ„Έμš”.
  2. μœ λ‹ˆν‹° μƒλ‹¨μ˜ Assets > Import Package > Custom Package ... λ₯Ό ν΄λ¦­ν•˜μ—¬ νŒ¨ν‚€μ§€λ₯Ό μΆ”κ°€ν•΄ μ£Όμ„Έμš”.
  3. μ„€μΉ˜κ°€ μ™„λ£Œλ˜λ©΄ μœ λ‹ˆν‹° μƒλ‹¨μ˜ AB180 탭을 확인 ν•˜μ‹€ 수 μžˆμŠ΅λ‹ˆλ‹€.

ν”„λ‘œμ νŠΈ μ„€μ •

μœ λ‹ˆν‹° μƒλ‹¨μ˜ AB180 > Airbridge Settings λ₯Ό ν΄λ¦­ν•˜μ‹œλ©΄ μ•„λž˜μ™€ 같은 화면을 확인 ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

🚧

ν•„λ“œ μž…λ ₯ μ™„λ£Œ ν›„ μ μš©μ„ μœ„ν•΄ Update iOS App Setting ν˜Ήμ€ Update Android Manifestλ₯Ό λ°˜λ“œμ‹œ λˆŒλŸ¬μ£Όμ„Έμš”.

🚧

Android Manifest νŒŒμΌμ„ μ‚¬μš©μžκ°€ 직접 Merge μž‘μ—…μ„ μˆ˜ν–‰ν•  경우, Project > Plugins > Airbridge > Android > AndroidManifest.xml νŒŒμΌμ„ μ°Έμ‘°ν•˜μ—¬ μ£Όμ„Έμš”.

μ•± 정보 μ„€μ •

μœ λ‹ˆν‹° μƒλ‹¨μ˜ AB180 > Airbridge Settings의 App Name 및 App Token ν•„λ“œμ— λŒ€μ‹œλ³΄λ“œμ—μ„œ μ„€μ •λœ μ•± 이름 (Unique ID)κ³Ό μ•± SDK 토큰 정보λ₯Ό 각각 μž…λ ₯ν•΄ μ£Όμ„Έμš”.

ν•΄λ‹Ή μ •λ³΄λŠ” Airbridge λŒ€μ‹œλ³΄λ“œμ˜ β†’ Settings β†’ Tokens νƒ­μ—μ„œ ν™•μΈν•˜μ‹€ 수 μžˆμŠ΅λ‹ˆλ‹€.

2520

μ΄ˆκΈ°ν™”

Airbridge Unity SDK의 경우 λ³„λ„μ˜ μ΄ˆκΈ°ν™” μž‘μ—…μ€ ν•„μš”λ‘œ ν•˜μ§€ μ•ŠμœΌλ‚˜ νŠΉμˆ˜ν•œ 경우 각 ν”Œλž«νΌλ§ˆλ‹€ λ³„λ„μ˜ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ μž‘μ—…μ΄ ν•„μš”ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

SDK μ„€μΉ˜ 확인

μ—μ–΄λΈŒλ¦Ώμ§€ SDK의 κΈ°λ³Έ μ„€μΉ˜ 및 섀정이 μ™„λ£Œ ν›„ λ‹€μŒκ³Ό 같은 방법듀을 ν†΅ν•΄μ„œ μ˜¬λ°”λ₯΄κ²Œ μ„€μ • λ˜μ—ˆλŠ”μ§€ ν™•μΈν•˜μ‹€ 수 μžˆμŠ΅λ‹ˆλ‹€.

둜그둜 확인

ν•΄λ‹Ή μ•±μ˜ μžμ„Έν•œ 둜그 정보λ₯Ό ν™•μΈν•˜κ³  μ‹ΆμœΌμ‹  경우, μœ λ‹ˆν‹° μƒλ‹¨μ˜ AB180 > Airbridge Settings의 Log Level ν•„λ“œ 섀정을 ν†΅ν•˜μ—¬ ν™•μΈν•˜μ‹€ 수 μžˆμŠ΅λ‹ˆλ‹€.

λŒ€μ‹œλ³΄λ“œμ—μ„œ 확인

섀정이 μ™„λ£Œλ˜λ©΄ μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜ μ„€μΉ˜ ν›„ Airbridge λŒ€μ‹œλ³΄λ“œμ˜ β†’ Raw Data β†’ App Real-time Log νƒ­μ—μ„œ ν•΄λ‹Ή μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 이벀트λ₯Ό ν™•μΈν•˜μ‹€ 수 μžˆμŠ΅λ‹ˆλ‹€.

🚧

Real-time LogλŠ” 졜μž₯ 5λΆ„μ˜ μ§€μ—°μ‹œκ°„μ΄ μžˆμ„ μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

λ”₯링크 μ„€μ •


λŒ€μ‹œλ³΄λ“œ μ„€μ •

각각 iOS 및 Android ν”Œλž«νΌ 별 λ”₯링크 λŒ€μ‹œλ³΄λ“œ 섀정은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

ν”„λ‘œμ νŠΈ μ„€μ •

iOS λ”₯링크 μ„€μ •

μœ λ‹ˆν‹° μƒλ‹¨μ˜ AB180 > Airbridge Settings의 iOS URI Scheme ν•„λ“œμ— λŒ€μ‹œλ³΄λ“œμ—μ„œ μ„€μ •λœ iOS URI Scheme 정보λ₯Ό μž…λ ₯ν•΄ μ£Όμ„Έμš”.

ν•΄λ‹Ή μ •λ³΄λŠ” Airbridge λŒ€μ‹œλ³΄λ“œμ˜ β†’ Tracking Link β†’ Deep Link νƒ­μ—μ„œ ν™•μΈν•˜μ‹€ 수 μžˆμŠ΅λ‹ˆλ‹€.

Android λ”₯링크 μ„€μ •

μœ λ‹ˆν‹° μƒλ‹¨μ˜ AB180 > Airbridge Settings의 Android URI Scheme ν•„λ“œμ— λŒ€μ‹œλ³΄λ“œμ—μ„œ μ„€μ •λœ Android URI Scheme 정보λ₯Ό μž…λ ₯ν•΄ μ£Όμ„Έμš”.

ν•΄λ‹Ή μ •λ³΄λŠ” Airbridge λŒ€μ‹œλ³΄λ“œμ˜ β†’ Tracking Link β†’ Deep Link νƒ­μ—μ„œ ν™•μΈν•˜μ‹€ 수 μžˆμŠ΅λ‹ˆλ‹€.

μ»€μŠ€ν…€ 도메인 μ„€μ •

Airbridge λŒ€μ‹œλ³΄λ“œμ—μ„œ νŠΈλž˜ν‚Ή 링크λ₯Ό μƒμ„±ν•˜κ²Œ λ˜λŠ” 경우 deeplink.page ν˜Ήμ€ abr.ge ν˜•νƒœμ˜ νŠΈλž˜ν‚Ή 링크λ₯Ό μ‚¬μš©ν•  수 μžˆμ§€λ§Œ, κ³ κ°μ‚¬μ—μ„œλŠ” νŠΈλž˜ν‚Ή 링크의 λΈŒλžœλ”© 및 클릭λ₯ (CTR)의 ν–₯상을 μœ„ν•΄ λ‹€μŒκ³Ό 같은 섀정을 톡해 go.my_company.com/abcd와 같이 μ»€μŠ€ν„°λ§ˆμ΄μ¦ˆ 된 URL을 νŠΈλž˜ν‚Ή 링크둜 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

  1. μ‚¬μš©ν•  μ»€μŠ€ν…€ 도메인을 λ‹€μŒ κ°€μ΄λ“œμ™€ 같이 μ„€μ •ν•΄ μ£Όμ„Έμš”.

  2. μ•žμ„œ μ„€μ •ν•œ μ»€μŠ€ν…€ 도메인 μ£Όμ†Œλ₯Ό μœ λ‹ˆν‹° μƒλ‹¨μ˜ AB180 > Airbridge Settings의 Custom Domain ν•„λ“œμ— μž…λ ₯ν•΄ μ£Όμ„Έμš”.

λ”₯링크 콜백 μ„€μ •

μœ μ €κ°€ ν΄λ¦­ν•œ λ”₯링크 데이터λ₯Ό 전솑받기 μœ„ν•΄ λ‹€μŒκ³Ό 같이 λ©”μ‹œμ§€λ₯Ό λ°›κΈ° μœ„ν•œ 였브젝트λͺ…을 등둝해 μ£Όμ„Έμš”.

private void Awake()
{
	AirbridgeUnity.SetDeeplinkCallback("AirbridgeManager");
}

μœ„μ™€ 같이 Callback을 λ“±λ‘ν•˜κ²Œ 되면 ν•΄λ‹Ή ν΄λž˜μŠ€λŠ” λ‹€μŒκ³Ό 같은 ν•¨μˆ˜λ₯Ό 톡해 λ”₯링크 URL을 λ„˜κ²¨λ°›κ²Œ λ©λ‹ˆλ‹€.

using UnityEngine;

public class AirbridgeManager : MonoBehaviour
{ 
  private void Awake() {
    Airbridge.SetDeeplinkCallback("AirbridgeManager");
  }
  
  // Method will call by Airbridge when deeplink detected
  private void OnTrackingLinkResponse(string url)
  {

  }
}

πŸ“˜

Airbridge UnityλŠ” λ‚΄λΆ€μ μœΌλ‘œ Unityμ—μ„œ μ œκ³΅ν•˜λŠ” UnitySendMessage κΈ°λŠ₯을 μ΄μš©ν•˜μ—¬ λ”₯링크 정보λ₯Ό μ „λ‹¬ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

λ”₯링크 μ„€μ • 확인

Airbridge Unity SDK의 λ”₯링크 섀정이 μ™„λ£Œ ν›„ λ‹€μŒκ³Ό 같은 링크듀을 ν†΅ν•˜μ—¬ ν•΄λ‹Ή λͺ¨λ°”일 μ•±μ˜ νŽ˜μ΄μ§€λ‘œ μ˜¬λ°”λ₯΄κ²Œ 이동 λ˜λŠ”μ§€ ν™•μΈν•˜μ‹€ 수 μžˆμŠ΅λ‹ˆλ‹€.

  • scheme://

λ”₯링크 μ„€μ • 및 확인이 μ™„λ£Œλ˜λ©΄ Airbridge λŒ€μ‹œλ³΄λ“œ β†’ Raw Data β†’ App Real-time Log νƒ­μ—μ„œ λ‹€μŒκ³Ό 같이 ν™•μΈν•˜μ‹€ 수 μžˆμŠ΅λ‹ˆλ‹€.

μ‚¬μš©μž μ„€μ •


μ‚¬μš©μž μ‹λ³„μž 및 μ„€μ •

Airbridgeμ—μ„œλŠ” μ›Ή(Web)κ³Ό μ•±(App)κ°„μ˜ νŒŒνŽΈν™”λœ μ‚¬μš©μžμ˜ 기여도 츑정을 μœ„ν•΄ λ‹€μŒκ³Ό 같은 μ‚¬μš©μžμ˜ μ‹λ³„μž 정보듀을 μˆ˜μ§‘ν•©λ‹ˆλ‹€.

  • User Email : 이메일
  • User Phone : μ „ν™”λ²ˆν˜Έ
  • User ID : μ‚¬μš©μž 고유 ID (μ‚¬μš©μžμ˜ νŠΉμ •ν•  수 μžˆλŠ” ID κ°’μœΌλ‘œ μ›Ήκ³Ό μ•±μ—μ„œ 1:1둜 λŒ€μ‘λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€)
  • User Alias : μ‚¬μš©μžλ₯Ό λ‚˜νƒ€λ‚Ό 수 μžˆλŠ” 기타 ID (e.g. λ‘œμ—΄ν‹° ν”„λ‘œκ·Έλž¨μš© ID, 계열사 톡합 ID λ“±λ“±)

πŸ“˜

μž…λ ₯λ˜μ–΄μ§„ μ‚¬μš©μžμ˜ 이메일과 μ „ν™”λ²ˆν˜ΈλŠ” μžλ™μœΌλ‘œ ν•΄μ‹œν™”(SHA256)λ˜μ–΄ μ„œλ²„λ‘œ μ „μ†‘λ˜μ–΄ μ§‘λ‹ˆλ‹€.

Airbridge Unity SDKμ—μ„œλŠ” λ‹€μŒκ³Ό 같은 방법을 톡해 μ‚¬μš©μžμ˜ μ‹λ³„μž 정보λ₯Ό μ„€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

Dictionary<string, string> alias = new Dictionary<string, string>();
AirbridgeUser user = new AirbridgeUser();
user.SetId(UserId);
user.SetEmail(Email);
user.SetPhoneNumber(Phone);
user.SetAlias(alias);
AirbridgeUnity.SetUser(user);
  • User Alias의 κ°œμˆ˜λŠ” μ΅œλŒ€ 10개 μž…λ‹ˆλ‹€.
  • User Alias의 key λŠ” String νƒ€μž…μ΄λ©°, κΈΈμ΄λŠ” μ΅œλŒ€ 128자 μž…λ‹ˆλ‹€.
  • User Alias의 key λŠ” ^[a-z_][a-z0-9_]*$ μ •κ·œμ‹μ„ λ§Œμ‘±ν•΄μ•Ό ν•©λ‹ˆλ‹€.
  • User Alias의 value λŠ” String νƒ€μž…μ΄λ©° String의 경우 μ΅œλŒ€ 128자 μž…λ‹ˆλ‹€.

μ‚¬μš©μžμ˜ μ‹λ³„μž 정보λ₯Ό ν•œλ²ˆ μ„€μ •ν•˜κ²Œ 되면 λͺ¨λ“  μ΄λ²€νŠΈμ— ν•΄λ‹Ή μ‹λ³„μž 정보가 ν•¨κ»˜ ν¬ν•¨λ˜μ–΄ μ „λ‹¬λ©λ‹ˆλ‹€.

μ‚¬μš©μž 속성 μ„€μ •

MTA(Multi-Touch Attribution) λΆ„μ„μ˜ 정확도 ν–₯상, λ‚΄λΆ€ 데이터 뢄석, μ„œλ“œνŒŒν‹°(3rd Party) μ†”λ£¨μ…˜ 연동 λ“±μ˜ λͺ©μ μœΌλ‘œ μ‚¬μš©μžμ˜ μΆ”κ°€ 속성 데이터λ₯Ό μ„€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

Dictionary<string, object> attrs = new Dictionary<string, object>();
AirbridgeUser user = new AirbridgeUser();
user.SetAttributes(attrs);
AirbridgeUnity.SetUser(user);
  • User Attribute의 κ°œμˆ˜λŠ” μ΅œλŒ€ 100개 μž…λ‹ˆλ‹€.
  • User Attribute의 key λŠ” String νƒ€μž…μ΄λ©°, κΈΈμ΄λŠ” μ΅œλŒ€ 128자 μž…λ‹ˆλ‹€.
  • User Attribute의 key λŠ” ^[a-z_][a-z0-9_]*$ μ •κ·œμ‹μ„ λ§Œμ‘±ν•΄μ•Ό ν•©λ‹ˆλ‹€.
  • User Attribute의 value λŠ” Integer, Float, Long, Boolean νƒ€μž…κ³Ό String νƒ€μž…μ΄λ©° String의 경우 μ΅œλŒ€ 1024자 μž…λ‹ˆλ‹€.

μ‚¬μš©μž μ„€μ • 확인

Airbridge Unity SDKμ—μ„œ μ„€μ •ν•œ μœ μ € μ •λ³΄λŠ” Airbridge λŒ€μ‹œλ³΄λ“œ β†’ Raw Data β†’ App Real-time Log νƒ­μ—μ„œ λ‹€μŒκ³Ό 같이 ν™•μΈν•˜μ‹€ 수 μžˆμŠ΅λ‹ˆλ‹€.

λ””λ°”μ΄μŠ€ μ„€μ •


λ””λ°”μ΄μŠ€ μ‹λ³„μž μ„€μ •

SDK에 λ””λ°”μ΄μŠ€ μ‹λ³„μž 정보λ₯Ό μ„€μ •ν•΄ 이후 μˆ˜μ§‘λ˜λŠ” λͺ¨λ“  μ΄λ²€νŠΈμ— λ””λ°”μ΄μŠ€ 식별정보λ₯Ό ν¬ν•¨μ‹œν‚¬ 수 μžˆμŠ΅λ‹ˆλ‹€. λ””λ°”μ΄μŠ€ μ‹λ³„μžκ°€ μ„€μ •λ˜λ©΄ λ³„λ„λ‘œ μ‚­μ œν•˜μ§€ μ•Šμ„ 경우 μ•± μ’…λ£Œ 여뢀에 관계없이 계속 μœ μ§€λ©λ‹ˆλ‹€.

AirbridgeUnity.SetDeviceAlias("ADD_YOUR_KEY", "AND_YOUR_VALUE");
AirbridgeUnity.RemoveDeviceAlias("DELETE_THIS_KEY");
AirbridgeUnity.ClearDeviceAlias();
λ©”μ†Œλ“œμ„€λͺ…
SetDeviceAlias(string key, string value)μ „λ‹¬ν•œ Key와 Value μŒμ„ λ””λ°”μ΄μŠ€ μ‹λ³„μžμ— μΆ”κ°€ν•©λ‹ˆλ‹€.
RemoveDeviceAlias(string key)μ „λ‹¬ν•œ Key에 ν•΄λ‹Ήν•˜λŠ” λ””λ°”μ΄μŠ€ μ‹λ³„μžλ₯Ό μ‚­μ œν•©λ‹ˆλ‹€. ν•΄λ‹Ήν•˜λŠ” μ‹λ³„μžκ°€ 없을 경우 μ•„λ¬΄λŸ° λ™μž‘μ„ ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
ClearDeviceAlias()λͺ¨λ“  λ””λ°”μ΄μŠ€ μ‹λ³„μžλ₯Ό μ‚­μ œν•©λ‹ˆλ‹€.

이벀트 μ„€μ •


Airbridge Unity SDKμ—μ„œ ν˜ΈμΆœν•˜λŠ” λͺ¨λ“  μ΄λ²€νŠΈλ“€μ€ λ‹€μŒκ³Ό 같이 6개의 ν•˜μœ„ 속성 κ°’λ“€κ³Ό ν•¨κ»˜ 전솑할 수 μžˆμŠ΅λ‹ˆλ‹€.

  • Event Category : 이벀트의 이름 Required (string)
  • Event Action : 이벀트 ν•˜μœ„ 속성값 1 (string)
  • Event Label : 이벀트 ν•˜μœ„ 속성값 2 (string)
  • Event Value : 이벀트 ν•˜μœ„ 속성값 3 (double)
  • Event Custom Attributes : 이벀트 ν•˜μœ„μ˜ μ»€μŠ€ν…€ 데이터 (Dictionary<string, object>)
  • Event Semantic Attributes : 이벀트 ν•˜μœ„μ˜ μ‹œλ©˜ν‹± 데이터 (Dictionary<string, object>)

μ‚¬μš©μž 이벀트 전솑

Airbridge Unity SDKμ—μ„œλŠ” 편의λ₯Ό μœ„ν•΄ λ‹€μŒκ³Ό 같은 3가지 μœ μ € 이벀트λ₯Ό μ œκ³΅ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

  • νšŒμ›κ°€μž… (Sign up)
Dictionary<string, string> alias = new Dictionary<string, string>();
AirbridgeUser user = new AirbridgeUser();
user.SetId(UserId);
user.SetEmail(Email);
user.SetPhoneNumber(Phone);
user.SetAlias(alias);
AirbridgeUnity.SetUser(user);

AirbridgeEvent @event = new AirbridgeEvent(Airbridge.Constants.CATEGORY.SIGN_UP);
AirbridgeUnity.TrackEvent(@event);
  • 둜그인 (Sign in)
Dictionary<string, string> alias = new Dictionary<string, string>();
AirbridgeUser user = new AirbridgeUser();
user.SetId(UserId);
user.SetEmail(Email);
user.SetPhoneNumber(Phone);
user.SetAlias(alias);
AirbridgeUnity.SetUser(user);

AirbridgeEvent @event = new AirbridgeEvent(Airbridge.Constants.CATEGORY.SIGN_IN);
AirbridgeUnity.TrackEvent(@event);
  • λ‘œκ·Έμ•„μ›ƒ (Sign out)
AirbridgeEvent @event = new AirbridgeEvent(Airbridge.Constants.CATEGORY.SIGN_OUT);
AirbridgeUnity.TrackEvent(@event);
AirbridgeUnity.ExpireUser();

이컀머슀 이벀트 전솑

Airbridge Unity SDKμ—μ„œλŠ” 편의λ₯Ό μœ„ν•΄ λ‹€μŒκ³Ό 같은 μƒν’ˆ ν΄λž˜μŠ€μ™€ ν•¨κ»˜ 이컀머슀 이벀트λ₯Ό μ œκ³΅ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

Airbridge.Ecommerce.Product cocacola = new Airbridge.Ecommerce.Product();
cocacola.SetId("beverage_1");
cocacola.SetName("Coca Cola");
cocacola.SetPrice(1.25);
cocacola.SetCurrency("USD");
cocacola.SetQuantity(1);
cocacola.SetPosition(0);
  • ν™ˆ ν™”λ©΄ (Home Screen)
AirbridgeEvent @event = new AirbridgeEvent(Airbridge.Constants.CATEGORY.VIEW_HOME);
AirbridgeUnity.TrackEvent(@event);
  • 검색 κ²°κ³Ό 쑰회 (Search Results)
List<Airbridge.Ecommerce.Product> beverages = new List<Airbridge.Ecommerce.Product>();
Airbridge.Ecommerce.Product cocacola = new Airbridge.Ecommerce.Product();
cocacola.SetId("beverage_1");
cocacola.SetName("Coca Cola");
cocacola.SetPrice(1.25);
cocacola.SetCurrency("USD");
cocacola.SetQuantity(1);
cocacola.SetPosition(0);
beverages.Add(cocacola);

Airbridge.Ecommerce.Product fanta = new Airbridge.Ecommerce.Product();
fanta.SetId("beverage_2");
fanta.SetName("Fanta");
fanta.SetPrice(10.99);
fanta.SetCurrency("USD");
fanta.SetQuantity(1);
fanta.SetPosition(1);
beverages.Add(fanta);

AirbridgeEvent @event = new AirbridgeEvent(Airbridge.Constants.CATEGORY.VIEW_SEARCH_RESULT);
@event.SetQuery("SELECT * FROM beverages");
@event.SetProducts(beverages.ToArray());
@event.SetTotalValue(12.24);
AirbridgeUnity.TrackEvent(@event);
  • μƒν’ˆ 리슀트 쑰회 (Product List)
List<Airbridge.Ecommerce.Product> beverages = new List<Airbridge.Ecommerce.Product>();
Airbridge.Ecommerce.Product cocacola = new Airbridge.Ecommerce.Product();
cocacola.SetId("beverage_1");
cocacola.SetName("Coca Cola");
cocacola.SetPrice(1.25);
cocacola.SetCurrency("USD");
cocacola.SetQuantity(1);
cocacola.SetPosition(0);
beverages.Add(cocacola);

Airbridge.Ecommerce.Product fanta = new Airbridge.Ecommerce.Product();
fanta.SetId("beverage_3");
fanta.SetName("Fanta");
fanta.SetPrice(10.99);
fanta.SetCurrency("USD");
fanta.SetQuantity(1);
fanta.SetPosition(2);
beverages.Add(fanta);

AirbridgeEvent @event = new AirbridgeEvent(Airbridge.Constants.CATEGORY.VIEW_PRODUCT_LIST);
@event.SetProductListId("beverage_list_0");
@event.SetProducts(beverages.ToArray());
@event.SetTotalValue(12.24);
AirbridgeUnity.TrackEvent(@event);
  • μƒν’ˆ 상세 νŽ˜μ΄μ§€ 쑰회 (Product Details)
Airbridge.Ecommerce.Product cocacola = new Airbridge.Ecommerce.Product();
cocacola.SetId("beverage_1");
cocacola.SetName("Coca Cola");
cocacola.SetPrice(1.25);
cocacola.SetCurrency("USD");
cocacola.SetQuantity(1);
cocacola.SetPosition(0);

AirbridgeEvent @event = new AirbridgeEvent(Airbridge.Constants.CATEGORY.VIEW_PRODUCT_DETAILS);
@event.SetProducts(cocacola);
AirbridgeUnity.TrackEvent(@event);
  • μž₯λ°”κ΅¬λ‹ˆ λ‹΄κΈ° (Add to Cart)
Airbridge.Ecommerce.Product cocacola = new Airbridge.Ecommerce.Product();
cocacola.SetId("beverage_1");
cocacola.SetName("Coca Cola");
cocacola.SetPrice(1.25);
cocacola.SetCurrency("USD");
cocacola.SetQuantity(1);
cocacola.SetPosition(0);

AirbridgeEvent @event = new AirbridgeEvent(Airbridge.Constants.CATEGORY.ADD_TO_CART);
@event.SetProducts(cocacola);
@event.SetTotalValue(1.25);
AirbridgeUnity.TrackEvent(@event);
  • 결제 μ™„λ£Œ (Order Complete)
List<Airbridge.Ecommerce.Product> beverages = new List<Airbridge.Ecommerce.Product>();
Airbridge.Ecommerce.Product cocacola = new Airbridge.Ecommerce.Product();
cocacola.SetId("beverage_1");
cocacola.SetName("Coca Cola");
cocacola.SetPrice(1.25);
cocacola.SetCurrency("USD");
cocacola.SetQuantity(1);
cocacola.SetPosition(0);
beverages.Add(cocacola);

Airbridge.Ecommerce.Product fanta = new Airbridge.Ecommerce.Product();
fanta.SetId("beverage_3");
fanta.SetName("Fanta");
fanta.SetPrice(10.99);
fanta.SetCurrency("USD");
fanta.SetQuantity(1);
fanta.SetPosition(2);
beverages.Add(fanta);

AirbridgeEvent @event = new AirbridgeEvent(Airbridge.Constants.CATEGORY.ORDER_COMPLETE);
@event.SetTransactionId("transaction_123");
@event.SetProducts(beverages.ToArray());
@event.SetInAppPurchased(true);
@event.SetTotalValue(12.24);
AirbridgeUnity.TrackEvent(@event);

μ»€μŠ€ν…€ 이벀트 전솑

Airbridge Unity SDKμ—μ„œλŠ” λ‹€μŒκ³Ό 같은 방법을 톡해 μ»€μŠ€ν„°λ§ˆμ΄μ¦ˆ 된 이벀트λ₯Ό 전솑할 수 μžˆμŠ΅λ‹ˆλ‹€.

AirbridgeEvent @event = new AirbridgeEvent("category");
@event.SetAction("action");
@event.SetLabel("label");
@event.SetValue(100.99);
@event.AddCustomAttribute("custom_key", "value");
@event.AddSemanticAttribute("query", "query_123");
AirbridgeUnity.TrackEvent(@event);

πŸ“˜

Semantic Attributesλ₯Ό 직접 κ΅¬μ„±ν•˜μ—¬ μ „λ‹¬ν•˜κΈ° μœ„ν•΄μ„œλŠ” λ‹€μŒ νŽ˜μ΄μ§€λ₯Ό μ°Έμ‘°ν•΄ μ£Όμ„Έμš”.

이벀트 전솑 확인

Airbridge Unity SDKμ—μ„œ μ „μ†‘λœ 이벀트 μ •λ³΄λŠ” Airbridge λŒ€μ‹œλ³΄λ“œ β†’ Raw Data β†’ App Real-time Log νƒ­μ—μ„œ λ‹€μŒκ³Ό 같이 ν™•μΈν•˜μ‹€ 수 μžˆμŠ΅λ‹ˆλ‹€.

κ³ κΈ‰ μ„€μ •


SDK Signature μ„€μ •

Airbirdge Unity SDKμ—μ„œλŠ” μœ λ‹ˆν‹° μƒλ‹¨μ˜ AB180 > Airbridge Settings의 Sdk Signature Secret ID ν•„λ“œμ™€ Sdk Signature Secret ν•„λ“œμ˜ 섀정을 톡해 SDK λ₯Ό SDK Spoofing 으둜 λΆ€ν„° λ³΄ν˜Έν•  수 μžˆμŠ΅λ‹ˆλ‹€.

πŸ“˜

SDK Signature λ₯Ό μ„€μ •ν•˜κΈ° μœ„ν•΄μ„œλŠ” SDK Signature Secret, SDK Signature Secret ID 2가지가 ν•„μš”ν•©λ‹ˆλ‹€.

ν•΄λ‹Ή 2가지 값을 λ°œκΈ‰λ°›κΈ° μœ„ν•΄μ„œλŠ” λ‹΄λ‹Ή μ—μ–΄λΈŒλ¦Ώμ§€ CSM μ—κ²Œ 지원을 μš”μ²­ν•΄μ£Όμ„Έμš”.

μ‚¬μš©μž 정보 ν•΄μ‹œν™” μ„€μ •

λ‚΄λΆ€μ˜ 데이터 뢄석 λ“±μ˜ λͺ©μ μ„ μœ„ν•΄ HASH(SHA256)ν•˜μ§€ μ•Šκ³  μ‚¬μš©μžμ˜ μ‹λ³„μž 정보λ₯Ό μ „μ†‘ν•˜κ³  싢은 경우, μœ λ‹ˆν‹° μƒλ‹¨μ˜ AB180 > Airbridge Settings의 User Info Hash Enabled ν•„λ“œμ˜ 섀정을 톡해 User Email 그리고 User Phone μ •λ³΄μ˜ ν•΄μ‹œν™”(SHA256)λ₯Ό 쀑단할 수 μžˆμŠ΅λ‹ˆλ‹€.

❗️

ν•΄λ‹Ή μ˜΅μ…˜μ€ User Emailκ³Ό User Phone λ“± λ―Όκ°ν•œ κ°œμΈμ •λ³΄λ₯Ό 제 3μžμ—κ²Œ μ œκ³΅ν•˜κΈ° λ•Œλ¬Έμ— λ‚΄λΆ€μ μœΌλ‘œ λ³„λ„μ˜ λ³΄μ•ˆ μ‘°μΉ˜κ°€ μ„ ν–‰λ˜μ–΄μ Έμ•Ό ν•©λ‹ˆλ‹€.

μ„Έμ…˜ νƒ€μž„μ•„μ›ƒ μ„€μ •

Airbirdge Unity SDKμ—μ„œλŠ” μœ λ‹ˆν‹° μƒλ‹¨μ˜ AB180 > Airbridge Settings의 Session Timeout Seconds ν•„λ“œμ˜ 섀정을 톡해 μ„€μ •λœ μ„Έμ…˜ μ‹œκ°„ 내에 μœ μ €κ°€ 앱을 재 μ‹€ν–‰ ν•˜λ”λΌλ„ 같은 μ„Έμ…˜μœΌλ‘œ νŒλ‹¨ν•˜μ—¬ μ•± μ‹€ν–‰ 이벀트λ₯Ό λ‹€μ‹œ 보내지 μ•Šλ„λ‘ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

κ°œμΈμ •λ³΄λ³΄ν˜Έ μ„€μ •

ν•΄λ‹Ή κΈ°λŠ₯은 GDPRμ΄λ‚˜ CCPA와 같이 κ³ κ°μœΌλ‘œλΆ€ν„° κ°œμΈμ •λ³΄λ³΄ν˜Έμ— λŒ€ν•œ λ™μ˜λ₯Ό λ°›μ•„ 데이터 μˆ˜μ§‘ 및 전솑을 μ§„ν–‰ν•˜λŠ” κ²½μš°μ— μœ μš©ν•œ κΈ°λŠ₯μž…λ‹ˆλ‹€.

μœ λ‹ˆν‹° μƒλ‹¨μ˜ AB180 > Airbridge Settings의 Auto Start Tracking Enabled ν•„λ“œμ˜ 섀정을 μ΄μš©ν•˜μ—¬ 데이터 μˆ˜μ§‘κ³Ό 전솑을 λͺ…μ‹œμ μœΌλ‘œ μ‹œμž‘ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

πŸ“˜

ν•΄λ‹Ή κΈ°λŠ₯을 λΉ„ν™œμ„±ν™”ν•œ κ²½μš°μ— λ‹€μŒκ³Ό 같은 ν•¨μˆ˜λ₯Ό λͺ…μ‹œμ μœΌλ‘œ ν˜ΈμΆœν•΄μ•Ό μ˜¬λ°”λ₯΄κ²Œ 데이터 μˆ˜μ§‘μ΄ μ΄λ£¨μ–΄μ§€κ²Œ λ©λ‹ˆλ‹€.

AirbridgeUnity.StartTracking();

Airbridge 링크 좔적 μ„€μ •

κ΄‘κ³ μ£Όμ˜ μ•± λ‚΄μ—μ„œ λ‹€μˆ˜μ˜ λ”₯링크 λ™μž‘μœΌλ‘œ 인해 Airbridgeλ₯Ό ν†΅ν•œ Re-engagement μ„±κ³Όλ₯Ό ν•œλˆˆμ— ν™•μΈν•˜κΈ° μ–΄λ €μš΄ 경우, μœ λ‹ˆν‹° μƒλ‹¨μ˜ AB180 > Airbridge Settings의 Track Airbridge Link Only ν•„λ“œμ˜ 섀정을 ν†΅ν•˜μ—¬ Airbridge λ”₯링크λ₯Ό 톡해 λ“€μ–΄μ˜¨ μ„±κ³Όλ§Œ ν•„ν„°λ§ν•˜λ„λ‘ μ„€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

ν•΄λ‹Ή κΈ°λŠ₯을 ν™œμ„±ν™”ν•  경우 μ•„λž˜μ˜ 쑰건을 λ§Œμ‘±ν•œ λ”₯링크λ₯Ό 톡해 앱이 μ˜€ν”ˆ 된 κ²½μš°μ— ν•œν•˜μ—¬ λ”₯링크 μ„±κ³Όλ‘œ μΈ‘μ •ν•©λ‹ˆλ‹€.

  • λŒ€μ‹œλ³΄λ“œμ— λ“±λ‘λœ ν˜•νƒœμ˜ λ”₯링크λ₯Ό 톡해 앱이 μ˜€ν”ˆ 된 경우
  • airbridge.io λ”₯링크λ₯Ό 톡해 앱이 μ˜€ν”ˆ 된 경우
  • deeplink.page λ”₯링크λ₯Ό 톡해 앱이 μ˜€ν”ˆ 된 경우
  • airbridge_referrer query 정보가 μ‘΄μž¬ν•˜λŠ” 경우

μœ„μΉ˜ 정보 μˆ˜μ§‘

Airbridge Unity SDKμ—μ„œλŠ” μœ λ‹ˆν‹° μƒλ‹¨μ˜ AB180 > Airbridge Settings의 Location Collection Enabled ν•„λ“œμ˜ 섀정을 ν†΅ν•˜μ—¬ μœ μ €μ˜ μœ„μΉ˜ 정보λ₯Ό μˆ˜μ§‘ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

❗️

μœ„μΉ˜ μ •λ³΄λŠ” 합법적인 λͺ©μ κ³Ό 방법을 ν†΅ν•˜μ—¬ μˆ˜μ§‘λ˜μ–΄μ•Ό ν•˜λ―€λ‘œ λ³Έ κΈ°λŠ₯ μ‚¬μš©μ— μ£Όμ˜κ°€ μš”κ΅¬λ©λ‹ˆλ‹€.

🚧

ν•΄λ‹Ή κΈ°λŠ₯은 였직 μ•ˆλ“œλ‘œμ΄λ“œμ—μ„œ μ‚¬μš© κ°€λŠ₯ν•˜λ©° λ‹€μŒκ³Ό 같은 κΆŒν•œμ΄ AndroidManifest.xml에 ν¬ν•¨λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€.

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

페이슀뢁 λ””νΌλ“œ 앱링크 μ„€μ •

Facebook의 Deferred App Linkλ₯Ό μœ λ‹ˆν‹° μƒλ‹¨μ˜ AB180 > Airbridge Settings의 Facebook Deferred App Link Enabled ν•„λ“œμ˜ 섀정을 ν†΅ν•˜μ—¬ Airbridge Unity SDKμ—μ„œ ν•¨κ»˜ λ°›μ•„ 보싀 수 μžˆμŠ΅λ‹ˆλ‹€.

🚧

ν•΄λ‹Ή κΈ°λŠ₯을 μ‚¬μš©ν•˜κΈ° μœ„ν•΄μ„œ 미리 Facebook SDK 섀정이 μ„ ν–‰λ˜μ–΄μ Έμ•Ό ν•©λ‹ˆλ‹€.
μ°Έμ‘° - https://developers.facebook.com/docs/unity/

μ•± 좔적 ν—ˆμš© μ„€μ •

iOS 14의 μ •μ±… 변화에 따라 iOSμ—μ„œ μ•± 좔적 ν—ˆμš© μ„€μ •(App Tracking Transparency)을 ν†΅ν•˜μ—¬ μ‚¬μš©μžμ—κ²Œ λ™μ˜λ₯Ό μ–»μ–΄μ•Ό μ˜¬λ°”λ₯΄κ²Œ IDFA 정보λ₯Ό μˆ˜μ§‘ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

Airbridge Unity SDKμ—μ„œλŠ” μœ λ‹ˆν‹° μƒλ‹¨μ˜ AB180 > Airbridge Settings의 iOS Tracking Authorize Timeout Seconds 섀정을 톡해 μ„€μΉ˜ 이벀트λ₯Ό μ§€μ—°ν•˜μ—¬ μ˜¬λ°”λ₯΄κ²Œ IDFAκ°€ μΈμŠ€ν†¨ μ΄λ²€νŠΈμ— ν¬ν•¨λ˜λ„λ‘ μ„€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ•± μ‚­μ œ 좔적 μ„€μ •

πŸ“˜

μ•± μ‚­μ œ 좔적 섀정은 Airbridge Unity SDK v1.9.0 이후 버전 λΆ€ν„° μ‚¬μš© κ°€λŠ₯ν•©λ‹ˆλ‹€.

Uninstall Tracking μ„€μ • 방법

Android Uninstall Tracking

1. Firebase Cloud Messaging μ„€μ •

Firebase Cloud Messaging 곡식 λ¬Έμ„œλ₯Ό μ°Έκ³ ν•˜μ—¬ μ•±μ˜ κΈ°λ³Έ 섀정을 μ™„λ£Œν•΄ μ£Όμ„Έμš”.

2. Firebase Push Token 전솑

Firebase Cloud Messaging 섀정을 톡해 μƒμ„±λ˜μ–΄μ§€λŠ” Push Token을 λ‹€μŒ κ°€μ΄λ“œλ₯Ό μ°Έκ³ ν•˜μ—¬ 전달해 μ£Όμ„Έμš”.

public void Start() {
  Firebase.Messaging.FirebaseMessaging.TokenReceived += OnTokenReceived;
  Firebase.Messaging.FirebaseMessaging.MessageReceived += OnMessageReceived;
}

public void OnTokenReceived(object sender, Firebase.Messaging.TokenReceivedEventArgs token) {
#if UNITY_ANDROID
  AirbridgeUnity.RegisterPushToken(token.Token);
#endif
}

// λ‹€μŒκ³Ό 같은 처리λ₯Ό μΆ”κ°€ν•˜μ—¬ μ•± μ‚­μ œ μ•Œλ¦ΌμΈ 경우 μ‚¬μš©μžμ—κ²Œ λ…ΈμΆœλ˜μ§€ μ•Šμ„ 수 μžˆλ„λ‘ μ˜ˆμ™Έ μ²˜λ¦¬ν•΄ μ£Όμ„Έμš”.
public void OnMessageReceived(object sender, Firebase.Messaging.MessageReceivedEventArgs e) {
  if (e.Message.Data.ContainsKey("airbridge-uninstall-tracking")) return;
  ...
}

iOS Uninstall Tracking

1. Apple Push Notification service μ„€μ •

Unity Mobile Notifications package 곡식 λ¬Έμ„œλ₯Ό μ°Έκ³ ν•˜μ—¬ ν•΄λ‹Ή νŒ¨ν‚€μ§€λ₯Ό μ„€μΉ˜ν•΄ μ£Όμ„Έμš”.

2. Device Token 전솑

APNs Device Token을 λ‹€μŒ κ°€μ΄λ“œλ₯Ό μ°Έκ³ ν•˜μ—¬ 전달해 μ£Όμ„Έμš”.

void Start()
{
#if UNITY_IOS
  StartCoroutine(RequestAuthorization());
#endif
}

#if UNITY_IOS
IEnumerator RequestAuthorization()
{
  var authorizationOption = AuthorizationOption.Alert | AuthorizationOption.Badge;
  using (var req = new AuthorizationRequest(authorizationOption, true))
  {
    while (!req.IsFinished)
    {
      yield return null;
    };
    if (req.Granted && req.DeviceToken != "")
    {
      AirbridgeUnity.RegisterPushToken(req.DeviceToken);
    }
  }
}
#endif

ν•˜μ΄λΈŒλ¦¬λ“œ μ•± μ„€μ •

Web SDK만의 μ„€μΉ˜λ‘œλŠ” μ•± μ„€μΉ˜ 및 μ‹€ν–‰ λ˜λŠ” λ”₯링크 호좜 λ“±μ˜ 좔가적인 이벀트λ₯Ό νŠΈλž˜ν‚Ή ν•  μˆ˜κ°€ μ—†μŠ΅λ‹ˆλ‹€. Airbridge μ—μ„œλŠ” λ‹€μŒκ³Ό 같은 섀정을 ν†΅ν•˜μ—¬ μ‰½κ²Œ ν•˜μ΄λΈŒλ¦¬λ“œ μ•±μ—μ„œ 인앱 이벀트λ₯Ό ν˜ΈμΆœν•  수 μžˆμŠ΅λ‹ˆλ‹€.

AirbridgeWebInterface webInterface;
webInterface = AirbridgeUnity.CreateWebInterface(
	"YOUR_WEB_TOKEN",     // web token
	(msg) => $@"..."      // post command function
);

AirbridgeUnity.CreateWebInterface λ₯Ό ν†΅ν•΄μ„œ Web Interface λ₯Ό μ œμ–΄ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
μ•„λž˜ μ—°λ™κ°€μ΄λ“œλ₯Ό 확인 ν•΄μ£Όμ„Έμš”.

Unity ν•˜μ΄λΈŒλ¦¬λ“œ μ•± 연동 κ°€μ΄λ“œ

🚧

Airbridge Unity SDK 1.9.3 버전 λΆ€ν„° ν•˜μ΄λΈŒλ¦¬λ“œ μ•± μ„€μ • κΈ°λŠ₯을 μ œκ³΅ν•©λ‹ˆλ‹€.


Troubleshooting


Android

1. Android κΈ°κΈ°μ—μ„œ μ˜¬λ°”λ₯΄κ²Œ Airbridge Unityκ°€ μ΄ˆκΈ°ν™” λ˜μ§€ μ•ŠλŠ” 경우

  • Airbridge Unity Android의 경우 Content Providerλ₯Ό ν†΅ν•˜μ—¬ μžλ™μœΌλ‘œ μ΄ˆκΈ°ν™” λ©λ‹ˆλ‹€. μ˜¬λ°”λ₯Έ μ΄ˆκΈ°ν™” μž‘μ—…μ„ μœ„ν•˜μ—¬ Project > Plugins > Android > AndroidManifest.xml νŒŒμΌμ— λ‹€μŒκ³Ό 같은 Xml Tagκ°€ λ°˜λ“œμ‹œ μ˜¬λ°”λ₯΄κ²Œ λͺ…μ‹œλ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€.
<provider
	android:authorities="${applicationId}.co.ab180.airbridge.unity.AirbridgeContentProvider"
	android:name="co.ab180.airbridge.unity.AirbridgeContentProvider"
	android:exported="false" />

2. Android κΈ°κΈ°μ—μ„œ μ‚¬μš©μžκ°€ 이미 Custom Activityλ₯Ό μ‚¬μš©ν•˜λŠ” 경우

  • Airbridge UnityλŠ” μ˜¬λ°”λ₯Έ λ”₯링크의 ν˜ΈμΆœμ„ μœ„ν•΄ Custom Activityλ₯Ό μ‚¬μš©ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. μ‚¬μš©μžκ°€ 이미 Custom Activityλ₯Ό μ‚¬μš©ν•˜κ³  μžˆμ„ 경우, ν•΄λ‹Ή Custom Activity에 μ•„λž˜μ™€ 같은 μ½”λ“œλ₯Ό μΆ”κ°€ν•΄ μ£Όμ„Έμš”.
@Override
protected void onNewIntent(Intent intent) {
  super.onNewIntent(intent);
  setIntent(intent);
}

@Override
protected void onResume() {
  super.onResume();
  AirbridgeUnity.processDeeplinkData(getIntent());
}

3. Android Manifest 파일이 μ œλŒ€λ‘œ Merge λ˜μ§€ μ•ŠλŠ” 경우

  • Airbridge Unityμ—μ„œ μ œκ³΅λ˜λŠ” Android Manifest MergerλŠ” 이미 μ‘΄μž¬ν•˜λŠ” Project > Plugins > Android > AndroidManifest.xmlλ₯Ό 읽어듀여 Airbridge Unityμ—μ„œ μ œκ³΅λ˜λŠ” Project > Plugins > Airbridge > Android> AndroidManifest.xmlλ₯Ό λ‹¨μˆœν•˜κ²Œ Merge ν•΄μ£ΌλŠ” μ»΄ν¬λ„ŒνŠΈλ‘œμ„œ λͺ¨λ“  μ‚¬μš©μžμ˜ μΌ€μ΄μŠ€μ— 맞좰 μ›ν•˜λŠ” ν˜•νƒœλ‘œ 좜λ ₯ν•˜λŠ”λ° μžˆμ–΄μ„œλŠ” ν•œκ³„κ°€ μžˆμŠ΅λ‹ˆλ‹€. 이와 같은 경우 μ‚¬μš©μžκ°€ 직접 ν•΄λ‹Ή AndroidManifest.xmlλ₯Ό Merge ν•΄μ•Ό ν•©λ‹ˆλ‹€.

4. Missing 'package' key attribute on element package at ...

μ•ˆλ“œλ‘œμ΄λ“œ 11 λ²„μ „μ˜ Package Visibility μ •μ±… μΆ”κ°€λ‘œ ν•΄λ‹Ή 버전을 μ§€μ›ν•˜λŠ” λͺ¨λ“  μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ λ‹€λ₯Έ μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜κ³Ό μ˜¬λ°”λ₯΄κ²Œ μƒν˜Έμž‘μš©ν•˜κΈ° μœ„ν•΄ μ–΄λ–€ νŒ¨ν‚€μ§€μ™€ μƒν˜Έμž‘μš©μ΄ 이루어 μ§€λŠ”μ§€μ— λŒ€ν•΄μ„œ manifest의 <queries>λ₯Ό 톡해 μœ μ €μ—κ²Œ μ˜¬λ°”λ₯΄κ²Œ κ³ μ§€ν•˜μ—¬μ•Ό ν•©λ‹ˆλ‹€.

Airbridgeμ—μ„œλŠ” ν•΄λ‹Ή 정책을 μ€€μˆ˜λ₯Ό μœ„ν•΄ μ•ˆλ“œλ‘œμ΄λ“œ SDK λͺ¨λ“ˆμ΄ ν•΄λ‹Ή 변경사항이 ν¬ν•¨λ˜μ–΄ 있으며 <queries> νƒœκ·Έλ₯Ό μ§€μ›ν•˜κΈ° μœ„ν•΄μ„œλŠ” Gradle μ΅œμ†Œ 5.6.4 버전 이상 그리고 Android Gradle Plugin μ΅œμ†Œ 3.6.0 버전 이상을 ν•„μš”λ‘œ ν•©λ‹ˆλ‹€.

μœ λ‹ˆν‹° 버전에 따라 μ–΄λ– ν•œ Gradle 버전을 ν¬ν•¨ν•˜κ³  μžˆλŠ”κ°€μ— λŒ€ν•΄μ„œλŠ” λ‹€μŒ νŽ˜μ΄μ§€λ₯Ό 톡해 ν™•μΈν•˜μ‹€ 수 μžˆμŠ΅λ‹ˆλ‹€.

λ§Œμ•½ μ‚¬μš©ν•˜λŠ” μœ λ‹ˆν‹°μ˜ Gradle 버전이 5.6.4 버전 미만 ν˜Ήμ€ 및 Android Gradle Plugin 버전이 3.6.0 버전 미만인 경우, λ‹€μŒκ³Ό 같은 μœ λ‹ˆν‹° 섀정을 톡해 버전을 νŠΉμ •ν•˜μ—¬ μ‚¬μš©ν•˜μ‹€ 수 μžˆμŠ΅λ‹ˆλ‹€.

- μœ λ‹ˆν‹° 2020.1 λ˜λŠ” 이후 버전

λ‹€μŒ 버전듀은 Gradle 5.6.4 이후 버전과 Android Gradle Plugin 3.6.0 이후 버전을 이미 ν¬ν•¨ν•˜κ³  있기 λ•Œλ¬Έμ— 좔가적인 μž‘μ—…μ„ ν•„μš”λ‘œ ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

- μœ λ‹ˆν‹° 2019.3 버전 ~ 2019.4 버전

πŸ“˜

ν•΄λ‹Ή μ»€μŠ€ν…€ μ˜΅μ…˜μ€ μœ λ‹ˆν‹° 2019.3 patch 7 μ΄ν›„μ˜ λ²„μ „μ—μ„œλ§Œ κ°€λŠ₯ν•©λ‹ˆλ‹€.

  1. Gradle Build Tool νŽ˜μ΄μ§€λ‘œ μ΄λ™ν•˜μ—¬ Gradle 5.6.4 μ΄μƒμ˜ 버전을 λ‹€μš΄λ‘œλ“œν•΄ μ£Όμ„Έμš”.
  2. Preferences > External Tools둜 μ΄λ™ν•˜μ—¬ Gradle Installed with Unity (recommended) 체크λ₯Ό ν•΄μ œν•˜κ³  λ‹€μš΄λ‘œλ“œ 받은 Gradle 파일의 경둜λ₯Ό λ‹€μŒκ³Ό 같이 μ„€μ •ν•΄ μ£Όμ„Έμš”.

  1. Project Settings > Player > Android tab > Publishing Settings > Build둜 μ΄λ™ν•˜μ—¬ λ‹€μŒ μ˜΅μ…˜λ“€μ„ λͺ¨λ‘ 선택해 μ£Όμ„Έμš”.

a. Custom Main Gradle Template
b. Custom Launcher Gradle Template

  1. Β Β λ‹€μŒ μžλ™ μƒμ„±λœ 두가지 파일 λͺ¨λ‘ λ‹€μŒκ³Ό 같이 λ³€κ²½ν•΄ μ£Όμ„Έμš”.
  • Assets/Plugins/Android/mainTemplate.gradle
  • Assets/Plugins/Android/launcherTemplate.gradle
buildscript {
    repositories {
        google()
        jcenter()
    }
    dependencies {
        // Must be Android Gradle Plugin 3.6.0 or later. For a list of
        // compatible Gradle versions refer to:
        // https://developer.android.com/studio/releases/gradle-plugin
        classpath 'com.android.tools.build:gradle:3.6.0'
    }
}

allprojects {
   repositories {
      google()
      jcenter()
      flatDir {
        dirs 'libs'
      }
   }
}
- μœ λ‹ˆν‹° 2019.1 버전 ~ 2019.2 버전
  1. Gradle Build Tool νŽ˜μ΄μ§€λ‘œ μ΄λ™ν•˜μ—¬ Gradle 5.6.4 μ΄μƒμ˜ 버전을 λ‹€μš΄λ‘œλ“œν•΄ μ£Όμ„Έμš”.
  2. Preferences > External Tools둜 μ΄λ™ν•˜μ—¬ Gradle Installed with Unity (recommended) 체크λ₯Ό ν•΄μ œν•˜κ³  λ‹€μš΄λ‘œλ“œ 받은 Gradle 파일의 경둜λ₯Ό λ‹€μŒκ³Ό 같이 μ„€μ •ν•΄ μ£Όμ„Έμš”.

  1. Project Settings > Player > Android tab > Publishing Settings > Build둜 μ΄λ™ν•˜μ—¬ Custom Gradle Template μ˜΅μ…˜μ„ λ‹€μŒκ³Ό 같이 선택해 μ£Όμ„Έμš”.

  1. μƒμ„±λœ Assets/Plugins/Android/mainTemplate.gradle 파일둜 μ΄λ™ν•˜μ—¬ λ‹€μŒκ³Ό 같이 λ³€κ²½ν•΄ μ£Όμ„Έμš”.
buildscript {
    dependencies {
        // Must be Android Gradle Plugin 3.6.0 or later. For a list of
        // compatible Gradle versions refer to:
        // https://developer.android.com/studio/releases/gradle-plugin
        classpath 'com.android.tools.build:gradle:3.6.0'
    }
}
μœ λ‹ˆν‹° 2018.4 버전

πŸ“˜

ν•΄λ‹Ή μ»€μŠ€ν…€ μ˜΅μ…˜μ€ μœ λ‹ˆν‹° 2018.4 patch 24 μ΄ν›„μ˜ λ²„μ „μ—μ„œλ§Œ κ°€λŠ₯ν•©λ‹ˆλ‹€.

  1. Gradle Build Tool νŽ˜μ΄μ§€λ‘œ μ΄λ™ν•˜μ—¬ Gradle 5.6.4 μ΄μƒμ˜ 버전을 λ‹€μš΄λ‘œλ“œν•΄ μ£Όμ„Έμš”.
  2. Build Settings > Android둜 μ΄λ™ν•˜μ—¬ λ‹€μŒ 이미지와 같이 Build Systemμ—μ„œ Gradle을 선택해 μ£Όμ„Έμš”.

  1. Preferences > External Tools둜 μ΄λ™ν•˜μ—¬ Gradle Installed with Unity (recommended) 체크λ₯Ό ν•΄μ œν•˜κ³  λ‹€μš΄λ‘œλ“œ 받은 Gradle 파일의 경둜λ₯Ό λ‹€μŒκ³Ό 같이 μ„€μ •ν•΄ μ£Όμ„Έμš”.

  1. Project Settings > Player > Android tab > Publishing Settings > Build둜 μ΄λ™ν•˜μ—¬ Custom Gradle Template μ˜΅μ…˜μ„ λ‹€μŒκ³Ό 같이 선택해 μ£Όμ„Έμš”.

  1. μƒμ„±λœ Assets/Plugins/Android/mainTemplate.gradle 파일둜 μ΄λ™ν•˜μ—¬ λ‹€μŒκ³Ό 같이 λ³€κ²½ν•΄ μ£Όμ„Έμš”.
buildscript {
    dependencies {
        // Must be Android Gradle Plugin 3.6.0 or later. For a list of
        // compatible Gradle versions refer to:
        // https://developer.android.com/studio/releases/gradle-plugin
        classpath 'com.android.tools.build:gradle:3.6.0'
    }
}

μœ λ‹ˆν‹° 2018.3 μ΄ν•˜ 버전

Gradle μ»€μŠ€ν„°λ§ˆμ΄μ¦ˆ μ˜΅μ…˜μ€ 2018.3 버전 μ΄ν•˜μ˜ μœ λ‹ˆν‹°μ—μ„œλŠ” μ§€μ›ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

iOS

1. iOS μ—μ„œ Custom AppController λ₯Ό μ‚¬μš©ν•˜λŠ” 경우

  • Airbridge Unity iOS의 경우 μœ λ‹ˆν‹°μ—μ„œ μ œκ³΅ν•˜λŠ” IMPL_APP_CONTROLLER_SUBCLASSλ₯Ό μ΄μš©ν•˜μ—¬ Custom AppControllerλ₯Ό μƒμ„±ν•©λ‹ˆλ‹€. 이미 IMPL_APP_CONTROLLER_SUBCLASSλ₯Ό μ‚¬μš©ν•˜μ—¬ Custom AppController λ₯Ό κ΅¬ν˜„ν•œ 경우 ν•΄λ‹Ή Custom AppController 에 μ•„λž˜μ™€ 같은 μ½”λ“œλ₯Ό μΆ”κ°€ν•΄ μ£Όμ„Έμš”.
- (BOOL) application:(UIApplication*)application 
continueUserActivity:(NSUserActivity*)userActivity 
  restorationHandler:(void (^)(NSArray<id<UIUserActivityRestoring>>* _Nullable))restorationHandler 
{
    [AUAppDelegate.instance application:application 
                   continueUserActivity:userActivity 
                     restorationHandler:restorationHandler];

    return YES;
}
  • ν•΄λ‹Ή μž‘μ—… μ™„λ£Œ ν›„ 기쑴의 Airbridge Unity SDK Assets > Plugins > Airbridge > iOS > Delegate > AUAppController.mm 파일 μ œκ±°ν•΄ μ£Όμ„Έμš”.

μƒ˜ν”Œ μ•±

Unity Sample App