iOS用SDKでアプリ接客をしたい

はじめに

SDKによるアプリ接客を用いるにはSDKの導入が必要です
導入手順の詳細については 以下の記事を参照ください

アプリ接客の導入

iOS版 アプリ接客は iOS 9.0 以降で動作します。アプリ接客を導入する手順を説明します。

SDK を初期化する

AppDelegate クラスで初期化を行います。

class AppDelegate: UIResponder, UIApplicationDelegate, UIAlertViewDelegate{

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
_ = BDashWebReceptionController.init()
return true
}
}

ポップアップ表示準備

ポップアップを表示するには BDashReport クラスに表示条件の情報を設定する必要があります。設定するパラメーターはb→dash 画面側と連動します。設定例のサンプルコードを紹介します。

let report: BDashReport = BDashReport(targets: [self.item.itemId],
trigger: "default",
view: "商品詳細画面",
preView: "商品一覧画面",
page: "ItemDetailViewController",
prePage: "ItemListViewController",
eventFunc: "viewDidLoad",
customProperty: nil)
ポップアップ表示準備に関する補足

2021/2現在、trigger,preView,prePage,eventFuncはb→dash管理画面での設定項目がないため、利用することができません。詳細はカスタマーサクセス担当までお問い合わせください。

ポップアップ表示

ポップアップのインスタンス生成には、self.popup = BDashWebReceptionController.getInstance().newPopup() を利用し、表示を行うには self.popup.showMessage()を使います。ポップアップを表示するには「アプリ内コンテンツで表示する場合」と、「WebView コンテンツで表示させる場合」かで、呼び出すタイミングが異なります。

アプリ内コンテンツで表示させる場合
class ItemDetailViewController: UIViewController {
var popup: BDashWebReception!

override func viewDidLoad() {
super.viewDidLoad()

self.popup = BDashWebReceptionController.getInstance().newPopup()

let report: BDashReport = BDashReport(targets: [self.item.itemId],
trigger: "default",
view: "商品詳細画面",
preView: "商品一覧画面",
page: "ItemDetailViewController",
prePage: "ItemListViewController",
eventFunc: "viewDidLoad",
customProperty: nil)

if let view = self.navigationController?.view {
_ = self.popup.showMessage(report: report, onView: view) } }
showMessage()について

showMessage() では、UIViewController.onCreateView() のタイミングで実装しておりView の作成時にしか呼び出されません。最適な呼び出すタイミングとしては下記となります。
・インスタンス化は UIViewController.viewDidLoad() で行う
・ポップアップの表示は UIViewControllerが 「アクティブ」 になったときに行う
(ライフサイクルイベント関数で実装するなども有効です)

WebView コンテンツで表示させる場合
class ItemWebViewController: UIViewController {

@IBOutlet weak var webView: UIWebView!

var popup: BDashWebReception = BDashWebReceptionController.getInstance().newPopup()
var lastUrl: String = ""

override func viewDidLoad() {
super.viewDidLoad()

self.webView.delegate = self

if let filePath = Bundle.main.path(forResource: "productlist", ofType: "html") {
let url = URL(fileURLWithPath: filePath)
let req = URLRequest(url: url)
webView.loadRequest(req)
}
}

override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
self.popup.closeMessage()
}

@IBAction func touchUpInsideBackButton(_ sender: Any) {
if self.webView.canGoBack == true {
self.popup.closeMessage()
self.webView.goBack()
}
}
}

extension ItemWebViewController: UIWebViewDelegate {

func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) { self.popup.closeMessage() decisionHandler(.allow) }
以降のサンプルコードでは UIWebView 利用しておりますが、2020年現在 WKWebView が推奨されているため、読み替えての実装をお願いいたします。
func webViewDidFinishLoad(_ webView: UIWebView) {
if let last = webView.request?.url?.lastPathComponent {
let tmpUrl = "http://localhost/" + last
let report: BDashReport = BDashReport(targets: [tmpUrl],
trigger: "default",
view: tmpUrl,
preView: self.lastUrl,
page: "ItemWebViewController",
prePage: "ItemWebViewController",
eventFunc: "webView(_:didFinish:)",
customProperty: nil)
if let view = self.navigationController?.view {
_ = self.popup.showMessage(report: report, onView: view)
}
self.lastUrl = tmpUrl
}
}
}

ポップアップ内のアクションイベントを受け取る

ポップアップコンテンツ内にある「ディープリンク」を、エンドユーザーがクリックした際のイベントを受け取ることができます。このとき利用する I/F は BDashWebReceptionのインスタンスを生成し設定します。
・WebView の場合は、イベント発生時に「url キー」が固定で渡されます。
・Internal の場合は、イベント発生時に「b→dash管理画面で設定したキー」が複数渡されます。
実装例のサンプルコードを紹介します。

self.wr.eventDelegate = { (type, param) in
guard let type = eventType(rawValue: type) else { return }
switch type {
case .EVENT_INTERNAL:
if let view = param["view"] as? String, let date = param["date"] as? String, let url = param["url"] as? String {
print("(view) (date) (url)")
}
case .EVENT_WEBVIEW:
if let url = param["url"] as? String { print("(url)") } } }

ポップアップを閉じる

アプリ接客の「ポップアップ右上」に設置している「クローズボタン」をエンドユーザーが押下することで閉じられます。またプログラム内で、画面遷移やライフサイクルイベントなどにより安全に閉じるための関数を用意しています。この処理を行うにはcloseMessage() を利用します。実装例のサンプルコードを紹介します。

override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) self.wr.closeMessage()
closeMessage()について

closeMessage() は「ポップアップが未表示(準備中)、表示中」に関わらず破棄状態にさせます。画面遷移を行うときは、親となるViewが変わるため必ずcloseMessage()を呼び出す必要があります。

トラッキングレポートを送る

アプリ接客では showMessage() でポップアップを表示する際に「トラッキングレポート」も送付しています。アプリ内シーンで「ポップアップ表示をさせたくない・できない」 タイミングで「トラッキングレポートのみを送る」には代わりに BDashWebReception.report() 関数を利用します。実装例のサンプルコードを紹介します。

let report: BDashReport = BDashReport(targets: [self.item.itemId],
trigger: "default",
view: "商品詳細画面",
preView: "商品一覧画面",
page: "ItemDetailViewController",
prePage: "ItemListViewController",
eventFunc: "viewDidLoad",
customProperty: nil)

_ = BDashWebReception.report(obj: report)
report()について

report() 関数では先に記載したcloseMessage()の影響は受けずに成果を送ります。なお通信エラーが発生した場合は、Tracker クラスと異なり 「リトライ処理は行われない」のでご注意ください。

ポップアップをユーザーごとにカスタマイズする

ポップアップのユーザーごとのカスタマイズは導入SDKバージョン 2.6.0以降で実装可能です。ポップアップを表示する際に、利用ユーザーごとにカスタマイズすること(異なるポップアップを出す等)ができます。実装例のサンプルコードを紹介します。赤文字の個所をセットすることで、SDK 側の設定は完了となります。

var popup: BDashWebReception = BDashWebReceptionController.getInstance().newPopup()
var customProperty: [String: String] = [BDashReport.CUSTOM_LOGIN_USER:""]

customProperty.updateValue(
"ログインユーザーID",
forKey: BDashReport.CUSTOM_LOGIN_USER
)
let report: BDashReport = BDashReport(
targets: ["省略"],
trigger: "default",
view: "商品詳細画面",
preView: "商品一覧画面",
page: "ItemDetailViewController",
prePage: "ItemListViewController",
eventFunc: "viewDidLoad",
customProperty: customProperty
)

_ = self.popup.showMessage(report: report, onView: view)
b→dash管理画面側の設定や機能詳細についてはサポートサイトに記載予定ではありますが、対象記事は現在作成中となりますので、お手数をおかけしますがカスタマーサクセス担当までお問い合わせください。