問題の内容
iOSとAndroidでは、 プリチャット オブジェクトと VisitorInfo オブジェクトの動作が異なるため、アプリケーションの動作を統一すると混乱を招く可能性があります。
VisitorInfo オブジェクトを使用すると、チャットを開始する前に訪問者に関する情報を設定できます。対照的に、PreChatForm オブジェクトはチャットが開始されるとその情報を収集します。
当初は、ワークフローでどちらか一方を使用し、同時に両方を使用することはできませんでしたが、iOSでもこの考え方が変わりました。
JWT認証を使用したワークフローにより、Chatの動作も変更されます。詳細については、ドキュメント(「Android」 | 「iOS」)を参照するか、次の記事を参照してください:Chat SDKを使用して認証済みユーザーを有効にする。
解決手順
iOS
iOSのロジックは次のとおりです。
-
ChatAPIConfigurationの
visitorInfo
かつdepartment
表示されます。 -
ChatConfigurationの
preChatFormConfiguration
データ要件を満たしています。 - 基本的なプロパティが
VisitorInfo
nilまたは空の文字列であり、対応するデータ要件は.hidden
フィールドを表示します。 - 基本的なプロパティが
department
nilまたは空の文字列であり、対応するデータ要件は.hidden
フィールドを表示します。 - SDKによってユーザーにフォームが表示されます。ユーザーが詳細を入力するか、
.optional
カスタマイズすることができます。 - SDKは、フォームに入力された情報を収集します。
スキップされたフィールドがある場合、そこにある設定の詳細に戻ります。このフィールドが空の場合、詳細情報は送信されません。 - SDKは、部門とコールを
chat.profileProvider.setVisitorInfo(visitorInfo)
フォームの VisitorInfo の詳細と(入力されたデータを未記入のAPI設定と統合します)。
例:
func status(for info: String?) -> FormFieldStatus {
info?.isEmpty == true ? .optional: .hidden
}
let chatAPIConfig = ChatAPIConfiguration()
chatAPIConfig.visitorInfo = visitorInfo
chatAPIConfig.department = departmentName
chat.configuration = chatAPIConfig
chat.profileProvider.setVisitorInfo(visitorInfo)
let chatUIConfig = ChatConfiguration()
chatUIConfig.preChatFormConfiguration = .init(name: status(for: visitorInfo.name),
email: status(for: visitorInfo.email),
phoneNumber: status(for: visitorInfo.phoneNumber),
department: status(for: form.departmentId))
// pass chatUIConfig into buildUI(engines:, configs:)
Android
SDK Chat 3.2.0より前のバージョンの場合:
Androidでは、ロジックが異なります。PreChatForm が有効になっている場合、フィールドが「必須」、「オプション」、または「非表示」のいずれであるかに関係なく、VisitorInfo は完全に消去されます。
この制限を回避する1つの方法は、チャットの開始後に VisitorInfo を更新することです(ただし、チャットの開始後に編集できない部門を除く)。
- 作成
VisitorInfo
オブジェクトを選択します。 - ユーザーに関する既知の情報を入力します。
- 不足している情報を入力するようにプリチャットフォームを設定する。
- オブザーバを設定します。
- Chatアクティビティを開始します。
プリチャットが完了し、チャットが「開始済み」ステータスになると、訪問者情報が更新されます。
例:
boolean visitorSet = false; // Generic condition to ensure that you only set those info once
// ...
public void setupObserver(){
final ObservationScope observationScope = new ObservationScope();
Chat.INSTANCE.providers().chatProvider().observeChatState(observationScope, new Observer<ChatState>() {
@Override
public void update(ChatState chatState) {
ChatSessionStatus chatStatus = chatState.getChatSessionStatus();
// Status achieved after the PreChatForm is completed
if (chatStatus == ChatSessionStatus.STARTED) {
// Update the information MID chat here. All info but Department can be updated
if (!visitorSet) {
// Add here the code to set the visitor info - visitorInfo would be a VisitorInfo type variable containing all the information to set
profileProvider.setVisitorInfo(visitorInfo, null);
visitorSet = true;
}
} else {
// There are few other statuses that you can observe but they are unused in this example
Log.d("DEBUG", "[observerSetup] - ChatSessionUpdate -> (unused) status : " + chatStatus.toString());
}
}
});
}
ワークフローに合わせて、提供されているコードスクリプトを更新してください。
バージョン3.2.0以降:
最新のSDKでは、PreChatFormとVisitorInfoをより柔軟に使用できます。詳細については、この記事を参照してください:チャットセッションの情報を設定しています。
これは、ドキュメントの例に従うことでネイティブに機能します。
翻訳に関する免責事項:この記事は、お客様の利便性のために自動翻訳ソフ トウェアによって翻訳されたものです。Zendeskでは、翻訳の正確さを期すために相応の努力を払っておりますが、翻訳の正確性につ いては保証いたしません。
翻訳された記事の内容の正確性に関して疑問が生じた場合は、正式版である英語の記事 を参照してください。