OneLink 개선 방안

Mongle·2024년 8월 29일

React 톺아보기

목록 보기
3/4

기존 솔루션 (Existing Solutions)

  • OneLink클릭시 유저관점에서 정상적인 동작처리 Flow
    graph LR
      A(OneLink 클릭) --> B{어플리케이션이 설치되어있는가?}
    	B --> |YES|C
    	B --> |NO|D(앱스토어로 이동)
    	D --> E(어플리케이션 설치)
    	E --> C(어플리케이션 실행)
    	C --> F(지정 스크린으로 이동)
    
  • 위의 정상적인 동작처리 Flow와 달리 현재 서비스에서 제공하는 OneLink 클릭시 동작처리에 문제가 있음
    • 어플리케이션이 설치되어있는 경우에도 앱스토어로 이동한다.
      • iOS Safari ⇒ 앱이 설치되어있는 경우에도 항상 앱스토어로 이동.
    • 어플리케이션이 설치되어있지 않은 경우에 앱스토어로 이동하지않는다.
      • iOS Chrome ⇒ Direct Deep Link는 항상 정상동작, Deferred Deep Link 정상동작을 할 때도 있지만 스토어로 이동을 하지않을 때도 있음.
  • 플랫폼별 동작상태
    • Desktop
      • 모두 Appsflyer OneLink 설정에 따라(기본: 각 스토어) 정상이동.
    • Mobile
      AndroidiOS
      Deferred Deep Link스토어로 정상이동 ⇒ 다운로드 후 DeepLinking 동작 X기본 브라우저가 Chrome 일때 ⇒ 스토어로 정상이동 ⇒ Deep Linking 정상 동작
      그 외 브라우저일 경우 ⇒ 스토어로 정상이동 ⇒ Deep Linking 동작 X
      Direct Deep Link정상 동작정상 동작
      특정 브라우저, 앱에서 Direct Deep Link가 작동하지 않는 이슈 확인(Slack, Safari)

솔루션 (Solution)

  • 현재 사용중인 딥링킹 라이브러리 react-native-appsflyer 업데이트 및 Unified Deep Linking API(이하 UDL)을 사용하여 딥링크 논리를 처리

  • 기본적인 UDL 동작 Flow

    1. 사용자가 OneLink 단축 URL을 클릭
    2. iOS Universal Link/Android App Link 또는 지연된 딥 링크(deferred deep link)는 SDK를 트리거
    3. SDK는 onDeepLink Listener를 트리거하고 딥링크 결과 개체를 사용자에게 전달
  • ~~UDL 작업을 위해 AOS/iOS 각각 네이티브 코드 추가가 필요~~

  • UDL 사용을위한 Deep Linking Listener 변경 필요

    // As-is : onAppOpenAttribution listener를 통해 처리
    Appsflyer.onAppOpenAttribution(res => {
    	// Response Sample
    	{
    	  "status": "success",
    	  "type": "onAppOpenAttribution",
    	  "data": {
    	    "af_dp": "",
    	    "install_time": "2023-02-01 02:35:17",
    	    "media_source": "UDL_test",
    	    "scheme": "",
    	    "link": "",
    	    "af_status": "Non-organic",
    	    "af_deeplink": "true",
    	    "path": "/187",
    	    "af_xp": "custom",
    	    "af_force_deeplink": "true",
    	    "host": "",
    	    "campaign": "None",
    	    "source_caller": "ui",
    	    "shortlink": "m0zorhly"
    		}
    	}
    	...
    });
    
    // To-be: onDeepLink listener로 변경
    Appsflyer.onDeepLink(res => {
    	// Response Sample
    	{
    	  "deepLinkStatus": "FOUND",
    	  "status": "success",
    	  "type": "onDeepLinking",
    	  "data": {
    	    "af_dp": "", // Direct Deep Link 일경우만 유효
    	    "path": "/187/chapters/952918436",
    	    "media_source": "TikTok",
    	    "scheme": "",
    	    "af_xp": "custom",
    	    "link": "",
    	    "host": "",
    	    "campaign": "",
    	    "source_caller": "ui",
    	    "deep_link_value": "",
    	    "is_deferred": false
    		}
    	}
    
    	const {
          deepLinkStatus,
          data,
          isDeferred,
      } = res;
    
    	if (deepLinkStatus === 'FOUND') {
    			// deepLinkStatus === 'FOUND'일 경우만 object 존재
          const {
              af_dp,
              deep_link_value,
          } = data;
    
    			// deep_link_value 우선으로 사용하나 레거시코드에서
    
    			// deep_link_value가 없고 af_dp만 존재할 경우 대응
    			// 단, Direct Deep Link일 경우에만 af_dp값 확인 가능. (Deferred Deep Link일 경우 af_dp값 확인 불가.)
          const rawLink = deep_link_value || af_dp;
    
          if (isNotEmpty(rawLink)) {
    					// onDeepLink 리스너에서 deferred(지연) 여부를 확인할 수 있기에
    					// 기존에 onInstallConversionData 리스너에서 해주던 부분 변경
              isDeferred
                  ? setDeferredLink(decodeURIComponent(rawLink))
                  : setLink(decodeURIComponent(rawLink));
          }
      }
    })
    
  • UDL 변경에 따른 기존 레거시 OneLink 대응

    • 앱이 설치되어있지 않은경우 기존 레거시 OneLink 클릭시 (Deferred Deep Link)
      • deep_link_value가 설정되어있는 경우에는 onDeepLink 리스너에서 deep_link_value 값을 통해 딥링킹 처리 가능.
      • deep_link_value가 설정되어 있지않고 fallback url만 설정되어있는 경우와 같이 af_dp가 설정되어있는 동적 링크는 onDeepLink 리스너에서 af_dp 값을 확인할 수 없기에 레거시 OneLink 대응 불가
    • 앱이 설치되어있는 경우 기존 OneLink 클릭시 (Direct Deep Link)
      • onDeepLink 리스너에서 deep_link_valueaf_dp 모두 확인 가능하므로 대응 가능.

하위 호환성 (Backward Compatibility)

  • react-native-appsflyer 라이브러리 업데이트 후 기존에 사용되던 기능 동작 이상없는지 체크
  • UDL 적용후 레거시 OneLink 체크
    • 기존의 OneLink 세팅으로 동작하는지 확인
    • 추가적인 세팅이 필요하다면(ex.deeplink value) 세팅 후에 레거시(deferred deeplink)가 잘 동작하는지 확인
  • 진행중인 OneLink 템플릿 ⇒ fallback & deep_link_value & af_force_deeplink=true 설정 필수.

테스트 (Test)

  • 여러 플랫폼에서의 UDL 테스트
    • 웹 투 앱, 앱 투 앱, QR 투 앱 중심으로 테스트
profile
https://github.com/Jeongseo21

0개의 댓글