콘솔로 이동

Android 앱에서 Firebase 초대 주고받기

시작하기 전에

  1. 아직 Firebase 프로젝트에 앱을 연결하지 않았다면 Firebase 콘솔에서 연결합니다. 앱 연결 시 SHA-1 서명 키를 지정해야 합니다.
  2. Firebase 동적 링크를 사용 설정하지 않았다면 Firebase 콘솔에서 동적 링크 섹션을 열고 서비스 약관에 동의하라는 메시지가 나타나면 약관에 동의합니다. Firebase 초대는 Firebase 동적 링크를 기반으로 하므로 Firebase 초대를 사용하려면 Firebase 동적 링크를 사용 설정해야 합니다.
  3. Android 프로젝트에 Firebase를 추가합니다.
  4. 앱 수준 build.gradle 파일에 Firebase 초대에 대한 종속 항목을 추가합니다.
    implementation 'com.google.firebase:firebase-invites:17.0.0'
    

초대 보내기

먼저 IntentAppInviteInvitation.IntentBuilder 클래스를 사용하여 빌드합니다.

자바

private void onInviteClicked() {
    Intent intent = new AppInviteInvitation.IntentBuilder(getString(R.string.invitation_title))
            .setMessage(getString(R.string.invitation_message))
            .setDeepLink(Uri.parse(getString(R.string.invitation_deep_link)))
            .setCustomImage(Uri.parse(getString(R.string.invitation_custom_image)))
            .setCallToActionText(getString(R.string.invitation_cta))
            .build();
    startActivityForResult(intent, REQUEST_INVITE);
}

Kotlin

private fun onInviteClicked() {
    val intent = AppInviteInvitation.IntentBuilder(getString(R.string.invitation_title))
            .setMessage(getString(R.string.invitation_message))
            .setDeepLink(Uri.parse(getString(R.string.invitation_deep_link)))
            .setCustomImage(Uri.parse(getString(R.string.invitation_custom_image)))
            .setCallToActionText(getString(R.string.invitation_cta))
            .build()
    startActivityForResult(intent, REQUEST_INVITE)
}

초대 맞춤설정

초대 Intent를 만들 때 초대 대화상자의 제목 및 전송할 초대 메시지를 지정해야 합니다. 위 예와 같이 초대를 통해 전송되는 이미지 및 딥 링크 URL도 맞춤설정할 수 있으며, HTML을 지정하여 리치 이메일 초대를 보내는 방법도 권장됩니다. 자세한 내용은 Firebase 초대: 권장사항을 참조하세요.

메소드채널설명
setMessage 이메일 및 SMS 초대와 함께 전송할 기본 메시지를 설정합니다. 보내는 사람이 초대 대화상자에서 이 메시지를 수정할 수 있습니다. 최대 길이는 100자입니다.
setDeepLink 이메일 및 SMS 초대와 함께 전송할 앱 링크를 설정합니다. 수신자와 특정 콘텐츠를 공유하거나 사용자가 초대를 통해 앱을 열 때 맞춤화된 경험을 제공하려면 이 링크를 지정합니다.
setCustomImage 이메일 이메일 초대에 포함할 맞춤 이미지의 URL을 설정합니다. 이미지는 600x600픽셀 정도 크기의 정사각형이어야 합니다. 이미지의 최대 크기는 4000x4000픽셀입니다.
setCallToActionText 이메일 이메일 초대에 표시되는 버튼의 클릭 유도문안을 설정합니다. 최대 길이는 32자(영문 기준)입니다.
setEmailHtmlContent 이메일 권장: 이메일 초대의 내용을 설정합니다. 리치 HTML 이메일 초대를 보내려는 경우에 설정합니다. HTML은 자리표시자 문자열 %%APPINVITE_LINK_PLACEHOLDER%%를 포함해야 하며, 이 문자열은 수신자가 초대를 수락하기 위해 여는 URL로 대체됩니다. 맞춤 이메일 메시지를 지정하면 setDescription, setCustomImagesetCallToActionText 메소드는 적용되지 않습니다.
setEmailSubject 이메일 setEmailHtmlContent를 사용하는 경우 필수 항목입니다. 이메일 초대의 제목 행을 설정합니다.

앱의 iOS 버전이 있으며 Android 외에 iOS에서도 열 수 있는 초대를 보내려면 앱 초대 인텐트를 만들 때 iOS 앱의 OAuth 2.0 클라이언트 ID를 setOtherPlatformsTargetApplication에 전달합니다. iOS 앱의 클라이언트 ID는 Firebase Console에서 다운로드한 GoogleService-Info.plist 파일에서 확인할 수 있습니다. 예를 들면 다음과 같습니다.

자바

Intent intent = new AppInviteInvitation.IntentBuilder(getString(R.string.invitation_title))
        // ...
        .setOtherPlatformsTargetApplication(
                AppInviteInvitation.IntentBuilder.PlatformMode.PROJECT_PLATFORM_IOS,
                IOS_APP_CLIENT_ID)
        // ...
        .build();

Kotlin

val intent = AppInviteInvitation.IntentBuilder(getString(R.string.invitation_title))
        // ...
        .setOtherPlatformsTargetApplication(
                AppInviteInvitation.IntentBuilder.PlatformMode.PROJECT_PLATFORM_IOS,
                IOS_APP_CLIENT_ID)
        // ...
        .build()

AppInviteInvitation 인텐트를 실행하면 사용자가 초대할 연락처를 선택할 수 있는 연락처 선택 화면이 열립니다. 초대는 이메일 또는 SMS로 전송됩니다. 사용자가 연락처를 선택하고 초대를 보내면 앱에서 onActivityResult에 대한 콜백을 수신합니다.

자바

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    Log.d(TAG, "onActivityResult: requestCode=" + requestCode + ", resultCode=" + resultCode);

    if (requestCode == REQUEST_INVITE) {
        if (resultCode == RESULT_OK) {
            // Get the invitation IDs of all sent messages
            String[] ids = AppInviteInvitation.getInvitationIds(resultCode, data);
            for (String id : ids) {
                Log.d(TAG, "onActivityResult: sent invitation " + id);
            }
        } else {
            // Sending failed or it was canceled, show failure message to the user
            // ...
        }
    }
}

Kotlin

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    Log.d(TAG, "onActivityResult: requestCode=$requestCode, resultCode=$resultCode")

    if (requestCode == REQUEST_INVITE) {
        if (resultCode == Activity.RESULT_OK) {
            // Get the invitation IDs of all sent messages
            val ids = AppInviteInvitation.getInvitationIds(resultCode, data!!)
            for (id in ids) {
                Log.d(TAG, "onActivityResult: sent invitation $id")
            }
        } else {
            // Sending failed or it was canceled, show failure message to the user
            // ...
        }
    }
}

초대 수신

초대를 수신한 사용자가 앱을 아직 설치하지 않은 경우 사용자는 선택에 따라 Google Play 스토어에서 앱을 설치할 수 있습니다. 앱 설치가 완료되었거나 앱이 이미 설치되어 있다면 앱이 시작되고 콘텐츠로 연결되는 URL을 전송한 경우 앱에서 이 URL을 수신합니다. 앱의 콘텐츠로 연결되는 URL을 수신하려면 getDynamicLink 메소드를 호출합니다.

자바

@Override
protected void onCreate(Bundle savedInstanceState) {
    // ...

    // Check for App Invite invitations and launch deep-link activity if possible.
    // Requires that an Activity is registered in AndroidManifest.xml to handle
    // deep-link URLs.
    FirebaseDynamicLinks.getInstance().getDynamicLink(getIntent())
            .addOnSuccessListener(this, new OnSuccessListener<PendingDynamicLinkData>() {
                @Override
                public void onSuccess(PendingDynamicLinkData data) {
                    if (data == null) {
                        Log.d(TAG, "getInvitation: no data");
                        return;
                    }

                    // Get the deep link
                    Uri deepLink = data.getLink();

                    // Extract invite
                    FirebaseAppInvite invite = FirebaseAppInvite.getInvitation(data);
                    if (invite != null) {
                        String invitationId = invite.getInvitationId();
                    }

                    // Handle the deep link
                    // ...
                }
            })
            .addOnFailureListener(this, new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    Log.w(TAG, "getDynamicLink:onFailure", e);
                }
            });
}

Kotlin

override fun onCreate(savedInstanceState: Bundle?) {
    // ...

    // Check for App Invite invitations and launch deep-link activity if possible.
    // Requires that an Activity is registered in AndroidManifest.xml to handle
    // deep-link URLs.
    FirebaseDynamicLinks.getInstance().getDynamicLink(intent)
            .addOnSuccessListener(this, OnSuccessListener { data ->
                if (data == null) {
                    Log.d(TAG, "getInvitation: no data")
                    return@OnSuccessListener
                }

                // Get the deep link
                val deepLink = data.link

                // Extract invite
                val invite = FirebaseAppInvite.getInvitation(data)
                val invitationId = invite.invitationId

                // Handle the deep link
                // ...
            })
            .addOnFailureListener(this) { e -> Log.w(TAG, "getDynamicLink:onFailure", e) }
}

getIntent().getData()를 사용하여 인텐트에서 링크를 알아낼 수도 있지만, 링크로 인해 실행될 수 있는 모든 활동에서 getDynamicLink()를 호출해야 합니다. getDynamicLink()를 호출하면 링크와 초대 ID를 가져오고 데이터를 삭제하므로 앱에서 한 번만 처리됩니다.

일반적으로 기본 활동뿐 아니라 링크와 일치하는 인텐트 필터가 실행하는 모든 활동에서 getDynamicLink()를 호출합니다.