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) }
}
}
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 -> {
}
}
}
}