問題の内容
Pre-chatオブジェクトとVisitorInfoオブジェクトに関しては、iOS と Android の動作が異なるため、アプリケーションの動作を統一すると混乱する可能性があります。
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が有効な場合、フィールドが Required、Optional、または Hidden のいずれであるかに関係なく、 VisitorInfoは完全に消去されます。
この制限を回避する 1 つの方法は、チャットの開始後にVisitorInfoを更新することです (チャットの開始後に編集できない部門を除く)。
- 作成する
VisitorInfo物体。 - ユーザーに関する既知の情報を入力します。
- 不足している情報を尋ねるように事前チャット フォームを構成します。
- オブザーバーを設定します。
- チャット活動を開始します。
PreChat が完了し、チャットが STARTED ステータスになると、訪問者情報が更新されます。
例:
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 では、VisitorInfo で PreChatForm をより柔軟に使用できます。詳細については、この記事を参照してください:チャット セッションの設定情報。
これは、ドキュメントの例に従うことでネイティブに機能します。
翻訳に関する免責事項:この記事は、お客様の利便性のために自動翻訳ソフトウェアによって翻訳されたものです。Zendeskでは、翻訳の正確さを期すために相応の努力を払っておりますが、翻訳の正確性については保証いたしません。
翻訳された記事の内容の正確性に関して疑問が生じた場合は、正式版である英語の記事を参照してください。