# リーダーに接続する アプリケーションを Stripe Terminal リーダーに接続します。 > まだリーダーを選択していない場合は、利用可能な [Terminal リーダー](https://docs.stripe.com/terminal/payments/setup-reader.md)を比較して、ニーズに最適なリーダーを選択してください。 # Bluetooth リーダー Bluetooth 接続型リーダーは Bluetooth LE デバイスです。支払い詳細を収集しますが、Stripe との通信にはペアリングされたモバイルデバイスを使用します。 Bluetooth を使用してアプリを Terminal リーダーに接続するには、次のステップを実行します。 1. [リーダーを検出](https://docs.stripe.com/terminal/payments/connect-reader.md#discover-readers)します。 2. [リーダーに接続](https://docs.stripe.com/terminal/payments/connect-reader.md#connect-reader)します。 > リーダーとペアリングするために、モバイルデバイス設定を使用しないでください。デバイス設定を使用してリーダーをペアリングすると、リーダーをアプリに接続できなくなります。 ## リーダーを検出する [クライアント側] - [discoverReaders (iOS)](https://stripe.dev/stripe-terminal-ios/docs/Classes/SCPTerminal.html#/c:objc\(cs\)SCPTerminal\(im\)discoverReaders:delegate:completion:) - [BluetoothScanDiscoveryConfiguration (iOS)](https://stripe.dev/stripe-terminal-ios/docs/Classes/SCPBluetoothScanDiscoveryConfiguration.html) まず、リーダーの電源が入っていて、近くにあることを確認してください。 次に、アプリから `BluetoothScanDiscoveryConfiguration` を使用して、`discoverReaders` メソッドで近くにある Bluetooth 接続型リーダーを検索します。 #### Swift ```swift import StripeTerminal class DiscoverReadersViewController: UIViewController, DiscoveryDelegate { var discoverCancelable: Cancelable? // ... // Action for a "Discover Readers" button func discoverReadersAction() throws { let config = try BluetoothScanDiscoveryConfigurationBuilder().build() // In addition to Terminal's completion block methods, Swift async alternatives are available. // See our Example app for usage examples: https://github.com/stripe/stripe-terminal-ios/tree/master/Example self.discoverCancelable = Terminal.shared.discoverReaders(config, delegate: self) { error in if let error = error { print("discoverReaders failed: \(error)") } else { print("discoverReaders succeeded") } } } // ... // MARK: DiscoveryDelegate func terminal(_ terminal: Terminal, didUpdateDiscoveredReaders readers: [Reader]) { // In your app, display the discovered readers to the user. // Call `connectReader` after the user selects a reader to connect to. } } ``` #### Bluetooth 近接センサー * (BBPOS Chipper 2X BT のみ) Bluetooth 近接センサーは、検索結果をフィルターして最も近いリーダーを返します。リーダーが検出されると、そのリーダーはマルチカラーで点滅するため、複数のリーダーの中でどのリーダーが検出されたのかがわかります。SDK がリーダーを検出した後は、その検出されたリーダーをオフにしない限り、より近くにあるリーダーに切り替わりません。 Bluetooth 近接センサーを使用すると、SDK はアプリのコールバックにリーダーを 2 回返します。最初に、アプリはリーダーのシリアル番号のみが入力された `Reader` オブジェクトを受信します。その後少ししてから、リーダーのバッテリーレベルなどの新しい情報が入力された `Reader` オブジェクトを受信します。 ユーザーがそのリーダーへの接続を確認したり、そのリーダーへの接続を希望しない場合にキャンセルしたりできるように、アプリの UI に検出されたリーダーを表示することをお勧めします。 #### Bluetooth スキャン Bluetooth スキャンは、近くにあるすべてのリーダーを検索して、検出したリーダーのリストをアプリに返します。検出プロセスが続くと、SDK は近くのリーダーの最新リストを使用して `DiscoveryDelegate.didUpdateDiscoveredReaders` メソッドを呼び出し続けます。 検出プロセスでは、検出中に Terminal の `SCPConnectionStatus` が `SCPConnectionStatus.SCPConnectionStatusDiscovering` に移行します。 Bluetooth スキャン検出方法では、一定時間でスキャンをタイムアウトするよう設定できます。これを使用して、バッテリーの残量を管理したり、デバイスが見つからないときにエラーメッセージを表示したりできます。 モバイルアプリでは、ユーザーが自身のモバイルリーダーを特定しやすくするために、検出されたリーダーのシリアル番号を一覧表示し、自動更新されるようにすることをお勧めします。モバイルリーダーの検出時にはリーダーの `label` プロパティーには値が入りません。リーダーのわかりやすい名前を表示する場合は、アプリケーション側でシリアル番号とラベルの対応表を管理してください。 #### Bluetooth ペアリング セキュリティを強化し、EU の規制に準拠するため、2025 年 11 月現在、Stripe は WisePad 3 クレジットカードリーダーに数値比較 Bluetooth ペアリングプロセスを使用しています。数値比較プロセスでは、ペアリング時にカードリーダーと POS デバイスの両方でパスキーを確認する必要があります。デバイスを[最新のソフトウェアバージョン](https://docs.stripe.com/terminal/readers/bbpos-wisepad3.md#reader-software-releases)に更新したら、次の手順を実行して WisePad 3 を新しいモバイルアプリに接続します。POS デバイスが WisePad 3 リーダーを検出して表示したら、次の手順を実行します。 1. WisePad 3 と POS デバイスの両方で 6 桁のコードが一致していることを確認します。 2. WisePad 3 で **確定** を選択します。 3. POS デバイスで **ペアリング** を選択します。 > #### 注 > > 数値比較のペアリングは、WisePad 3 を新しい POS デバイスとペアリングする場合、または既存の「忘れた」 POS デバイスと再ペアリングする場合にのみ実行する必要があります。 ## リーダーに接続する [クライアント側] - [connectReader (iOS)](https://stripe.dev/stripe-terminal-ios/docs/Classes/SCPTerminal.html#/c:objc\(cs\)SCPTerminal\(im\)connectReader:connectionConfig:completion:) - [BluetoothConnectionConfiguration (iOS)](https://stripe.dev/stripe-terminal-ios/docs/Classes/SCPBluetoothConnectionConfiguration.html) 検出されたリーダーに接続するには、アプリから `connectReader` メソッドを呼び出します。常に最新の検出結果からリーダーオブジェクトを渡してください。古いリーダーオブジェクトは接続障害を引き起こす可能性があるため、以前の検出セッションからのリーダーオブジェクトをキャッシュしたり再利用したりしないでください。 モバイルリーダーを事前にダッシュボードやAPIに登録する必要はありません。接続時にモバイルリーダーを[店舗](https://docs.stripe.com/api/terminal/locations.md)に関連付けます。そのためには、接続時に `locationId` を当該店舗 ID に設定して `BluetoothConnectionConfiguration` を作成し使用します。 #### Swift ```swift // Call `connectReader` with the selected reader and a connection config // to register to a location as set by your app. var connectionConfig: BluetoothConnectionConfiguration do { connectionConfig = try BluetoothConnectionConfigurationBuilder(delegate: yourMobileReaderDelegate, locationId: ""{{LOCATION_ID}}"") .build() } catch { // Handle the error building the connection configuration return } Terminal.shared.connectReader(selectedReader, connectionConfig: connectionConfig) { reader, error in if let reader = reader { print("Successfully connected to reader: \(reader)") } else if let error = error { print("connectReader failed: \(error)") } } ``` アプリをバックグラウンドで実行し、リーダーへの接続が保持された状態にするには、[アプリを設定](https://docs.stripe.com/terminal/payments/setup-integration.md?terminal-sdk-platform=ios#configure)して、必要なバックグラウンドモードを追加します。 > #### スタンバイモードを使用する > > アプリで省エネを目的として `disconnectReader` を呼び出すプログラムは使用しないでください。リーダーは、スタンバイモードを使用して効率的に電源を管理します。 ## リーダーの連結の解除を処理する - [MobileReaderDelegate (iOS)](https://stripe.dev/stripe-terminal-ios/docs/Protocols/SCPMobileReaderDelegate.html) - [DisconnectReason (iOS)](https://stripe.dev/stripe-terminal-ios/docs/Enums/SCPDisconnectReason.html) リーダーの切断が、アプリとリーダーの間で発生することがあります。たとえば、リーダーが範囲外であるか、バッテリーが切れた場合、アプリからリーダーが切断されることがあります。リーダーの電源をオフにすると、テスト中に予期しない切断をシミュレーションできます。 `MobileReaderDelegate` には `reader:didDisconnect:` メソッドが含まれています。これは、リーダーの接続が切断された理由を示す `DisconnectReason` をアプリケーションに提供します。 リーダーの切断にご自身で対処するには、次の手順を実行します。 1. 接続中は `autoReconnectOnUnexpectedDisconnect` を `false` に設定します。 2. 切断コールバックを処理して、リーダーが予期せず切断されたことをユーザーに通知するメッセージをアプリに表示し、リーダーの検出と接続を開始します。 #### Swift ```swift import StripeTerminal class ReaderViewController: UIViewController, MobileReaderDelegate { override func viewDidLoad() { super.viewDidLoad() // Set the reader delegate when connecting to a reader } // ... func reader(_ reader: Reader, didDisconnect reason: DisconnectReason) { // Consider displaying a UI to notify the user and start rediscovering readers } } ``` ### 接続されたリーダーを再起動する - [rebootReader (iOS)](https://stripe.dev/stripe-terminal-ios/docs/Classes/SCPTerminal.html#/c:objc\(cs\)SCPTerminal\(im\)rebootReader:.html) Stripe リーダー M2 および BBPOS WisePad 3 は、24 時間使用すると自動的に再起動します。ただし、`rebootReader` API を使用すると、リーダーを強制的に再起動して、24 時間のタイマーをリセットできます。このアクションの後、リーダーは SDK から切断され、再起動されます。自動再接続を使用している場合、SDK はリーダーとの接続を復元しようとします。 #### Swift ```swift Terminal.shared.rebootReader { error in if let error = error { // Placeholder for handling the error } else { // Reboot succeeded and the reader will disconnect. // If your app is using automatic reconnect the reconnect will begin. } } ``` #### 自動的に再接続を試行する リーダーの接続が切断されると、デフォルトで自動再接続が試行されます。そのプロセスの間、リーダーのステータスを伝える通知をアプリに表示することをお勧めします。 自動再接続中にアプリに通知を表示するには、次の操作を行います。 1. `MobileReaderDelegate` にリーダーの再接続コールバックを実装します。 2. `MobileReaderDelegate` を `BluetoothConnectionConfiguration` に渡します。 3. [`reader:didStartReconnect:disconnectReason:`](https://stripe.dev/stripe-terminal-ios/docs/Protocols/SCPReaderDelegate.html#/c:objc\(pl\)SCPReaderDelegate\(im\)reader:didStartReconnect:disconnectReason:) がアプリに送信される際、SDK は、リーダーの接続が失われ、再接続が進行中であることをメッセージで通知します。 - `Cancelable` オブジェクトを使用して、いつでも再接続の試行を停止できます。 4. [`readerDidSucceedReconnect:`](https://stripe.dev/stripe-terminal-ios/docs/Protocols/SCPReaderDelegate.html#/c:objc\(pl\)SCPReaderDelegate\(im\)readerDidSucceedReconnect:) を送信して再接続が成功した場合、SDK は、接続が復元され、通常の動作を続行できることをメッセージで通知します。 5. リーダーに再接続できず、[`readerDidFailReconnect:`](https://stripe.dev/stripe-terminal-ios/docs/Protocols/SCPReaderDelegate.html#/c:objc\(pl\)SCPReaderDelegate\(im\)readerDidFailReconnect:) と `reader:didDisconnect:` の両方を送信した場合、SDK は予期しない切断が発生したことを知らせるメッセージを表示します。 #### Swift ```swift import StripeTerminal extension ReaderViewController: MobileReaderDelegate { // MARK: MobileReaderDelegate func reader(_ reader: Reader, didStartReconnect cancelable: Cancelable, disconnectReason: DisconnectReason) { // 1. Notified at the start of a reconnection attempt // Use cancelable to stop reconnection at any time } func readerDidSucceedReconnect(_ reader: Reader) { // 2. Notified when reader reconnection succeeds // App is now connected } func readerDidFailReconnect(_ reader: Reader) { // 3. Notified when reader reconnection fails // App is now disconnected } } ``` #### アプリケーションの開始時の自動再接続 Stripe Terminal は、アプリケーションの起動時にリーダーに自動的に再接続しません。代わりに、リーダー ID を保存し、起動時に既知のリーダーへの接続を行うことで、再接続フローを構築できます。 1. リーダーに正常に接続されたら、シリアル番号を [UserDefaults API](https://developer.apple.com/documentation/foundation/userdefaults) (iOS) などの永続的なデータ格納場所に保存します。 1. アプリが起動したら、その永続的なデータ格納場所に保存されているシリアル番号を確認します。確認できた場合は、`discoverReaders` メソッドを呼び出して、アプリケーションがそのリーダーを再度見つけられるようにします。 2. 保存されたシリアル番号が検出されたリーダーのいずれかと一致する場合は、`discoverReaders` の呼び出しから返された一致するリーダーオブジェクトを使用して、そのリーダーへの接続を試してください。以前に接続したリーダーが見つからない場合は、検出プロセスを停止します。 検出および接続プロセス中に何らかの UI を表示して、自動再接続が実行されていることを示します。 ## リーダーソフトウェアを更新する [クライアント側] - [MobileReaderDelegate (iOS)](https://stripe.dev/stripe-terminal-ios/docs/Protocols/SCPMobileReaderDelegate.html) アプリケーションは、モバイルリーダーを更新して以下を適用する必要があります。 - カードネットワークとカード発行会社の要件に対して最新の状態に保つための地域設定 - セキュリティ更新 必要な更新では、リーダーに接続するとインストールが開始されます。更新が完了するまでリーダーを使用できません。 > 更新をインストールするには、リーダーのバッテリー残量が 50% 以上なければなりません。 ### 必要な更新 緊急の更新がリーダーで利用可能になると、システムの `MobileReaderDelegate` が `didStartInstallingUpdate` コールバック と `ReaderSoftwareUpdate` を受信します。 `ReaderSoftwareUpdate` は、更新に関する重要情報 (更新の合計推定時間を示す `durationEstimate` など) を提供します。 インストールプロセスでは、更新がリーダーにインストールされる間、Terminal の `connectionStatus` が `connecting` に移行します。 アプリケーションからユーザーに更新をインストール中であることを伝え、また UI に進捗状況を表示する必要があります。接続に通常よりも時間がかかる理由を明確にします。 必須の更新のプロセスが失敗した場合、Stripe は `didFinishInstallingUpdate` を使用して `MobileReaderDelegate` にエラーを通知します。必須の更新に失敗した後は、以下の条件が満たされない限り、リーダーに再接続することはできません。 - リーダーは、過去 30 日間の場所に対応する最新のソフトウェアバージョンを実行します。 - iOS SDK バージョンが `3.5.0` 以降です。 条件が満たされると、更新が未完了であっても接続プロセスは成功します。Stripe は、更新が正常にインストールされるまで、次回そのリーダーに接続したときに、必要な更新を再試行します。 #### Swift ```swift import UIKit import StripeTerminal class ReaderViewController: UIViewController, MobileReaderDelegate { // ... // MARK: MobileReaderDelegate func reader(_ reader: Reader, didStartInstallingUpdate update: ReaderSoftwareUpdate, cancelable: Cancelable?) { // Show UI communicating that a required update has started installing } func reader(_ reader: Reader, didReportReaderSoftwareUpdateProgress progress: Float) { // Update the progress of the installation } func reader(_ reader: Reader, didFinishInstallingUpdate update: ReaderSoftwareUpdate?, error: Error?) { // Report success or failure of the update } // ... } ``` `Cancelable` オブジェクトを使用すると必須の更新をキャンセルできます。この場合もリーダーへの接続は失敗します。進行中の増分のみの更新はキャンセルできません。 ### オプションの更新 任意の更新は、指定した日付まで先延ばしすることが可能で、その後必須になります。リーダーの接続中、処理が行われていないときは SDK が随時 `MobileReaderDelegate` を通じて任意の更新を通知します。任意の更新が利用可能な場合、アプリケーションの `MobileReaderDelegate` は、以下の更新情報を含む `ReaderSoftwareUpdate` オブジェクトとともに `didReportAvailableUpdate` コールバックを受信します。 - 更新にかかる推定時間 (`durationEstimate`) - 更新が必須になるタイムスタンプ (`requiredAt`) アプリケーションで、更新が提供されていることをユーザーに伝え、必要に応じて更新に進むための画面を表示します。 `didReportAvailableUpdate` ですでに通知されている更新を続けるには、`Terminal.shared.installAvailableUpdate` をコールします。 利用可能な更新は、リーダーオブジェクトにも `reader.availableUpdate` として保存されます。 更新中は、顧客がアプリのページから移動できないようにするとともに、更新が完了するまでリーダーを受信範囲内に置き、電源を入れたままにしておくように指示します。また、更新の進捗状況を視覚的に示すインジケーターを、顧客に表示することもお勧めします。`MobileReaderDelegate` は、`didReportReaderSoftwareUpdateProgress` メソッドで更新の進捗状況を報告します。 オプションの更新の `requiredAt` の期日を過ぎると、次回リーダーが接続されたときに更新がインストールされます。 #### Swift ```swift import UIKit import StripeTerminal class ReaderViewController: UIViewController, MobileReaderDelegate { // ... // MARK: MobileReaderDelegate func reader(_ reader: Reader, didReportAvailableUpdate update: ReaderSoftwareUpdate) { // An update is available for the connected reader. Show this update in your application. // Install this update using `Terminal.shared.installAvailableUpdate`. } } ``` アプリケーションがリーダーに適用可能な各種の更新タイプを処理できるようにするには、[リーダーの更新をテストする](https://docs.stripe.com/terminal/references/testing.md#simulated-reader-updates) をご覧ください。 ## 次のステップ アプリケーションをリーダーに接続しました。次に、[Stripe Terminal の最初の支払いを回収](https://docs.stripe.com/terminal/payments/collect-card-payment.md)します。 BBPOS および Chipper™ の名称およびロゴは BBPOS Limited のアメリカおよび/またはその他の国における商標または登録商標です。Verifone® の名称およびロゴは Verifone のアメリカおよび/またはその他の国における商標または登録商標のいずれかです。これらの商標の使用は BBPOS または Verifone による何らかの承認を意味するものではありません。