https://firebase.google.com/docs/dynamic-links?hl=ko

파이어베이스 동적링크는 앱 설치 여부와 관계없이 여러 플랫폼에서 원하는 대로 작동하는 링크입니다.

동적링크를 사용하면 사용자가 링크를 연 플랫폼에 가장 적합한 환경을 제공해줍니다.
iOS, Android에서 실행한다면 앱이 설치되어있을 시 해당 링크에 적합한 페이지로의 이동을, 미설치시 설치하는 스토어로 연결이 가능하며 웹또한 동일합니다.

파이어베이스Console을 이용하여 동적링크를 만들며 원하는 매개변수를 추가하여 URL을 작성할 수 있습니다.
이러한 매개변수들은 앱에 접근 후 상황에 맞게 처리할 수 있습니다.

사용 사례

  • 웹 사용자를 네이티브 앱 사용자로 전환
  • 앱에 사용자 초대
  • 사용자 추천, 추천 보상

동적링크 생성

동적링크를 생성합니다.
Builder를 이용하여 생성하며 상황에 맞게 동적링크의 파라미터를 넣어줍니다.
prefix로 자신의 도메인을 보통 지정하며 setLink를 통하여 넣고싶은 매개변수를 넣어줍니다.
보통 key : Value형식으로 넣어줍니다.
.setAndroidParameters, .setIosParameters를 통하여 각각의 네이티브일 경우의 동적링크 또한 포함해줍니다. 두 네이티브의 경우 미설치시 각각의 스토어로 연결합니다.

private class DeepLinkInfo(
    val domainUriPrefix: String,
    val iOSPackageName: String,
    val iOSMinimumVersion: String
)

object DynamicLinkUtils {
    private fun linkAndDomainUriPrefix(): DeepLinkInfo {
            DeepLinkInfo(
                "prefix",
                "iOSPackaggeName",
                "version"
            )
    }

    private fun getDeepLink(
        scheme: String,
        key: String?,
        resourceType: String?,
        key2: String?,
        resourceId: Int?
    ): Uri {
        val link: String = "link"

        return if (key == null) {
            Uri.parse("${link}/${scheme}")
        } else {
            Uri.parse("${link}/${scheme}/?${key}=$resourceType&${key2}=${resourceId}")
        }
    }

    fun onDynamicLinkClick(
        activity: Activity,
        scheme: String,
        key: String? = null,
        resourceType: String? = null,
        key2: String? = null,
        resourceId: Int? = null
    ): Task<ShortDynamicLink> {
        val deepLinkInfo = linkAndDomainUriPrefix()
        return FirebaseDynamicLinks.getInstance().createDynamicLink()
            .setLink(getDeepLink(scheme, key, resourceType, key2, resourceId))
            .setDomainUriPrefix(deepLinkInfo.domainUriPrefix)
            .setAndroidParameters(
                DynamicLink.AndroidParameters.Builder(activity.packageName)
                    .setFallbackUrl(PLAYSTORE_URL.toUri())
                    .setMinimumVersion(1)
                    .build()
            )
            .setIosParameters(
                DynamicLink.IosParameters.Builder(deepLinkInfo.iOSPackageName)
                    .setAppStoreId("AppstoreId").setMinimumVersion(deepLinkInfo.iOSMinimumVersion)
                    .build()
            )
            .buildShortDynamicLink()
    }
}

수신

  • 인텐트 필터를 추가해줍니다.
<activity
	android:name=".ui.DynamicLinkActivity"
	android:exported="true">
	<intent-filter>
		<action android:name="android.intent.action.VIEW" />
		<category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
	<data
		android:host="@string/deeplink_host"
        android:scheme="@string/deeplink_scheme" />
    </intent-filter>
</activity>
  • 동적링크 수신시 열어줄 액티비티를 생성합니다.
class DynamicLinkActivity : AppCompatActivity() {

    private val TAG = "DynamicLinkActivity"

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        handleDynamicLinks()
    }

    private fun handleDynamicLinks() {
        Firebase.dynamicLinks
            .getDynamicLink(intent)
            .addOnSuccessListener(this) { pendingDynamicLinkData ->
                val deeplink: Uri? = pendingDynamicLinkData.link
                if (deeplink != null) {
                    val resourceType = deeplink.getQueryParameter(KEY_RESOURCE_TYPE)
                    val resourceId = deeplink.getQueryParameter(KEY_RESOURCE_ID)?.toLong()
                    relayResource(resourceType, resourceId)
                } else {
                    Log.d(TAG, "getDynamicLink: no link found")
                }
            }
            .addOnFailureListener(this) { e -> Log.e(TAG, "getDynamicLink:onFailure", e) }
    }
}
  • 본인의 경우 동적링크 생성시 넣어주었던 Scheme으로 앱이 실행되었을때 동적링크를 통한것인지 판단합니다.
fun Fragment.shareItem(action: (DynamicLinkResource) -> Unit) {
    requireActivity().intent.extras?.let { intent ->
        if (intent.getString(ARG_MAIN) == ARG_SHARE) {
            intent.getParcelable<DynamicLinkResource>(BUNDLE_SHARE_ITEM)?.let { action(it) }
        }
    }
}
  • 추후에 매개변수를 이용하여 해당 동적링크를 까고 그 내용에 따라 화면을 이동시킵니다.
private fun hasShareItem() {
        shareItem {
            when (it.resourceType) {
                SCHEME_VIDEO -> {
                    val videoId = it.resourceId
                    val bundle = bundleOf(
                        BUNDLE_VIDEO_ID to videoId,
                        BUNDLE_VIDEO_STATE to VideoState.SHARE_VIDEO.name
                    )
                    findParentNavController().navigate(
                        R.id.action_mainFragment_to_videoListFragment, bundle
                    )
                }
                SCHEME_COMMUNITY -> {
                    findNavController().navigate(R.id.action_global_communityFragment)
                }
                SCHEME_MAIN -> {
                }
            }
        }
    }
profile
러닝커브를 따라서 등반중입니다.

0개의 댓글