> ## Documentation Index
> Fetch the complete documentation index at: https://docs.ones1ght.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Flutter 設定ガイド

## システム要件

| 項目 | 要件 |
| - | - |
| Flutter | 3.44 以上（iOS は Swift Package Manager でのみインストール可） |
| iOS | iOS 27 以上・UWB 対応 iPhone（アプリの最小ターゲットは iOS 18） |
| Android | Android 17（API 37）以上・UWB DL-TDoA 対応端末（アプリの最小ターゲットは API 26） |
| ネイティブ SDK | iOS `0.2.2`・Android `0.0.9`（プラグインに固定） |
| 言語 | Dart |

測位情報を受信できない端末では SDK が動作を停止し、稼働中のアプリには影響しません。

## SDK のインストール

**Step 1**

[pub.dev](https://pub.dev/packages/ones1ght_sdk) からパッケージを追加します。

```bash theme={null}
flutter pub add ones1ght_sdk
```

手動で追加する場合は、`pubspec.yaml` の dependencies に追加します。

```yaml pubspec.yaml theme={null}
dependencies:
  ones1ght_sdk: ^0.0.4
```

**Step 2**

Dart コードでインポートします。

```dart Dart icon="https://mintcdn.com/onecheck/wv66PbaB8dD4xd9I/images/icons/dart.svg?fit=max&auto=format&n=wv66PbaB8dD4xd9I&q=85&s=02dee5dd767b4c76ef0e07bc8663c542" theme={null}
import 'package:ones1ght_sdk/ones1ght_sdk.dart';
```

## iOS 設定

**1. Swift Package Manager を有効にする**

```bash theme={null}
flutter config --enable-swift-package-manager
```

**2. デプロイターゲットを上げる**

`ios/Runner.xcodeproj` の `IPHONEOS_DEPLOYMENT_TARGET` を **18.0** に上げます。

**3. 権限説明文を追加する**

`ios/Runner/Info.plist` に以下 5 つの権限説明文を 1 つも欠かさず追加します。追加方法は [iOS 設定ガイド](/ja/developers/sdk/integration/ios#ios-権限設定) を参照してください。

| キー | 権限 | 用途 |
| - | - | - |
| `NSBluetoothAlwaysUsageDescription` | Bluetooth 権限 | ロケーターの BLE 受信用 |
| `NSLocationWhenInUseUsageDescription` | 位置情報権限 | ロケーターの位置確認用 |
| `NSLocationAlwaysAndWhenInUseUsageDescription` | 位置情報権限（常に） | ロケーターの位置確認用（iOS 27.2 beta 以上） |
| `NSLocationTemporaryUsageDescriptionDictionary` | 正確な位置情報権限 | 正確な屋内位置の計算用 内側のキーは必ず `Positioning` |
| `NSNearbyInteractionUsageDescription` | Nearby Interaction | ユーザーの高精度測位用 |

```xml Info.plist theme={null}
<key>NSBluetoothAlwaysUsageDescription</key>
<string>周辺の測位機器を探すために使用します。</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>屋内での位置確認のために使用します。</string>
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>iOS 27.2 以上で建物のフロアを特定するために使用します。</string>
<key>NSLocationTemporaryUsageDescriptionDictionary</key>
<dict>
    <key>Positioning</key>
    <string>正確な屋内位置を計算するために使用します。</string>
</dict>
<key>NSNearbyInteractionUsageDescription</key>
<string>UWB 高精度測位のために使用します。</string>
```

iOS 27.2 以降では、位置情報権限が\*\*「常に」\*\*でないとフロアを検出できません。SDK は「常に」をリクエストしないため、「アプリの使用中のみ」の許可後にアプリから直接リクエストしてください。

```dart theme={null}
// permission_handler は接頭辞を付けてインポートする — PermissionStatus の名前が SDK と重複する。
import 'package:permission_handler/permission_handler.dart' as ph;

await ph.Permission.locationAlways.request();
```

## Android 設定

**1. MainActivity を変更する**

SDK の権限リクエストには `ComponentActivity` が必要なため、`MainActivity` を **`FlutterFragmentActivity`** に変更します。

```kotlin MainActivity.kt icon="https://mintcdn.com/onecheck/wv66PbaB8dD4xd9I/images/icons/kotlin.svg?fit=max&auto=format&n=wv66PbaB8dD4xd9I&q=85&s=3721cc48a6f44aef50ea7a0151e369f2" theme={null}
import io.flutter.embedding.android.FlutterFragmentActivity

class MainActivity : FlutterFragmentActivity()
```

**2. ビルドバージョンを合わせる**

```kotlin android/app/build.gradle.kts icon="https://mintcdn.com/onecheck/wv66PbaB8dD4xd9I/images/icons/kotlin.svg?fit=max&auto=format&n=wv66PbaB8dD4xd9I&q=85&s=3721cc48a6f44aef50ea7a0151e369f2" theme={null}
android {
    compileSdk = 37
    defaultConfig {
        minSdk = 26
    }
}
```

測位権限は Android SDK のマニフェストから自動でマージされます。

## SDK の初期化

測位エンジンを稼働させるための初期化を開始します。

| 関数・プロパティ | 説明 | 戻り値 |
| - | - | - |
| `initialize(sdkKey:)` | キーの検証と設定の取得。アプリ起動時に 1 回 | `Future<void>` |
| `isInitialized()` | 初期化に成功したか | `Future<bool>` |
| `sdkVersion()` | SDK バージョン | `Future<String>` |
| `pluginVersion` | プラグインのバージョン | `String`（例: `'0.0.4'`） |

すべての呼び出しは `Future`、イベントは `Stream` です。

```dart Dart icon="https://mintcdn.com/onecheck/wv66PbaB8dD4xd9I/images/icons/dart.svg?fit=max&auto=format&n=wv66PbaB8dD4xd9I&q=85&s=02dee5dd767b4c76ef0e07bc8663c542" theme={null}
const sdkKey = String.fromEnvironment('ONES1GHT_SDK_KEY');   // flutter run --dart-define=ONES1GHT_SDK_KEY=…
await OneS1ght.initialize(sdkKey: sdkKey);
```

## プロフィール

ユーザー（アカウントまたは端末）1 人の動線は**プロフィール**単位で管理されます。\

プロフィール ID は一意で、紛失すると復元できないため保管に注意してください。

| 関数・プロパティ | 説明 | 戻り値 |
| - | - | - |
| `createProfile(attributes)` | 属性からプロフィールを作成 | `Future<String>`（プロフィール ID） |
| `identify(profileId:)` | この端末の測位をプロフィールに紐付け。 解除する場合は `null` | `Future<void>` |
| `fetchProfile(profileId)` | プロフィール ID で属性を取得 | `Future<Map<String, String>>` |
| `replaceProfile(profileId, attributes:)` | 属性をすべて置き換え | `Future<void>` |
| `deleteProfile(profileId)` | プロフィールを削除 | `Future<void>` |

### プロフィールの作成

新しいプロフィールを作成するとプロフィール ID が返ります。属性はレポート・指標のセグメントとして使われ、Key-Value に制約はありません。\

発行された ID はアプリ（または自社サーバー）に保管し、起動のたびに測位前に `identify` で紐付けます。

> [!WARNING]
>
> プロフィール属性に氏名・電話番号・会員 ID のような機微な情報を入れないでください。\\
>
> 年代（`"20s"`）のように個人を特定できない値だけを入れます。

```dart Dart icon="https://mintcdn.com/onecheck/wv66PbaB8dD4xd9I/images/icons/dart.svg?fit=max&auto=format&n=wv66PbaB8dD4xd9I&q=85&s=02dee5dd767b4c76ef0e07bc8663c542" theme={null}
final profileId = await OneS1ght.createProfile({'gender': 'F', 'ageBand': '20s'});   // 新しいプロフィールを作成 → プロフィール ID を返す
save(profileId);                                                                    // アプリまたは自社サーバーに保管

await OneS1ght.identify(profileId: savedProfileId);   // 起動のたびに測位前に紐付け。ログアウト時は null
```

### プロフィール情報の取得

プロフィール ID から、保存されたパーソナライズ属性を取得します。

```dart Dart icon="https://mintcdn.com/onecheck/wv66PbaB8dD4xd9I/images/icons/dart.svg?fit=max&auto=format&n=wv66PbaB8dD4xd9I&q=85&s=02dee5dd767b4c76ef0e07bc8663c542" theme={null}
final attributes = await OneS1ght.fetchProfile(profileId);   // {gender: F, ageBand: 20s}
```

### プロフィール情報の更新

パーソナライズ属性は**まるごと置き換え**られます。更新後、以前の値は削除され、元に戻せません。

```dart Dart icon="https://mintcdn.com/onecheck/wv66PbaB8dD4xd9I/images/icons/dart.svg?fit=max&auto=format&n=wv66PbaB8dD4xd9I&q=85&s=02dee5dd767b4c76ef0e07bc8663c542" theme={null}
await OneS1ght.replaceProfile(profileId, attributes: {'gender': 'F', 'ageBand': '30s'});   // 属性をすべて置き換え
```

### プロフィールの削除

パーソナライズ属性を削除します。削除した属性は元に戻せません。

```dart Dart icon="https://mintcdn.com/onecheck/wv66PbaB8dD4xd9I/images/icons/dart.svg?fit=max&auto=format&n=wv66PbaB8dD4xd9I&q=85&s=02dee5dd767b4c76ef0e07bc8663c542" theme={null}
await OneS1ght.deleteProfile(profileId);
```

## 建物・フロアの選択

測位座標を受信するには、ロケーターが設置された建物とフロアを選択する必要があります。

| 関数・プロパティ | 説明 | 戻り値 |
| - | - | - |
| `floorSession()` | 測位セッション | `Future<FloorSession>` |
| `session.onFloorDetected` | エンジンがフロアを検出すると流れてくる。 フロアを見失うと `null` | `Stream<String?>`（フロア ID） |
| `buildings()` | コンソールに登録された建物一覧 | `Future<List<Building>>`  `id`: 建物 ID  `name`: 建物名  `floorCount`: フロア数 |
| `floors(buildingId:)` | 建物のフロア一覧（図面画像なし） | `Future<List<Floor>>` |
| `floor(buildingId:, floorId:)` | フロア 1 件（図面画像あり） | `Future<Floor>` |
| `setFloorMap(floor, buildingId:)` | フロアを指定  解除する場合は `null` | `Future<void>` |
| `session.floor()` | 現在指定されているフロア | `Future<Floor?>` |

### BLE 受信で選択

SDK の測位エンジンがロケーターの BLE 信号からフロアを検出すると、`onFloorDetected` にフロア ID が届きます。\

フロアを見失うと `null` が届きます。

```dart Dart icon="https://mintcdn.com/onecheck/wv66PbaB8dD4xd9I/images/icons/dart.svg?fit=max&auto=format&n=wv66PbaB8dD4xd9I&q=85&s=02dee5dd767b4c76ef0e07bc8663c542" theme={null}
final session = await OneS1ght.floorSession();                                   // 測位セッションを取得
session.onFloorDetected.listen((floorId) async {                                  // エンジンがフロアを検出するとフロア ID を渡す
  if (floorId == null) return;
  final floor = await OneS1ght.floor(buildingId: buildingId, floorId: floorId);   // フロア情報を取得
  await OneS1ght.setFloorMap(floor, buildingId: buildingId);                      // フロアを指定
});
```

### 手動で選択

ユーザーにフロアを選ばせる場合や、測位前に地図を先に描画する場合は、建物とフロアを直接指定します。

```dart Dart icon="https://mintcdn.com/onecheck/wv66PbaB8dD4xd9I/images/icons/dart.svg?fit=max&auto=format&n=wv66PbaB8dD4xd9I&q=85&s=02dee5dd767b4c76ef0e07bc8663c542" theme={null}
final buildings = await OneS1ght.buildings();                               // コンソールに登録された建物一覧
final floors    = await OneS1ght.floors(buildingId: buildings.first.id);    // 建物のフロア一覧

await OneS1ght.setFloorMap(floors.first, buildingId: buildings.first.id);   // フロアを指定
await OneS1ght.setFloorMap(null);                                           // フロア指定を解除
```

## リアルタイム測位情報の受信

`floorSession()` で測位セッションを取得し、`begin()` で開始、`end()` で終了します。\

位置は `onPosition` で受け取り、座標（メートル）が最大で毎秒 4 回届きます。

| 状況 | 対応 |
| - | - |
| アプリがバックグラウンドへ移行 | 不要 — ネイティブ SDK が測位を止め、フォアグラウンドに戻ると自動で再開します。Dart が止まっていても同じです。 |
| 画面を一時的に離れるとき | `pause()` で停止し、`resume()` で再開します。エンジンは動いたままなので、すぐに続きます。 |
| 測位を完全に終えるとき | `end()`。エンジンも停止するため、次の `begin()` はロケーターを最初から探し直します。 |

| 関数・プロパティ | 説明 | 戻り値 |
| - | - | - |
| `session.onPosition` | リアルタイム座標 | `Stream<Coordinates>`  `x`・`y`: 図面基準のメートル  `z`: 高さ |
| `session.begin()` | 測位開始 | `Future<void>` |
| `session.end()` | 測位終了 + 残りの座標を送信 | `Future<void>` |
| `session.pause()` / `resume()` | 一時停止 / 再開 | `Future<void>` |
| `session.isRunning()` / `isPaused()` | 測位中 / 一時停止中か | `Future<bool>` |

```dart Dart icon="https://mintcdn.com/onecheck/wv66PbaB8dD4xd9I/images/icons/dart.svg?fit=max&auto=format&n=wv66PbaB8dD4xd9I&q=85&s=02dee5dd767b4c76ef0e07bc8663c542" theme={null}
final session = await OneS1ght.floorSession();
session.onPosition.listen((coord) => updateMyLocationMarker(coord.x, coord.y));   // coord.z: 高さ

await session.begin();   // 測位開始
await session.end();     // 測位終了 + 残りの座標を送信
```

## ゾーンイベント

コンソールの[空間管理](/ja/console/areas)で描いたゾーンの進入・退出・滞在イベントを受け取ります。判定は端末内で行われるため、すぐに届きます。\

ゾーンに紐付いた施策（クーポン・サイネージなど）はサーバーがマッチングし、`onTriggers` で届きます。\

イベントはすべて `Stream` なので、複数の場所で同時に購読しても構いません。

| 関数・プロパティ | 説明 | 戻り値 |
| - | - | - |
| `session.onZoneEnter` / `onZoneExit` | ゾーン進入 / 退出 | `Stream<Zone>`  `id`: ゾーン ID  `name`: ゾーン名  `polygon`: ゾーン形状（頂点リスト）  `dwellSeconds`: 滞在判定の基準（秒） |
| `session.onZoneDwell` | ゾーン滞在時  `dwellSeconds` 到達時に訪問ごとに 1 回 | `Stream<ZoneDwell>`  `zone`: ゾーン  `seconds`: 滞在時間（秒） |
| `session.onTriggers` | サーバーがマッチングしたパーソナライズアクション | `Stream`  `zoneId`: ゾーン ID  `triggers`: トリガー一覧 （`triggerId`: トリガー ID  `type`: 種類  `payload`: 種類ごとの付加情報） |
| `session.onConfigChanged` | コンソールでゾーン設定が変更されたとき | `Stream<ConfigChange>`  `ZonesChanged`: ゾーン変更  `PlanChanged`: 図面変更  `RulesChanged`: 施策変更  `SdkConfigChanged`: SDK リモート設定変更  `ResyncNeeded`: 全体を再取得 （再接続後、またはイベントを取りこぼした可能性がある場合） |
| `refreshZones()` | ゾーン情報を最新化 | `Future<List<Zone>>` |

```dart Dart icon="https://mintcdn.com/onecheck/wv66PbaB8dD4xd9I/images/icons/dart.svg?fit=max&auto=format&n=wv66PbaB8dD4xd9I&q=85&s=02dee5dd767b4c76ef0e07bc8663c542" theme={null}
session.onZoneEnter.listen((zone) => showBanner('進入: ${zone.name}'));
session.onZoneExit.listen((zone) => hideBanner());
session.onZoneDwell.listen((d) => showBanner('滞在: ${d.zone.name} — ${d.seconds.toInt()}秒'));
session.onTriggers.listen((t) => t.triggers.forEach(handle));   // type: signage · coupon · tracking · merch · generic
```

### ゾーン情報の更新

コンソールでゾーン情報が変わると `onConfigChanged` が流れてきます。連続して届く場合は 1 秒ほどまとめて、`refreshZones()` を 1 回だけ呼びます。

```dart Dart icon="https://mintcdn.com/onecheck/wv66PbaB8dD4xd9I/images/icons/dart.svg?fit=max&auto=format&n=wv66PbaB8dD4xd9I&q=85&s=02dee5dd767b4c76ef0e07bc8663c542" theme={null}
session.onConfigChanged.listen((change) {
  switch (change) {
    case ZonesChanged() || ResyncNeeded():
      OneS1ght.refreshZones();
    case PlanChanged():
      reloadFloorPlan();   // 図面が変わった
    default:
      break;
  }
});
```

## 図面の表示

ロケーターに紐付く図面と、ユーザーの現在位置を表示できます。\

図面を設定しない場合、背景はグリッドで表示されます。

| 関数・プロパティ | 説明 | 戻り値 |
| - | - | - |
| `floor(buildingId:, floorId:)` | フロア詳細 | `Future<Floor>` `image: Uint8List?`: 図面画像 `hasPlan`: 図面登録の有無 `originX`: 図面原点 X（メートル） `originY`: 図面原点 Y（メートル） `widthM`: 横幅（メートル） `heightM`: 縦幅（メートル） `minX`: X の最小値 `minY`: Y の最小値 `maxX`: X の最大値 `maxY`: Y の最大値 |
| `locators(buildingId:, floorId:)` | フロアのロケーター情報 | `Future<FloorLocators>` `locators`: ロケーター情報 （`address`: UWB MAC の下位 2 バイト（`int`）、 `x`・`y`・`z`: ロケーター座標） `sessionId`: UWB セッション ID（フロアごとに異なる） `positioningReady`: 測位可能か |

```dart Dart icon="https://mintcdn.com/onecheck/wv66PbaB8dD4xd9I/images/icons/dart.svg?fit=max&auto=format&n=wv66PbaB8dD4xd9I&q=85&s=02dee5dd767b4c76ef0e07bc8663c542" theme={null}
final floor = await OneS1ght.floor(buildingId: buildingId, floorId: floorId);
if (floor.image != null) planWidget = Image.memory(floor.image!);
setBounds(floor.minX, floor.minY, floor.maxX, floor.maxY);
```

## その他のオプション

| 関数・プロパティ | 説明 | 戻り値 |
| - | - | - |
| `uploadPendingPositions()` | アプリ内に溜めた座標を即時送信 | `Future<void>` |
| `discardPendingPositions()` | アプリ内に溜めた座標を破棄 | `Future<void>` |
| `reset()` | セッションを破棄（新しいセッションは作成しない。続けて使うには `initialize` を呼び出す） | `Future<void>` |
| `session.onStopped` | セッション停止 | `Stream<StopReason>`: 停止理由  `ended`: セッション終了（正常）  `engineFailed`: エンジン異常（失敗） |
| `deviceAvailability()` | この端末で測位できるか、できない場合はその理由 | `Future<DeviceAvailability>` — `available`・`osVersionTooLow`・`deviceNotSupported` |
| `isDeviceAvailable()` | 上記の要約 | `Future<bool>` |
| `OneS1ght.onDebugLog` | SDK デバッグ用 | `Stream<DebugLog>` — `level`・`message` ログを返す |

### データ送信の制御

座標は **300 件たまるか、前回の送信から 60 秒経過すると**自動で送信されます。ただし、アプリが強制終了されると座標は破棄されます。

```dart Dart icon="https://mintcdn.com/onecheck/wv66PbaB8dD4xd9I/images/icons/dart.svg?fit=max&auto=format&n=wv66PbaB8dD4xd9I&q=85&s=02dee5dd767b4c76ef0e07bc8663c542" theme={null}
await OneS1ght.uploadPendingPositions();    // 溜めた座標を今すぐ送信
await OneS1ght.discardPendingPositions();   // 送信せずに破棄
```

### セッションのリセット

現在のセッションを破棄します。新しいセッションは作成しないため、続けて使うには `initialize` を再度呼び出してください（別のキーでも可能です）。

```dart Dart icon="https://mintcdn.com/onecheck/wv66PbaB8dD4xd9I/images/icons/dart.svg?fit=max&auto=format&n=wv66PbaB8dD4xd9I&q=85&s=02dee5dd767b4c76ef0e07bc8663c542" theme={null}
await OneS1ght.reset();
```

### 測位終了時の処理

測位エンジンが終了すると `onStopped` イベントが発生し、測位可能な状態へ戻せます。

```dart Dart icon="https://mintcdn.com/onecheck/wv66PbaB8dD4xd9I/images/icons/dart.svg?fit=max&auto=format&n=wv66PbaB8dD4xd9I&q=85&s=02dee5dd767b4c76ef0e07bc8663c542" theme={null}
session.onStopped.listen((reason) {
  if (reason == StopReason.engineFailed) showRetrySearch();   // 原因を解消して begin() をやり直す
});
```

### 対応端末の確認

`deviceAvailability` はネットワーク（インターネット）接続なしで即時に確認でき、\

測位に対応しない端末でもアプリの動作には影響しません。

```dart Dart icon="https://mintcdn.com/onecheck/wv66PbaB8dD4xd9I/images/icons/dart.svg?fit=max&auto=format&n=wv66PbaB8dD4xd9I&q=85&s=02dee5dd767b4c76ef0e07bc8663c542" theme={null}
switch (await OneS1ght.deviceAvailability()) {
  case DeviceAvailability.available:
    break;
  case DeviceAvailability.osVersionTooLow:
    showNotice('OS をアップデートすると利用できます');
  case DeviceAvailability.deviceNotSupported:
    hidePositioningFeatures();   // UWB 非対応端末
}
```

## 付録

### 権限のリクエスト

`requestPermission()` は、SDK の利用に必要なすべての権限をまとめてリクエストします。\

ユーザーが一度でも拒否するとアプリから再リクエストできないため、設定アプリへ案内してください。

| 関数・プロパティ | 説明 | 戻り値 |
| - | - | - |
| `requestPermission()` | 測位権限をリクエスト | `Future<PermissionStatus>`  `authorized`: 測位可能  `denied`: 拒否  `unsupported`: 測位非対応端末（ダイアログは表示されない） |

```dart Dart icon="https://mintcdn.com/onecheck/wv66PbaB8dD4xd9I/images/icons/dart.svg?fit=max&auto=format&n=wv66PbaB8dD4xd9I&q=85&s=02dee5dd767b4c76ef0e07bc8663c542" theme={null}
switch (await OneS1ght.requestPermission()) {
  case PermissionStatus.authorized:
    break;
  case PermissionStatus.denied:
    showSettingsGuide();        // アプリから再リクエスト不可 — 設定アプリへ案内
  case PermissionStatus.unsupported:
    showUnsupportedNotice();    // 測位非対応端末
}
```

### デバッグログ

デバッグログを確認するには、SDK の初期化（`initialize`）の**直前**に登録してください。\

ログは `flutter run` を実行したターミナルや、IDE のデバッグコンソールに出力されます。\

端末から直接取得する方法は [iOS](/ja/developers/sdk/integration/ios#デバッグログ)・[Android](/ja/developers/sdk/integration/android#デバッグログ) ガイドを参照してください。\

ユーザーの測位情報はシミュレーター・エミュレーターでは確認できません。

```dart Dart icon="https://mintcdn.com/onecheck/wv66PbaB8dD4xd9I/images/icons/dart.svg?fit=max&auto=format&n=wv66PbaB8dD4xd9I&q=85&s=02dee5dd767b4c76ef0e07bc8663c542" theme={null}
import 'package:flutter/foundation.dart';   // kDebugMode · debugPrint

if (kDebugMode) {
  OneS1ght.onDebugLog.listen((log) => debugPrint('[OneS1ght] ${log.level} ${log.message}'));
}
```

SDK のログ・案内文の言語は `setLanguage` で指定します — `'ko'`・`'ja'`・`'en'`、`null` なら端末の言語に従います。

```dart Dart icon="https://mintcdn.com/onecheck/wv66PbaB8dD4xd9I/images/icons/dart.svg?fit=max&auto=format&n=wv66PbaB8dD4xd9I&q=85&s=02dee5dd767b4c76ef0e07bc8663c542" theme={null}
await OneS1ght.setLanguage('ja');
```

### ネイティブ SDK との違い

| 項目 | ネイティブ SDK | Flutter |
| - | - | - |
| イベント | コールバックプロパティ（`session.onZoneEnter = …`） | 同名の `Stream`（`session.onZoneEnter.listen(…)`） |
| 状態値 | プロパティ（`OneS1ght.isInitialized`） | `Future` を返す関数（`await OneS1ght.isInitialized()`） |
| 初期化 | Android は `Context` も渡す | プラグインが渡す — `initialize(sdkKey:)` のみ |
| 権限 | Android は `requestPermission(activity)` | プラグインが Activity を渡す — `requestPermission()` のみ |
| 非対応 | — | カスタム測位 provider（`begin(provider:)`） |

## トラブルシューティング

| 症状 | 原因と対処 |
| - | - |
| `pod install` が OneS1ght の案内文とともに止まる | Swift Package Manager が無効です。  `flutter config --enable-swift-package-manager` を実行して再ビルド |
| Android で `requestPermission()` がエラーで失敗する | `MainActivity` を `FlutterFragmentActivity` に変更 |
| Android の対応端末なのに `deviceNotSupported` になる | `initialize()` の前に読み取っています。初期化後に再度読み取ってください |

> **[エラーコード](/ja/developers/sdk/troubleshooting/error-codes)**
>
> 開発中に発生するエラーの内容を案内します。


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.