diff --git a/README.md b/README.md
new file mode 100644
index 0000000..abdb4a6
--- /dev/null
+++ b/README.md
@@ -0,0 +1,214 @@
+# Plaud SDK for React Native
+
+A local [Expo module](https://docs.expo.dev/modules/overview/) that bridges Plaud's native
+iOS device SDK into React Native. It exposes BLE scan/connect, on-device recording events,
+file listing, and audio export to JavaScript.
+
+- **`modules/plaud-sdk/`** — the module itself. This is the piece you drop into another
+ project. See `modules/plaud-sdk/README.md` for the terse module-level notes.
+- **`react-native-demo/`** — a reference Expo (SDK 57) app wiring the module end to end:
+ scan → connect → list → export → transcribe. `src/app/index.tsx` is the canonical usage
+ example.
+
+---
+
+## How the module works
+
+The module is three layers stacked on top of each other. A JS call travels down; native
+events travel back up.
+
+```
+ your React Native code
+ │ import { PlaudSdk, isAvailable } from 'plaud-sdk'
+ ▼
+ ┌─────────────────────────────┐
+ │ JS layer (src/*.ts) │ requireNativeModule('PlaudSdk'), fully typed,
+ │ │ degrades to a no-op Proxy off-iOS
+ └─────────────────────────────┘
+ │ Expo Modules bridge (AsyncFunction / Events)
+ ┌─────────────────────────────┐
+ │ Plaud native SDK │ three precompiled .xcframeworks
+ │ (ios/Frameworks/*) │ BLE / Device / WiFi
+ └─────────────────────────────┘
+```
+
+**1. JS layer (`src/index.ts`, `src/PlaudSdk.types.ts`).**
+`requireNativeModule('PlaudSdk')` resolves the native module at runtime. It's called lazily
+inside a `try/catch` and only on iOS, so the module never throws at import time. Two exports
+matter:
+- `isAvailable` — `true` only when the native module is linked and callable (a physical iOS
+ device). Guard every call site with it.
+- `PlaudSdk` — the typed handle. When the native module is absent (Android / simulator), it's
+ a `Proxy` whose methods reject and whose `addListener` is a harmless no-op, so shared code
+ doesn't need platform branches everywhere.
+
+**2. Plaud native SDK (`ios/Frameworks/*.xcframework`).**
+Three precompiled binary frameworks — `PlaudBleSDK`, `PlaudDeviceBasicSDK`, `PlaudWiFiSDK` —
+vendored by `ios/PlaudSdk.podspec` (`vendored_frameworks`). CocoaPods embeds and code-signs
+them automatically; there are no Podfile or Xcode edits to make by hand.
+
+---
+
+## ⚠️ Platform constraints — read this first
+
+The Plaud frameworks are **arm64, iOS 15+, device-only**. There is **no simulator slice** and
+**no Android support**. That means:
+
+- You must run on a **physical iPhone** (`npx expo run:ios --device`), never the simulator.
+- You must use a **custom dev build**, not Expo Go (this is custom native code).
+- On Android or the simulator, `isAvailable` is `false` and every `PlaudSdk` method rejects —
+ so guard call sites and keep the app functional (just without the SDK) on those targets.
+
+---
+
+## Implementing the module in an existing React Native project
+
+The module is built on Expo's module system, so the smoothest path is an Expo (or
+Expo-prebuild) app. Bare React Native works too — you just need the Expo Modules
+infrastructure installed first.
+
+### Prerequisites
+
+| Tool | Notes |
+| ----------------------------- | ------------------------------------------------- |
+| Node.js | v20+ (v24 used here) |
+| Xcode | 16.x+, with a physical iPhone + Apple ID |
+| CocoaPods | `brew install cocoapods` |
+| An Expo-based RN app | Expo SDK 52+ recommended (this repo uses SDK 57) |
+
+### Step 0 (bare RN only): add Expo Modules support
+
+Skip this if your app already uses Expo. For a bare React Native app, install the Expo Modules
+runtime once — it's what provides `requireNativeModule` and the autolinking `PlaudSdk`
+depends on:
+
+```bash
+npx install-expo-modules@latest
+```
+
+### Step 1: copy the module into your app
+
+Place the module where Expo autolinking looks — a `modules/` folder at your project root:
+
+```bash
+cp -R modules/plaud-sdk /path/to/your-app/modules/plaud-sdk
+```
+
+Then reference it from your app's `package.json` so Metro and TypeScript resolve the
+`plaud-sdk` import to the local folder:
+
+```jsonc
+// your-app/package.json
+{
+ "dependencies": {
+ "plaud-sdk": "file:./modules/plaud-sdk"
+ }
+}
+```
+
+```bash
+npm install
+```
+
+> The module's `expo-module.config.json` is what makes autolinking pick it up — no manual
+> native linking, no Podfile edits.
+
+### Step 2: declare BLE permissions in `app.json`
+
+These live in the app's config (not the module) so they survive `expo prebuild`. Add them
+under `expo.ios.infoPlist`:
+
+```jsonc
+{
+ "expo": {
+ "ios": {
+ "infoPlist": {
+ "NSBluetoothAlwaysUsageDescription": "Plaud uses Bluetooth to connect to your recorder and sync recordings.",
+ "UIBackgroundModes": ["bluetooth-central"]
+ }
+ }
+ }
+}
+```
+
+### Step 3: generate the native project and build
+
+```bash
+npx expo prebuild -p ios # regenerates ios/ from app.json and runs pod install
+npx expo run:ios --device # build + install on a connected iPhone
+```
+
+Re-run `expo prebuild` after any native config change. If you're in a bare app that manages
+`ios/` by hand, run `pod install` from `ios/` instead — autolinking still discovers the module.
+
+### Step 4: use it from JS
+
+```ts
+import { PlaudSdk, isAvailable } from 'plaud-sdk';
+
+if (!isAvailable) {
+ // Android / simulator — the native module isn't linked. Degrade gracefully.
+}
+
+// 1. Initialise with a per-user JWT (see "Tokens" below).
+await PlaudSdk.initSDK({
+ userAccessToken, // per-user Bearer JWT
+ customDomain: 'platform-us.plaud.ai', // domain only, no https://
+ userId: 'your-app-user-id', // reused as the connect deviceToken
+});
+
+// 2. Subscribe to the event stream — this is where results land.
+const subs = [
+ PlaudSdk.addListener('scanResult', ({ devices }) => {/* show devices */}),
+ PlaudSdk.addListener('connectState', ({ connected, failed }) => {
+ if (connected) PlaudSdk.getFileList(); // ask for recordings once connected
+ }),
+ PlaudSdk.addListener('fileList', ({ files }) => {/* show recordings */}),
+ PlaudSdk.addListener('exportProgress', ({ progress, message }) => {/* progress UI */}),
+];
+
+// 3. Drive it.
+await PlaudSdk.startScan();
+// user taps a device from scanResult:
+await PlaudSdk.connectBleDevice({ uuid: device.uuid });
+// user taps a file from fileList:
+const { outputPath } = await PlaudSdk.exportAudio({ sessionId, format: 'mp3' });
+
+// 4. Clean up listeners on unmount.
+subs.forEach((s) => s.remove());
+```
+
+The demo's `react-native-demo/src/app/index.tsx` is a complete, production-shaped version of
+this (React state, error handling, live-recording banners). Read it before building your own
+screen.
+
+---
+
+## Tokens and transcription (your app's responsibility)
+
+`initSDK` needs a **per-user access token** (a Bearer JWT). The SDK does *not* mint it — that's
+an app/backend concern. Mint it via Plaud's partner OAuth flow on your backend and hand it to
+the client. For local testing you can paste one via `EXPO_PUBLIC_PLAUD_ACCESS_TOKEN` (Expo
+inlines `EXPO_PUBLIC_*` at build time).
+
+Once a recording is exported to a local file, **uploading and transcribing it is plain HTTP —
+not part of this native module**. The demo shows the full flow in
+`react-native-demo/src/lib/plaud-transcription.ts` (presigned S3 upload → submit → poll).
+
+> ⚠️ The demo calls the Plaud platform API directly from the device with `EXPO_PUBLIC_*`
+> credentials, which are extractable from the bundle. That's fine for a demo, but in
+> production the transcription API key and upload must live behind a backend.
+
+---
+
+## Running the demo app
+
+```bash
+cd react-native-demo
+npm install
+cp .env.example .env # fill in EXPO_PUBLIC_PLAUD_* values
+npx expo prebuild -p ios
+npx expo run:ios --device # physical iPhone required
+```
+
+See `react-native-demo/README.md` for the full build-and-run walkthrough.
diff --git a/modules/plaud-sdk/README.md b/modules/plaud-sdk/README.md
new file mode 100644
index 0000000..275e203
--- /dev/null
+++ b/modules/plaud-sdk/README.md
@@ -0,0 +1,38 @@
+# plaud-sdk (local Expo module)
+
+Native iOS bridge to Plaud's device SDK — the React Native counterpart of the Capacitor
+`PlaudSdk` plugin. Exposes BLE connect/scan, on-device file listing, and audio export to JS,
+plus an event stream for scan results, connection state, device-initiated recording, etc.
+
+## How it's wired
+- **Autolinked** via `use_expo_modules!` — Expo scans `./modules` during prebuild, so no
+ Podfile or Xcode edits are needed. `expo-module.config.json` registers `PlaudSdkModule`.
+- The Plaud SDK ships as three precompiled `.xcframework`s in `ios/Frameworks/`
+ (`PlaudBleSDK`, `PlaudDeviceBasicSDK`, `PlaudWiFiSDK`), vendored by `PlaudSdk.podspec`
+ (`vendored_frameworks`). CocoaPods embeds and code-signs them automatically.
+- BLE permissions (`NSBluetoothAlwaysUsageDescription`, `UIBackgroundModes: bluetooth-central`)
+ live in the app's `app.json` under `ios.infoPlist`, so they survive `expo prebuild`.
+
+## ⚠️ Device only
+The frameworks are **arm64, iOS 15+, device-only** — there is no simulator slice. You must:
+- Run on a **physical iPhone** (`npx expo run:ios --device`), not the simulator.
+- Use a **dev build**, not Expo Go (this is custom native code).
+
+On Android / simulator the JS `PlaudSdk` methods reject and `isAvailable` is `false`.
+
+## Usage
+```ts
+import { PlaudSdk, isAvailable } from 'plaud-sdk';
+
+if (isAvailable) {
+ await PlaudSdk.initSDK({ userAccessToken, customDomain: 'platform-us.plaud.ai', userId });
+ const sub = PlaudSdk.addListener('scanResult', ({ devices }) => { /* ... */ });
+ await PlaudSdk.startScan();
+ // ...later: sub.remove();
+}
+```
+
+## Not ported from the Capacitor plugin
+`readFile` / `putBinary` — those existed only to work around WKWebView CORS when Capacitor
+loaded a remote origin. React Native has no WebView/CORS constraint: read exported files with
+`expo-file-system` and upload with `fetch`.
diff --git a/modules/plaud-sdk/expo-module.config.json b/modules/plaud-sdk/expo-module.config.json
new file mode 100644
index 0000000..4d95835
--- /dev/null
+++ b/modules/plaud-sdk/expo-module.config.json
@@ -0,0 +1,6 @@
+{
+ "platforms": ["apple"],
+ "apple": {
+ "modules": ["PlaudSdkModule"]
+ }
+}
diff --git a/modules/plaud-sdk/index.ts b/modules/plaud-sdk/index.ts
new file mode 100644
index 0000000..9b28da1
--- /dev/null
+++ b/modules/plaud-sdk/index.ts
@@ -0,0 +1,2 @@
+export * from './src';
+export { default } from './src';
diff --git a/modules/plaud-sdk/ios/Frameworks/PlaudBleSDK.xcframework/Info.plist b/modules/plaud-sdk/ios/Frameworks/PlaudBleSDK.xcframework/Info.plist
new file mode 100644
index 0000000..a2264c5
--- /dev/null
+++ b/modules/plaud-sdk/ios/Frameworks/PlaudBleSDK.xcframework/Info.plist
@@ -0,0 +1,27 @@
+
+
+
+
+ AvailableLibraries
+
+
+ BinaryPath
+ PlaudBleSDK.framework/PlaudBleSDK
+ LibraryIdentifier
+ ios-arm64
+ LibraryPath
+ PlaudBleSDK.framework
+ SupportedArchitectures
+
+ arm64
+
+ SupportedPlatform
+ ios
+
+
+ CFBundlePackageType
+ XFWK
+ XCFrameworkFormatVersion
+ 1.0
+
+
diff --git a/modules/plaud-sdk/ios/Frameworks/PlaudBleSDK.xcframework/ios-arm64/PlaudBleSDK.framework/Headers/JXAvcFilePlayer.h b/modules/plaud-sdk/ios/Frameworks/PlaudBleSDK.xcframework/ios-arm64/PlaudBleSDK.framework/Headers/JXAvcFilePlayer.h
new file mode 100644
index 0000000..ea4a9e3
--- /dev/null
+++ b/modules/plaud-sdk/ios/Frameworks/PlaudBleSDK.xcframework/ios-arm64/PlaudBleSDK.framework/Headers/JXAvcFilePlayer.h
@@ -0,0 +1,56 @@
+//
+// JXAvcFilePlayer.h
+// PenBleSDK
+//
+// Created by 天诺泰 on 2019/5/21.
+// Copyright © 2019 天诺泰. All rights reserved.
+//
+
+#import
+
+@protocol JXAvcFilePlayerDelegate
+/// 播放状态改变
+- (void)onStateChanged:(BOOL)isPlaying;
+/// 播放进度(秒)
+- (void)onPlayLocation:(double)seconds;
+
+@end
+
+/// avc/opus文件播放器
+/// @deprecated 废弃,请使用JXOggPlayer
+@interface JXAvcFilePlayer : NSObject
+
+@property (nonatomic, weak) id delegate;
+@property (nonatomic, assign) BOOL isPrepared;
+@property (nonatomic, strong) NSString *filePath; //文件路径
+@property (nonatomic, assign) NSInteger fileSize; //文件大小
+@property (nonatomic, assign) NSInteger curOffset; //当前播放文件偏移量
+
++ (instancetype)shared;
+/// 是否开启降噪、增益
+- (void)openNsAgc:(BOOL)open;
+
+/// 是否开启声加降噪
+- (void)openSoundPlusNs:(BOOL)open;
+
+/// 设置avc文件路径
+- (void)setAudioPath:(NSString *)avcPath numerOfChannel:(int)channels;
+
+/// 开始播放
+- (void)play;
+/// 播放速率
+- (void)setPlayRate:(Float32)rate;
+/// 跳到某个位置
+- (void)seekTo:(NSTimeInterval)seconds;
+/// 暂停播放
+- (void)pause;
+/// 结束播放
+- (void)stop;
+///是否正在播放
+- (BOOL)isPlaying;
+///播放到的毫秒值
+- (NSInteger)curMillisec;
+///总时长
+- (double)duration;
+
+@end
diff --git a/modules/plaud-sdk/ios/Frameworks/PlaudBleSDK.xcframework/ios-arm64/PlaudBleSDK.framework/Headers/JXOggPlayer.h b/modules/plaud-sdk/ios/Frameworks/PlaudBleSDK.xcframework/ios-arm64/PlaudBleSDK.framework/Headers/JXOggPlayer.h
new file mode 100644
index 0000000..7756259
--- /dev/null
+++ b/modules/plaud-sdk/ios/Frameworks/PlaudBleSDK.xcframework/ios-arm64/PlaudBleSDK.framework/Headers/JXOggPlayer.h
@@ -0,0 +1,83 @@
+//
+// JXOggPlayer.h
+// PenBleSDK
+//
+// Created by 天诺泰 on 2021/5/31.
+// Copyright © 2021 天诺泰. All rights reserved.
+//
+
+#import
+
+NS_ASSUME_NONNULL_BEGIN
+
+@protocol JXOggPlayerDelegate
+
+/// 播放状态改变
+- (void)onStateChanged:(BOOL)isPlaying;
+/// 播放进度(秒)
+- (void)onPlayingLocation:(double)seconds;
+
+@end
+
+/// 直接播放录音笔ogg文件的类
+@interface JXOggPlayer : NSObject
+
+@property (nonatomic, weak) id delegate;
+@property (nonatomic, assign, readonly) BOOL isPrepared;
+/// 文件路径,不要直接操作
+@property (nonatomic, strong, readonly) NSString *filePath;
+/// 文件总大小
+@property (nonatomic, assign, readonly) NSInteger fileSize;
+/// 录音文件总时长(单位毫秒)
+@property (nonatomic, assign, readonly) NSInteger totalMillsec;
+/// 录音当前播放进度(单位毫秒)
+@property (nonatomic, assign, readonly) NSInteger curMillsec;
+
++ (instancetype)shared;
+
+/// 设置ogg文件路径和音频声道数
+/// @param oggPath ogg文件路径
+/// @param channel 声道数
+- (void)setOggPath:(NSString *)oggPath withChannel:(int)channel;
+
+/// 设置opus文件路径和音频声道数
+/// @param opusPath opus纯音频未解码数据文件路径
+/// @param channel 声道数
+- (void)setOpusPath:(NSString *)opusPath withChannel:(int)channel;
+
+/// 设置 pcm 文件路径和音频声道数
+/// @param pcmPath pcm 数据文件路径
+/// @param channel 声道数
+- (void)setPCMPath:(NSString *)pcmPath withChannel:(int)channel;
+
+/// 是否开启降噪、增益(仅单声道)
+- (void)openNsAgc:(BOOL)open;
+
+/// 设置是否启用 Plaud 算法降噪(基于 plaud_algo,按 256 帧处理,16k 单声道)
+- (void)setPlaudAlgo:(BOOL)enabled;
+
+/// 开始播放
+- (void)play;
+
+/// 设置倍速播放
+/// @param rate 播放倍率
+- (void)setPlayRate:(Float32)rate;
+/// 跳到某个位置;因为会清空音频队列,跳转后需要手动恢复播放
+/// @param seconds 单位秒
+- (void)seekTo:(NSTimeInterval)seconds;
+
+/// 跳到某个位置;因为会清空音频队列,跳转后需要手动恢复播放
+/// @param millSec 单位 毫秒
+- (void)seekToMillSec:(NSTimeInterval)millSec;
+
+/// 暂停播放
+- (void)pause;
+/// 结束播放
+- (void)stop;
+///是否正在播放
+- (BOOL)isPlaying;
+
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/modules/plaud-sdk/ios/Frameworks/PlaudBleSDK.xcframework/ios-arm64/PlaudBleSDK.framework/Headers/JXOpusDecoder.h b/modules/plaud-sdk/ios/Frameworks/PlaudBleSDK.xcframework/ios-arm64/PlaudBleSDK.framework/Headers/JXOpusDecoder.h
new file mode 100644
index 0000000..92fc180
--- /dev/null
+++ b/modules/plaud-sdk/ios/Frameworks/PlaudBleSDK.xcframework/ios-arm64/PlaudBleSDK.framework/Headers/JXOpusDecoder.h
@@ -0,0 +1,25 @@
+//
+// JXOpusDecoder.h
+// PenBleSDK
+//
+// Created by 天诺泰 on 2019/8/15.
+// Copyright © 2019 天诺泰. All rights reserved.
+//
+
+#import
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface JXOpusDecoder : NSObject
+
+/// 初始化解码器
+/// @param channels 声道数,1,2,4
+- (instancetype)initWithChannels:(int)channels;
+
+/// 解码数据·
+/// @param avcData 数据,单声道包大小是80,双声道包大小是160,四声道是320
+- (nullable NSData *)decode:(NSData *)avcData;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/modules/plaud-sdk/ios/Frameworks/PlaudBleSDK.xcframework/ios-arm64/PlaudBleSDK.framework/Headers/Mp3Convert.h b/modules/plaud-sdk/ios/Frameworks/PlaudBleSDK.xcframework/ios-arm64/PlaudBleSDK.framework/Headers/Mp3Convert.h
new file mode 100644
index 0000000..68dd71b
--- /dev/null
+++ b/modules/plaud-sdk/ios/Frameworks/PlaudBleSDK.xcframework/ios-arm64/PlaudBleSDK.framework/Headers/Mp3Convert.h
@@ -0,0 +1,152 @@
+//
+// Mp3Convert.h
+// PenBleSDK
+//
+// Created by 天诺泰 on 2019/8/16.
+// Copyright © 2019 天诺泰. All rights reserved.
+//
+
+#import
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface Mp3Convert : NSObject
+
++ (instancetype)shared;
+
+//+ (void)jx_swap:(int *)a :(int *)b;
+/// 生成声波
+/// @param avcPath 原始文件路径
+/// @param channels 声道数
+/// @param callback 回调,每秒一个分贝值
+- (void)generateSoundWave:(NSString *)avcPath
+ channels:(int)channels
+ callback:(void(^)(int second, int secVolume))callback;
+
+/// 生成音乐模式下wav的声波
+/// @param wavPath wav文件
+/// @param channels 声道数
+/// @param simpleRate 采样率
+/// @param callback 回调,每秒一个分贝值
+- (void)generateSoundWave:(NSString *)wavPath
+ channels:(int)channels
+ simpleRate:(int)simpleRate
+ callback:(void(^)(int second, int secVolume))callback;
+
+/// 取消生成声波的任务
+- (void)generateSoundWaveCancel;
+
+/// avc转pcm
+/// @param avcPath 原始文件路径
+/// @param pcmPath 目标文件路径
+/// @param channels 声道数
+/// @param ns_agc 是否降噪增益
+/// @param callback 进度回调
+- (void)convertAvc:(NSString *)avcPath
+ toPcm:(NSString *)pcmPath
+ channels:(int)channels
+ ns_agc:(BOOL)ns_agc
+ callback:(void(^)(int64_t curPos))callback;
+
+/// ogg转pcm
+/// @param oggPath ogg文件路径
+/// @param pcmPath pcm文件路径
+/// @param channels 声道数
+/// @param ns_agc 是否降噪增益
+/// @param callback 进度回调
+- (void)convertOgg:(NSString *)oggPath
+ toPcm:(NSString *)pcmPath
+ channels:(int)channels
+ ns_agc:(BOOL)ns_agc
+ callback:(void(^)(int64_t curPos))callback;
+
+/// pcm转mp3
+/// @param pcmPath pcm文件路径
+/// @param mp3Path mp3文件路径
+/// @param quality 音质质量(默认选7) 2 near-best quality, not too slow;5 good quality, fast; 7 ok quality, really fast
+/// @param channels 声道数
+/// @param callback 进度回调
+- (void)convertPcm:(NSString *)pcmPath
+ toMp3:(NSString *)mp3Path
+ quality:(int)quality
+ channels:(int)channels
+ callback:(void(^)(int64_t curPos))callback;
+
+
+/// avc转mp3
+/// @param avcPath 原始未解码文件路径
+/// @param mp3Path mp3文件路径
+/// @param quality mp3音质 2 near-best quality, not too slow;5 good quality, fast;7 ok quality, really fast 默认7
+/// @param channels 声道数
+/// @param ns_agc 是否要做降噪增益?(笔端如果做了app就不用做)
+/// @param callback 回调进度(已处理文件偏移量)
+- (void)convertAvc:(NSString *)avcPath
+ toMp3:(NSString *)mp3Path
+ quality:(int)quality
+ channels:(int)channels
+ ns_agc:(BOOL)ns_agc
+ callback:(void(^)(int64_t curPos))callback;
+
+/// ogg转mp3
+/// @param oggPath ogg文件路径
+/// @param mp3Path 待生成的mp3文件路径
+/// @param quality mp3音质 2 near-best quality, not too slow;5 good quality, fast;7 ok quality, really fast 默认7
+/// @param channels ogg声道数
+/// @param ns_agc 是否要做降噪增益?(@see BleDevice)
+/// @param callback 回调进度(已处理文件偏移量)
+- (void)convertOgg:(NSString *)oggPath
+ toMp3:(NSString *)mp3Path
+ quality:(int)quality
+ channals:(int)channels
+ ns_agc:(BOOL)ns_agc
+ callback:(void(^)(int64_t curPos))callback;
+
+
+/// avc转wave
+/// @param avcPath 原始未解码文件路径
+/// @param wavePath wave文件路径
+/// @param channels 声道数
+/// @param simpleRate 采样率,16000(16k)、48000(48k)
+/// @param ns_agc 是否要做降噪增益?(笔端如果做了app就不用做)
+/// @param callback 回调进度(已处理文件偏移量)
+- (void)convertAvc:(NSString *)avcPath
+ toWave:(NSString *)wavePath
+ channels:(int)channels
+ simpleRate:(uint32_t)simpleRate
+ ns_agc:(BOOL)ns_agc
+ callback:(void(^)(int64_t curPos))callback;
+
+/// avc 转降噪 wave
+/// @param avcPath 原始未解码文件路径
+/// @param wavePath wave文件路径
+/// @param channels 声道数
+/// @param simpleRate 采样率,16000(16k)、48000(48k)
+/// @param soundPlus 是否要做降噪增益?(笔端如果做了app就不用做)
+/// @param callback 回调进度(已处理文件偏移量)
+- (void)convertAvc:(NSString *)avcPath
+ toNoiseReductionWave:(NSString *)wavePath
+ channels:(int)channels
+ simpleRate:(uint32_t)simpleRate
+ soundPlus:(BOOL)soundPlus
+noiseReductionGain:(int)gain
+ callback:(void(^)(int64_t curPos))callback;
+
+
+/// 取消avcToPcm的任务
+- (void)convertAvcToPcmCancel;
+/// 取消压缩PcmToMp3的任务
+- (void)convertPcmToMp3Cancel;
+/// 取消压缩AvcToMp3的任务
+- (void)convertAvcToMp3Cancel;
+/// 取消ogg转mp3的任务
+- (void)convertOggToMp3Cancel;
+
+/// 取消ogg转pcm的任务
+- (void)convertOggToPcmCancel;
+/// 取消压缩AvcToWav的任务
+- (void)convertAvcToWavCancel;
+/// 取消压缩AvcToNoiseReductionWav的任务
+- (void)convertAvcToNoiseReductionWavCancel;
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/modules/plaud-sdk/ios/Frameworks/PlaudBleSDK.xcframework/ios-arm64/PlaudBleSDK.framework/Headers/NSData+SHA.h b/modules/plaud-sdk/ios/Frameworks/PlaudBleSDK.xcframework/ios-arm64/PlaudBleSDK.framework/Headers/NSData+SHA.h
new file mode 100644
index 0000000..263ef8f
--- /dev/null
+++ b/modules/plaud-sdk/ios/Frameworks/PlaudBleSDK.xcframework/ios-arm64/PlaudBleSDK.framework/Headers/NSData+SHA.h
@@ -0,0 +1,19 @@
+//
+// NSData_SHA1.h
+// SwiftyRSA
+//
+// Created by Paul Wilkinson on 19/04/2016.
+// Copyright © 2016 Scoop. All rights reserved.
+//
+
+#import
+
+@interface NSData (NSData_SwiftyRSASHA)
+
+- (nonnull NSData*) SwiftyRSASHA1;
+- (nonnull NSData*) SwiftyRSASHA224;
+- (nonnull NSData*) SwiftyRSASHA256;
+- (nonnull NSData*) SwiftyRSASHA384;
+- (nonnull NSData*) SwiftyRSASHA512;
+
+@end
\ No newline at end of file
diff --git a/modules/plaud-sdk/ios/Frameworks/PlaudBleSDK.xcframework/ios-arm64/PlaudBleSDK.framework/Headers/NsAgcUtil.h b/modules/plaud-sdk/ios/Frameworks/PlaudBleSDK.xcframework/ios-arm64/PlaudBleSDK.framework/Headers/NsAgcUtil.h
new file mode 100644
index 0000000..7542f27
--- /dev/null
+++ b/modules/plaud-sdk/ios/Frameworks/PlaudBleSDK.xcframework/ios-arm64/PlaudBleSDK.framework/Headers/NsAgcUtil.h
@@ -0,0 +1,21 @@
+//
+// NsAgcUtil.h
+// PenBleSDK
+//
+// Created by 天诺泰 on 2020/2/24.
+// Copyright © 2020 天诺泰. All rights reserved.
+//
+
+#import
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface NsAgcUtil : NSObject
+
+- (nullable NSData *)process:(NSData *)pcmData channesl:(int)channels;
+
+- (void)procress:(int16_t *)input channels:(int)channels;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/modules/plaud-sdk/ios/Frameworks/PlaudBleSDK.xcframework/ios-arm64/PlaudBleSDK.framework/Headers/OggUtil.h b/modules/plaud-sdk/ios/Frameworks/PlaudBleSDK.xcframework/ios-arm64/PlaudBleSDK.framework/Headers/OggUtil.h
new file mode 100644
index 0000000..7ccf9aa
--- /dev/null
+++ b/modules/plaud-sdk/ios/Frameworks/PlaudBleSDK.xcframework/ios-arm64/PlaudBleSDK.framework/Headers/OggUtil.h
@@ -0,0 +1,76 @@
+//
+// OggUtil.h
+// PenBleSDK
+//
+// Created by 天诺泰 on 2019/10/22.
+// Copyright © 2019 天诺泰. All rights reserved.
+//
+
+#import
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface OggUtil : NSObject
+
++ (instancetype)shared;
+
+/// 生成声波
+/// @param oggPath 原始文件路径
+/// @param channels 声道数
+/// @param callback 回调,每秒一个分贝值
+- (void)generateSoundWave:(NSString *)oggPath
+ channels:(int)channels
+ callback:(void(^)(int second, int secVolume, int progress))callback;
+
+/// 取消生成声波的任务
+- (void)generateSoundWaveCancel;
+
+
+/// 封装ogg
+/// @param avcPath opus压缩文件路径
+/// @param oggPath 目标ogg文件路径
+/// @param cutOut 是否截取?(讯飞的离线识别虽然说是5个小时,但是好像只能传4小时59分50秒的样子)
+/// @param channels 声道数(源数据声道)
+/// @param targetChannels 目标声道(单声道还是双声道?双声道可以只获取单声道的,语音识别的一般只支持单声道;双声道转双声道有点问题,声音不好)
+/// @param ns_agc 做降噪、增益
+/// @param callback 回调
+- (void)convertAvc:(NSString *)avcPath
+ toOgg:(NSString *)oggPath
+ cutOut:(BOOL)cutOut
+ channels:(int32_t)channels
+ targetChannels:(int32_t)targetChannels
+ ns_agc:(BOOL)ns_agc
+ callback:(void(^)(int64_t curPos))callback;
+
+/// 取消转码任务
+- (void)convertCancel;
+
+///提取pcm纯数据
+- (void)convertOgg:(NSString *)oggPath
+ toOpus:(NSString *)opusPath
+ channels:(int32_t)channels
+ callback:(void(^)(Boolean completed))callback;
+
+/// 单、双声道ogg转单声道ogg
+/// @param originPath 双声道ogg(必须是从录音笔直接获取的,其他格式不支持)
+/// @param singlePath 目标单声道ogg
+/// @param callback 进度回调
+- (void)convertOgg:(NSString *)originPath
+ toSingle:(NSString *)singlePath
+ channels:(int32_t)channels
+ callback:(void(^)(int64_t curPos))callback;
+
+
+/// 四声道ogg转单声道ogg
+/// @param originPath 四声道ogg(必须是从录音笔直接获取的,其他格式不支持)
+/// @param singlePath 目标单声道ogg
+/// @param callback 进度回调
+- (void)convertFourChannelOgg:(NSString *)originPath
+ toSingle:(NSString *)singlePath
+ callback:(void(^)(int64_t curPos))callback;
+
+
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/modules/plaud-sdk/ios/Frameworks/PlaudBleSDK.xcframework/ios-arm64/PlaudBleSDK.framework/Headers/PlaudAlgoTool.h b/modules/plaud-sdk/ios/Frameworks/PlaudBleSDK.xcframework/ios-arm64/PlaudBleSDK.framework/Headers/PlaudAlgoTool.h
new file mode 100644
index 0000000..c0adcba
--- /dev/null
+++ b/modules/plaud-sdk/ios/Frameworks/PlaudBleSDK.xcframework/ios-arm64/PlaudBleSDK.framework/Headers/PlaudAlgoTool.h
@@ -0,0 +1,41 @@
+//
+// PlaudAlgoTool.h
+// PenBleSDK
+//
+// Created for PlaudAlgo wrapper.
+//
+
+#import
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface PlaudAlgoTool : NSObject
+
++ (instancetype)shared;
+
+/// 是否启用 PlaudAlgo 处理
+@property (nonatomic, assign) BOOL enabled;
+
+/// 初始化算法(如有需要可重复调用保证幂等)
+- (void)setup;
+
+/// 处理 PCM int16 数据,要求 length 为采样点数(每点 2 字节),内部按 256 帧切片
+- (NSData *)processInt16:(int16_t *)input length:(int)length;
+
+/// 处理 WAV 文件,inputPath 为 16k/16bit/mono 的 WAV,输出 WAV
+- (BOOL)processWavFile:(NSString *)inputPath
+ outputPath:(NSString *)outputPath
+ progress:(void (^)(float progress))progressCallback;
+
+/// 处理裸 PCM 文件,输入/输出均为 16k/16bit/mono 的 PCM
+- (BOOL)processPcmFile:(NSString *)inputPath
+ outputPath:(NSString *)outputPath
+ progress:(void (^)(float progress))progressCallback;
+
+/// 获取底层算法版本号
+- (NSInteger)version;
+
+@end
+
+NS_ASSUME_NONNULL_END
+
diff --git a/modules/plaud-sdk/ios/Frameworks/PlaudBleSDK.xcframework/ios-arm64/PlaudBleSDK.framework/Headers/PlaudBleSDK-Swift.h b/modules/plaud-sdk/ios/Frameworks/PlaudBleSDK.xcframework/ios-arm64/PlaudBleSDK.framework/Headers/PlaudBleSDK-Swift.h
new file mode 100644
index 0000000..4240849
--- /dev/null
+++ b/modules/plaud-sdk/ios/Frameworks/PlaudBleSDK.xcframework/ios-arm64/PlaudBleSDK.framework/Headers/PlaudBleSDK-Swift.h
@@ -0,0 +1,2538 @@
+#if 0
+#elif defined(__arm64__) && __arm64__
+// Generated by Apple Swift version 6.0.3 effective-5.10 (swiftlang-6.0.3.1.10 clang-1600.0.30.1)
+#ifndef PLAUDBLESDK_SWIFT_H
+#define PLAUDBLESDK_SWIFT_H
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wgcc-compat"
+
+#if !defined(__has_include)
+# define __has_include(x) 0
+#endif
+#if !defined(__has_attribute)
+# define __has_attribute(x) 0
+#endif
+#if !defined(__has_feature)
+# define __has_feature(x) 0
+#endif
+#if !defined(__has_warning)
+# define __has_warning(x) 0
+#endif
+
+#if __has_include()
+# include
+#endif
+
+#pragma clang diagnostic ignored "-Wauto-import"
+#if defined(__OBJC__)
+#include
+#endif
+#if defined(__cplusplus)
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#else
+#include
+#include
+#include
+#include
+#endif
+#if defined(__cplusplus)
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wnon-modular-include-in-framework-module"
+#if defined(__arm64e__) && __has_include()
+# include
+#else
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wreserved-macro-identifier"
+# ifndef __ptrauth_swift_value_witness_function_pointer
+# define __ptrauth_swift_value_witness_function_pointer(x)
+# endif
+# ifndef __ptrauth_swift_class_method_pointer
+# define __ptrauth_swift_class_method_pointer(x)
+# endif
+#pragma clang diagnostic pop
+#endif
+#pragma clang diagnostic pop
+#endif
+
+#if !defined(SWIFT_TYPEDEFS)
+# define SWIFT_TYPEDEFS 1
+# if __has_include()
+# include
+# elif !defined(__cplusplus)
+typedef uint_least16_t char16_t;
+typedef uint_least32_t char32_t;
+# endif
+typedef float swift_float2 __attribute__((__ext_vector_type__(2)));
+typedef float swift_float3 __attribute__((__ext_vector_type__(3)));
+typedef float swift_float4 __attribute__((__ext_vector_type__(4)));
+typedef double swift_double2 __attribute__((__ext_vector_type__(2)));
+typedef double swift_double3 __attribute__((__ext_vector_type__(3)));
+typedef double swift_double4 __attribute__((__ext_vector_type__(4)));
+typedef int swift_int2 __attribute__((__ext_vector_type__(2)));
+typedef int swift_int3 __attribute__((__ext_vector_type__(3)));
+typedef int swift_int4 __attribute__((__ext_vector_type__(4)));
+typedef unsigned int swift_uint2 __attribute__((__ext_vector_type__(2)));
+typedef unsigned int swift_uint3 __attribute__((__ext_vector_type__(3)));
+typedef unsigned int swift_uint4 __attribute__((__ext_vector_type__(4)));
+#endif
+
+#if !defined(SWIFT_PASTE)
+# define SWIFT_PASTE_HELPER(x, y) x##y
+# define SWIFT_PASTE(x, y) SWIFT_PASTE_HELPER(x, y)
+#endif
+#if !defined(SWIFT_METATYPE)
+# define SWIFT_METATYPE(X) Class
+#endif
+#if !defined(SWIFT_CLASS_PROPERTY)
+# if __has_feature(objc_class_property)
+# define SWIFT_CLASS_PROPERTY(...) __VA_ARGS__
+# else
+# define SWIFT_CLASS_PROPERTY(...)
+# endif
+#endif
+#if !defined(SWIFT_RUNTIME_NAME)
+# if __has_attribute(objc_runtime_name)
+# define SWIFT_RUNTIME_NAME(X) __attribute__((objc_runtime_name(X)))
+# else
+# define SWIFT_RUNTIME_NAME(X)
+# endif
+#endif
+#if !defined(SWIFT_COMPILE_NAME)
+# if __has_attribute(swift_name)
+# define SWIFT_COMPILE_NAME(X) __attribute__((swift_name(X)))
+# else
+# define SWIFT_COMPILE_NAME(X)
+# endif
+#endif
+#if !defined(SWIFT_METHOD_FAMILY)
+# if __has_attribute(objc_method_family)
+# define SWIFT_METHOD_FAMILY(X) __attribute__((objc_method_family(X)))
+# else
+# define SWIFT_METHOD_FAMILY(X)
+# endif
+#endif
+#if !defined(SWIFT_NOESCAPE)
+# if __has_attribute(noescape)
+# define SWIFT_NOESCAPE __attribute__((noescape))
+# else
+# define SWIFT_NOESCAPE
+# endif
+#endif
+#if !defined(SWIFT_RELEASES_ARGUMENT)
+# if __has_attribute(ns_consumed)
+# define SWIFT_RELEASES_ARGUMENT __attribute__((ns_consumed))
+# else
+# define SWIFT_RELEASES_ARGUMENT
+# endif
+#endif
+#if !defined(SWIFT_WARN_UNUSED_RESULT)
+# if __has_attribute(warn_unused_result)
+# define SWIFT_WARN_UNUSED_RESULT __attribute__((warn_unused_result))
+# else
+# define SWIFT_WARN_UNUSED_RESULT
+# endif
+#endif
+#if !defined(SWIFT_NORETURN)
+# if __has_attribute(noreturn)
+# define SWIFT_NORETURN __attribute__((noreturn))
+# else
+# define SWIFT_NORETURN
+# endif
+#endif
+#if !defined(SWIFT_CLASS_EXTRA)
+# define SWIFT_CLASS_EXTRA
+#endif
+#if !defined(SWIFT_PROTOCOL_EXTRA)
+# define SWIFT_PROTOCOL_EXTRA
+#endif
+#if !defined(SWIFT_ENUM_EXTRA)
+# define SWIFT_ENUM_EXTRA
+#endif
+#if !defined(SWIFT_CLASS)
+# if __has_attribute(objc_subclassing_restricted)
+# define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_CLASS_EXTRA
+# define SWIFT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA
+# else
+# define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA
+# define SWIFT_CLASS_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA
+# endif
+#endif
+#if !defined(SWIFT_RESILIENT_CLASS)
+# if __has_attribute(objc_class_stub)
+# define SWIFT_RESILIENT_CLASS(SWIFT_NAME) SWIFT_CLASS(SWIFT_NAME) __attribute__((objc_class_stub))
+# define SWIFT_RESILIENT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_class_stub)) SWIFT_CLASS_NAMED(SWIFT_NAME)
+# else
+# define SWIFT_RESILIENT_CLASS(SWIFT_NAME) SWIFT_CLASS(SWIFT_NAME)
+# define SWIFT_RESILIENT_CLASS_NAMED(SWIFT_NAME) SWIFT_CLASS_NAMED(SWIFT_NAME)
+# endif
+#endif
+#if !defined(SWIFT_PROTOCOL)
+# define SWIFT_PROTOCOL(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA
+# define SWIFT_PROTOCOL_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA
+#endif
+#if !defined(SWIFT_EXTENSION)
+# define SWIFT_EXTENSION(M) SWIFT_PASTE(M##_Swift_, __LINE__)
+#endif
+#if !defined(OBJC_DESIGNATED_INITIALIZER)
+# if __has_attribute(objc_designated_initializer)
+# define OBJC_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer))
+# else
+# define OBJC_DESIGNATED_INITIALIZER
+# endif
+#endif
+#if !defined(SWIFT_ENUM_ATTR)
+# if __has_attribute(enum_extensibility)
+# define SWIFT_ENUM_ATTR(_extensibility) __attribute__((enum_extensibility(_extensibility)))
+# else
+# define SWIFT_ENUM_ATTR(_extensibility)
+# endif
+#endif
+#if !defined(SWIFT_ENUM)
+# define SWIFT_ENUM(_type, _name, _extensibility) enum _name : _type _name; enum SWIFT_ENUM_ATTR(_extensibility) SWIFT_ENUM_EXTRA _name : _type
+# if __has_feature(generalized_swift_name)
+# define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME, _extensibility) enum _name : _type _name SWIFT_COMPILE_NAME(SWIFT_NAME); enum SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_ENUM_ATTR(_extensibility) SWIFT_ENUM_EXTRA _name : _type
+# else
+# define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME, _extensibility) SWIFT_ENUM(_type, _name, _extensibility)
+# endif
+#endif
+#if !defined(SWIFT_UNAVAILABLE)
+# define SWIFT_UNAVAILABLE __attribute__((unavailable))
+#endif
+#if !defined(SWIFT_UNAVAILABLE_MSG)
+# define SWIFT_UNAVAILABLE_MSG(msg) __attribute__((unavailable(msg)))
+#endif
+#if !defined(SWIFT_AVAILABILITY)
+# define SWIFT_AVAILABILITY(plat, ...) __attribute__((availability(plat, __VA_ARGS__)))
+#endif
+#if !defined(SWIFT_WEAK_IMPORT)
+# define SWIFT_WEAK_IMPORT __attribute__((weak_import))
+#endif
+#if !defined(SWIFT_DEPRECATED)
+# define SWIFT_DEPRECATED __attribute__((deprecated))
+#endif
+#if !defined(SWIFT_DEPRECATED_MSG)
+# define SWIFT_DEPRECATED_MSG(...) __attribute__((deprecated(__VA_ARGS__)))
+#endif
+#if !defined(SWIFT_DEPRECATED_OBJC)
+# if __has_feature(attribute_diagnose_if_objc)
+# define SWIFT_DEPRECATED_OBJC(Msg) __attribute__((diagnose_if(1, Msg, "warning")))
+# else
+# define SWIFT_DEPRECATED_OBJC(Msg) SWIFT_DEPRECATED_MSG(Msg)
+# endif
+#endif
+#if defined(__OBJC__)
+#if !defined(IBSegueAction)
+# define IBSegueAction
+#endif
+#endif
+#if !defined(SWIFT_EXTERN)
+# if defined(__cplusplus)
+# define SWIFT_EXTERN extern "C"
+# else
+# define SWIFT_EXTERN extern
+# endif
+#endif
+#if !defined(SWIFT_CALL)
+# define SWIFT_CALL __attribute__((swiftcall))
+#endif
+#if !defined(SWIFT_INDIRECT_RESULT)
+# define SWIFT_INDIRECT_RESULT __attribute__((swift_indirect_result))
+#endif
+#if !defined(SWIFT_CONTEXT)
+# define SWIFT_CONTEXT __attribute__((swift_context))
+#endif
+#if !defined(SWIFT_ERROR_RESULT)
+# define SWIFT_ERROR_RESULT __attribute__((swift_error_result))
+#endif
+#if defined(__cplusplus)
+# define SWIFT_NOEXCEPT noexcept
+#else
+# define SWIFT_NOEXCEPT
+#endif
+#if !defined(SWIFT_C_INLINE_THUNK)
+# if __has_attribute(always_inline)
+# if __has_attribute(nodebug)
+# define SWIFT_C_INLINE_THUNK inline __attribute__((always_inline)) __attribute__((nodebug))
+# else
+# define SWIFT_C_INLINE_THUNK inline __attribute__((always_inline))
+# endif
+# else
+# define SWIFT_C_INLINE_THUNK inline
+# endif
+#endif
+#if defined(_WIN32)
+#if !defined(SWIFT_IMPORT_STDLIB_SYMBOL)
+# define SWIFT_IMPORT_STDLIB_SYMBOL __declspec(dllimport)
+#endif
+#else
+#if !defined(SWIFT_IMPORT_STDLIB_SYMBOL)
+# define SWIFT_IMPORT_STDLIB_SYMBOL
+#endif
+#endif
+#if defined(__OBJC__)
+#if __has_feature(objc_modules)
+#if __has_warning("-Watimport-in-framework-header")
+#pragma clang diagnostic ignored "-Watimport-in-framework-header"
+#endif
+@import CoreBluetooth;
+@import CoreFoundation;
+@import Dispatch;
+@import Foundation;
+@import ObjectiveC;
+@import Security;
+#endif
+
+#endif
+#pragma clang diagnostic ignored "-Wproperty-attribute-mismatch"
+#pragma clang diagnostic ignored "-Wduplicate-method-arg"
+#if __has_warning("-Wpragma-clang-attribute")
+# pragma clang diagnostic ignored "-Wpragma-clang-attribute"
+#endif
+#pragma clang diagnostic ignored "-Wunknown-pragmas"
+#pragma clang diagnostic ignored "-Wnullability"
+#pragma clang diagnostic ignored "-Wdollar-in-identifier-extension"
+#pragma clang diagnostic ignored "-Wunsafe-buffer-usage"
+
+#if __has_attribute(external_source_symbol)
+# pragma push_macro("any")
+# undef any
+# pragma clang attribute push(__attribute__((external_source_symbol(language="Swift", defined_in="PlaudBleSDK",generated_declaration))), apply_to=any(function,enum,objc_interface,objc_category,objc_protocol))
+# pragma pop_macro("any")
+#endif
+
+#if defined(__OBJC__)
+@class BleDevice;
+@protocol BleAgentProtocol;
+@protocol GlassProtocol;
+@class NSString;
+@class NSData;
+@class NSNumber;
+@class UpdateInfo;
+
+/// 蓝牙传输控制类
+SWIFT_CLASS("_TtC11PlaudBleSDK8BleAgent")
+@interface BleAgent : NSObject
+/// 单例
+SWIFT_CLASS_PROPERTY(@property (nonatomic, class, readonly, strong) BleAgent * _Nonnull shared;)
++ (BleAgent * _Nonnull)shared SWIFT_WARN_UNUSED_RESULT;
+/// 封装的录音笔实体类
+@property (nonatomic, strong) BleDevice * _Nullable bleDevice;
+@property (nonatomic, weak) id _Nullable delegate;
+@property (nonatomic, weak) id _Nullable glassDelegate;
+/// 蓝牙是否可用
+@property (nonatomic, readonly) BOOL isPoweredOn;
+/// 是否已连接设备
+@property (nonatomic, readonly) BOOL isConnected;
+/// 是否已绑定设备
+@property (nonatomic, readonly) BOOL isBinded;
+/// 同步文件列表是否仅获取单个文件
+@property (nonatomic, readonly) BOOL isOnlyOne;
+/// 是否正在录音
+@property (nonatomic, readonly) BOOL isRecording;
+/// 是否需要解码数据流
+@property (nonatomic, readonly) BOOL needDecode;
+/// 实时录音的场景是不是音乐模式?
+@property (nonatomic, readonly) BOOL isMusic;
+/// 当前录音的场景
+@property (nonatomic, readonly) NSInteger scene;
+@property (nonatomic, readonly) NSInteger settingScene;
+/// 当前录音文件或同步(下载)文件的sessionId
+@property (nonatomic, readonly) NSInteger sessionId;
+/// 是否正在同步(下载)文件
+@property (nonatomic, readonly) BOOL isDownloading;
+/// 是否是切换WiFi导致的蓝牙断开
+@property (nonatomic, readonly) BOOL isWiFiOpen;
+/// 重复命令间隔,默认500ms
+/// getFileList、syncFile、deleteFile三个命令特殊处理,加入sessionId和start来判断是否是重复命令
+@property (nonatomic) NSInteger repeatCommondInterval;
+/// 命令回调线程,默认是主线程
+@property (nonatomic, strong) dispatch_queue_t _Nonnull cmdDelegateQueue;
+/// 8e0b1ef62e607u38ad8200163e02394b acb89eea1e6011e8ad8200163e02394b
+/// 是不是处于U盘模式?
+@property (nonatomic) BOOL isUsbState;
+@property (nonatomic) BOOL isCharging;
+@property (nonatomic, copy) NSDictionary * _Nonnull flutterMapData;
+/// 密文包
+@property (nonatomic, copy) NSArray * _Nonnull secretPackages;
+/// 密文包索引
+@property (nonatomic) NSInteger secretIndex;
+/// 密文包数量
+@property (nonatomic) NSInteger secretCount;
+/// 密钥
+@property (nonatomic, copy) NSData * _Nullable chacha20Key;
+/// 随机数
+@property (nonatomic, copy) NSData * _Nullable chacha20Nonce;
+/// 认证数据
+@property (nonatomic, copy) NSData * _Nullable chacha20AD;
+/// WiFi 加密是否使用 AES-GCM(通过 newFeature 协商)
+@property (nonatomic) BOOL wifiUseAes;
+/// 全局发送给设备的序号
+@property (nonatomic) NSInteger globalSendSeq;
+/// 全局发送给设备的序号
+@property (nonatomic) NSInteger globalReceiveSeq;
+@property (nonatomic, copy) NSString * _Nonnull versionType;
+@property (nonatomic) NSInteger versionCode;
+- (nonnull instancetype)init SWIFT_UNAVAILABLE;
++ (nonnull instancetype)new SWIFT_UNAVAILABLE_MSG("-init is unavailable");
+/// WiFi传输是否打开?没有WiFi模块的不用关心
+/// \param connected 是否连接上了
+///
+- (void)setWiFiState:(BOOL)connected;
+/// 用户认证初始化(必须调用)
+/// \param appKey 跟包名绑定的key
+///
+/// \param bindToken 用于绑定录音笔,应该是账号唯一,建议使用服务器发下的openid
+///
+/// \param hkServer 是否使用HK服务器
+/// @see 回调见 bleAppKeyState、
+///
+- (void)setUserIdentifier:(NSString * _Nonnull)appKey :(NSString * _Nonnull)bindToken :(BOOL)hkServer;
+/// 初始化蓝牙,使用蓝牙相关接口之前调用(必须调用)
+- (void)initBluetooth SWIFT_METHOD_FAMILY(none);
+/// 会先断开连接然后centralManager置nil
+- (void)disInitBluetooth;
+/// 校验AppKey,第一次校验需要使用网络
+/// 该方法建议在AppDelegate中调用,校验成功才能时候后续功能
+/// \param appKey 跟包名绑定的key
+/// @see bleAppKeyState
+/// @deprecated 该方法废弃,由 setUserIdentifier()方法代替
+/// @note Flutter 路径使用 setUserIdentifier() 初始化,此方法不会被调用。
+///
+- (void)checkAppKey:(NSString * _Nonnull)appKey;
+/// 设置绑定录音笔的token
+/// token应该是账号唯一的,不会失效,最好是由服务器统一生成
+/// \param token
+/// @deprecated 该方法废弃,由 setUserIdentifier()方法代替
+/// @note Flutter 路径使用 setUserIdentifier() 初始化,此方法不会被调用。
+///
+- (void)setBinding:(NSString * _Nonnull)token;
+/// 设置扫描时的过滤名称
+/// 该方法设置后仅过滤一个蓝牙名称
+/// 如果设为nil,将显示所有符合协议的录音笔
+/// \param name 蓝牙名称
+/// @see setFilter(_ names: [String])
+///
+- (void)setFilterWithName:(NSString * _Nullable)name;
+/// 同时过滤多个
+/// 如果数组为空,将显示所有符合协议的录音笔
+/// \param names 蓝牙名称
+/// @see setFilter(name: String)
+///
+- (void)setFilter:(NSArray * _Nonnull)names;
+/// 打开sdk的调试日志,或者回调日志
+- (void)openLog:(BOOL)opened logBlock:(void (^ _Nullable)(NSString * _Nonnull))logBlock wlogBlock:(void (^ _Nullable)(NSString * _Nonnull))wlogBlock;
+/// 是不是连接着某个设备
+/// 蓝牙开着、连接着、绑定着并且bleDevice不为nil
+///
+/// returns:
+/// true or false
+- (BOOL)isDeviceConnect SWIFT_WARN_UNUSED_RESULT;
+/// 开始扫描
+/// @see startLoopScan()
+/// @see stopScan()
+/// @see 回调bleScanResult
+- (void)startScan;
+/// 开始一个循环扫描
+/// 内部会启动一个timer,每12秒扫描一次,直到连接上录音笔;断开连接后会重启timer
+/// app应该在在扫描的回调中去连接已绑定的设备
+/// @see startScan()
+/// @see stopScan()
+/// @see 回调bleScanResult
+/// @deprecated 该方法废弃,不建议使用
+- (void)startLoopScan;
+/// 结束扫描
+/// @see startLoopScan()
+/// @see startScan()
+- (void)stopScan;
+/// 连接蓝牙设备
+/// 不再支持自动连接,设备的版本号是在扫描的时候获取的,自动连接无法更新版本号,在录音笔升级后会有问题
+/// @see startLoopScan
+/// \param bleDevice 封装的蓝牙设备
+///
+/// \param devToken 扫码绑定传过来的笔端token,utf-8转成data后长度是8,非扫码绑定是8个0 (捷通的,其他客户不要传)
+///
+/// \param userName 用户名(捷通的,其他客户不要传)
+/// @see 回调bleConnectState
+/// @see 回调bleBind
+///
+- (void)connectBleDeviceWithBleDevice:(BleDevice * _Nonnull)bleDevice :(NSString * _Nullable)devToken :(NSString * _Nullable)userName :(BOOL)isForceClear;
+/// 断开蓝牙连接
+- (void)disconnect;
+/// 录音笔是不是临时校验的?
+- (BOOL)isSNTempChecked SWIFT_WARN_UNUSED_RESULT;
+/// 如果之前没有校验成功SN,重复校验
+- (void)reCheckSNIfNeed;
+/// 主动读取电池电量
+/// 这个是读的标准电池电量服务,某些情况下会不准
+/// 协议5以后自动改为getChargingState
+/// @see getChargingState
+/// @see 回调blePowerChange
+/// @see 回调bleChargingState
+- (void)readPower;
+/// 获取电池电量状态
+/// 协议5以后改用这个方法读取电量,readPower也会在协议5以后走这里
+/// @see 回调blePowerChange
+/// @see 回调bleChargingState
+- (void)getChargingState;
+/// 读取录音笔状态,返回state和隐私状态
+/// @see 回调blePenState
+- (void)getState;
+/// 取消配对,解绑
+/// \param clear 是否同时清空录音笔
+///
+- (void)depairWithClear:(BOOL)clear;
+/// 读取录音笔剩余空间
+/// @see 回调bleStorage
+- (void)getStorage;
+/// 重置笔端密码,用于多按键带屏项目,例如纽曼P23H
+/// @see 回调blePasswordReset
+- (void)appResetPassword;
+/// 读取背光时长
+/// 用于带屏非多按键项目 例如P23R1。
+/// @see setBacklightDuration
+/// @see 回调bleBacklightDuration
+- (void)readBacklightDuration;
+/// 设置背光时长
+/// 用于带屏非多按键项目 例如P23R1。
+/// \param type 时长的枚举 0: 10秒 1:20秒 2: 30秒 4: 始终亮屏
+/// @see readBacklightDuration
+/// @see 回调bleBacklightDuration
+///
+- (void)setBacklightDurationWithType:(NSInteger)type;
+/// 读取背光对比度
+/// 用于带屏非多按键项目 例如P23R1。
+/// @see setBacklightBright
+/// @see 回调bleBacklightBright
+- (void)readBacklightBright;
+/// 设置背光对比度
+/// 用于带屏非多按键项目 例如P23R1。
+/// \param type 对比度的枚举 1-6
+/// @see readBacklightBright
+/// @see 回调bleBacklightBright
+///
+- (void)setBacklightBrightWithType:(NSInteger)type;
+/// 带屏项目获取录音笔当前语言
+/// @see setLanguage
+/// @see 回调bleLanguage
+- (void)readLanguage;
+/// 带屏项目设置录音笔语言
+/// \param type 语言类型 0 简体中文 1 繁体中文 2 英语
+/// @see readLanguage
+/// @see 回调bleLanguage
+///
+- (void)setLanguageWithType:(NSInteger)type;
+/// 设置录音场景
+/// \param value 0 Unknown; 1 Normal; 2 Interview; 3 Classroom(Speech); 4 Music; 5 Meeting; 6 Memo
+///
+- (void)setRecSceneWithValue:(NSInteger)value;
+/// 获取录音场景
+/// @see 回调bleRecScene
+- (void)readRecScene;
+/// 设置录音模式
+/// \param value 1 Normal (正常,非降噪); 2 NC (降噪)
+///
+- (void)setRecModeWithValue:(NSInteger)value;
+/// 获取录音模式
+/// @see bleRecMode
+- (void)readRecMode;
+/// 设置 VAD 敏感度
+/// \param value 0:Quality 1:Low bitrate 2:Normal 3:Aggressive
+///
+- (void)setVadSensitivityWithSensitivity:(NSInteger)sensitivity;
+/// 获取 VAD 敏感度
+/// @see bleVadSensitivity
+- (void)readVadSensitivity;
+/// 设置 VPU 敏感度
+/// \param sensitivity 0:Low 1:Medium 2:High
+///
+- (void)setVpuGainWithGain:(NSInteger)gain;
+/// 获取 VPU 敏感度
+/// @see bleVpuGain
+- (void)readVpuGain;
+/// 设置麦克风增益
+/// \param value 麦克风增益值,范围 0 - 30
+///
+- (void)setMicGainWithValue:(NSInteger)value;
+/// 获取 VPU 敏感度
+/// @see bleVpuGain
+- (void)readBatteryMode;
+/// 续航模式
+/// \param value 0:普通,1:长续航
+///
+- (void)setBatteryModeWithValue:(NSInteger)value;
+/// 获取麦克风增益
+/// @see bleMicGain
+- (void)readMicGain;
+/// 设置 switch 开关功能
+/// \param id:0 通话场景切换;1 录音功能; 2 关机功能
+///
+- (void)setSwitchHandlerWithId:(NSInteger)id;
+/// 获取 switch 开关功能
+/// @see bleSwitchHandler
+- (void)readSwitchHandler;
+/// 设置 自动关机
+/// \param value:0:关闭 1:立即关机 2:15分钟 3:30分钟 4:1个小时 5:5个小时
+///
+- (void)setAutoPowerOffWithValue:(NSInteger)value;
+/// 获取 switch 开关功能
+/// @see bleSwitchHandler
+- (void)readAutoPowerOff;
+/// 设置 是否保存 wav 文件
+/// \param value:0:关闭 1:开启
+///
+- (void)setRawWaveEnabledWithValue:(NSInteger)value;
+/// 获取 wav 文件开关功能
+/// @see bleRawWaveEnabled
+- (void)readRawWaveEnabled;
+/// 获取 充电器拔出后开始录音 开关
+/// @see bleRecordingAfterDisConnetEnabled
+- (void)readRecordingAfterDisConnetEnabled;
+/// 设置 充电器拔出后开始录音 开关
+/// \param value:0:关闭 1:开启
+///
+- (void)setRecordingAfterDisConnetEnabledWithValue:(NSInteger)value;
+/// 获取 闲时同步 开关
+/// @see bleSyncWhenIdleEnabled
+- (void)readSyncWhenIdleEnabled;
+/// 设置 闲时同步 开关
+/// \param value:0:关闭 1:开启
+///
+- (void)setSyncWhenIdleEnabledWithValue:(NSInteger)value;
+/// 设置 设备 findmy 状态
+/// \param value
+/// 0:未绑定状态 - 关闭广播
+/// 1:未绑定状态 - 开启广播
+/// 2:绑定状态 - 可被查找
+/// 3:绑定状态 - 不可被查找
+///
+- (void)setFindMyStateWithValue:(NSInteger)value;
+/// 获取 设备 findmy 状态
+/// @see bleFindMyState
+- (void)readFindMyState;
+/// 设置 VPU CLK 矫正
+/// \param value 0:关闭 1:开启
+/// @see 回调 bleSetVpuCLK
+///
+- (void)setVPUCLKWithValue:(NSInteger)value;
+/// 读取 VPU CLK 矫正
+/// @see 回调 bleVpuCLK
+- (void)readVPUCLK;
+/// 设置充电器插入后自动停止录音
+/// \param value 0:关闭 1:开启
+/// @see 回调 bleStopRecordingAfterCharging
+///
+- (void)setStopRecordingAfterChargingWithValue:(NSInteger)value;
+/// 读取充电器插入后自动停止录音
+/// @see 回调 bleStopRecordingAfterCharging
+- (void)readStopRecordingAfterCharging;
+/// 设置 ble 名称
+/// \param name:设备新名字
+///
+- (void)setBleNameWithName:(NSString * _Nonnull)name;
+/// 获取设备文件列表
+- (void)getDeviceLogListWithLogType:(NSInteger)logType;
+/// 开始获取设备文件
+- (void)startSyncDeviceLogFileWithLogType:(NSInteger)logType;
+/// 停止获取设备文件列表
+- (void)stopSyncDeviceLogFile;
+/// 删除设备文件
+- (void)deleteDeviceLogFileWithLogType:(NSInteger)logType;
+/// 获取 ble 名称
+/// @see bleName
+- (void)readBleName;
+/// app端请求开启或者关闭wifi
+/// \param open 开启还是关闭
+///
+- (void)operateWiFiWithOpen:(BOOL)open isOTA:(BOOL)isOTA;
+/// 获取记录报表
+/// \param uid 区分连续请求
+///
+- (void)readGlassDataWithUid:(NSInteger)uid;
+/// 清空记录报表
+- (void)clearGlassData;
+/// 获取笔端保存的自动删除录音的状态值
+/// @see saveAutoClear
+/// @see 回调bleAutoClear
+- (void)readAutoClear;
+/// 保存自动清除录音状态
+/// 注意:录音笔仅保存该状态,方便账号同步设置状态,同步文件完成后是否删除笔端录音依然是app控制
+/// \param status 0 关闭 1 打开
+/// @see readAutoClear
+/// @see 回调bleAutoClear
+///
+- (void)saveAutoClear:(BOOL)open;
+/// 开始录音(录音速记)
+/// 如果开始录音成功,需要自己去syncFile同步文件
+/// 可以通过通过同步文件的偏移量显示实时录音时长
+/// \param scene 录音场景 1:会议 2:课堂 3:采访 4:音乐 5:备忘
+/// @see 回调bleRecordStart
+///
+- (void)startRecord:(NSInteger)scene;
+/// 结束当前录音
+/// @see 回调bleRecordStop
+- (void)stopRecord;
+/// 暂停录音
+/// 如果当前录音处于暂停状态,估计版本7之前通过@see startRecord()恢复录音,之后通过resumeRecord()恢复
+/// 录音笔协议7开始需要传sessionId,早期版本忽略
+/// @see 回调bleRecordPause
+- (void)pauseRecord:(NSInteger)sessionId;
+/// 恢复录音
+/// 协议版本7开始支持
+/// @see 回调bleRecordResume
+- (void)resumeRecord:(NSInteger)sessionId;
+/// 获取录音笔灯状态
+/// @see setLedState
+/// @see 回调bleLedState
+- (void)getLedState;
+/// 设置录音笔灯状态
+/// \param onOff 0 正常;1 关闭
+/// @see getLedState
+/// @see 回调bleSetLedState
+///
+- (void)setLedStateOnOff:(NSInteger)onOff;
+/// 获取会话列表(获取某个sessionId之后的文件列表)
+/// 该命令在录音状态下不可用
+/// 该命令在U盘模式下不可用
+/// \param uid 用于区分不同的命令
+///
+/// \param sessionId 从哪个文件开始同步?0 表示同步所有
+///
+/// \param onlyOne 如果真,那么只查询此sessionId对应的文件(实时录音结束后获取实时录音文件长度),默认false
+/// @see 回调bleFileList
+///
+- (void)getFileListWithUid:(NSInteger)uid sessionId:(NSInteger)sessionId onlyOne:(BOOL)onlyOne;
+/// 同步(下载)文件
+/// \param sessionId 录音文件的唯一id
+///
+/// \param start 录音文件起始位置(字节)
+///
+/// \param end 同步到哪?一搬传0,表示同步到文件尾(字节)
+///
+/// \param decode 是否同时返回解码后的数据
+/// @see 回调bleSyncFileHead
+/// @see 回调bleSyncFileTail
+/// @see 回调bleData
+/// @see 回调bleDecodeFail
+/// @see 回调bleDataComplete
+/// @see 回调blePcmData
+///
+- (void)syncFileWithSessionId:(NSInteger)sessionId start:(NSInteger)start end:(NSInteger)end decode:(BOOL)decode;
+/// 结束文件同步(下载)
+/// @see 回调bleSyncFileStop
+- (void)stopSyncFile;
+/// 删除录音笔中的文件
+/// \param sessionId 录音文件唯一id
+/// @see 回调bleDeleteFile
+///
+- (void)deleteFileWithSessionId:(NSInteger)sessionId;
+/// 获取录音打点数据
+/// \param sessionId 会话id
+///
+- (void)getMarking:(NSInteger)sessionId;
+/// 获取录音打点数据(3.0新协议)
+/// \param uid 请求uid
+///
+/// \param startTimestamp 起始时间戳
+///
+/// \param endTimestamp 结束时间戳
+///
+- (void)getRecordMarkingTagsWithUid:(NSInteger)uid startTimestamp:(NSInteger)startTimestamp endTimestamp:(NSInteger)endTimestamp;
+/// 通知录音笔有版本升级
+/// \param uid 命令区分标识
+///
+/// \param fromVersion 现在的版本 T0012 或者 V0012 这样的格式
+///
+/// \param toVersion 目标版本 T0012 或者 V0012 这样的格式
+///
+/// \param thirdVersion G101项目,其他填0
+///
+/// \param fileSize 升级包大小(字节)
+///
+/// \param crc 校验码
+/// @see 回调bleFotaResult
+/// @see 回调bleFotaPackReq
+///
+- (void)pushFotaInfo:(NSInteger)uid :(NSString * _Nonnull)fromVersion :(NSString * _Nonnull)toVersion :(NSInteger)thirdVersion :(NSInteger)fileSize :(NSInteger)crc;
+/// 通知录音笔有版本升级
+/// 目标版本一定要大于原版本
+/// \param uid 命令区分标识
+///
+/// \param fromVersion 原版本
+///
+/// \param fromVersionType 原版本类型
+///
+/// \param toVersion 目标版本
+///
+/// \param toVersionType 目标版本类型
+///
+/// \param fileSize 升级包大小(字节)
+///
+/// \param crc 校验码
+/// @see 回调bleFotaResult
+/// @see 回调bleFotaPackReq
+///
+- (void)pushFotaInfo:(NSInteger)uid :(NSInteger)fromVersion :(NSString * _Nonnull)fromVersionType :(NSInteger)toVersion :(NSString * _Nonnull)toVersionType :(NSInteger)thirdVersion :(NSInteger)fileSize :(NSInteger)crc;
+/// 告知录音笔文件已发送完
+/// \param uid 标识,区分命令
+///
+/// \param status 0 正常结束,1 用户退出 0XFF 未知原因
+///
+- (void)pushFotaComplete:(NSInteger)uid :(NSInteger)status;
+/// 发送ota数据包
+/// 不能一个循环就全发了,每个包要等一段时间
+/// 不同的手机不同的蓝牙版本,等待时长不一样,这个要实际测
+/// 目前我的iphone6是等待
+/// \param offset 偏移量(字节)
+///
+/// \param packData 数据包,注意控制单个数据包大小,不要超过最大长度(不同型号这个值是不一样的,保守的话就80)
+///
+- (void)pushFotaPack:(NSInteger)offset packData:(NSData * _Nonnull)packData postDelayUs:(NSNumber * _Nullable)postDelayUs;
+/// 能不能往不稳定栈里面push数据?
+- (BOOL)canSendWithoutResponse SWIFT_WARN_UNUSED_RESULT SWIFT_AVAILABILITY(ios,introduced=11.0);
+/// 恢复出厂设置
+/// 没有回调
+- (void)restoreFactory;
+/// 隐私设置
+/// 开启时,禁止笔端播放,禁止U盘功能,禁止笔端解除绑定
+/// \param onOff 1 开启;0 关闭
+/// @see getState
+/// @see 回调blePrivacy
+///
+- (void)setPrivacyOnOff:(NSInteger)onOff;
+/// 清空笔端所有文件
+/// @see 回调bleClearAllFile
+- (void)clearAllFile;
+/// 设备 休眠和唤醒
+/// \param onOff 1 唤醒;0 休眠
+///
+- (void)setDeviceActiveWithStatus:(NSInteger)status;
+/// 心跳
+/// \param status 0 ping, 1 pong
+///
+- (void)setHeartBeatWithStatus:(NSInteger)status;
+/// WiFi配网
+/// \param ssid WiFi名称
+///
+/// \param password 密码
+///
+/// \param isTest 是否使用测试环境
+///
+- (void)setWiFiSsidWithSsid:(NSString * _Nonnull)ssid password:(NSString * _Nonnull)password isTest:(BOOL)isTest;
+/// App请求盒子端当前的配网状态
+- (void)getWiFiSsid;
+/// 获取固件升级信息
+/// \param callback errcode == 0 表示Http成功返回
+///
+- (void)getUpdateInfo:(void (^ _Nonnull)(NSInteger, UpdateInfo * _Nullable))callback;
+/// 设置服务器配置
+/// \param type 1 服务器url 2 服务器token 2 设备端token
+///
+/// \param content url最大63字节;serToken最大16字节;devToken最大16字节
+///
+- (void)setWebsocketProfileWithType:(NSInteger)type content:(NSString * _Nonnull)content;
+/// 获取服务器配置
+- (void)getWebsocketProfileWithType:(NSInteger)type;
+/// 服务器测试
+- (void)testWebsocket;
+/// 设置定时录音
+/// \param start 定时闹钟开始时间(UTC);0 表示关闭定时闹钟
+///
+/// \param duration 持续时长(单位s)
+///
+/// \param repeatMode 0 once仅一次; 1 daily每天定时; 2 weekly每周定时
+///
+- (void)setAlarmRecWithStart:(NSInteger)start duration:(NSInteger)duration repeatMode:(NSInteger)repeatMode;
+/// 获取定时录音
+- (void)getAlarmRec;
+/// 发送bin文件信息
+/// \param type 文件类型
+///
+/// \param totalSize 文件总大小
+///
+- (void)sendBinFileInfoWithType:(NSInteger)type totalSize:(NSInteger)totalSize;
+/// 发送bin文件数据
+/// \param type 文件类型
+///
+/// \param packageOffset 包偏移量
+///
+/// \param packageSize 包大小
+///
+/// \param data 包数据
+///
+- (void)sendBinFileDataWithType:(NSInteger)type packageOffset:(NSInteger)packageOffset packageSize:(NSInteger)packageSize data:(NSData * _Nonnull)data;
+/// 发送bin文件校验和结果
+/// \param type 文件类型
+///
+/// \param crc 校验和
+///
+- (void)sendBinFileCheckSumResultWithType:(NSInteger)type crc:(NSInteger)crc;
+/// 获取闲时同步 Wi-Fi 配置
+/// \param wifiIndex Wi-Fi 编号 (4 bytes)
+///
+- (void)getSyncInIdleWifiConfigWithWifiIndex:(uint32_t)wifiIndex;
+/// 设置闲时同步 Wi-Fi 配置
+/// \param operation 操作类型 1: 添加, 2: 变更)
+///
+/// \param wifiIndex Wi-Fi 编号 (4 bytes)
+///
+/// \param ssid Wi-Fi SSID
+///
+/// \param password Wi-Fi 密码
+///
+- (void)setSyncInIdleWifiConfigWithOperation:(NSInteger)operation wifiIndex:(uint32_t)wifiIndex ssid:(NSString * _Nonnull)ssid password:(NSString * _Nonnull)password;
+/// 删除闲时同步 Wi-Fi 配置
+/// \param wifiIndices 要删除的 Wi-Fi 编号数组 (每个编号为 4 bytes)
+///
+- (void)deleteSyncInIdleWifiConfigWithWifiIndices:(NSArray * _Nonnull)wifiIndices;
+/// 重置 findmy 状态
+- (void)resetFindmy;
+/// 获取闲时同步 Wi-Fi 列表
+- (void)getSyncInIdleWifiList;
+/// 发起闲时同步 Wi-Fi 测试
+/// \param wifiIndex Wi-Fi 编号 (4 bytes)
+///
+- (void)setSyncInIdleWifiTestWithWifiIndex:(uint32_t)wifiIndex;
+/// 获取闲时同步 Wi-Fi 测试结果
+/// \param wifiIndex Wi-Fi 编号 (4 bytes)
+///
+- (void)getSyncInIdleWifiTestResultWithWifiIndex:(uint32_t)wifiIndex;
+/// 设置声加 license key
+/// \param licenseKey license key 字符串 (如果转换后少于 64 字节,将用 0 补足)
+///
+- (void)setSoundPlusTokenWithLicenseKey:(NSString * _Nonnull)licenseKey;
+/// 通用参数设置
+/// \param dataType 字符串类型(1: WiFi上云域名/ip, 2: findmy PPID)
+///
+/// \param value 字符串内容(UTF-8)
+///
+- (void)setCommonParamsWithDataType:(NSInteger)dataType value:(NSString * _Nonnull)value;
+/// 通用参数读取
+/// \param dataType 字符串类型(1: WiFi上云域名/ip, 2: findmy PPID)
+///
+- (void)getCommonParamsWithDataType:(NSInteger)dataType;
+/// 获取设备 SDFLASH CID
+- (void)getSDFLASHCID;
+/// 返回设备的NewFeature
+- (void)getNewFeature:(NSData * _Nonnull)data;
+/// 获取设备状态
+- (void)getDeviceStatus;
+@end
+
+
+
+/// pcm流式解码协议
+SWIFT_PROTOCOL("_TtP11PlaudBleSDK20JXPcmProcessDelegate_")
+@protocol JXPcmProcessDelegate
+/// 回调pcm数据
+/// \param sessionId 录音id
+///
+/// \param millSec 当前数据毫秒值(起始时刻毫秒值)
+///
+/// \param pcmData 纯音频已解码数据,长度是20ms
+///
+- (void)onPcmData:(NSInteger)sessionId :(NSInteger)millSec :(NSData * _Nonnull)pcmData;
+- (void)onDecodeErr:(NSInteger)millSec;
+@end
+
+
+@interface BleAgent (SWIFT_EXTENSION(PlaudBleSDK))
+- (void)onPcmData:(NSInteger)sessionId :(NSInteger)millSec :(NSData * _Nonnull)pcmData;
+- (void)onDecodeErr:(NSInteger)millSec;
+@end
+
+
+@class CBCentralManager;
+@class CBPeripheral;
+
+@interface BleAgent (SWIFT_EXTENSION(PlaudBleSDK))
+/// 判断手机蓝牙状态
+/// mark - sdk实现系统回调,app不要调用
+- (void)centralManagerDidUpdateState:(CBCentralManager * _Nonnull)central;
+/// 扫描到外围设备后去连接
+/// mark - sdk实现系统回调,app不要调用
+- (void)centralManager:(CBCentralManager * _Nonnull)central didDiscoverPeripheral:(CBPeripheral * _Nonnull)peripheral advertisementData:(NSDictionary * _Nonnull)advertisementData RSSI:(NSNumber * _Nonnull)RSSI;
+/// 连接成功
+/// mark - sdk实现系统回调,app不要调用
+- (void)centralManager:(CBCentralManager * _Nonnull)central didConnectPeripheral:(CBPeripheral * _Nonnull)peripheral;
+/// 连接失败
+/// mark - sdk实现系统回调,app不要调用
+- (void)centralManager:(CBCentralManager * _Nonnull)central didFailToConnectPeripheral:(CBPeripheral * _Nonnull)peripheral error:(NSError * _Nullable)error;
+/// 断开连接,尝试重连
+/// mark - sdk实现系统回调,app不要调用
+- (void)centralManager:(CBCentralManager * _Nonnull)central didDisconnectPeripheral:(CBPeripheral * _Nonnull)peripheral error:(NSError * _Nullable)error;
+@end
+
+
+@class NSURLSession;
+@class NSURLAuthenticationChallenge;
+@class NSURLCredential;
+
+@interface BleAgent (SWIFT_EXTENSION(PlaudBleSDK))
+- (void)URLSession:(NSURLSession * _Nonnull)session didReceiveChallenge:(NSURLAuthenticationChallenge * _Nonnull)challenge completionHandler:(void (^ _Nonnull)(NSURLSessionAuthChallengeDisposition, NSURLCredential * _Nullable))completionHandler;
+@end
+
+
+
+
+@interface BleAgent (SWIFT_EXTENSION(PlaudBleSDK))
+/// 授权是否成功
+- (BOOL)isAuthOk SWIFT_WARN_UNUSED_RESULT;
+/// 双声道转单声道
+/// \param pcmData 一个数据包,大小应该是1280
+///
+- (NSData * _Nonnull)toSingleChannel:(NSData * _Nonnull)pcmData SWIFT_WARN_UNUSED_RESULT;
+@end
+
+@class BleFile;
+@class BleRecordMarkingTag;
+
+/// 代理
+SWIFT_PROTOCOL("_TtP11PlaudBleSDK16BleAgentProtocol_")
+@protocol BleAgentProtocol
+/// 升级时电量不足(
+/// 在pushFotaInfo的时候检查(电量在40以下不允许升级)
+- (void)bleUpdatePowerLowErr;
+/// 未连接设备
+/// 发送命令前都会检查是不是正常连着设备
+- (void)bleDeviceDisconnectErr;
+/// 当录音笔处于U盘模式,调用getFileList/startRecord/syncFile/deleteFile/pushFotaInfo等方法时回调此异常
+/// 录音笔初次连接,需要app调用getState获取录音笔状态
+/// \param funcName U盘模式下不支持的方法名
+///
+- (void)bleUDiskErrWithFuncName:(NSString * _Nonnull)funcName;
+/// appKey校验结果
+/// \param result 校验结果 0 临时 1 成功 2 失败
+///
+- (void)bleAppKeyStateWithResult:(NSInteger)result;
+/// 蓝牙状态回调
+/// \param powered 是否可用?
+///
+- (void)bleStateWithPowered:(BOOL)powered;
+@optional
+/// 蓝牙连接阶段回调
+/// \param sn 序列号(Serial Number),当前连接设备的唯一标识
+///
+/// \param stage 当前连接阶段,对应 ConnectStage 枚举的取值
+///
+/// \param detail 关于当前连接阶段的可选补充说明信息
+///
+- (void)bleConnectStageWithSn:(NSString * _Nullable)sn stage:(NSString * _Nonnull)stage detail:(NSString * _Nullable)detail;
+@required
+/// 蓝牙连接状态
+///
+/// -
+/// Parameters state: 0 断开连接或者未连接;1 连接成功;2 连接失败
+///
+///
+- (void)bleConnectStateWithState:(NSInteger)state;
+/// 扫描蓝牙设备回调
+/// \param bleDevices 蓝牙设备列表
+///
+- (void)bleScanResultWithBleDevices:(NSArray * _Nonnull)bleDevices;
+/// 扫描超时结束
+/// @see startScan
+- (void)bleScanOverTime;
+/// 等待用户确认
+/// \param timeout 超时时长,单位秒
+///
+- (void)bleHandshakeWaitWithTimeout:(NSInteger)timeout;
+/// 连接的回调
+/// \param status 状态,0:成功,>0:拒绝 1:Token不匹配 2: 带屏的项目,正在录音,用户暂时无法确认 3:带屏的项目,用户手动拒绝 255:录音笔不在连接模式,非连接模式下拒绝握手请求(黑黎三段式开关特有) <0 校验失败 -1: 没有SSN -2:网络异常 -3 : 服务器数据异常或校验不正确
+///
+/// \param protVersion 协议版本号
+///
+/// \param timezone 笔端当前时区
+///
+- (void)bleBindWithSn:(NSString * _Nullable)sn status:(NSInteger)status protVersion:(NSInteger)protVersion timezone:(NSInteger)timezone;
+/// 设备名称
+/// \param name 设备名称
+///
+- (void)bleDeviceNameWithName:(NSString * _Nullable)name;
+/// 心跳消息
+/// \param status 0 ping,1 pong,
+///
+- (void)bleHeartbeatWithStatus:(NSInteger)status;
+/// 电池电量改变
+/// \param power 现在的电量
+///
+/// \param oldPower 之前的电量(用于判断从20%->19%以及10%->9%低电提醒)
+///
+- (void)blePowerChangeWithPower:(NSInteger)power oldPower:(NSInteger)oldPower;
+/// 电池电量状态
+/// \param isCharging 是否插入充电器 0 未插入 1 插入 (BleDevice中有一个isCharging,会在该回调之后设置,可以比较前值,判断充电状态的改变)
+///
+/// \param level 电量 0-100
+///
+- (void)bleChargingStateWithIsCharging:(BOOL)isCharging level:(NSInteger)level;
+/// 返回状态
+/// \param state 根据项目自定义 (4099(0x00001003) 表示录音笔正在录音, 1好像是录音中)
+///
+/// \param privacy 隐私设置状态
+///
+/// \param keySatte 拨动开光状态(协议版本4新增)
+///
+/// \param uDisk U盘是否启用
+/// 另外两个参数直接放在BleAgent中
+///
+/// \param scene 当前录音场景(没在录音是0)
+///
+/// \param findMyToken findmy token 是否存在(NotePin 设备)
+///
+/// \param hasSndpKey 声加 license token 是否存在
+///
+/// \param deviceAccessToken 设备闲时同步的 AccessToken 是否存在
+///
+/// \param sessionId 当前会话id(没在录音时为0)
+///
+- (void)blePenStateWithState:(NSInteger)state privacy:(NSInteger)privacy keyState:(NSInteger)keyState uDisk:(NSInteger)uDisk findMyToken:(NSInteger)findMyToken hasSndpKey:(NSInteger)hasSndpKey deviceAccessToken:(NSInteger)deviceAccessToken versionType:(NSString * _Nonnull)versionType versionCode:(NSInteger)versionCode;
+/// 同步时间的回调
+/// \param stamp GMT时间戳
+///
+/// \param timezone 时区
+///
+/// \param zoneMin 时区分钟部分
+/// 数据会保存在device实体类中,用于通过sessionId转换为时间戳
+///
+- (void)blePenTimeWithStamp:(NSInteger)stamp timezone:(NSInteger)timezone zoneMin:(NSInteger)zoneMin;
+/// 录音笔空间
+/// \param total 空间总大小(字节)
+///
+/// \param free 剩余空间大小(字节)
+///
+/// \param duration 录音笔估算的剩余录音时长(毫秒)
+///
+- (void)bleStorageWithTotal:(NSInteger)total free:(NSInteger)free duration:(NSInteger)duration;
+/// 重置密码
+/// \param password 重置后的初始密码
+///
+- (void)blePasswordResetWithPassword:(NSInteger)password;
+/// 读取获取设置背光时长的回调
+/// \param duration 时长的枚举 0: 10秒 1:20秒 2: 30秒 4: 始终亮屏
+///
+- (void)bleBacklightDuration:(NSInteger)duration;
+/// 读取或设置背光对比度(亮度)的回调
+/// \param bright 亮度的等级 1-6
+///
+- (void)bleBacklightBright:(NSInteger)bright;
+/// 语言
+/// \param type 0 简体中文 1 繁体中文 2 英语
+///
+- (void)bleLanguage:(NSInteger)type;
+/// 录音场景
+/// \param scene 0 Unknown; 1 Normal; 2 Interview; 3 Classroom(Speech); 4 Music; 5 Meeting; 6 Memo
+///
+- (void)bleRecScene:(NSInteger)scene;
+/// 录音模式
+/// \param mode 1 Normal (正常,非降噪); 2 NC (降噪)
+///
+- (void)bleRecMode:(NSInteger)mode;
+/// vad 灵敏度
+/// \param value 1:Quality; 2:Normal; 3:Aggressive
+///
+- (void)bleVadSensitivity:(NSInteger)value;
+/// 电池模式
+/// \param value 0:默认,1:长续航
+///
+- (void)bleBatteryMode:(NSInteger)value;
+/// vpu 灵敏度
+/// \param value 1:Low; 2:Medium; 3:High
+///
+- (void)bleVpuGain:(NSInteger)value;
+/// vpu 灵敏度
+/// \param value 1- 30
+///
+- (void)bleMicGain:(NSInteger)value;
+/// SWITCH开关功能
+/// \param id 0:通话场景切换 1:录音功能 2:关机功能
+///
+- (void)bleSwitchHandler:(NSInteger)id;
+/// 定时关机功能
+/// \param value 0:关闭 1:立即关机 2:15分钟 3:30分钟 4:1个小时 5:5个小时
+///
+- (void)bleAutoPowerOff:(NSInteger)value;
+/// 设备存储 raw wav 文件
+/// \param value 0:关闭 1:开启
+///
+- (void)bleRawWaveEnabled:(NSInteger)value;
+/// 充电器拔出后开始录音
+/// \param value 0:关闭 1:开启
+///
+- (void)bleRecordingAfterDisConnetEnabled:(NSInteger)value;
+/// 闲时同步
+/// \param value 0:关闭 1:开启
+///
+- (void)bleSyncWhenIdleEnabled:(NSInteger)value;
+/// findmy 状态
+/// \param value
+/// 0:未绑定状态 - 关闭广播
+/// 1:未绑定状态 - 开启广播
+/// 2:绑定状态 - 可被查找
+/// 3:绑定状态 - 不可被查找
+///
+- (void)bleFindMyState:(NSInteger)value;
+/// \param value
+/// 0:关闭
+/// 1:开启
+///
+- (void)bleVPUCLKState:(NSInteger)value;
+/// \param value
+/// 0:关闭
+/// 1:开启
+///
+- (void)bleStopRecordingAfterCharging:(NSInteger)value;
+/// 自动清除录音状态
+/// 注意:录音笔仅保存状态,是否在同步完录音后删除录音,app自行决定
+/// \param open 是否开启
+///
+- (void)bleAutoClear:(BOOL)open;
+/// vad开关状态
+/// \param open 是否开启
+///
+- (void)bleVad:(BOOL)open;
+/// 解绑
+/// \param status 0 成功 ;1 正在工作 2 正在升级
+///
+- (void)bleDepair:(NSInteger)status;
+/// WiFi开启通知
+/// \param status 0 正常,>1 禁止开启 1 录音状态,2 U盘状态
+///
+/// \param wifiName 录音笔热点名称
+///
+/// \param wholeName 判断是否要追加4位sn后的名称
+///
+/// \param wifiPass 录音笔热点密码
+///
+- (void)bleWiFiOpen:(NSInteger)status :(NSString * _Nonnull)wifiName :(NSString * _Nonnull)wholeName :(NSString * _Nonnull)wifiPass;
+/// WiFi关闭通知
+/// \param status 0 成功 1 wifi没有开启
+///
+- (void)bleWiFiClose:(NSInteger)status;
+/// WiFi配网结果
+/// \param status 0 成功; 1 参数长度不对
+///
+- (void)bleSetWiFiSsidWithStatus:(NSInteger)status;
+/// WiFi配网查询结果
+/// \param status 0 连接中
+///
+/// \param ssid wifi
+///
+- (void)bleGetWiFiSsidWithStatus:(NSInteger)status ssid:(NSString * _Nullable)ssid;
+/// 录音声音异常提醒
+/// \param status 0 正常 1 敲击/声音截幅 2 声音过大 3 声音太小 4 噪音太大
+///
+- (void)bleVoiceAbnormalWithStatus:(NSInteger)status;
+/// 设置或者获取服务器配置
+/// \param type 1 服务器url 2 服务器token 3 设备端token
+///
+/// \param conent url / serToken / devToken
+///
+- (void)bleWebsocketProfile:(NSInteger)type :(NSString * _Nullable)conent;
+/// 服务器测试
+/// \param status 0 成功;1 未扫描到AP 2 AP密码错误 3 websocket连接失败
+///
+- (void)bleWebsocketTest:(NSInteger)status;
+/// 开始录音的回调
+/// \param sessionId 录音文件唯一id,0时区时间戳,换成手机当前时间戳需要减掉时区
+///
+/// \param start 已录音时长(文件偏移量,字节)(如果之前不在录音,返回0;如果之前在录音,返回已录音的时长)
+///
+/// \param status 0:成功,>0:失败 1:空间已满;2:U盘模式;3:硬件异常;4:当前正忙; 255:模式不对(录音笔不在录音模式,黑黎三段式开关特有)
+///
+/// \param scene 录音模式(依项目、版本号而定)
+///
+/// \param startTime 开始时间(依项目、版本号而定)
+///
+- (void)bleRecordStartWithSessionId:(NSInteger)sessionId start:(NSInteger)start status:(NSInteger)status scene:(NSInteger)scene startTime:(NSInteger)startTime;
+/// 结束录音的回调
+/// \param sessionId 录音文件唯一id,0时区时间戳,换成手机当前时间戳需要减掉时区
+///
+/// \param reason 原因(其余未定义)
+/// 1.MMI_REC_STOP_FROM_DEV /// 设备端停止录音
+/// 2.MMI_REC_STOP_FROM_APP /// APP端停止录音
+/// 3.MMI_REC_STOP_BY_SPLIT /// 自动时间切片停止录音
+/// 4.MMI_REC_STOP_BY_SWITCH /// switch开关切换停止录音 )
+///
+/// \param fileExist 文件是否保存
+///
+/// \param fileSize 文件大小(如果有的话,字节)
+///
+- (void)bleRecordStopWithSessionId:(NSInteger)sessionId reason:(NSInteger)reason fileExist:(BOOL)fileExist fileSize:(NSInteger)fileSize;
+/// 录音暂停的回调
+/// \param sessionId 录音文件唯一id,0时区时间戳,换成手机当前时间戳需要减掉时区
+///
+/// \param reason 原因(目前未定义)
+///
+/// \param fileExist 文件是否保存
+///
+/// \param fileSize 文件大小(如果有的话,字节)
+///
+- (void)bleRecordPauseWithSessionId:(NSInteger)sessionId reason:(NSInteger)reason fileExist:(BOOL)fileExist fileSize:(NSInteger)fileSize;
+/// 录音恢复(固件版本7开始)
+/// \param sessionId 录音文件唯一id,0时区时间戳,换成手机当前时间戳需要减掉时区
+///
+/// \param start 已录音时长(文件偏移量,字节)(如果之前不在录音,返回0;如果之前在录音,返回已录音的时长)
+///
+/// \param status 0:成功,>0:失败 1:空间已满;2:U盘模式;3:硬件异常
+///
+/// \param scene 录音模式(依项目、版本号而定)
+///
+/// \param startTime 开始时间(依项目、版本号而定)
+///
+- (void)bleRecordResumeWithSessionId:(NSInteger)sessionId start:(NSInteger)start status:(NSInteger)status scene:(NSInteger)scene startTime:(NSInteger)startTime;
+/// 获取录音灯效
+- (void)bleLedStateOnOff:(NSInteger)onOff;
+/// 设置录音灯效
+- (void)bleSetLedStateOnOff:(NSInteger)onOff;
+/// 获取文件列表的回调
+/// \param bleFiles 文件列表
+///
+- (void)bleFileListWithBleFiles:(NSArray * _Nonnull)bleFiles;
+/// 同步(下载)文件开始的回调
+/// \param sessionId 文件唯一id
+///
+/// \param status 状态,0:成功;>0:失败 1:文件系统当前不可用 2:文件不存在 3: 被打断
+///
+- (void)bleSyncFileHeadWithSessionId:(NSInteger)sessionId status:(NSInteger)status;
+/// 同步(下载)文件结束
+/// \param sessionId 文件唯一id
+///
+/// \param crc 文件校验码,校验文件完整性(录音笔改为egg保存文件后不要用)
+///
+- (void)bleSyncFileTailWithSessionId:(NSInteger)sessionId crc:(NSInteger)crc;
+/// 返回录音打点数据
+/// \param sessionId 会话id
+///
+/// \param status 状态 0 正常 1 当前文件系统不可用
+///
+/// \param markList 打点数据
+///
+- (void)bleMarkingWithSessionId:(NSInteger)sessionId status:(NSInteger)status markList:(NSArray * _Nonnull)markList;
+/// 返回录音打点数据(3.0新协议)
+/// \param uid 请求uid
+///
+/// \param totals 总条数
+///
+/// \param index 当前包索引
+///
+/// \param tags 打点数据列表,包含时间戳、类型、状态和保留字段
+///
+- (void)bleGetRecordMarkingTagsWithUid:(NSInteger)uid totals:(NSInteger)totals index:(NSInteger)index tags:(NSArray * _Nonnull)tags;
+/// 角度上报
+/// \param pitchAngle 俯仰角 -180~180
+///
+/// \param rollbackAngle 回滚角 -180~180
+///
+/// \param yawAngle 偏航角 -180~180
+///
+- (void)bleAnglesWithPitchAngle:(float)pitchAngle rollbackAngle:(float)rollbackAngle yawAngle:(float)yawAngle;
+/// 数据接收完了
+- (void)bleDataComplete;
+/// 语音数据返回
+/// \param sessionId 文件的id,协议7支持
+///
+/// \param start 数据在未解码文件中的偏移量(字节)
+///
+/// \param data 数据(可能是ogg数据也可能是opus纯音频,由固件决定)
+///
+- (void)bleDataWithSessionId:(NSInteger)sessionId start:(NSInteger)start data:(NSData * _Nonnull)data;
+/// log文件数据下载
+/// \param start 当前数据包偏移量
+///
+/// \param data 数据包
+///
+- (void)deviceLogDataWithStart:(NSInteger)start data:(NSData * _Nonnull)data logType:(NSInteger)logType;
+/// 返回解码后的pcm数据
+/// \param sessionId 文件的id,协议7支持
+///
+/// \param millsec 当前语言毫秒值
+///
+/// \param pcmData 解码后的数据,如果开始录音的时候没有要求解码,不会回调;如果录音是双声道,这里会处理为单声道;音乐模式是双声道48k采样率,会处理成单声道48k,不可用于识别
+///
+/// \param isMusic 是不是音乐模式?音乐模式返回的pcm不是正常的pcm,是6个short取一个,用于生成声波,不能用于识别
+///
+- (void)blePcmDataWithSessionId:(NSInteger)sessionId millsec:(NSInteger)millsec pcmData:(NSData * _Nonnull)pcmData isMusic:(BOOL)isMusic;
+/// 语音数据解码失败
+/// \param start 数据在未解码文件中的偏移量
+///
+- (void)bleDecodeFailWithStart:(NSInteger)start;
+/// 同步文件终止
+- (void)bleSyncFileStop;
+/// 删除文件
+/// \param sessionId 协议版本7支持
+///
+/// \param status 状态,0:删除成功;1:正在录音不允许删除 2: 已收藏不允许删除; 3: 正在播放不允许删除
+///
+- (void)bleDeleteFileWithSessionId:(NSInteger)sessionId status:(NSInteger)status;
+/// ota通知
+/// \param uid 标识
+///
+/// \param status 状态 0 正常,1. 升级失败 2. 版本信息不匹配 3.FLASH写失败 4.文件太大 5.尝试次数过多 6. U盘模式;7.正在录音; 8. U盘剩余空间不足; 9. 正在工作中; 10. G101眼镜仅在充电模式允许升级;11. G101眼镜电池电量不足;12. G101眼镜收到升级协议并准备调整到OTA_MODE; 255:模式不对(录音笔不在录音模式,黑黎三段式开关特有)
+///
+/// \param errmsg 协议版本4,如果升级成功,这里返回升级后的版本;如果失败,依然返回错误信息。
+///
+- (void)bleFotaResultWithUid:(NSInteger)uid status:(NSInteger)status errmsg:(NSString * _Nullable)errmsg;
+/// ota包请求,录音笔请求发送升级包数据
+/// \param uid 标识
+///
+/// \param start 开始位置(字节)
+///
+/// \param end 结束位置(字节)
+///
+- (void)bleFotaPackReqWithUid:(NSInteger)uid start:(NSInteger)start end:(NSInteger)end;
+/// ota包接收完成
+/// \param uid 标识
+///
+/// \param status 状态 0 正常,1. 升级失败 2. 版本信息不匹配 3.FLASH写失败 4.文件太大 5尝试次数过多 6. U盘模式;7.正在录音; 8. U盘剩余空间不足
+///
+/// \param errmsg 协议版本4,如果升级成功,这里返回升级后的版本;如果失败,依然返回错误信息。
+///
+- (void)bleFotaPackFinWithUid:(NSInteger)uid status:(NSInteger)status errmsg:(NSString * _Nullable)errmsg;
+/// ota数据发送失败
+- (void)bleOtaDataSendFail;
+/// 蓝牙传输速率的回调
+/// \param lossRate 丢包率
+///
+/// \param rate 平均速率,字节/S
+///
+/// \param instantRate 实时速率
+///
+- (void)bleRateWithLossRate:(double)lossRate rate:(NSInteger)rate instantRate:(NSInteger)instantRate;
+/// 隐私设置
+/// 开启时,禁止笔端播放,禁止U盘功能,禁止笔端解除绑定
+- (void)blePrivacyWithPrivacy:(NSInteger)privacy;
+/// 清空笔端所有文件
+/// 0:删除成功;1:正在录音文件不允许删除;2:已收藏不允许删除; 3:正在播放文件不允许删除;4:U盘模式
+- (void)bleClearAllFileWithStatus:(NSInteger)status;
+/// 设备状态读取
+/// status[4]:4字节状态数组,包含设备状态位信息
+/// 原始数据格式:32位状态值,每个位代表一个状态
+/// 已知状态位定义:
+/// bit0: BLE文件传输, bit1: WiFi快传, bit2: WiFi测试中, bit3: 有线传输中
+/// bit4: U盘模式中, bit5: wifi上云中, bit6: pan上云中, bit7: BLEota下载中
+/// bit8: WiFiota下载中, bit9: OTA升级中
+/// 注意:返回原始数据,应用层可自行解析,支持设备后续新增状态位
+- (void)bleDeviceStatusWithStatus:(NSArray * _Nonnull)status;
+/// 设备支持的feature功能
+- (void)bleNewFeatureWithData:(NSData * _Nonnull)data;
+/// 定时录音
+/// \param start 开始时间(UTC); 0 表示关闭定时录音
+///
+/// \param duration 录音时长(单位s)
+///
+/// \param repeatMode 0 once仅一次有效; 1 daily每天; 2 weekly每周
+///
+- (void)bleAlarmRecWithStart:(NSInteger)start duration:(NSInteger)duration repeatMode:(NSInteger)repeatMode;
+/// 唤醒、休眠设置
+/// 0:休眠;1:唤醒
+- (void)bleSetActiveWithStatus:(NSInteger)status;
+/// binaryFile基础信息同步 - FindMy Token
+/// \param type 文件扩展类型(长度 1 byte)
+///
+/// \param packageOffset 文件读取偏移值(4byte)
+///
+/// \param packageSize 请求获取一段数据的大小(2byte)
+///
+/// \param endStatus 文件结束,0还需要数据;(1byte)
+///
+- (void)onBinaryFileReqWithType:(NSInteger)type packageOffset:(NSInteger)packageOffset packageSize:(NSInteger)packageSize endStatus:(NSInteger)endStatus;
+/// 发送二进制数据 - FindMy Token 设置
+/// \param result 成功 0 /(失败1或者其他原因)(1byte)
+///
+- (void)onBinaryFileEndWithResult:(NSInteger)result;
+/// 闲时同步 WiFi 配置接收
+/// \param index WiFi 编号 (4 bytes)
+///
+/// \param ssid WiFi SSID
+///
+/// \param password WiFi 密码
+///
+- (void)onSyncIdleWifiConfigReceivedWithIndex:(uint32_t)index ssid:(NSString * _Nonnull)ssid password:(NSString * _Nonnull)password;
+/// 设置闲时同步 WiFi 配置结果
+/// \param result 结果代码 (0: 成功, 1: 已存在, 2: 未找到删除设备, 3: 未找到变更, 4: 操作码异常, 5: 队列已满, 其他: 其他错误)
+///
+- (void)onSyncIdleWifiConfigSetWithResult:(NSInteger)result;
+/// 闲时同步 WiFi 列表接收
+/// \param list WiFi 索引列表
+///
+- (void)onSyncIdleWifiListReceivedWithList:(NSArray * _Nonnull)list;
+/// 闲时同步 WiFi 删除结果
+/// \param result 结果代码 (0: 成功, -1: 失败)
+///
+- (void)onSyncIdleWifiDeleteResultWithResult:(NSInteger)result;
+/// 闲时同步 WiFi 测试开始
+/// \param index WiFi 编号
+///
+- (void)onSyncIdleWifiTestStartedWithIndex:(uint32_t)index;
+/// 闲时同步即将开始开始
+/// \param second 即将开始的秒数
+///
+- (void)onSyncIdleWillStartWithSeconds:(NSInteger)seconds;
+/// 闲时同步 WiFi 测试结果
+/// \param index WiFi 编号
+///
+/// \param result 测试结果:0, 测试成功 1,未找到wifi 2,Wifi密码不正确 3,Wifi连接失败 4,数据传输失败
+///
+/// \param rawCode 原始错误码
+///
+- (void)onSyncIdleWifiTestResultWithIndex:(uint32_t)index result:(NSInteger)result rawCode:(NSInteger)rawCode;
+/// 重置 findmy 状态结果
+/// \param result 测试结果:0, 测试成功 1,未找到wifi 2,Wifi密码不正确 3,Wifi连接失败 4,数据传输失败
+///
+- (void)onResetFindmyResultWithResult:(NSInteger)result;
+/// 通用参数设置结果
+/// \param success 是否成功
+///
+/// \param dataType 字符串类型(1: WiFi上云域名/ip, 2: findmy PPID)
+///
+/// \param value 返回的字符串内容(失败时可能为空)
+///
+- (void)onCommonParamsSetResultWithSuccess:(BOOL)success dataType:(NSInteger)dataType value:(NSString * _Nullable)value;
+/// 通用参数读取结果
+/// \param success 是否成功
+///
+/// \param dataType 字符串类型(1: WiFi上云域名/ip, 2: findmy PPID)
+///
+/// \param value 返回的字符串内容(失败时可能为空)
+///
+- (void)onCommonParamsGetResultWithSuccess:(BOOL)success dataType:(NSInteger)dataType value:(NSString * _Nullable)value;
+- (void)onSetSoundPlusTokenResultWithLicenseKey:(NSString * _Nonnull)licenseKey;
+- (void)onGetSDFlashCIDResultWithCid:(NSString * _Nonnull)cid;
+- (void)onGetDeviceLogListWithData:(NSData * _Nonnull)data;
+- (void)onSyncDeviceLogStartWithData:(NSData * _Nonnull)data;
+- (void)onSyncDeviceLogStop;
+- (void)onSyncDeviceLogEndWithData:(NSData * _Nonnull)data;
+- (void)onDeviceLogDeletedWithData:(NSData * _Nonnull)data;
+@end
+
+
+SWIFT_CLASS("_TtC11PlaudBleSDK9BleDevice")
+@interface BleDevice : NSObject
+/// 录音笔的名称
+@property (nonatomic, copy) NSString * _Nonnull name;
+/// uuid
+@property (nonatomic, copy) NSString * _Nonnull uuid;
+/// 蓝牙信号强度
+@property (nonatomic) float rssi;
+/// 厂商类型,MTK或Nordic
+@property (nonatomic, copy) NSString * _Nonnull manufacturer;
+/// 项目代码
+@property (nonatomic) NSInteger projectCode;
+/// 版本类型,T或V
+@property (nonatomic, copy) NSString * _Nonnull versionTypeStr;
+/// 版本号
+@property (nonatomic) NSInteger versionCode;
+/// SN,设备唯一编号
+@property (nonatomic, copy) NSString * _Nonnull serialNumber;
+/// 绑定状态 0 未绑定,1 已绑定
+@property (nonatomic) NSInteger bindCode;
+/// 设备电池电量
+@property (nonatomic) NSInteger power;
+/// 设备是否正在充电
+@property (nonatomic) BOOL isCharging;
+/// 空间总大小
+@property (nonatomic) NSInteger total;
+/// 设备剩余空间
+@property (nonatomic) NSInteger free;
+/// 录音笔估算的剩余录音时长
+@property (nonatomic) NSInteger duration;
+/// 设备当前时区
+@property (nonatomic) NSInteger timezone;
+/// 时区的分钟部分
+@property (nonatomic) NSInteger zoneMin;
+/// 声道数
+@property (nonatomic) NSInteger channels;
+/// 是否支持WiFi
+@property (nonatomic) BOOL supportWiFi;
+/// 是否需要App端做降噪、增益
+@property (nonatomic) BOOL nsAgc;
+/// 同步的是ogg完整数据还是纯音频opus?
+@property (nonatomic) BOOL isOgg;
+/// 是否在同步完语音数据后删除录音笔中的文件
+@property (nonatomic) NSInteger autoClear;
+/// 是否隐蔽录音
+@property (nonatomic) NSInteger hideLed;
+/// 根据项目自定义 (4099(0x00001003) 表示录音笔正在录音)
+@property (nonatomic) NSInteger state;
+/// 是否开启隐私设置 1 开启;0 关闭
+@property (nonatomic) NSInteger privacy;
+/// 拨动开光状态, 0 无状态 1 录音状态 2 闲置状态
+/// Plaud:3 Switch on 4 Switch off
+@property (nonatomic) NSInteger keyState;
+/// U盘是否启用, 0 未启用 1 已启用
+@property (nonatomic) NSInteger uDisk;
+/// finmy token 是否存在,0 不存在,1 存在
+@property (nonatomic) NSInteger findmyToken;
+/// 是否有升级包(通过http访问服务器获取,放在这里方便使用)
+@property (nonatomic) BOOL hasFota;
+/// 判断是否要添加四位SN后的名称
+@property (nonatomic, readonly, copy) NSString * _Nonnull wholeName;
+/// WiFi热点的名字
+@property (nonatomic, readonly, copy) NSString * _Nonnull wifiName;
+- (nonnull instancetype)initWithSn:(NSString * _Nonnull)sn OBJC_DESIGNATED_INITIALIZER;
+/// 版本号对外显示
+///
+/// returns:
+/// 版本号显示字符串
+- (NSString * _Nonnull)wholeVersion SWIFT_WARN_UNUSED_RESULT;
+- (NSString * _Nonnull)toString SWIFT_WARN_UNUSED_RESULT;
+/// 8:30 –> 83600+3060
+/// -2: 45 –> -23600-4560
+- (NSInteger)zoneSecond SWIFT_WARN_UNUSED_RESULT;
+- (nonnull instancetype)init SWIFT_UNAVAILABLE;
++ (nonnull instancetype)new SWIFT_UNAVAILABLE_MSG("-init is unavailable");
+@end
+
+@class CBService;
+@class CBCharacteristic;
+
+@interface BleDevice (SWIFT_EXTENSION(PlaudBleSDK))
+- (void)peripheral:(CBPeripheral * _Nonnull)peripheral didDiscoverServices:(NSError * _Nullable)error;
+- (void)peripheral:(CBPeripheral * _Nonnull)peripheral didDiscoverCharacteristicsForService:(CBService * _Nonnull)service error:(NSError * _Nullable)error;
+- (void)peripheral:(CBPeripheral * _Nonnull)peripheral didUpdateNotificationStateForCharacteristic:(CBCharacteristic * _Nonnull)characteristic error:(NSError * _Nullable)error;
+- (void)peripheral:(CBPeripheral * _Nonnull)peripheral didUpdateValueForCharacteristic:(CBCharacteristic * _Nonnull)characteristic error:(NSError * _Nullable)error;
+- (void)peripheral:(CBPeripheral * _Nonnull)peripheral didWriteValueForCharacteristic:(CBCharacteristic * _Nonnull)characteristic error:(NSError * _Nullable)error;
+@end
+
+
+/// 录音文件实例类
+SWIFT_CLASS("_TtC11PlaudBleSDK7BleFile")
+@interface BleFile : NSObject
+/// 录音设备的唯一标识(该录音属于哪个录音笔)
+@property (nonatomic, copy) NSString * _Nonnull sn;
+/// 录音笔中录音文件id,唯一
+@property (nonatomic) NSInteger sessionId;
+/// 文件大小
+@property (nonatomic) NSInteger size;
+/// 文件偏移量,即当前文件下载位置
+@property (nonatomic) NSInteger offset;
+/// 当前时区
+/// 笔端文件名是当地时间,如果要转成UTC时间,就需要把时区减掉
+@property (nonatomic) NSInteger timezone;
+/// 时区的分钟部分(部分国家地区会有带分钟的时区)
+@property (nonatomic) NSInteger zoneMin;
+/// 场景(协议7支持)
+@property (nonatomic) NSInteger scenes;
+/// 是否笔端收藏
+@property (nonatomic) NSInteger penCollect;
+/// 声道数
+@property (nonatomic) NSInteger channels;
+/// 是否需要App端降噪、增益
+@property (nonatomic) BOOL nsAgc;
+/// 传输的是ogg文件还是opus?
+@property (nonatomic) BOOL isOgg;
+/// 是不是音乐模式下的录音?
+@property (nonatomic, readonly) BOOL isMusic;
+- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER;
+/// 初始化
+/// \param sessionId 文件唯一id
+///
+/// \param fileSize 文件大小,文件时长通过文件大小来计算
+///
+- (nonnull instancetype)init:(NSInteger)sessionId :(NSInteger)size OBJC_DESIGNATED_INITIALIZER;
+- (nonnull instancetype)init:(NSString * _Nonnull)sn :(NSInteger)sessionId :(NSInteger)size OBJC_DESIGNATED_INITIALIZER;
+- (nonnull instancetype)init:(NSString * _Nonnull)sn :(NSInteger)sessionId :(NSInteger)size :(NSInteger)channels :(BOOL)nsAgc OBJC_DESIGNATED_INITIALIZER;
+- (nonnull instancetype)init:(NSString * _Nonnull)sn :(NSInteger)sessionId :(NSInteger)size :(NSInteger)scenes :(NSInteger)penCollect :(NSInteger)channels :(BOOL)nsAgc OBJC_DESIGNATED_INITIALIZER;
+/// 获取录音文件时长
+///
+/// returns:
+/// 时长,单位毫秒
+- (NSInteger)duration SWIFT_WARN_UNUSED_RESULT;
+/// ogg文件大小转时长(不会十分严谨,误差在100ms内)
+///
+/// returns:
+/// 时长,单位毫秒
+/// @depared 返回的是duration(),以后的版本会移除该方法
+- (NSInteger)oggDuration SWIFT_WARN_UNUSED_RESULT;
+- (NSString * _Nonnull)toString SWIFT_WARN_UNUSED_RESULT;
+/// 计算录音文件时长
+/// \param fileSize 文件大小
+///
+/// \param channel 声道数
+///
+/// \param isOgg 是不是ogg文件?
+///
+/// \param scenes 场景, 如果是会议模式(4),那么传输的是Wave,需要特殊处理
+///
+///
+/// returns:
+/// 时长,毫秒
++ (NSInteger)calculateDuration:(NSInteger)fileSize :(NSInteger)channel :(BOOL)isOgg :(NSInteger)scenes SWIFT_WARN_UNUSED_RESULT;
+@end
+
+
+@interface BleFile (SWIFT_EXTENSION(PlaudBleSDK))
+/// 深拷贝
+- (id _Nonnull)copyWithZone:(struct _NSZone * _Nullable)zone SWIFT_WARN_UNUSED_RESULT;
+/// 时区转秒
+- (NSInteger)zoneSecond SWIFT_WARN_UNUSED_RESULT;
+/// 通过sessionId(utc 0时区时间)和时区获取的本地时间戳
+- (NSInteger)utsStamp SWIFT_WARN_UNUSED_RESULT;
+@end
+
+
+/// 录音打点数据(3.0新协议)
+SWIFT_CLASS("_TtC11PlaudBleSDK19BleRecordMarkingTag")
+@interface BleRecordMarkingTag : NSObject
+@property (nonatomic, readonly) uint32_t timestamp;
+@property (nonatomic, readonly) uint8_t type;
+@property (nonatomic, readonly) uint8_t status;
+@property (nonatomic, readonly, copy) NSArray * _Nonnull reserved;
+- (nonnull instancetype)initWithTimestamp:(uint32_t)timestamp type:(uint8_t)type status:(uint8_t)status reserved:(NSArray * _Nonnull)reserved OBJC_DESIGNATED_INITIALIZER;
+- (nonnull instancetype)init SWIFT_UNAVAILABLE;
++ (nonnull instancetype)new SWIFT_UNAVAILABLE_MSG("-init is unavailable");
+@end
+
+
+
+
+/// 眼镜记录报表数据
+SWIFT_CLASS("_TtC11PlaudBleSDK9GlassData")
+@interface GlassData : NSObject
+@property (nonatomic) NSInteger year;
+@property (nonatomic) NSInteger month;
+@property (nonatomic) NSInteger day;
+@property (nonatomic) NSInteger time;
+- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER;
+- (nonnull instancetype)init:(uint16_t)year :(uint8_t)month :(uint8_t)day :(uint32_t)time OBJC_DESIGNATED_INITIALIZER;
+@end
+
+
+/// 眼镜专有数据的代理
+SWIFT_PROTOCOL("_TtP11PlaudBleSDK13GlassProtocol_")
+@protocol GlassProtocol
+/// 眼镜报表数据
+/// \param delFlag 删除次数统计
+///
+/// \param dataArr 报表数据
+///
+- (void)glassData:(NSInteger)delFlag :(NSArray * _Nonnull)dataArr;
+/// 清除报表数据
+/// \param status 0 成功;1 设备正在使用,删除失败
+///
+- (void)glassDataClear:(NSInteger)status;
+@end
+
+
+SWIFT_CLASS_NAMED("JXAvcDecoder")
+@interface JXAvcDecoder : NSObject
+/// 单声道单个包大小
+@property (nonatomic, readonly) NSInteger packSize;
+/// 双声道单个包大小
+@property (nonatomic, readonly) NSInteger twoChannelPackSize;
+/// 4声道单个包大小
+@property (nonatomic, readonly) NSInteger fourChannelPackSize;
+- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER;
+/// 创建解码器
+/// \param channels 声道数,默认1
+///
+- (void)createDecoderIfNeed:(NSInteger)channels;
+/// 解码单个数据包
+/// 如果解码器异常或者被回收,会重新创建并初始化
+/// \param data 待解码数据,长度是 80 * channels
+///
+///
+/// returns:
+/// 解码后的数据
+- (NSData * _Nullable)decode:(NSData * _Nonnull)data :(NSInteger)channels SWIFT_WARN_UNUSED_RESULT;
+/// 释放解码器
+- (void)releaseDecoder;
+@end
+
+
+/// crc工具类
+/// 同步(下载)录音笔的文件,自己控制好偏移量拼接好,文件就不会错,crc是对不上的(笔端文件和发给app的不一样)
+/// 给录音笔下发差分升级包需要给录音笔传一个crc校验文件的完整性
+SWIFT_CLASS("_TtC11PlaudBleSDK11JXCrcHelper")
+@interface JXCrcHelper : NSObject
+SWIFT_CLASS_PROPERTY(@property (nonatomic, class, readonly, strong) JXCrcHelper * _Nonnull shared;)
++ (JXCrcHelper * _Nonnull)shared SWIFT_WARN_UNUSED_RESULT;
+- (nonnull instancetype)init SWIFT_UNAVAILABLE;
++ (nonnull instancetype)new SWIFT_UNAVAILABLE_MSG("-init is unavailable");
+/// 获取文件的CRC校验码
+/// \param path 文件路径
+///
+///
+/// returns:
+/// 校验码,如果文件不存在,返回-1
+- (NSInteger)getCrcWithPath:(NSString * _Nonnull)path SWIFT_WARN_UNUSED_RESULT;
+/// 校验文件CRC
+/// \param crc 笔端返回的crc值
+///
+/// \param path 文件路径
+///
+///
+/// returns:
+/// 文件是否完整
+- (BOOL)checkCrcWithCrc:(NSInteger)crc ofFile:(NSString * _Nonnull)path SWIFT_WARN_UNUSED_RESULT;
+@end
+
+
+/// 音频解码、格式转换工具类
+SWIFT_CLASS("_TtC11PlaudBleSDK13JXFileDecoder")
+@interface JXFileDecoder : NSObject
+SWIFT_CLASS_PROPERTY(@property (nonatomic, class, readonly, strong) JXFileDecoder * _Nonnull shared;)
++ (JXFileDecoder * _Nonnull)shared SWIFT_WARN_UNUSED_RESULT;
+- (nonnull instancetype)init SWIFT_UNAVAILABLE;
++ (nonnull instancetype)new SWIFT_UNAVAILABLE_MSG("-init is unavailable");
+/// pcm转wav
+/// \param pcmPath pcm文件路径
+///
+/// \param wavPath wav文件路径
+///
+/// \param channels 声道数,默认1
+///
+/// \param simpleRate 采样率,默认16000
+///
+/// \param completionHandler 回调
+///
+- (void)pcmToWavWithPcmPath:(NSString * _Nonnull)pcmPath wavPath:(NSString * _Nonnull)wavPath channels:(uint32_t)channels simpleRate:(uint32_t)simpleRate completionHandler:(void (^ _Nonnull)(BOOL))completionHandler;
+/// 音乐模式下录制的音频,且一开始进行了实时录音的同步,那么wav头信息需要重新设置以下才能用普通播放器播放
+/// \param wavPath wav文件路径
+///
+/// \param channels 声道数,音乐模式是双声道
+///
+/// \param sampleRate 采样率,音乐模式是48000(48k)
+///
+- (void)resetWavHead:(NSString * _Nonnull)wavPath :(uint32_t)channels :(uint32_t)sampleRate;
+@end
+
+
+@interface JXFileDecoder (SWIFT_EXTENSION(PlaudBleSDK))
+/// 是否有未完成任务
+- (BOOL)hasAvcToWavTask SWIFT_WARN_UNUSED_RESULT;
+/// 取消当前任务(如果有的话),清空任务队列
+- (void)convertAvcToWavCancel;
+/// avc未解码数据转wav,如果有多个,会按照队列依次执行
+/// 实现改为了c语言
+/// \param avcPath 原始数据文件路径
+///
+/// \param wavPath wav文件路径
+///
+/// \param channels 声道数,默认1
+///
+/// \param ns_agc 是否做降噪、增益
+///
+/// \param clearUnfinished 如果任务队列中海油之前未完成的任务,会取消掉
+///
+/// \param completionHandler 完成是 true 100;失败是 false -1; 进度是 fale 0-100
+///
+- (void)avcToWavWithAvcPath:(NSString * _Nonnull)avcPath wavPath:(NSString * _Nonnull)wavPath channels:(int32_t)channels ns_agc:(BOOL)ns_agc clearUnfinished:(BOOL)clearUnfinished completionHandler:(void (^ _Nonnull)(BOOL, NSInteger))completionHandler;
+@end
+
+
+@interface JXFileDecoder (SWIFT_EXTENSION(PlaudBleSDK))
+/// 是否有未完成任务
+- (BOOL)hasPcmToMp3Task SWIFT_WARN_UNUSED_RESULT;
+/// 取消当前任务(如果有的话),清空任务队列
+- (void)convertPcmToMp3Cancel;
+/// pcm录音文件转mp3,如果有多个,会按照队列依次执行
+/// 不知道为什么生成的mp3不能用AVAudioPlayer播放,用AVPlayer播放是可以的
+/// \param pcmPath pcm文件路径
+///
+/// \param mp3Path 要生成的MP3文件路径
+///
+/// \param clearUnfinished 如果任务队列中海油之前未完成的任务,会取消掉
+///
+/// \param quality 2 near-best quality, not too slow; 5 good quality, fast; 7 ok quality, really fast
+///
+/// \param channels 声道数,默认1
+///
+/// \param completionHandler 完成是 true 100;失败是 false -1; 进度是 fale 0-100
+///
+- (void)pcmToMp3WithPcmPath:(NSString * _Nonnull)pcmPath mp3Path:(NSString * _Nonnull)mp3Path clearUnfinished:(BOOL)clearUnfinished quality:(int32_t)quality channels:(int32_t)channels completionHandler:(void (^ _Nonnull)(BOOL, NSInteger))completionHandler;
+@end
+
+
+@interface JXFileDecoder (SWIFT_EXTENSION(PlaudBleSDK))
+/// 是否有未完成任务
+- (BOOL)hasAvcToMp3Task SWIFT_WARN_UNUSED_RESULT;
+/// 取消当前任务(如果有的话),清空任务队列
+- (void)convertAvcToMp3Cancel;
+/// avc原始录音文件转mp3,如果有多个,会按照队列依次执行
+/// 不知道为什么生成的mp3不能用AVAudioPlayer播放,用AVPlayer播放是可以的
+/// \param avcPath avc原始录音文件路径
+///
+/// \param mp3Path 要生成的MP3文件路径
+///
+/// \param clearUnfinished 如果任务队列中还有之前未完成的任务,会取消掉
+///
+/// \param quality 2 near-best quality, not too slow; 5 good quality, fast; 7 ok quality, really fast
+///
+/// \param channels 声道数,默认1
+///
+/// \param ns_agc 是否要做降噪、增益
+///
+/// \param completionHandler 完成是 true 100;失败是 false -1; 进度是 fale 0-100
+///
+- (void)avcToMp3WithAvcPath:(NSString * _Nonnull)avcPath mp3Path:(NSString * _Nonnull)mp3Path clearUnfinished:(BOOL)clearUnfinished quality:(int32_t)quality channels:(int32_t)channels ns_agc:(BOOL)ns_agc completionHandler:(void (^ _Nonnull)(BOOL, NSInteger))completionHandler;
+@end
+
+
+@interface JXFileDecoder (SWIFT_EXTENSION(PlaudBleSDK))
+/// 是否有未完成任务
+- (BOOL)hasOggToMp3Task SWIFT_WARN_UNUSED_RESULT;
+/// 取消当前任务(如果有的话),清空任务队列
+- (void)convertOggToMp3Cancel;
+/// ogg压缩mp3
+/// \param oggPath ogg文件路径
+///
+/// \param mp3Path mp3文件路径
+///
+/// \param channels ogg声道数
+///
+/// \param quality mp3音质 2 near-best quality, not too slow;5 good quality, fast;7 ok quality, really fast 默认7
+///
+/// \param callback 完成是 true 100;失败是 false -1; 进度是 fale 0-100
+///
+- (void)oggToMp3:(NSString * _Nonnull)oggPath :(NSString * _Nonnull)mp3Path :(int32_t)channels :(int32_t)quality :(void (^ _Nonnull)(BOOL, NSInteger))callback;
+@end
+
+
+@interface JXFileDecoder (SWIFT_EXTENSION(PlaudBleSDK))
+/// 是否有未完成任务
+- (BOOL)hasOggMulToSingleTask SWIFT_WARN_UNUSED_RESULT;
+/// 取消当前任务(如果有的话),清空任务队列
+- (void)oggMulToSingleCancel;
+/// 多声道ogg转单声道ogg,多声道可以是单、双、四声道;
+/// 转后的ogg略小,可以谷歌浏览器播放
+/// \param mulPath 多声道ogg地址
+///
+/// \param singlePath 目标单声道地址
+///
+/// \param channels 多声道ogg声道数
+///
+/// \param callback 完成是 true 100;失败是 false -1; 进度是 fale 0-100
+///
+- (void)oggMulToSingle:(NSString * _Nonnull)mulPath :(NSString * _Nonnull)singlePath :(int32_t)channels :(void (^ _Nonnull)(BOOL, NSInteger))callback;
+@end
+
+
+@interface JXFileDecoder (SWIFT_EXTENSION(PlaudBleSDK))
+- (BOOL)hasAvcToNoiseReductionWav SWIFT_WARN_UNUSED_RESULT;
+- (void)convertAvcToNoiseReductionWavCancel;
+/// avc未解码数据转wav,如果有多个,会按照队列依次执行
+/// 实现改为了c语言
+/// \param avcPath 原始数据文件路径
+///
+/// \param wavPath wav文件路径
+///
+/// \param channels 声道数,默认1
+///
+/// \param ns_agc 是否做降噪、增益
+///
+/// \param clearUnfinished 如果任务队列中海油之前未完成的任务,会取消掉
+///
+/// \param completionHandler 完成是 true 100;失败是 false -1; 进度是 fale 0-100
+///
+- (void)avcToNoiseReductionWavWithAvcPath:(NSString * _Nonnull)avcPath wavPath:(NSString * _Nonnull)wavPath channels:(int32_t)channels sound_plus:(BOOL)sound_plus noiseReductionGain:(NSInteger)noiseReductionGain clearUnfinished:(BOOL)clearUnfinished completionHandler:(void (^ _Nonnull)(BOOL, NSInteger))completionHandler;
+@end
+
+
+@interface JXFileDecoder (SWIFT_EXTENSION(PlaudBleSDK))
+/// 是否有未完成任务
+- (BOOL)hasAvcToOggTask SWIFT_WARN_UNUSED_RESULT;
+/// 取消当前任务(如果有的话),清空任务队列
+- (void)convertAvcToOggCancel;
+- (void)oggToOpus:(NSString * _Nonnull)oggPath :(NSString * _Nonnull)opusPath :(int32_t)channels :(void (^ _Nonnull)(BOOL))callback;
+/// avc(opus)转ogg,网易云可以播放,思必驰、讯飞可以识别
+/// \param avcPath avc(opus)文件路径
+///
+/// \param oggPath 目标ogg文件路径
+///
+/// \param clearUnfinished 如果任务队列中海油之前未完成的任务,会取消掉
+///
+/// \param iflyToolongCut 讯飞超长截取,默认打开(最长限制到4小时59分50秒)
+///
+/// \param channels 声道数,默认1
+///
+/// \param targetChannels 目标声道数(双声道默认转成单声道,也可以指定为双声道, 单声道不能转双声道)
+///
+/// \param ns_agc 是否要做降噪、增益
+///
+/// \param callback 回调函数,完成是 true 100;失败是 false -1; 进度是 fale 0-100
+///
+- (void)avcToOgg:(NSString * _Nonnull)avcPath :(NSString * _Nonnull)oggPath clearUnfinished:(BOOL)clearUnfinished :(BOOL)iflyToolongCut :(int32_t)channels :(int32_t)targetChannels :(BOOL)ns_agc :(void (^ _Nonnull)(BOOL, NSInteger))callback;
+@end
+
+
+@interface JXFileDecoder (SWIFT_EXTENSION(PlaudBleSDK))
+/// 是否有未完成任务
+- (BOOL)hasAvcToPcmTask SWIFT_WARN_UNUSED_RESULT;
+/// 取消当前任务(如果有的话),清空任务队列
+- (void)convertAvcToPcmCancel;
+/// avc文件转pcm
+/// \param avcPath avc/opus文件路径
+///
+/// \param pcmPath pcm文件路径
+///
+/// \param clearUnfinished 如果任务队列中还有之前未完成的任务,会取消掉
+///
+/// \param channels 声道数,默认1
+///
+/// \param ns_agc 是否要做降噪、增益
+///
+/// \param completionHandler 完成是 true 100;失败是 false -1; 进度是 fale 0-100
+///
+- (void)avcToPcmWithAvcPath:(NSString * _Nonnull)avcPath pcmPath:(NSString * _Nonnull)pcmPath clearUnfinished:(BOOL)clearUnfinished channels:(int32_t)channels ns_agc:(BOOL)ns_agc completionHandler:(void (^ _Nonnull)(BOOL, NSInteger))completionHandler;
+/// ogg文件转pcm
+/// \param avcPath ogg文件路径
+///
+/// \param pcmPath pcm文件路径
+///
+/// \param clearUnfinished 如果任务队列中还有之前未完成的任务,会取消掉
+///
+/// \param channels 声道数,默认1
+///
+/// \param ns_agc 是否要做降噪、增益
+///
+/// \param completionHandler 完成是 true 100;失败是 false -1; 进度是 fale 0-100
+///
+- (void)oggToPcmWithAvcPath:(NSString * _Nonnull)avcPath pcmPath:(NSString * _Nonnull)pcmPath clearUnfinished:(BOOL)clearUnfinished channels:(int32_t)channels ns_agc:(BOOL)ns_agc completionHandler:(void (^ _Nonnull)(BOOL, NSInteger))completionHandler;
+@end
+
+
+/// 声波文件生成工具类
+SWIFT_CLASS("_TtC11PlaudBleSDK15JXFileSoundWave")
+@interface JXFileSoundWave : NSObject
+SWIFT_CLASS_PROPERTY(@property (nonatomic, class, readonly, strong) JXFileSoundWave * _Nonnull shared;)
++ (JXFileSoundWave * _Nonnull)shared SWIFT_WARN_UNUSED_RESULT;
+- (nonnull instancetype)init SWIFT_UNAVAILABLE;
++ (nonnull instancetype)new SWIFT_UNAVAILABLE_MSG("-init is unavailable");
+/// 是否有未完成任务
+- (BOOL)hasAvcToSoundWaveTask SWIFT_WARN_UNUSED_RESULT;
+/// 取消当前任务(如果有的话),清空任务队列
+- (void)generateSoundWaveCancel;
+/// 录音文件获取声波
+/// \param filePath 录音文件路径
+///
+/// \param channels 声道数
+///
+/// \param isOgg 是ogg还是opus/avc?
+///
+/// \param isMusic 是不是音乐模式
+///
+/// \param callback 回调
+///
+- (void)createSoundWave:(NSString * _Nonnull)filePath :(NSInteger)channels :(BOOL)isOgg :(BOOL)isMusic :(void (^ _Nonnull)(BOOL, NSInteger))callback;
+/// 录音文件生成声波
+/// \param avcPath 未解码文件路径
+///
+/// \param channels 声道数,默认是1
+///
+/// \param completionHandler 回调结果和进度
+///
+- (void)avcToSoundWaveWithAvcPath:(NSString * _Nonnull)avcPath channels:(NSInteger)channels completionHandler:(void (^ _Nonnull)(BOOL, NSInteger))completionHandler;
+@end
+
+
+/// 用于流式解码opus以及ogg数据,ogg只能是从录音笔同步的ogg,其他外部协议的不支持
+SWIFT_CLASS("_TtC11PlaudBleSDK12JXPcmProcess")
+@interface JXPcmProcess : NSObject
+- (nonnull instancetype)init SWIFT_UNAVAILABLE;
++ (nonnull instancetype)new SWIFT_UNAVAILABLE_MSG("-init is unavailable");
+/// 单例
+SWIFT_CLASS_PROPERTY(@property (nonatomic, class, readonly, strong) JXPcmProcess * _Nonnull shared;)
++ (JXPcmProcess * _Nonnull)shared SWIFT_WARN_UNUSED_RESULT;
+/// 协议
+@property (nonatomic, weak) id _Nullable delegate;
+/// 回调线程,默认主线程
+@property (nonatomic, strong) dispatch_queue_t _Nonnull callbackQueue;
+/// 重置,开始接收数据前必须重置
+/// \param sessionId 录音id(@see BleFile)
+///
+/// \param channel 声道数(@see BleDevice)
+///
+/// \param isOgg 是ogg还是opus纯音频未解码数据(@see BleDevice)
+///
+/// \param nsAgc 是否需要降噪增益(@see BleDevice)
+///
+- (void)resetWith:(NSInteger)sessionId :(NSInteger)channel :(BOOL)isOgg :(BOOL)nsAgc;
+- (void)receiveData:(NSInteger)sessionId :(NSInteger)start :(NSData * _Nonnull)data;
+- (void)receiveDataBytes:(NSInteger)sessionId :(NSInteger)start :(NSData * _Nonnull)data;
+@end
+
+
+@interface JXPcmProcess (SWIFT_EXTENSION(PlaudBleSDK))
+- (void)onPcmData:(NSInteger)sessionId :(NSInteger)millSec :(NSData * _Nonnull)pcmData;
+- (void)onDecodeErr:(NSInteger)millSec;
+@end
+
+
+
+/// 完整的录音文件声音大小辅助工具类
+SWIFT_CLASS("_TtC11PlaudBleSDK15JXRecordVolumer")
+@interface JXRecordVolumer : NSObject
+SWIFT_CLASS_PROPERTY(@property (nonatomic, class, readonly, strong) JXRecordVolumer * _Nonnull shared;)
++ (JXRecordVolumer * _Nonnull)shared SWIFT_WARN_UNUSED_RESULT;
+/// 多久返回一个峰值?单位是毫秒,一个80B的avc包是20毫秒, 640B的pcm包是20毫秒
+/// 不再支持,固定是1秒
+@property (nonatomic) NSInteger waveInterval;
+/// 音量数组, 内数组包含两个值,第一个是时间(秒),第二个是声音大小(分贝)
+/// 例:[[1, 54], [2, 76], [3, 46]]
+/// 从第一秒开始
+@property (nonatomic, copy) NSArray *> * _Nonnull volumeArr;
+/// 当前走到第几秒
+@property (nonatomic, readonly) NSInteger curSec;
+- (nonnull instancetype)init SWIFT_UNAVAILABLE;
++ (nonnull instancetype)new SWIFT_UNAVAILABLE_MSG("-init is unavailable");
+/// 获取一个包的平均音量
+/// 如果要自定义,可以用这个方法,否则就用不着
+/// \param pcmData 解码后的pcm数据包,单声道是640字节,双声道是1280字节
+///
+- (NSInteger)averageVolume:(NSData * _Nonnull)pcmData SWIFT_WARN_UNUSED_RESULT;
+/// 追加一个解码后的数据包
+/// \param start 偏移量
+///
+/// \param pcmData 解码后的pcm数据包,单声道是640字节,双声道是1280字节
+///
+/// \param channels 声道
+///
+- (void)appendWithStart:(NSInteger)start pcmData:(NSData * _Nonnull)pcmData;
+/// 重置声音队列(开始新的录音前)
+- (void)reset;
+@end
+
+@protocol VolumeProtocol;
+
+/// 实时录音声音大小辅助工具类
+SWIFT_CLASS("_TtC11PlaudBleSDK18JXRecordingVolumer")
+@interface JXRecordingVolumer : NSObject
+SWIFT_CLASS_PROPERTY(@property (nonatomic, class, readonly, strong) JXRecordingVolumer * _Nonnull shared;)
++ (JXRecordingVolumer * _Nonnull)shared SWIFT_WARN_UNUSED_RESULT;
+@property (nonatomic, weak) id _Nullable delegate;
+/// 多久返回一个峰值?单位是毫秒,一个80B的avc包是20毫秒, 640B的pcm包是20毫秒
+@property (nonatomic) NSInteger waveInterval;
+/// 音量数组, 内数组包含两个值,第一个是时间(秒),第二个是声音大小(分贝)
+/// 例:[[1, 54], [2, 76], [3, 46]]
+/// 从第一秒开始
+@property (nonatomic, readonly, copy) NSArray *> * _Nonnull volumeArr;
+/// 当前走到第几秒
+@property (nonatomic, readonly) NSInteger curSec;
+/// 当前毫秒值
+@property (nonatomic, readonly) NSInteger curMillisec;
+/// 当前大小(偏移+data大小)
+@property (nonatomic, readonly) NSInteger curFileSize;
+- (nonnull instancetype)init SWIFT_UNAVAILABLE;
++ (nonnull instancetype)new SWIFT_UNAVAILABLE_MSG("-init is unavailable");
+/// 获取一个包的平均音量
+/// 如果要自定义,可以用这个方法,否则就用不着
+/// \param pcmData 解码后的pcm数据包,640,如果是1280双声道,会转成单声道的640
+///
+- (CGFloat)averageVolume:(NSData * _Nonnull)pcmData SWIFT_WARN_UNUSED_RESULT;
+/// 追加一个解码后的数据包
+/// \param start 原始数据偏移量
+///
+/// \param pcmData 解码后的数据(注意:双声道会变单声道)
+///
+/// \param channels 声道数
+///
+- (void)appendWithStart:(NSInteger)start pcmData:(NSData * _Nonnull)pcmData channels:(NSInteger)channels;
+/// 追加一个解码后的数据包(单声道)
+/// \param millSec 毫秒值
+///
+/// \param pcmData 解码后的数据
+///
+- (void)append:(NSInteger)millSec :(NSData * _Nonnull)pcmData;
+/// 初始化历史数据
+- (void)setOldVolumeMetersWithMeters:(NSArray *> * _Nonnull)meters;
+/// 重置声音队列(开始新的录音前)
+- (void)reset;
+@end
+
+
+SWIFT_CLASS("_TtC11PlaudBleSDK17JXWave2PcmProcess")
+@interface JXWave2PcmProcess : NSObject
+- (nonnull instancetype)init SWIFT_UNAVAILABLE;
++ (nonnull instancetype)new SWIFT_UNAVAILABLE_MSG("-init is unavailable");
+/// 单例
+SWIFT_CLASS_PROPERTY(@property (nonatomic, class, readonly, strong) JXWave2PcmProcess * _Nonnull shared;)
++ (JXWave2PcmProcess * _Nonnull)shared SWIFT_WARN_UNUSED_RESULT;
+/// 协议
+@property (nonatomic, weak) id _Nullable delegate;
+/// 回调线程,默认主线程
+@property (nonatomic, strong) dispatch_queue_t _Nonnull callbackQueue;
+/// 重置,开始接收数据前必须重置
+/// \param sessionId 录音id
+///
+- (void)resetWith:(NSInteger)sessionId;
+/// 接收Wave数据
+/// \param sessionId 录音id
+///
+/// \param start 偏移量
+///
+/// \param data wave数据
+///
+- (void)receiveData:(NSInteger)sessionId :(NSInteger)start :(NSData * _Nonnull)data;
+@end
+
+
+/// 这个是测试用的
+SWIFT_CLASS("_TtC11PlaudBleSDK12JXWaveHelper")
+@interface JXWaveHelper : NSObject
+SWIFT_CLASS_PROPERTY(@property (nonatomic, class, readonly, strong) JXWaveHelper * _Nonnull shared;)
++ (JXWaveHelper * _Nonnull)shared SWIFT_WARN_UNUSED_RESULT;
+SWIFT_CLASS_PROPERTY(@property (nonatomic, class, readonly, copy) NSString * _Nonnull tmpPcmPath;)
++ (NSString * _Nonnull)tmpPcmPath SWIFT_WARN_UNUSED_RESULT;
+SWIFT_CLASS_PROPERTY(@property (nonatomic, class, readonly, copy) NSString * _Nonnull tmpWavPath;)
++ (NSString * _Nonnull)tmpWavPath SWIFT_WARN_UNUSED_RESULT;
+SWIFT_CLASS_PROPERTY(@property (nonatomic, class, readonly, copy) NSString * _Nonnull leftPath;)
++ (NSString * _Nonnull)leftPath SWIFT_WARN_UNUSED_RESULT;
+SWIFT_CLASS_PROPERTY(@property (nonatomic, class, readonly, copy) NSString * _Nonnull rightPath;)
++ (NSString * _Nonnull)rightPath SWIFT_WARN_UNUSED_RESULT;
+SWIFT_CLASS_PROPERTY(@property (nonatomic, class, readonly, copy) NSString * _Nonnull leftWavPath;)
++ (NSString * _Nonnull)leftWavPath SWIFT_WARN_UNUSED_RESULT;
+SWIFT_CLASS_PROPERTY(@property (nonatomic, class, readonly, copy) NSString * _Nonnull rightWavPath;)
++ (NSString * _Nonnull)rightWavPath SWIFT_WARN_UNUSED_RESULT;
+SWIFT_CLASS_PROPERTY(@property (nonatomic, class, readonly, copy) NSString * _Nonnull leftLycPath;)
++ (NSString * _Nonnull)leftLycPath SWIFT_WARN_UNUSED_RESULT;
+SWIFT_CLASS_PROPERTY(@property (nonatomic, class, readonly, copy) NSString * _Nonnull rightLycPath;)
++ (NSString * _Nonnull)rightLycPath SWIFT_WARN_UNUSED_RESULT;
+- (nonnull instancetype)init SWIFT_UNAVAILABLE;
++ (nonnull instancetype)new SWIFT_UNAVAILABLE_MSG("-init is unavailable");
+/// pcm文件追加文件头转为wave文件
+/// \param pcmFilePath pcm文件路径
+///
+/// \param wavFilePath wave文件路径
+///
+/// \param channels 声道数,默认1
+///
+///
+/// returns:
+/// 是否成功
+- (BOOL)pcmFileToWaveWithPcmFilePath:(NSString * _Nonnull)pcmFilePath wavFilePath:(NSString * _Nonnull)wavFilePath channels:(uint32_t)channels simpleRate:(uint32_t)simpleRate SWIFT_WARN_UNUSED_RESULT;
+/// 分离左右声道
+- (void)divideLeftAndRight:(NSString * _Nonnull)wavePath :(NSString * _Nonnull)leftPath :(NSString * _Nonnull)rightPath handler:(void (^ _Nonnull)(BOOL))handler;
+@end
+
+
+SWIFT_PROTOCOL("_TtP11PlaudBleSDK11OtaProtocol_")
+@protocol OtaProtocol
+/// ota通知
+/// \param uid 标识
+///
+/// \param status 状态 0 正常,1. 升级失败 2. 版本信息不匹配 3.FLASH写失败 4.文件太大 5.尝试次数过多 6. U盘模式;7.正在录音; 8. U盘剩余空间不足; 9. 正在工作中; 10. G101眼镜仅在充电模式允许升级;11. G101眼镜电池电量不足;12. G101眼镜收到升级协议并准备调整到OTA_MODE; 255:模式不对(录音笔不在录音模式,黑黎三段式开关特有)
+///
+/// \param errmsg 协议版本4,如果升级成功,这里返回升级后的版本;如果失败,依然返回错误信息。
+///
+- (void)bleFotaResultWithUid:(NSInteger)uid status:(NSInteger)status errmsg:(NSString * _Nullable)errmsg;
+/// ota包请求,录音笔请求发送升级包数据
+/// \param uid 标识
+///
+/// \param start 开始位置(字节)
+///
+/// \param end 结束位置(字节)
+///
+- (void)bleFotaPackReqWithUid:(NSInteger)uid start:(NSInteger)start end:(NSInteger)end;
+/// ota包接收完成
+/// \param uid 标识
+///
+/// \param status 状态 0 正常,1. 升级失败 2. 版本信息不匹配 3.FLASH写失败 4.文件太大 5尝试次数过多 6. U盘模式;7.正在录音; 8. U盘剩余空间不足; 9. 正在工作中; 10. G101眼镜仅在充电模式允许升级;11. G101眼镜电池电量不足;12. G101眼镜收到升级协议并准备调整到OTA_MODE; 255:模式不对(录音笔不在录音模式,黑黎三段式开关特有)
+///
+/// \param errmsg 协议版本4,如果升级成功,这里返回升级后的版本;如果失败,依然返回错误信息。
+///
+- (void)bleFotaPackFinWithUid:(NSInteger)uid status:(NSInteger)status errmsg:(NSString * _Nullable)errmsg;
+@end
+
+
+/// 声波文件生成工具类
+SWIFT_CLASS("_TtC11PlaudBleSDK15PDFileSoundWave")
+@interface PDFileSoundWave : NSObject
+SWIFT_CLASS_PROPERTY(@property (nonatomic, class, readonly, strong) PDFileSoundWave * _Nonnull shared;)
++ (PDFileSoundWave * _Nonnull)shared SWIFT_WARN_UNUSED_RESULT;
+- (nonnull instancetype)init SWIFT_UNAVAILABLE;
++ (nonnull instancetype)new SWIFT_UNAVAILABLE_MSG("-init is unavailable");
+/// 是否有未完成任务
+- (BOOL)hasAvcToSoundWaveTask SWIFT_WARN_UNUSED_RESULT;
+/// 取消当前任务(如果有的话),清空任务队列
+- (void)generateSoundWaveCancel;
+/// 录音文件获取声波
+/// \param filePath 录音文件路径
+///
+/// \param channels 声道数
+///
+/// \param isOgg 是ogg还是opus/avc?
+///
+/// \param isMusic 是不是音乐模式
+///
+/// \param callback 回调
+///
+- (void)createSoundWave:(NSString * _Nonnull)filePath :(NSInteger)channels :(BOOL)isOgg :(BOOL)isMusic :(void (^ _Nonnull)(BOOL, NSInteger))callback;
+/// 录音文件生成声波
+/// \param avcPath 未解码文件路径
+///
+/// \param channels 声道数,默认是1
+///
+/// \param completionHandler 回调结果和进度
+///
+- (void)avcToSoundWaveWithAvcPath:(NSString * _Nonnull)avcPath channels:(NSInteger)channels completionHandler:(void (^ _Nonnull)(BOOL, NSInteger))completionHandler;
+@end
+
+
+/// 完整的录音文件声音大小辅助工具类
+SWIFT_CLASS("_TtC11PlaudBleSDK15PDRecordVolumer")
+@interface PDRecordVolumer : NSObject
+SWIFT_CLASS_PROPERTY(@property (nonatomic, class, readonly, strong) PDRecordVolumer * _Nonnull shared;)
++ (PDRecordVolumer * _Nonnull)shared SWIFT_WARN_UNUSED_RESULT;
+/// 多久返回一个峰值?单位是毫秒,一个80B的avc包是20毫秒, 640B的pcm包是20毫秒
+/// 不再支持,固定是1秒
+@property (nonatomic) NSInteger waveInterval;
+/// 音量数组, 内数组包含两个值,第一个是时间(秒),第二个是声音大小(分贝)
+/// 例:[[1, 54], [2, 76], [3, 46]]
+/// 从第一秒开始
+@property (nonatomic, copy) NSArray *> * _Nonnull volumeArr;
+/// 当前走到第几秒
+@property (nonatomic, readonly) NSInteger curSec;
+- (nonnull instancetype)init SWIFT_UNAVAILABLE;
++ (nonnull instancetype)new SWIFT_UNAVAILABLE_MSG("-init is unavailable");
+/// 获取一个包的平均音量
+/// 如果要自定义,可以用这个方法,否则就用不着
+/// \param pcmData 解码后的pcm数据包,单声道是640字节,双声道是1280字节
+///
+- (NSInteger)averageVolume:(NSData * _Nonnull)pcmData SWIFT_WARN_UNUSED_RESULT;
+/// 追加一个解码后的数据包
+/// \param start 偏移量
+///
+/// \param pcmData 解码后的pcm数据包,单声道是640字节,双声道是1280字节
+///
+/// \param channels 声道
+///
+- (void)appendWithStart:(NSInteger)start pcmData:(NSData * _Nonnull)pcmData;
+/// 重置声音队列(开始新的录音前)
+- (void)reset;
+@end
+
+@protocol PDVolumeProtocol;
+
+/// 实时录音声音大小辅助工具类
+SWIFT_CLASS("_TtC11PlaudBleSDK18PDRecordingVolumer")
+@interface PDRecordingVolumer : NSObject
+SWIFT_CLASS_PROPERTY(@property (nonatomic, class, readonly, strong) PDRecordingVolumer * _Nonnull shared;)
++ (PDRecordingVolumer * _Nonnull)shared SWIFT_WARN_UNUSED_RESULT;
+@property (nonatomic, weak) id _Nullable delegate;
+/// 多久返回一个峰值?单位是毫秒,一个80B的avc包是20毫秒, 640B的pcm包是20毫秒
+@property (nonatomic) NSInteger waveInterval;
+/// 音量数组, 内数组包含两个值,第一个是时间(秒),第二个是声音大小(分贝)
+/// 例:[[1, 54], [2, 76], [3, 46]]
+/// 从第一秒开始
+@property (nonatomic, readonly, copy) NSArray *> * _Nonnull volumeArr;
+/// 当前走到第几秒
+@property (nonatomic, readonly) NSInteger curSec;
+/// 当前毫秒值
+@property (nonatomic, readonly) NSInteger curMillisec;
+/// 当前大小(偏移+data大小)
+@property (nonatomic, readonly) NSInteger curFileSize;
+- (nonnull instancetype)init SWIFT_UNAVAILABLE;
++ (nonnull instancetype)new SWIFT_UNAVAILABLE_MSG("-init is unavailable");
+/// 获取一个包的平均音量
+/// 如果要自定义,可以用这个方法,否则就用不着
+/// \param pcmData 解码后的pcm数据包,640,如果是1280双声道,会转成单声道的640
+///
+- (CGFloat)averageVolume:(NSData * _Nonnull)pcmData SWIFT_WARN_UNUSED_RESULT;
+/// 追加一个解码后的数据包
+/// \param start 原始数据偏移量
+///
+/// \param pcmData 解码后的数据(注意:双声道会变单声道)
+///
+/// \param channels 声道数
+///
+- (void)appendWithStart:(NSInteger)start pcmData:(NSData * _Nonnull)pcmData channels:(NSInteger)channels;
+/// 追加一个解码后的数据包(单声道)
+/// \param millSec 毫秒值
+///
+/// \param pcmData 解码后的数据
+///
+- (void)append:(NSInteger)millSec :(NSData * _Nonnull)pcmData;
+/// 初始化历史数据
+- (void)setOldVolumeMetersWithMeters:(NSArray *> * _Nonnull)meters;
+/// 重置声音队列(开始新的录音前)
+- (void)reset;
+@end
+
+
+SWIFT_PROTOCOL("_TtP11PlaudBleSDK16PDVolumeProtocol_")
+@protocol PDVolumeProtocol
+/// 时长该表
+- (void)onDurationWithMillisec:(NSInteger)millisec;
+/// 回到声音大小
+/// \param sec 第几秒? 从1开始,每个整数秒会有一个之前一秒钟的平均音量
+///
+/// \param volume 单位分贝
+///
+- (void)onVolumeWithSec:(NSInteger)sec volume:(NSInteger)volume;
+/// 回到声音大小
+/// \param mescIndex 每二十毫秒为一个间隔,从 0 开始,每二十毫秒对应一个分贝值
+///
+/// \param volume 单位分贝
+///
+- (void)onVolumePerTwentyMsecWithMescSecond:(NSInteger)mescSecond volume:(NSInteger)volume;
+@end
+
+
+
+/// 录音笔固件升级信息
+SWIFT_CLASS("_TtC11PlaudBleSDK10UpdateInfo")
+@interface UpdateInfo : NSObject
+/// 哪个录音笔?
+@property (nonatomic, copy) NSString * _Nonnull sn;
+/// 固件版本 (例:T0004)
+@property (nonatomic, copy) NSString * _Nonnull swVersion;
+/// 当前版本 (例:V1.0.0)
+@property (nonatomic, copy) NSString * _Nonnull currentVersion;
+/// 目标版本, 为空表示没有升级版本
+@property (nonatomic, copy) NSString * _Nonnull version;
+/// 下载地址
+@property (nonatomic, copy) NSString * _Nonnull url;
+/// 大小
+@property (nonatomic) NSInteger size;
+/// 更新信息
+@property (nonatomic, copy) NSString * _Nonnull modifyDesc;
+/// “本次升级大约需要10分钟”
+@property (nonatomic, copy) NSString * _Nonnull updateDesc;
+@property (nonatomic, copy) NSString * _Nonnull updatePreTip;
+@property (nonatomic, copy) NSString * _Nonnull updatingTip;
+@property (nonatomic, copy) NSString * _Nonnull failureTip;
+/// 初始版本
+@property (nonatomic, copy) NSString * _Nonnull fromVersion;
+/// 目标版本
+@property (nonatomic, copy) NSString * _Nonnull toVersion;
+/// md5校验完整性
+@property (nonatomic, copy) NSString * _Nonnull md5;
+- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER;
+/// 当前录音笔是否需要升级固件?
+- (BOOL)hasNewVersion:(BleDevice * _Nonnull)device SWIFT_WARN_UNUSED_RESULT;
+/// 校验MD5, path是下载后升级包的路径
+- (BOOL)checkMD5WithPath:(NSString * _Nonnull)path SWIFT_WARN_UNUSED_RESULT;
+/// 方便打印
+- (NSString * _Nonnull)toString SWIFT_WARN_UNUSED_RESULT;
+@end
+
+
+SWIFT_PROTOCOL("_TtP11PlaudBleSDK14VolumeProtocol_")
+@protocol VolumeProtocol
+/// 时长该表
+- (void)onDurationWithMillisec:(NSInteger)millisec;
+/// 回到声音大小
+/// \param sec 第几秒? 从1开始,每个整数秒会有一个之前一秒钟的平均音量
+///
+/// \param volume 单位分贝
+///
+- (void)onVolumeWithSec:(NSInteger)sec volume:(NSInteger)volume;
+@end
+
+@class PublicKey;
+@class EncryptedMessage;
+@class PrivateKey;
+enum DigestType : NSInteger;
+@class Signature;
+@class VerificationResult;
+
+SWIFT_CLASS_NAMED("_objc_ClearMessage")
+@interface ClearMessage : NSObject
+@property (nonatomic, readonly, copy) NSString * _Nonnull base64String;
+@property (nonatomic, readonly, copy) NSData * _Nonnull data;
+- (nonnull instancetype)initWithData:(NSData * _Nonnull)data OBJC_DESIGNATED_INITIALIZER;
+- (nullable instancetype)initWithString:(NSString * _Nonnull)string using:(NSUInteger)rawEncoding error:(NSError * _Nullable * _Nullable)error OBJC_DESIGNATED_INITIALIZER;
+- (nullable instancetype)initWithBase64Encoded:(NSString * _Nonnull)base64String error:(NSError * _Nullable * _Nullable)error OBJC_DESIGNATED_INITIALIZER;
+- (NSString * _Nullable)stringWithEncoding:(NSUInteger)rawEncoding error:(NSError * _Nullable * _Nullable)error SWIFT_WARN_UNUSED_RESULT;
+- (EncryptedMessage * _Nullable)encryptedWith:(PublicKey * _Nonnull)key padding:(SecPadding)padding error:(NSError * _Nullable * _Nullable)error SWIFT_WARN_UNUSED_RESULT;
+- (Signature * _Nullable)signedWith:(PrivateKey * _Nonnull)key digestType:(enum DigestType)digestType error:(NSError * _Nullable * _Nullable)error SWIFT_WARN_UNUSED_RESULT;
+- (VerificationResult * _Nullable)verifyWith:(PublicKey * _Nonnull)key signature:(Signature * _Nonnull)signature digestType:(enum DigestType)digestType error:(NSError * _Nullable * _Nullable)error SWIFT_WARN_UNUSED_RESULT;
+- (nonnull instancetype)init SWIFT_UNAVAILABLE;
++ (nonnull instancetype)new SWIFT_UNAVAILABLE_MSG("-init is unavailable");
+@end
+
+
+SWIFT_CLASS_NAMED("_objc_EncryptedMessage")
+@interface EncryptedMessage : NSObject
+@property (nonatomic, readonly, copy) NSString * _Nonnull base64String;
+@property (nonatomic, readonly, copy) NSData * _Nonnull data;
+- (nonnull instancetype)initWithData:(NSData * _Nonnull)data OBJC_DESIGNATED_INITIALIZER;
+- (nullable instancetype)initWithBase64Encoded:(NSString * _Nonnull)base64String error:(NSError * _Nullable * _Nullable)error OBJC_DESIGNATED_INITIALIZER;
+- (ClearMessage * _Nullable)decryptedWith:(PrivateKey * _Nonnull)key padding:(SecPadding)padding error:(NSError * _Nullable * _Nullable)error SWIFT_WARN_UNUSED_RESULT;
+- (nonnull instancetype)init SWIFT_UNAVAILABLE;
++ (nonnull instancetype)new SWIFT_UNAVAILABLE_MSG("-init is unavailable");
+@end
+
+@class NSBundle;
+
+SWIFT_CLASS_NAMED("_objc_PrivateKey")
+@interface PrivateKey : NSObject
+@property (nonatomic, readonly) SecKeyRef _Nonnull reference;
+@property (nonatomic, readonly, copy) NSData * _Nullable originalData;
+- (NSString * _Nullable)pemStringAndReturnError:(NSError * _Nullable * _Nullable)error SWIFT_WARN_UNUSED_RESULT;
+- (NSData * _Nullable)dataAndReturnError:(NSError * _Nullable * _Nullable)error SWIFT_WARN_UNUSED_RESULT;
+- (NSString * _Nullable)base64StringAndReturnError:(NSError * _Nullable * _Nullable)error SWIFT_WARN_UNUSED_RESULT;
+- (nullable instancetype)initWithData:(NSData * _Nonnull)data error:(NSError * _Nullable * _Nullable)error OBJC_DESIGNATED_INITIALIZER;
+- (nullable instancetype)initWithReference:(SecKeyRef _Nonnull)reference error:(NSError * _Nullable * _Nullable)error OBJC_DESIGNATED_INITIALIZER;
+- (nullable instancetype)initWithBase64Encoded:(NSString * _Nonnull)base64String error:(NSError * _Nullable * _Nullable)error OBJC_DESIGNATED_INITIALIZER;
+- (nullable instancetype)initWithPemEncoded:(NSString * _Nonnull)pemString error:(NSError * _Nullable * _Nullable)error OBJC_DESIGNATED_INITIALIZER;
+- (nullable instancetype)initWithPemNamed:(NSString * _Nonnull)pemName in:(NSBundle * _Nonnull)bundle error:(NSError * _Nullable * _Nullable)error OBJC_DESIGNATED_INITIALIZER;
+- (nullable instancetype)initWithDerNamed:(NSString * _Nonnull)derName in:(NSBundle * _Nonnull)bundle error:(NSError * _Nullable * _Nullable)error OBJC_DESIGNATED_INITIALIZER;
+- (nonnull instancetype)init SWIFT_UNAVAILABLE;
++ (nonnull instancetype)new SWIFT_UNAVAILABLE_MSG("-init is unavailable");
+@end
+
+
+SWIFT_CLASS_NAMED("_objc_PublicKey")
+@interface PublicKey : NSObject
+@property (nonatomic, readonly) SecKeyRef _Nonnull reference;
+@property (nonatomic, readonly, copy) NSData * _Nullable originalData;
+- (NSString * _Nullable)pemStringAndReturnError:(NSError * _Nullable * _Nullable)error SWIFT_WARN_UNUSED_RESULT;
+- (NSData * _Nullable)dataAndReturnError:(NSError * _Nullable * _Nullable)error SWIFT_WARN_UNUSED_RESULT;
+- (NSString * _Nullable)base64StringAndReturnError:(NSError * _Nullable * _Nullable)error SWIFT_WARN_UNUSED_RESULT;
+- (nullable instancetype)initWithData:(NSData * _Nonnull)data error:(NSError * _Nullable * _Nullable)error OBJC_DESIGNATED_INITIALIZER;
+- (nullable instancetype)initWithReference:(SecKeyRef _Nonnull)reference error:(NSError * _Nullable * _Nullable)error OBJC_DESIGNATED_INITIALIZER;
+- (nullable instancetype)initWithBase64Encoded:(NSString * _Nonnull)base64String error:(NSError * _Nullable * _Nullable)error OBJC_DESIGNATED_INITIALIZER;
+- (nullable instancetype)initWithPemEncoded:(NSString * _Nonnull)pemString error:(NSError * _Nullable * _Nullable)error OBJC_DESIGNATED_INITIALIZER;
+- (nullable instancetype)initWithPemNamed:(NSString * _Nonnull)pemName in:(NSBundle * _Nonnull)bundle error:(NSError * _Nullable * _Nullable)error OBJC_DESIGNATED_INITIALIZER;
+- (nullable instancetype)initWithDerNamed:(NSString * _Nonnull)derName in:(NSBundle * _Nonnull)bundle error:(NSError * _Nullable * _Nullable)error OBJC_DESIGNATED_INITIALIZER;
++ (NSArray * _Nonnull)publicKeysWithPemEncoded:(NSString * _Nonnull)pemString SWIFT_WARN_UNUSED_RESULT;
+- (nonnull instancetype)init SWIFT_UNAVAILABLE;
++ (nonnull instancetype)new SWIFT_UNAVAILABLE_MSG("-init is unavailable");
+@end
+
+
+SWIFT_CLASS_NAMED("_objc_Signature")
+@interface Signature : NSObject
+@property (nonatomic, readonly, copy) NSString * _Nonnull base64String;
+@property (nonatomic, readonly, copy) NSData * _Nonnull data;
+- (nonnull instancetype)initWithData:(NSData * _Nonnull)data OBJC_DESIGNATED_INITIALIZER;
+- (nullable instancetype)initWithBase64Encoded:(NSString * _Nonnull)base64String error:(NSError * _Nullable * _Nullable)error OBJC_DESIGNATED_INITIALIZER;
+- (nonnull instancetype)init SWIFT_UNAVAILABLE;
++ (nonnull instancetype)new SWIFT_UNAVAILABLE_MSG("-init is unavailable");
+@end
+
+typedef SWIFT_ENUM(NSInteger, DigestType, open) {
+ DigestTypeSha1 = 0,
+ DigestTypeSha224 = 1,
+ DigestTypeSha256 = 2,
+ DigestTypeSha384 = 3,
+ DigestTypeSha512 = 4,
+};
+
+
+SWIFT_CLASS_NAMED("_objc_VerificationResult")
+@interface VerificationResult : NSObject
+@property (nonatomic, readonly) BOOL isSuccessful;
+- (nonnull instancetype)init SWIFT_UNAVAILABLE;
++ (nonnull instancetype)new SWIFT_UNAVAILABLE_MSG("-init is unavailable");
+@end
+
+#endif
+#if __has_attribute(external_source_symbol)
+# pragma clang attribute pop
+#endif
+#if defined(__cplusplus)
+#endif
+#pragma clang diagnostic pop
+#endif
+
+#else
+#error unsupported Swift architecture
+#endif
diff --git a/modules/plaud-sdk/ios/Frameworks/PlaudBleSDK.xcframework/ios-arm64/PlaudBleSDK.framework/Headers/PlaudBleSDK.h b/modules/plaud-sdk/ios/Frameworks/PlaudBleSDK.xcframework/ios-arm64/PlaudBleSDK.framework/Headers/PlaudBleSDK.h
new file mode 100644
index 0000000..946af2c
--- /dev/null
+++ b/modules/plaud-sdk/ios/Frameworks/PlaudBleSDK.xcframework/ios-arm64/PlaudBleSDK.framework/Headers/PlaudBleSDK.h
@@ -0,0 +1,33 @@
+//
+// PlaudBleSDK.h
+// PlaudBleSDK
+//
+// Copyright © 2025 NiceBuild. All rights reserved.
+//
+
+#import
+#import
+
+//! Project version number for PlaudBleSDK.
+FOUNDATION_EXPORT double PlaudBleSDKVersionNumber;
+
+//! Project version string for PlaudBleSDK.
+FOUNDATION_EXPORT const unsigned char PlaudBleSDKVersionString[];
+
+// ObjC types from the embedded PenBleSDK static library
+#import
+#import
+#import
+#import
+#import
+#import
+#import
+#import
+#import
+#import
+
+// PlaudBleSDK-Swift.h is auto-generated by Xcode (all Swift @objc types are
+// compiled directly into this framework — no separate PenBleSDK module needed).
+#if __has_include()
+#import
+#endif
diff --git a/modules/plaud-sdk/ios/Frameworks/PlaudBleSDK.xcframework/ios-arm64/PlaudBleSDK.framework/Headers/SwiftyRSA.h b/modules/plaud-sdk/ios/Frameworks/PlaudBleSDK.xcframework/ios-arm64/PlaudBleSDK.framework/Headers/SwiftyRSA.h
new file mode 100644
index 0000000..32f2d0a
--- /dev/null
+++ b/modules/plaud-sdk/ios/Frameworks/PlaudBleSDK.xcframework/ios-arm64/PlaudBleSDK.framework/Headers/SwiftyRSA.h
@@ -0,0 +1,19 @@
+//
+// SwiftyRSA.h
+// SwiftyRSA
+//
+// Created by Loïs Di Qual on 7/2/15.
+// Copyright (c) 2015 Scoop. All rights reserved.
+//
+
+#import
+
+//! Project version number for SwiftyRSA.
+FOUNDATION_EXPORT double SwiftyRSAVersionNumber;
+
+//! Project version string for SwiftyRSA.
+FOUNDATION_EXPORT const unsigned char SwiftyRSAVersionString[];
+
+// In this header, you should import all the public headers of your framework using statements like #import
+
+#import
diff --git a/modules/plaud-sdk/ios/Frameworks/PlaudBleSDK.xcframework/ios-arm64/PlaudBleSDK.framework/Headers/Transcode.h b/modules/plaud-sdk/ios/Frameworks/PlaudBleSDK.xcframework/ios-arm64/PlaudBleSDK.framework/Headers/Transcode.h
new file mode 100644
index 0000000..4bd5e4d
--- /dev/null
+++ b/modules/plaud-sdk/ios/Frameworks/PlaudBleSDK.xcframework/ios-arm64/PlaudBleSDK.framework/Headers/Transcode.h
@@ -0,0 +1,52 @@
+//
+// Transcode.h
+// PenBleSDK
+//
+// Created by 天诺泰 on 2018/11/12.
+// Copyright © 2018 天诺泰. All rights reserved.
+//
+
+#import
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface Transcode : NSObject
+
+@property (nonatomic, assign) BOOL isProjectJT;
+
++ (instancetype _Nonnull)shared;
+
+
++ (double)volume:(NSData *)pcmData buff:(short [80*4])buff;
++ (double)volume:(NSData *)pcmData;
+
+
+/// pcm转wav
++ (void)translatePcmFile:(NSString *)pcmPath toWavFile:(NSString *)wavPath withChannels:(uint32_t)channels simpleRate:(uint32_t)simpleRate;
+
+/// 生成Wav头信息
++ (NSData *)generateWavHeaderWithPcmLen:(uint32_t)pcmLen channels:(uint32_t)channels sampleRate:(uint32_t)sampleRate;
+
+/// 获取文件的crc
++ (uint16_t)getCrc:(NSString *)filePath;
+/// 检查文件的crc
++ (BOOL)checkCrc:(uint16_t)crc withFile:(NSString *)filePath;
+
+/**
+ 分离双声道wave文件为左右声道两个文件
+
+ @param wavePath wave文件路径
+ @param leftPath 左声道文件路径
+ @param rightPath 右声道文件路径
+ @param handle block回调
+ */
++ (void)divide:(NSString *)wavePath toLeft:(NSString *)leftPath andRight:(NSString *)rightPath handle:(void(^_Nullable)(void))handle;
+
+/// 获取偏移量地址
+long calculate(void);
+
+
+@end
+
+NS_ASSUME_NONNULL_END
+
diff --git a/modules/plaud-sdk/ios/Frameworks/PlaudBleSDK.xcframework/ios-arm64/PlaudBleSDK.framework/Info.plist b/modules/plaud-sdk/ios/Frameworks/PlaudBleSDK.xcframework/ios-arm64/PlaudBleSDK.framework/Info.plist
new file mode 100644
index 0000000..6c48b2f
--- /dev/null
+++ b/modules/plaud-sdk/ios/Frameworks/PlaudBleSDK.xcframework/ios-arm64/PlaudBleSDK.framework/Info.plist
@@ -0,0 +1,55 @@
+
+
+
+
+ BuildMachineOSBuild
+ 24G90
+ CFBundleDevelopmentRegion
+ en
+ CFBundleExecutable
+ PlaudBleSDK
+ CFBundleIdentifier
+ com.plaud.sdk.PlaudBleSDK
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ PlaudBleSDK
+ CFBundlePackageType
+ FMWK
+ CFBundleShortVersionString
+ 1.0
+ CFBundleSupportedPlatforms
+
+ iPhoneOS
+
+ CFBundleVersion
+ 1
+ DTCompiler
+ com.apple.compilers.llvm.clang.1_0
+ DTPlatformBuild
+ 22C146
+ DTPlatformName
+ iphoneos
+ DTPlatformVersion
+ 18.2
+ DTSDKBuild
+ 22C146
+ DTSDKName
+ iphoneos18.2
+ DTXcode
+ 1620
+ DTXcodeBuild
+ 16C5032a
+ MinimumOSVersion
+ 14.0
+ UIDeviceFamily
+
+ 1
+ 2
+
+ UIRequiredDeviceCapabilities
+
+ arm64
+
+
+
diff --git a/modules/plaud-sdk/ios/Frameworks/PlaudBleSDK.xcframework/ios-arm64/PlaudBleSDK.framework/Modules/PlaudBleSDK.swiftmodule/Project/arm64-apple-ios.swiftsourceinfo b/modules/plaud-sdk/ios/Frameworks/PlaudBleSDK.xcframework/ios-arm64/PlaudBleSDK.framework/Modules/PlaudBleSDK.swiftmodule/Project/arm64-apple-ios.swiftsourceinfo
new file mode 100644
index 0000000..29d1b68
Binary files /dev/null and b/modules/plaud-sdk/ios/Frameworks/PlaudBleSDK.xcframework/ios-arm64/PlaudBleSDK.framework/Modules/PlaudBleSDK.swiftmodule/Project/arm64-apple-ios.swiftsourceinfo differ
diff --git a/modules/plaud-sdk/ios/Frameworks/PlaudBleSDK.xcframework/ios-arm64/PlaudBleSDK.framework/Modules/PlaudBleSDK.swiftmodule/arm64-apple-ios.swiftdoc b/modules/plaud-sdk/ios/Frameworks/PlaudBleSDK.xcframework/ios-arm64/PlaudBleSDK.framework/Modules/PlaudBleSDK.swiftmodule/arm64-apple-ios.swiftdoc
new file mode 100644
index 0000000..c82a474
Binary files /dev/null and b/modules/plaud-sdk/ios/Frameworks/PlaudBleSDK.xcframework/ios-arm64/PlaudBleSDK.framework/Modules/PlaudBleSDK.swiftmodule/arm64-apple-ios.swiftdoc differ
diff --git a/modules/plaud-sdk/ios/Frameworks/PlaudBleSDK.xcframework/ios-arm64/PlaudBleSDK.framework/Modules/PlaudBleSDK.swiftmodule/arm64-apple-ios.swiftinterface b/modules/plaud-sdk/ios/Frameworks/PlaudBleSDK.xcframework/ios-arm64/PlaudBleSDK.framework/Modules/PlaudBleSDK.swiftmodule/arm64-apple-ios.swiftinterface
new file mode 100644
index 0000000..a000534
--- /dev/null
+++ b/modules/plaud-sdk/ios/Frameworks/PlaudBleSDK.xcframework/ios-arm64/PlaudBleSDK.framework/Modules/PlaudBleSDK.swiftmodule/arm64-apple-ios.swiftinterface
@@ -0,0 +1,1374 @@
+// swift-interface-format-version: 1.0
+// swift-compiler-version: Apple Swift version 6.0.3 effective-5.10 (swiftlang-6.0.3.1.10 clang-1600.0.30.1)
+// swift-module-flags: -target arm64-apple-ios14.0 -enable-objc-interop -enable-library-evolution -swift-version 5 -enforce-exclusivity=checked -O -enable-bare-slash-regex -module-name PlaudBleSDK
+// swift-module-flags-ignorable: -no-verify-emitted-module-interface
+import CommonCrypto
+import CoreBluetooth
+import CryptoKit
+import Foundation
+@_exported import PlaudBleSDK
+import Security
+import Swift
+import SystemConfiguration
+import UIKit
+import _Concurrency
+import _StringProcessing
+import _SwiftConcurrencyShims
+@_inheritsConvenienceInitializers @objc open class BleFile : ObjectiveC.NSObject {
+ @objc public var sn: Swift.String
+ @objc public var sessionId: Swift.Int
+ @objc public var size: Swift.Int
+ @objc public var offset: Swift.Int
+ @objc public var timezone: Swift.Int
+ @objc public var zoneMin: Swift.Int
+ @objc public var scenes: Swift.Int
+ @objc public var penCollect: Swift.Int
+ @objc public var channels: Swift.Int
+ @objc public var nsAgc: Swift.Bool
+ @objc public var isOgg: Swift.Bool
+ @objc public var isMusic: Swift.Bool {
+ @objc get
+ }
+ @objc override dynamic public init()
+ @objc public init(_ sessionId: Swift.Int, _ size: Swift.Int)
+ @objc public init(_ sn: Swift.String, _ sessionId: Swift.Int, _ size: Swift.Int)
+ @objc public init(_ sn: Swift.String, _ sessionId: Swift.Int, _ size: Swift.Int, _ channels: Swift.Int = 1, _ nsAgc: Swift.Bool = false)
+ @objc public init(_ sn: Swift.String, _ sessionId: Swift.Int, _ size: Swift.Int, _ scenes: Swift.Int, _ penCollect: Swift.Int, _ channels: Swift.Int = 1, _ nsAgc: Swift.Bool = false)
+ @objc public func duration() -> Swift.Int
+ @objc public func oggDuration() -> Swift.Int
+ @objc public func toString() -> Swift.String
+ @objc public static func calculateDuration(_ fileSize: Swift.Int, _ channel: Swift.Int, _ isOgg: Swift.Bool, _ scenes: Swift.Int = 0) -> Swift.Int
+ @objc deinit
+}
+extension PlaudBleSDK.BleFile : Foundation.NSCopying {
+ @objc dynamic public func copy(with zone: ObjectiveC.NSZone? = nil) -> Any
+ @objc dynamic public func zoneSecond() -> Swift.Int
+ @objc dynamic public func utsStamp() -> Swift.Int
+}
+@_inheritsConvenienceInitializers @objc open class GlassData : ObjectiveC.NSObject {
+ @objc public var year: Swift.Int
+ @objc public var month: Swift.Int
+ @objc public var day: Swift.Int
+ @objc public var time: Swift.Int
+ @objc override dynamic public init()
+ @objc public init(_ year: Swift.UInt16, _ month: Swift.UInt8, _ day: Swift.UInt8, _ time: Swift.UInt32)
+ @objc deinit
+}
+@objc public class BleRecordMarkingTag : ObjectiveC.NSObject {
+ @objc final public let timestamp: Swift.UInt32
+ @objc final public let type: Swift.UInt8
+ @objc final public let status: Swift.UInt8
+ @objc final public let reserved: [Swift.UInt8]
+ @objc public init(timestamp: Swift.UInt32, type: Swift.UInt8, status: Swift.UInt8, reserved: [Swift.UInt8])
+ @objc deinit
+}
+public func mlog(_ text: Swift.String, data: Foundation.Data? = nil, maxBytes: Swift.Int? = 80)
+public func wlog(_ text: Swift.String, data: Foundation.Data? = nil, maxBytes: Swift.Int? = 80)
+public typealias Int2Void = (Swift.Int) -> Swift.Void
+@objc public protocol BleAgentProtocol {
+ @objc func bleUpdatePowerLowErr()
+ @objc func bleDeviceDisconnectErr()
+ @objc func bleUDiskErr(funcName: Swift.String)
+ @objc func bleAppKeyState(result: Swift.Int)
+ @objc func bleState(powered: Swift.Bool)
+ @objc optional func bleConnectStage(sn: Swift.String?, stage: Swift.String, detail: Swift.String?)
+ @objc func bleConnectState(state: Swift.Int)
+ @objc func bleScanResult(bleDevices: [PlaudBleSDK.BleDevice])
+ @objc func bleScanOverTime()
+ @objc func bleHandshakeWait(timeout: Swift.Int)
+ @objc func bleBind(sn: Swift.String?, status: Swift.Int, protVersion: Swift.Int, timezone: Swift.Int)
+ @objc func bleDeviceName(name: Swift.String?)
+ @objc func bleHeartbeat(status: Swift.Int)
+ @objc func blePowerChange(power: Swift.Int, oldPower: Swift.Int)
+ @objc func bleChargingState(isCharging: Swift.Bool, level: Swift.Int)
+ @objc func blePenState(state: Swift.Int, privacy: Swift.Int, keyState: Swift.Int, uDisk: Swift.Int, findMyToken: Swift.Int, hasSndpKey: Swift.Int, deviceAccessToken: Swift.Int, versionType: Swift.String, versionCode: Swift.Int)
+ @objc func blePenTime(stamp: Swift.Int, timezone: Swift.Int, zoneMin: Swift.Int)
+ @objc func bleStorage(total: Swift.Int, free: Swift.Int, duration: Swift.Int)
+ @objc func blePasswordReset(password: Swift.Int)
+ @objc func bleBacklightDuration(_ duration: Swift.Int)
+ @objc func bleBacklightBright(_ bright: Swift.Int)
+ @objc func bleLanguage(_ type: Swift.Int)
+ @objc func bleRecScene(_ scene: Swift.Int)
+ @objc func bleRecMode(_ mode: Swift.Int)
+ @objc func bleVadSensitivity(_ value: Swift.Int)
+ @objc func bleBatteryMode(_ value: Swift.Int)
+ @objc func bleVpuGain(_ value: Swift.Int)
+ @objc func bleMicGain(_ value: Swift.Int)
+ @objc func bleSwitchHandler(_ id: Swift.Int)
+ @objc func bleAutoPowerOff(_ value: Swift.Int)
+ @objc func bleRawWaveEnabled(_ value: Swift.Int)
+ @objc func bleRecordingAfterDisConnetEnabled(_ value: Swift.Int)
+ @objc func bleSyncWhenIdleEnabled(_ value: Swift.Int)
+ @objc func bleFindMyState(_ value: Swift.Int)
+ @objc func bleVPUCLKState(_ value: Swift.Int)
+ @objc func bleStopRecordingAfterCharging(_ value: Swift.Int)
+ @objc func bleAutoClear(_ open: Swift.Bool)
+ @objc func bleVad(_ open: Swift.Bool)
+ @objc func bleDepair(_ status: Swift.Int)
+ @objc func bleWiFiOpen(_ status: Swift.Int, _ wifiName: Swift.String, _ wholeName: Swift.String, _ wifiPass: Swift.String)
+ @objc func bleWiFiClose(_ status: Swift.Int)
+ @objc func bleSetWiFiSsid(status: Swift.Int)
+ @objc func bleGetWiFiSsid(status: Swift.Int, ssid: Swift.String?)
+ @objc func bleVoiceAbnormal(status: Swift.Int)
+ @objc func bleWebsocketProfile(_ type: Swift.Int, _ conent: Swift.String?)
+ @objc func bleWebsocketTest(_ status: Swift.Int)
+ @objc func bleRecordStart(sessionId: Swift.Int, start: Swift.Int, status: Swift.Int, scene: Swift.Int, startTime: Swift.Int)
+ @objc func bleRecordStop(sessionId: Swift.Int, reason: Swift.Int, fileExist: Swift.Bool, fileSize: Swift.Int)
+ @objc func bleRecordPause(sessionId: Swift.Int, reason: Swift.Int, fileExist: Swift.Bool, fileSize: Swift.Int)
+ @objc func bleRecordResume(sessionId: Swift.Int, start: Swift.Int, status: Swift.Int, scene: Swift.Int, startTime: Swift.Int)
+ @objc func bleLedState(onOff: Swift.Int)
+ @objc func bleSetLedState(onOff: Swift.Int)
+ @objc func bleFileList(bleFiles: [PlaudBleSDK.BleFile])
+ @objc func bleSyncFileHead(sessionId: Swift.Int, status: Swift.Int)
+ @objc func bleSyncFileTail(sessionId: Swift.Int, crc: Swift.Int)
+ @objc func bleMarking(sessionId: Swift.Int, status: Swift.Int, markList: [Swift.UInt32])
+ @objc func bleGetRecordMarkingTags(uid: Swift.Int, totals: Swift.Int, index: Swift.Int, tags: [PlaudBleSDK.BleRecordMarkingTag])
+ @objc func bleAngles(pitchAngle: Swift.Float, rollbackAngle: Swift.Float, yawAngle: Swift.Float)
+ @objc func bleDataComplete()
+ @objc func bleData(sessionId: Swift.Int, start: Swift.Int, data: Foundation.Data)
+ @objc func deviceLogData(start: Swift.Int, data: Foundation.Data, logType: Swift.Int)
+ @objc func blePcmData(sessionId: Swift.Int, millsec: Swift.Int, pcmData: Foundation.Data, isMusic: Swift.Bool)
+ @objc func bleDecodeFail(start: Swift.Int)
+ @objc func bleSyncFileStop()
+ @objc func bleDeleteFile(sessionId: Swift.Int, status: Swift.Int)
+ @objc func bleFotaResult(uid: Swift.Int, status: Swift.Int, errmsg: Swift.String?)
+ @objc func bleFotaPackReq(uid: Swift.Int, start: Swift.Int, end: Swift.Int)
+ @objc func bleFotaPackFin(uid: Swift.Int, status: Swift.Int, errmsg: Swift.String?)
+ @objc func bleOtaDataSendFail()
+ @objc func bleRate(lossRate: Swift.Double, rate: Swift.Int, instantRate: Swift.Int)
+ @objc func blePrivacy(privacy: Swift.Int)
+ @objc func bleClearAllFile(status: Swift.Int)
+ @objc func bleDeviceStatus(status: [Swift.UInt8])
+ @objc func bleNewFeature(data: Foundation.Data)
+ @objc func bleAlarmRec(start: Swift.Int, duration: Swift.Int, repeatMode: Swift.Int)
+ @objc func bleSetActive(status: Swift.Int)
+ @objc func onBinaryFileReq(type: Swift.Int, packageOffset: Swift.Int, packageSize: Swift.Int, endStatus: Swift.Int)
+ @objc func onBinaryFileEnd(result: Swift.Int)
+ @objc func onSyncIdleWifiConfigReceived(index: Swift.UInt32, ssid: Swift.String, password: Swift.String)
+ @objc func onSyncIdleWifiConfigSet(result: Swift.Int)
+ @objc func onSyncIdleWifiListReceived(list: [Swift.UInt32])
+ @objc func onSyncIdleWifiDeleteResult(result: Swift.Int)
+ @objc func onSyncIdleWifiTestStarted(index: Swift.UInt32)
+ @objc func onSyncIdleWillStart(seconds: Swift.Int)
+ @objc func onSyncIdleWifiTestResult(index: Swift.UInt32, result: Swift.Int, rawCode: Swift.Int)
+ @objc func onResetFindmyResult(result: Swift.Int)
+ @objc func onCommonParamsSetResult(success: Swift.Bool, dataType: Swift.Int, value: Swift.String?)
+ @objc func onCommonParamsGetResult(success: Swift.Bool, dataType: Swift.Int, value: Swift.String?)
+ @objc func onSetSoundPlusTokenResult(licenseKey: Swift.String)
+ @objc func onGetSDFlashCIDResult(cid: Swift.String)
+ @objc func onGetDeviceLogList(data: Foundation.Data)
+ @objc func onSyncDeviceLogStart(data: Foundation.Data)
+ @objc func onSyncDeviceLogStop()
+ @objc func onSyncDeviceLogEnd(data: Foundation.Data)
+ @objc func onDeviceLogDeleted(data: Foundation.Data)
+}
+@objc public protocol OtaProtocol {
+ @objc func bleFotaResult(uid: Swift.Int, status: Swift.Int, errmsg: Swift.String?)
+ @objc func bleFotaPackReq(uid: Swift.Int, start: Swift.Int, end: Swift.Int)
+ @objc func bleFotaPackFin(uid: Swift.Int, status: Swift.Int, errmsg: Swift.String?)
+}
+@objc public protocol GlassProtocol {
+ @objc func glassData(_ delFlag: Swift.Int, _ dataArr: [PlaudBleSDK.GlassData])
+ @objc func glassDataClear(_ status: Swift.Int)
+}
+@_inheritsConvenienceInitializers @_hasMissingDesignatedInitializers @objc public class BleAgent : ObjectiveC.NSObject {
+ public enum ConnectStage : Swift.String {
+ case start
+ case gattConnect
+ case setNotify
+ case setBatteryNotify
+ case readBattery
+ case setDataNotify
+ case preHandshake
+ case sendRSAPublic
+ case firstHandshake
+ case twoHandshake
+ case handshakeGetSSN
+ case changeHandshakeTimeout
+ case syncTime
+ public init?(rawValue: Swift.String)
+ public typealias RawValue = Swift.String
+ public var rawValue: Swift.String {
+ get
+ }
+ }
+ public static let protocolVersionNewBatteryService: Swift.Int
+ public static let protocolVersionV20Features: Swift.Int
+ @objc public static let shared: PlaudBleSDK.BleAgent
+ public var cbManager: CoreBluetooth.CBCentralManager?
+ @objc public var bleDevice: PlaudBleSDK.BleDevice?
+ @objc weak public var delegate: (any PlaudBleSDK.BleAgentProtocol)?
+ @objc weak public var glassDelegate: (any PlaudBleSDK.GlassProtocol)?
+ weak public var otaDelegate: (any PlaudBleSDK.OtaProtocol)?
+ public var bleBlock: PlaudBleSDK.Int2Void?
+ final public let selfSignedHosts: [Swift.String]
+ @objc public var isPoweredOn: Swift.Bool {
+ get
+ }
+ @objc public var isConnected: Swift.Bool {
+ get
+ }
+ @objc public var isBinded: Swift.Bool {
+ get
+ }
+ @objc public var isOnlyOne: Swift.Bool {
+ get
+ }
+ public var userToken: Swift.String? {
+ get
+ }
+ @objc public var isRecording: Swift.Bool {
+ get
+ }
+ @objc public var needDecode: Swift.Bool {
+ get
+ }
+ @objc public var isMusic: Swift.Bool {
+ get
+ }
+ @objc public var scene: Swift.Int {
+ get
+ }
+ @objc public var settingScene: Swift.Int {
+ get
+ }
+ @objc public var sessionId: Swift.Int {
+ get
+ }
+ @objc public var isDownloading: Swift.Bool {
+ get
+ }
+ @objc public var isWiFiOpen: Swift.Bool {
+ get
+ }
+ @objc public var repeatCommondInterval: Swift.Int
+ @objc public var cmdDelegateQueue: Dispatch.DispatchQueue
+ final public let parseQueue: Dispatch.DispatchQueue
+ public var customerToken: Swift.String? {
+ get
+ }
+ @objc public var isUsbState: Swift.Bool {
+ @objc get
+ @objc set
+ }
+ @objc public var isCharging: Swift.Bool {
+ @objc get
+ @objc set
+ }
+ @objc public var flutterMapData: [Swift.String : Any]
+ @objc public var secretPackages: [Foundation.Data]
+ @objc public var secretIndex: Swift.Int
+ @objc public var secretCount: Swift.Int
+ @objc public var chacha20Key: Foundation.Data?
+ @objc public var chacha20Nonce: Foundation.Data?
+ @objc public var chacha20AD: Foundation.Data?
+ @objc public var wifiUseAes: Swift.Bool
+ @objc public var globalSendSeq: Swift.Int
+ @objc public var globalReceiveSeq: Swift.Int
+ @objc public var versionType: Swift.String
+ @objc public var versionCode: Swift.Int
+ @objc public func setWiFiState(_ connected: Swift.Bool)
+ @objc public func setUserIdentifier(_ appKey: Swift.String, _ bindToken: Swift.String, _ hkServer: Swift.Bool = false)
+ @objc public func initBluetooth()
+ @objc public func disInitBluetooth()
+ @objc public func checkAppKey(_ appKey: Swift.String)
+ @objc public func setBinding(_ token: Swift.String)
+ @objc public func setFilter(name: Swift.String?)
+ @objc public func setFilter(_ names: [Swift.String])
+ @objc public func openLog(_ opened: Swift.Bool, logBlock: ((Swift.String) -> Swift.Void)? = nil, wlogBlock: ((Swift.String) -> Swift.Void)? = nil)
+ @objc public func isDeviceConnect() -> Swift.Bool
+ @objc public func startScan()
+ @objc public func startLoopScan()
+ @objc public func stopScan()
+ @objc public func connectBleDevice(bleDevice: PlaudBleSDK.BleDevice, _ devToken: Swift.String? = nil, _ userName: Swift.String? = nil, _ isForceClear: Swift.Bool)
+ @objc public func disconnect()
+ @objc public func isSNTempChecked() -> Swift.Bool
+ @objc public func reCheckSNIfNeed()
+ @objc public func readPower()
+ @objc public func getChargingState()
+ @objc public func getState()
+ @objc public func depair(clear: Swift.Bool = false)
+ @objc public func getStorage()
+ @objc public func appResetPassword()
+ @objc public func readBacklightDuration()
+ @objc public func setBacklightDuration(type: Swift.Int)
+ public func setBacklight(duration: PlaudBleSDK.BacklightDuration)
+ @objc public func readBacklightBright()
+ @objc public func setBacklightBright(type: Swift.Int)
+ public func setBacklight(bright: PlaudBleSDK.BacklightBright)
+ @objc public func readLanguage()
+ @objc public func setLanguage(type: Swift.Int)
+ public func setLanguage(type: PlaudBleSDK.LanguageType)
+ public func openVAD(open: Swift.Bool)
+ @objc public func setRecScene(value: Swift.Int)
+ public func setRecScene(type: PlaudBleSDK.RecScene)
+ @objc public func readRecScene()
+ @objc public func setRecMode(value: Swift.Int)
+ public func setRecMode(type: PlaudBleSDK.RecMode)
+ @objc public func readRecMode()
+ @objc public func setVadSensitivity(sensitivity: Swift.Int)
+ public func setVadSensitivity(sensitivity: PlaudBleSDK.VadSensitivity)
+ @objc public func readVadSensitivity()
+ @objc public func setVpuGain(gain: Swift.Int)
+ public func setVpuGain(gain: PlaudBleSDK.VpuGain)
+ @objc public func readVpuGain()
+ @objc public func setMicGain(value: Swift.Int)
+ @objc public func readBatteryMode()
+ @objc public func setBatteryMode(value: Swift.Int)
+ @objc public func readMicGain()
+ @objc public func setSwitchHandler(id: Swift.Int)
+ @objc public func readSwitchHandler()
+ @objc public func setAutoPowerOff(value: Swift.Int)
+ @objc public func readAutoPowerOff()
+ @objc public func setRawWaveEnabled(value: Swift.Int)
+ @objc public func readRawWaveEnabled()
+ @objc public func readRecordingAfterDisConnetEnabled()
+ @objc public func setRecordingAfterDisConnetEnabled(value: Swift.Int)
+ @objc public func readSyncWhenIdleEnabled()
+ @objc public func setSyncWhenIdleEnabled(value: Swift.Int)
+ @objc public func setFindMyState(value: Swift.Int)
+ @objc public func readFindMyState()
+ @objc public func setVPUCLK(value: Swift.Int)
+ @objc public func readVPUCLK()
+ @objc public func setStopRecordingAfterCharging(value: Swift.Int)
+ @objc public func readStopRecordingAfterCharging()
+ @objc public func setBleName(name: Swift.String)
+ @objc public func getDeviceLogList(logType: Swift.Int)
+ @objc public func startSyncDeviceLogFile(logType: Swift.Int)
+ @objc public func stopSyncDeviceLogFile()
+ @objc public func deleteDeviceLogFile(logType: Swift.Int)
+ @objc public func readBleName()
+ @objc public func operateWiFi(open: Swift.Bool, isOTA: Swift.Bool)
+ @objc public func readGlassData(uid: Swift.Int)
+ @objc public func clearGlassData()
+ @objc public func readAutoClear()
+ @objc public func saveAutoClear(_ open: Swift.Bool)
+ @objc public func startRecord(_ scene: Swift.Int = 0)
+ @objc public func stopRecord()
+ @objc public func pauseRecord(_ sessionId: Swift.Int)
+ @objc public func resumeRecord(_ sessionId: Swift.Int)
+ @objc public func getLedState()
+ @objc public func setLedState(onOff: Swift.Int)
+ @objc public func getFileList(uid: Swift.Int, sessionId: Swift.Int, onlyOne: Swift.Bool = false)
+ @objc public func syncFile(sessionId: Swift.Int, start: Swift.Int, end: Swift.Int, decode: Swift.Bool)
+ @objc public func stopSyncFile()
+ @objc public func deleteFile(sessionId: Swift.Int)
+ @objc public func getMarking(_ sessionId: Swift.Int)
+ @objc public func getRecordMarkingTags(uid: Swift.Int, startTimestamp: Swift.Int, endTimestamp: Swift.Int)
+ @objc public func pushFotaInfo(_ uid: Swift.Int, _ fromVersion: Swift.String, _ toVersion: Swift.String, _ thirdVersion: Swift.Int = 0, _ fileSize: Swift.Int, _ crc: Swift.Int)
+ public func pushFotaInfo(_ uid: Swift.Int, _ fromVersion: Swift.Int, _ fromVersionType: Swift.Character, _ toVersion: Swift.Int, _ toVersionType: Swift.Character, _ thirdVersion: Swift.Int = 0, _ fileSize: Swift.Int, _ crc: Swift.Int)
+ @objc public func pushFotaInfo(_ uid: Swift.Int, _ fromVersion: Swift.Int, _ fromVersionType: Swift.String, _ toVersion: Swift.Int, _ toVersionType: Swift.String, _ thirdVersion: Swift.Int = 0, _ fileSize: Swift.Int, _ crc: Swift.Int)
+ @objc public func pushFotaComplete(_ uid: Swift.Int, _ status: Swift.Int)
+ @objc public func pushFotaPack(_ offset: Swift.Int, packData: Foundation.Data, postDelayUs: Foundation.NSNumber?)
+ @available(iOS 11.0, *)
+ @objc public func canSendWithoutResponse() -> Swift.Bool
+ public func startBleRateTest(_ packSize: Swift.Int = 80)
+ public func stopBleRateTest()
+ @objc public func restoreFactory()
+ @objc public func setPrivacy(onOff: Swift.Int)
+ @objc public func clearAllFile()
+ @objc public func setDeviceActive(status: Swift.Int)
+ @objc public func setHeartBeat(status: Swift.Int)
+ @objc public func setWiFiSsid(ssid: Swift.String, password: Swift.String, isTest: Swift.Bool = false)
+ @objc public func getWiFiSsid()
+ @objc public func getUpdateInfo(_ callback: @escaping (Swift.Int, PlaudBleSDK.UpdateInfo?) -> Swift.Void)
+ @objc public func setWebsocketProfile(type: Swift.Int, content: Swift.String)
+ public func setWebsocketProfile(type: PlaudBleSDK.WebsocketType, content: Swift.String)
+ @objc public func getWebsocketProfile(type: Swift.Int)
+ public func getWebsocketProfile(type: PlaudBleSDK.WebsocketType)
+ @objc public func testWebsocket()
+ @objc public func setAlarmRec(start: Swift.Int, duration: Swift.Int, repeatMode: Swift.Int)
+ @objc public func getAlarmRec()
+ @objc public func sendBinFileInfo(type: Swift.Int, totalSize: Swift.Int)
+ @objc public func sendBinFileData(type: Swift.Int, packageOffset: Swift.Int, packageSize: Swift.Int, data: Foundation.Data)
+ @objc public func sendBinFileCheckSumResult(type: Swift.Int, crc: Swift.Int)
+ @objc public func getSyncInIdleWifiConfig(wifiIndex: Swift.UInt32)
+ @objc public func setSyncInIdleWifiConfig(operation: Swift.Int, wifiIndex: Swift.UInt32, ssid: Swift.String, password: Swift.String)
+ @objc public func deleteSyncInIdleWifiConfig(wifiIndices: [Swift.UInt32])
+ @objc public func resetFindmy()
+ @objc public func getSyncInIdleWifiList()
+ @objc public func setSyncInIdleWifiTest(wifiIndex: Swift.UInt32)
+ @objc public func getSyncInIdleWifiTestResult(wifiIndex: Swift.UInt32)
+ @objc public func setSoundPlusToken(licenseKey: Swift.String)
+ @objc public func setCommonParams(dataType: Swift.Int, value: Swift.String)
+ @objc public func getCommonParams(dataType: Swift.Int)
+ @objc public func getSDFLASHCID()
+ @objc public func getNewFeature(_ data: Foundation.Data)
+ @objc public func getDeviceStatus()
+ @objc deinit
+}
+extension PlaudBleSDK.BleAgent : CoreBluetooth.CBCentralManagerDelegate {
+ @objc dynamic public func centralManagerDidUpdateState(_ central: CoreBluetooth.CBCentralManager)
+ @objc dynamic public func centralManager(_ central: CoreBluetooth.CBCentralManager, didDiscover peripheral: CoreBluetooth.CBPeripheral, advertisementData: [Swift.String : Any], rssi RSSI: Foundation.NSNumber)
+ @objc dynamic public func centralManager(_ central: CoreBluetooth.CBCentralManager, didConnect peripheral: CoreBluetooth.CBPeripheral)
+ @objc dynamic public func centralManager(_ central: CoreBluetooth.CBCentralManager, didFailToConnect peripheral: CoreBluetooth.CBPeripheral, error: (any Swift.Error)?)
+ @objc dynamic public func centralManager(_ central: CoreBluetooth.CBCentralManager, didDisconnectPeripheral peripheral: CoreBluetooth.CBPeripheral, error: (any Swift.Error)?)
+}
+extension PlaudBleSDK.BleAgent {
+ @objc dynamic public func isAuthOk() -> Swift.Bool
+ @objc dynamic public func toSingleChannel(_ pcmData: Foundation.Data) -> Foundation.Data
+}
+extension PlaudBleSDK.BleAgent : PlaudBleSDK.JXPcmProcessDelegate {
+ @objc dynamic public func onPcmData(_ sessionId: Swift.Int, _ millSec: Swift.Int, _ pcmData: Foundation.Data)
+ @objc dynamic public func onDecodeErr(_ millSec: Swift.Int)
+}
+extension Foundation.Data {
+ public var hexDescription: Swift.String {
+ get
+ }
+}
+extension Foundation.Date {
+ public var stampMillisec: Swift.Int {
+ get
+ }
+ public var stampSec: Swift.Int {
+ get
+ }
+ public var logTime: Swift.String {
+ get
+ }
+}
+extension Foundation.TimeZone {
+ public var numValue: Swift.Int {
+ get
+ }
+ public func getHourAndMin() -> (Swift.Int, Swift.Int)
+}
+public enum CustomerAuth {
+ case temp
+ case notRestricted
+ case restricted
+ public static func == (a: PlaudBleSDK.CustomerAuth, b: PlaudBleSDK.CustomerAuth) -> Swift.Bool
+ public func hash(into hasher: inout Swift.Hasher)
+ public var hashValue: Swift.Int {
+ get
+ }
+}
+public enum SSNAuth {
+ case temp
+ case notRestricted
+ case restricted
+ public static func == (a: PlaudBleSDK.SSNAuth, b: PlaudBleSDK.SSNAuth) -> Swift.Bool
+ public func hash(into hasher: inout Swift.Hasher)
+ public var hashValue: Swift.Int {
+ get
+ }
+}
+extension PlaudBleSDK.BleAgent : Foundation.URLSessionDelegate {
+ @objc dynamic public func urlSession(_ session: Foundation.URLSession, didReceive challenge: Foundation.URLAuthenticationChallenge, completionHandler: @escaping (Foundation.URLSession.AuthChallengeDisposition, Foundation.URLCredential?) -> Swift.Void)
+ public func selfSignedTrust(session: Foundation.URLSession, challenge: Foundation.URLAuthenticationChallenge) -> (Foundation.URLSession.AuthChallengeDisposition, Foundation.URLCredential?)
+}
+extension Swift.String {
+ public var md5Hex: Swift.String {
+ get
+ }
+ public var dictionary: [Swift.String : Any] {
+ get
+ }
+ public var isNotEmpty: Swift.Bool {
+ get
+ }
+}
+extension Foundation.Data {
+ public var dictionary: [Swift.String : Any] {
+ get
+ }
+}
+#if compiler(>=5.3) && $NoncopyableGenerics
+extension Swift.Optional {
+ public var exist: Swift.Bool {
+ get
+ }
+ public var stringValue: Swift.String {
+ get
+ }
+ public var intValue: Swift.Int {
+ get
+ }
+ public var doubleValue: Swift.Double {
+ get
+ }
+ public var boolValue: Swift.Bool {
+ get
+ }
+ public var arrayValue: [[Swift.String : Any]] {
+ get
+ }
+ public var jsonObj: [Swift.String : Any]? {
+ get
+ }
+ public var jsonValue: [Swift.String : Any] {
+ get
+ }
+}
+#else
+extension Swift.Optional {
+ public var exist: Swift.Bool {
+ get
+ }
+ public var stringValue: Swift.String {
+ get
+ }
+ public var intValue: Swift.Int {
+ get
+ }
+ public var doubleValue: Swift.Double {
+ get
+ }
+ public var boolValue: Swift.Bool {
+ get
+ }
+ public var arrayValue: [[Swift.String : Any]] {
+ get
+ }
+ public var jsonObj: [Swift.String : Any]? {
+ get
+ }
+ public var jsonValue: [Swift.String : Any] {
+ get
+ }
+}
+#endif
+@objc open class BleDevice : ObjectiveC.NSObject {
+ public var peripheral: CoreBluetooth.CBPeripheral!
+ @objc public var name: Swift.String
+ @objc public var uuid: Swift.String
+ @objc public var rssi: Swift.Float
+ @objc public var manufacturer: Swift.String
+ @objc public var projectCode: Swift.Int
+ public var versionType: Swift.Character
+ @objc public var versionTypeStr: Swift.String
+ @objc public var versionCode: Swift.Int
+ @objc public var serialNumber: Swift.String
+ @objc public var bindCode: Swift.Int
+ @objc public var power: Swift.Int
+ @objc public var isCharging: Swift.Bool
+ @objc public var total: Swift.Int
+ @objc public var free: Swift.Int
+ @objc public var duration: Swift.Int
+ @objc public var timezone: Swift.Int
+ @objc public var zoneMin: Swift.Int
+ @objc public var channels: Swift.Int
+ @objc public var supportWiFi: Swift.Bool
+ @objc public var nsAgc: Swift.Bool
+ @objc public var isOgg: Swift.Bool
+ @objc public var autoClear: Swift.Int
+ @objc public var hideLed: Swift.Int
+ @objc public var state: Swift.Int
+ @objc public var privacy: Swift.Int
+ @objc public var keyState: Swift.Int
+ @objc public var uDisk: Swift.Int
+ @objc public var findmyToken: Swift.Int
+ @objc public var hasFota: Swift.Bool
+ public var ssn: Swift.String
+ public var protVersion: Swift.Int
+ public var isVadOpen: Swift.Bool
+ @objc public var wholeName: Swift.String {
+ @objc get
+ }
+ @objc public var wifiName: Swift.String {
+ @objc get
+ }
+ @objc public init(sn: Swift.String)
+ public init(peripheral: CoreBluetooth.CBPeripheral, rssi: Foundation.NSNumber, manufacturerData: Foundation.Data, localName: Swift.String?)
+ @objc public func wholeVersion() -> Swift.String
+ @objc public func toString() -> Swift.String
+ @objc public func zoneSecond() -> Swift.Int
+ @objc deinit
+}
+extension PlaudBleSDK.BleDevice : CoreBluetooth.CBPeripheralDelegate {
+ @objc dynamic public func peripheral(_ peripheral: CoreBluetooth.CBPeripheral, didDiscoverServices error: (any Swift.Error)?)
+ @objc dynamic public func peripheral(_ peripheral: CoreBluetooth.CBPeripheral, didDiscoverCharacteristicsFor service: CoreBluetooth.CBService, error: (any Swift.Error)?)
+ @objc dynamic public func peripheral(_ peripheral: CoreBluetooth.CBPeripheral, didUpdateNotificationStateFor characteristic: CoreBluetooth.CBCharacteristic, error: (any Swift.Error)?)
+ @objc dynamic public func peripheral(_ peripheral: CoreBluetooth.CBPeripheral, didUpdateValueFor characteristic: CoreBluetooth.CBCharacteristic, error: (any Swift.Error)?)
+ @objc dynamic public func peripheral(_ peripheral: CoreBluetooth.CBPeripheral, didWriteValueFor characteristic: CoreBluetooth.CBCharacteristic, error: (any Swift.Error)?)
+}
+public enum CommonType : Swift.Int {
+ case LightDuration
+ case LightBright
+ case Language
+ case AutoClear
+ case VAD
+ case RecScene
+ case RecMode
+ case VadSensitivity
+ case VpuGain
+ case BatteryMode
+ case MicGain
+ case WiFiChannel
+ case SwitchHandle
+ case AutoPowerOff
+ case RawWaveEnabled
+ case RecordingAfterDisConnet
+ case SyncWhenIdle
+ case FindMyState
+ case VPUCLK
+ case StopRecordAfterCharging
+ public init?(rawValue: Swift.Int)
+ public typealias RawValue = Swift.Int
+ public var rawValue: Swift.Int {
+ get
+ }
+}
+public enum CommonAction : Swift.Int {
+ case Read
+ case Set
+ public init?(rawValue: Swift.Int)
+ public typealias RawValue = Swift.Int
+ public var rawValue: Swift.Int {
+ get
+ }
+}
+public enum BacklightBright : Swift.Int {
+ case Bright1
+ case Bright2, Bright3, Bright4, Bright5, Bright6
+ public init?(rawValue: Swift.Int)
+ public typealias RawValue = Swift.Int
+ public var rawValue: Swift.Int {
+ get
+ }
+}
+public enum BacklightDuration : Swift.Int {
+ case Sec10
+ case Sec20, Sec30, SecAlways
+ public init?(rawValue: Swift.Int)
+ public typealias RawValue = Swift.Int
+ public var rawValue: Swift.Int {
+ get
+ }
+}
+public enum LanguageType : Swift.Int {
+ case SimpleChinese
+ case TradChinese
+ case English
+ public init?(rawValue: Swift.Int)
+ public typealias RawValue = Swift.Int
+ public var rawValue: Swift.Int {
+ get
+ }
+}
+public enum RecScene : Swift.Int {
+ case Unknown
+ case Normal
+ case Interview
+ case Classroom
+ case Music
+ case Meeting
+ case Memo
+ public init?(rawValue: Swift.Int)
+ public typealias RawValue = Swift.Int
+ public var rawValue: Swift.Int {
+ get
+ }
+}
+public enum RecMode : Swift.Int {
+ case Normal
+ case NC
+ public init?(rawValue: Swift.Int)
+ public typealias RawValue = Swift.Int
+ public var rawValue: Swift.Int {
+ get
+ }
+}
+public enum VadSensitivity : Swift.Int {
+ case Quality
+ case lowBitrate
+ case Normal
+ case Aggressive
+ public init?(rawValue: Swift.Int)
+ public typealias RawValue = Swift.Int
+ public var rawValue: Swift.Int {
+ get
+ }
+}
+public enum VpuGain : Swift.Int {
+ case Low
+ case Medium
+ case High
+ public init?(rawValue: Swift.Int)
+ public typealias RawValue = Swift.Int
+ public var rawValue: Swift.Int {
+ get
+ }
+}
+public enum SwitchHandlerID : Swift.Int {
+ case CallSceneSwitching
+ case Recording
+ public init?(rawValue: Swift.Int)
+ public typealias RawValue = Swift.Int
+ public var rawValue: Swift.Int {
+ get
+ }
+}
+public enum WebsocketType : Swift.UInt8 {
+ case url
+ case serToken
+ case devToken
+ public init?(rawValue: Swift.UInt8)
+ public typealias RawValue = Swift.UInt8
+ public var rawValue: Swift.UInt8 {
+ get
+ }
+}
+public enum AutoClear : Swift.Int {
+ case Close
+ case Open
+ public init?(rawValue: Swift.Int)
+ public typealias RawValue = Swift.Int
+ public var rawValue: Swift.Int {
+ get
+ }
+}
+extension PlaudBleSDK.BleAgent {
+ public func dataOfGetRecordMarkingTags(uid: Swift.Int, startTimestamp: Swift.Int, endTimestamp: Swift.Int) -> Foundation.Data
+}
+extension Foundation.Data {
+ public func subData(begin: Swift.Int, count: Swift.Int) -> Foundation.Data
+ public func safeSubdata(in range: Swift.Range) -> Foundation.Data?
+ public func safeSubdata(offset: Swift.Int, count: Swift.Int) -> Foundation.Data?
+ public var floatValue: Swift.Float {
+ get
+ }
+ public var int8: Swift.Int8 {
+ get
+ }
+ public var uint8: Swift.UInt8 {
+ get
+ }
+ public var uint16: Swift.UInt16 {
+ get
+ }
+ public var uint24: Swift.UInt32 {
+ get
+ }
+ public var uint32: Swift.UInt32 {
+ get
+ }
+ public var uint64: Swift.UInt64 {
+ get
+ }
+ public func int8(at offset: Swift.Int) -> Swift.Int
+ public func uint8(at offset: Swift.Int) -> Swift.UInt8
+ public func int16(at offset: Swift.Int) -> Swift.Int16
+ public func uint16(at offset: Swift.Int) -> Swift.UInt16
+ public func uint24(at offset: Swift.Int) -> Swift.UInt32
+ public func int32(at offset: Swift.Int) -> Swift.Int32
+ public func uint32(at offset: Swift.Int) -> Swift.UInt32
+ public func int64(at offset: Swift.Int) -> Swift.Int64
+ public func uint64(at offset: Swift.Int) -> Swift.UInt64
+ public func float(at offset: Swift.Int) -> Swift.Float
+}
+extension Swift.Int8 {
+ public var data: Foundation.Data {
+ get
+ }
+}
+extension Swift.UInt8 {
+ public var data: Foundation.Data {
+ get
+ }
+}
+extension Swift.UInt16 {
+ public var data: Foundation.Data {
+ get
+ }
+}
+extension Swift.Int16 {
+ public var data: Foundation.Data {
+ get
+ }
+}
+extension Swift.UInt32 {
+ public var data: Foundation.Data {
+ get
+ }
+ public var data24: Foundation.Data {
+ get
+ }
+ public var byteArrayLittleEndian: [Swift.UInt8] {
+ get
+ }
+}
+extension Swift.UInt64 {
+ public var data: Foundation.Data {
+ get
+ }
+}
+@_inheritsConvenienceInitializers @_hasMissingDesignatedInitializers @objc public class JXFileSoundWave : ObjectiveC.NSObject {
+ @objc public static let shared: PlaudBleSDK.JXFileSoundWave
+ @objc public func hasAvcToSoundWaveTask() -> Swift.Bool
+ @objc public func generateSoundWaveCancel()
+ @objc public func createSoundWave(_ filePath: Swift.String, _ channels: Swift.Int, _ isOgg: Swift.Bool, _ isMusic: Swift.Bool, _ callback: @escaping (Swift.Bool, Swift.Int) -> Swift.Void)
+ @objc public func avcToSoundWave(avcPath: Swift.String, channels: Swift.Int = 1, completionHandler: @escaping (Swift.Bool, Swift.Int) -> Swift.Void)
+ @objc deinit
+}
+@_inheritsConvenienceInitializers @_hasMissingDesignatedInitializers @objc public class JXRecordVolumer : ObjectiveC.NSObject {
+ @objc public static let shared: PlaudBleSDK.JXRecordVolumer
+ @objc public var waveInterval: Swift.Int
+ @objc public var volumeArr: [[Swift.Int]]
+ public var volumeMeters: [(sec: Swift.Int, volume: Swift.Int)]
+ @objc public var curSec: Swift.Int {
+ get
+ }
+ @objc public func averageVolume(_ pcmData: Foundation.Data) -> Swift.Int
+ @objc public func append(start: Swift.Int, pcmData: Foundation.Data)
+ public func middleNum(_ volumeArr: inout [Swift.Int]) -> Swift.Int
+ @objc public func reset()
+ @objc deinit
+}
+@_inheritsConvenienceInitializers @_hasMissingDesignatedInitializers @objc public class JXRecordingVolumer : ObjectiveC.NSObject {
+ @objc public static let shared: PlaudBleSDK.JXRecordingVolumer
+ @objc weak public var delegate: (any PlaudBleSDK.VolumeProtocol)?
+ @objc public var waveInterval: Swift.Int
+ @objc public var volumeArr: [[Swift.Int]] {
+ get
+ }
+ public var volumeMeters: [(sec: Swift.Int, volume: Swift.Int)] {
+ get
+ }
+ @objc public var curSec: Swift.Int {
+ get
+ }
+ @objc public var curMillisec: Swift.Int {
+ get
+ }
+ @objc public var curFileSize: Swift.Int {
+ get
+ }
+ @objc public func averageVolume(_ pcmData: Foundation.Data) -> CoreFoundation.CGFloat
+ @objc public func append(start: Swift.Int, pcmData: Foundation.Data, channels: Swift.Int = 1)
+ @objc public func append(_ millSec: Swift.Int, _ pcmData: Foundation.Data)
+ @objc public func setOldVolumeMeters(meters: [[Swift.Int]])
+ public func setOldVolumeMeters(meters: [(sec: Swift.Int, volume: Swift.Int)])
+ @objc public func reset()
+ @objc deinit
+}
+@objc public protocol VolumeProtocol {
+ @objc func onDuration(millisec: Swift.Int)
+ @objc func onVolume(sec: Swift.Int, volume: Swift.Int)
+}
+@_inheritsConvenienceInitializers @_hasMissingDesignatedInitializers @objc public class JXWaveHelper : ObjectiveC.NSObject {
+ @objc public static let shared: PlaudBleSDK.JXWaveHelper
+ @objc public static let tmpPcmPath: Swift.String
+ @objc public static let tmpWavPath: Swift.String
+ @objc public static let leftPath: Swift.String
+ @objc public static let rightPath: Swift.String
+ @objc public static let leftWavPath: Swift.String
+ @objc public static let rightWavPath: Swift.String
+ @objc public static let leftLycPath: Swift.String
+ @objc public static let rightLycPath: Swift.String
+ @objc public func pcmFileToWave(pcmFilePath: Swift.String = JXWaveHelper.tmpPcmPath, wavFilePath: Swift.String = JXWaveHelper.tmpWavPath, channels: Swift.UInt32 = 1, simpleRate: Swift.UInt32 = 16000) -> Swift.Bool
+ public func readWaveHeader(wavePath: Swift.String) -> (fileSize: Swift.Int, channel: Swift.Int, sampleRate: Swift.Int, bitRate: Swift.Int, sampleBit: Swift.Int, dataSize: Swift.Int)
+ @objc public func divideLeftAndRight(_ wavePath: Swift.String, _ leftPath: Swift.String = JXWaveHelper.leftPath, _ rightPath: Swift.String = JXWaveHelper.rightPath, handler: @escaping (Swift.Bool) -> Swift.Void)
+ @objc deinit
+}
+@_inheritsConvenienceInitializers @_hasMissingDesignatedInitializers @objc public class JXCrcHelper : ObjectiveC.NSObject {
+ @objc public static let shared: PlaudBleSDK.JXCrcHelper
+ @objc public func getCrc(path: Swift.String) -> Swift.Int
+ @objc public func checkCrc(crc: Swift.Int, ofFile path: Swift.String) -> Swift.Bool
+ @objc deinit
+}
+extension Foundation.FileManager {
+ public func fileSize(path: Swift.String) -> Swift.Int
+}
+@_hasMissingDesignatedInitializers open class NetworkReachabilityManager {
+ public enum NetworkReachabilityStatus {
+ case unknown
+ case notReachable
+ case reachable(PlaudBleSDK.NetworkReachabilityManager.ConnectionType)
+ }
+ public enum ConnectionType {
+ case ethernetOrWiFi
+ case wwan
+ public static func == (a: PlaudBleSDK.NetworkReachabilityManager.ConnectionType, b: PlaudBleSDK.NetworkReachabilityManager.ConnectionType) -> Swift.Bool
+ public func hash(into hasher: inout Swift.Hasher)
+ public var hashValue: Swift.Int {
+ get
+ }
+ }
+ public typealias Listener = (PlaudBleSDK.NetworkReachabilityManager.NetworkReachabilityStatus) -> Swift.Void
+ open var isReachable: Swift.Bool {
+ get
+ }
+ open var isReachableOnWWAN: Swift.Bool {
+ get
+ }
+ open var isReachableOnEthernetOrWiFi: Swift.Bool {
+ get
+ }
+ open var networkReachabilityStatus: PlaudBleSDK.NetworkReachabilityManager.NetworkReachabilityStatus {
+ get
+ }
+ open var listenerQueue: Dispatch.DispatchQueue
+ open var listener: PlaudBleSDK.NetworkReachabilityManager.Listener?
+ open var flags: SystemConfiguration.SCNetworkReachabilityFlags? {
+ get
+ }
+ open var previousFlags: SystemConfiguration.SCNetworkReachabilityFlags
+ convenience public init?(host: Swift.String)
+ convenience public init?()
+ @objc deinit
+ @discardableResult
+ open func startListening() -> Swift.Bool
+ open func stopListening()
+}
+extension PlaudBleSDK.NetworkReachabilityManager.NetworkReachabilityStatus : Swift.Equatable {
+}
+public func == (lhs: PlaudBleSDK.NetworkReachabilityManager.NetworkReachabilityStatus, rhs: PlaudBleSDK.NetworkReachabilityManager.NetworkReachabilityStatus) -> Swift.Bool
+@_inheritsConvenienceInitializers @objc(JXAvcDecoder) public class JXAvcDecoder : ObjectiveC.NSObject {
+ @objc final public let packSize: Swift.Int
+ @objc final public let twoChannelPackSize: Swift.Int
+ @objc final public let fourChannelPackSize: Swift.Int
+ @objc override dynamic public init()
+ @objc public func createDecoderIfNeed(_ channels: Swift.Int = 1)
+ @objc public func decode(_ data: Foundation.Data, _ channels: Swift.Int) -> Foundation.Data?
+ @objc public func releaseDecoder()
+ @objc deinit
+}
+@_inheritsConvenienceInitializers @_hasMissingDesignatedInitializers @objc public class JXFileDecoder : ObjectiveC.NSObject {
+ @objc public static let shared: PlaudBleSDK.JXFileDecoder
+ @objc public func pcmToWav(pcmPath: Swift.String, wavPath: Swift.String, channels: Swift.UInt32 = 1, simpleRate: Swift.UInt32 = 16000, completionHandler: @escaping (Swift.Bool) -> Swift.Void)
+ @objc public func resetWavHead(_ wavPath: Swift.String, _ channels: Swift.UInt32, _ sampleRate: Swift.UInt32 = 16000)
+ @objc deinit
+}
+extension PlaudBleSDK.JXFileDecoder {
+ @objc dynamic public func hasOggMulToSingleTask() -> Swift.Bool
+ @objc dynamic public func oggMulToSingleCancel()
+ @objc dynamic public func oggMulToSingle(_ mulPath: Swift.String, _ singlePath: Swift.String, _ channels: Swift.Int32, _ callback: @escaping (Swift.Bool, Swift.Int) -> Swift.Void)
+}
+extension PlaudBleSDK.JXFileDecoder {
+ @objc dynamic public func hasAvcToOggTask() -> Swift.Bool
+ @objc dynamic public func convertAvcToOggCancel()
+ @objc dynamic public func oggToOpus(_ oggPath: Swift.String, _ opusPath: Swift.String, _ channels: Swift.Int32, _ callback: @escaping (Swift.Bool) -> Swift.Void)
+ @objc dynamic public func avcToOgg(_ avcPath: Swift.String, _ oggPath: Swift.String, clearUnfinished: Swift.Bool = true, _ iflyToolongCut: Swift.Bool = true, _ channels: Swift.Int32 = 1, _ targetChannels: Swift.Int32 = 1, _ ns_agc: Swift.Bool = false, _ callback: @escaping (Swift.Bool, Swift.Int) -> Swift.Void)
+}
+extension PlaudBleSDK.JXFileDecoder {
+ @objc dynamic public func hasOggToMp3Task() -> Swift.Bool
+ @objc dynamic public func convertOggToMp3Cancel()
+ @objc dynamic public func oggToMp3(_ oggPath: Swift.String, _ mp3Path: Swift.String, _ channels: Swift.Int32, _ quality: Swift.Int32 = 4, _ callback: @escaping (Swift.Bool, Swift.Int) -> Swift.Void)
+}
+extension PlaudBleSDK.JXFileDecoder {
+ @objc dynamic public func hasAvcToMp3Task() -> Swift.Bool
+ @objc dynamic public func convertAvcToMp3Cancel()
+ @objc dynamic public func avcToMp3(avcPath: Swift.String, mp3Path: Swift.String, clearUnfinished: Swift.Bool = true, quality: Swift.Int32 = 4, channels: Swift.Int32 = 1, ns_agc: Swift.Bool = false, completionHandler: @escaping (Swift.Bool, Swift.Int) -> Swift.Void)
+}
+extension PlaudBleSDK.JXFileDecoder {
+ @objc dynamic public func hasPcmToMp3Task() -> Swift.Bool
+ @objc dynamic public func convertPcmToMp3Cancel()
+ @objc dynamic public func pcmToMp3(pcmPath: Swift.String, mp3Path: Swift.String, clearUnfinished: Swift.Bool = true, quality: Swift.Int32 = 4, channels: Swift.Int32 = 1, completionHandler: @escaping (Swift.Bool, Swift.Int) -> Swift.Void)
+}
+extension PlaudBleSDK.JXFileDecoder {
+ @objc dynamic public func hasAvcToPcmTask() -> Swift.Bool
+ @objc dynamic public func convertAvcToPcmCancel()
+ @objc dynamic public func avcToPcm(avcPath: Swift.String, pcmPath: Swift.String, clearUnfinished: Swift.Bool = true, channels: Swift.Int32 = 1, ns_agc: Swift.Bool = false, completionHandler: @escaping (Swift.Bool, Swift.Int) -> Swift.Void)
+ @objc dynamic public func oggToPcm(avcPath: Swift.String, pcmPath: Swift.String, clearUnfinished: Swift.Bool = true, channels: Swift.Int32 = 1, ns_agc: Swift.Bool = false, completionHandler: @escaping (Swift.Bool, Swift.Int) -> Swift.Void)
+}
+extension PlaudBleSDK.JXFileDecoder {
+ @objc dynamic public func hasAvcToWavTask() -> Swift.Bool
+ @objc dynamic public func convertAvcToWavCancel()
+ @objc dynamic public func avcToWav(avcPath: Swift.String, wavPath: Swift.String, channels: Swift.Int32 = 1, ns_agc: Swift.Bool = false, clearUnfinished: Swift.Bool = true, completionHandler: @escaping (Swift.Bool, Swift.Int) -> Swift.Void)
+}
+extension PlaudBleSDK.JXFileDecoder {
+ @objc dynamic public func hasAvcToNoiseReductionWav() -> Swift.Bool
+ @objc dynamic public func convertAvcToNoiseReductionWavCancel()
+ @objc dynamic public func avcToNoiseReductionWav(avcPath: Swift.String, wavPath: Swift.String, channels: Swift.Int32 = 1, sound_plus: Swift.Bool = false, noiseReductionGain: Swift.Int = 6, clearUnfinished: Swift.Bool = true, completionHandler: @escaping (Swift.Bool, Swift.Int) -> Swift.Void)
+}
+@objc public protocol JXPcmProcessDelegate {
+ @objc func onPcmData(_ sessionId: Swift.Int, _ millSec: Swift.Int, _ pcmData: Foundation.Data)
+ @objc func onDecodeErr(_ millSec: Swift.Int)
+}
+@_inheritsConvenienceInitializers @_hasMissingDesignatedInitializers @objc public class JXPcmProcess : ObjectiveC.NSObject {
+ @objc public static let shared: PlaudBleSDK.JXPcmProcess
+ @objc weak public var delegate: (any PlaudBleSDK.JXPcmProcessDelegate)?
+ @objc public var callbackQueue: Dispatch.DispatchQueue
+ @objc public func resetWith(_ sessionId: Swift.Int, _ channel: Swift.Int, _ isOgg: Swift.Bool, _ nsAgc: Swift.Bool = false)
+ @objc public func receiveData(_ sessionId: Swift.Int, _ start: Swift.Int, _ data: Foundation.Data)
+ @objc public func receiveDataBytes(_ sessionId: Swift.Int, _ start: Swift.Int, _ data: Foundation.Data)
+ @objc deinit
+}
+extension PlaudBleSDK.JXPcmProcess : PlaudBleSDK.JXPcmProcessDelegate {
+ @objc dynamic public func onPcmData(_ sessionId: Swift.Int, _ millSec: Swift.Int, _ pcmData: Foundation.Data)
+ @objc dynamic public func onDecodeErr(_ millSec: Swift.Int)
+}
+@_inheritsConvenienceInitializers @_hasMissingDesignatedInitializers @objc public class JXWave2PcmProcess : ObjectiveC.NSObject {
+ @objc public static let shared: PlaudBleSDK.JXWave2PcmProcess
+ @objc weak public var delegate: (any PlaudBleSDK.JXPcmProcessDelegate)?
+ @objc public var callbackQueue: Dispatch.DispatchQueue
+ @objc public func resetWith(_ sessionId: Swift.Int)
+ @objc public func receiveData(_ sessionId: Swift.Int, _ start: Swift.Int, _ data: Foundation.Data)
+ @objc deinit
+}
+@_inheritsConvenienceInitializers @_hasMissingDesignatedInitializers @objc public class PDFileSoundWave : ObjectiveC.NSObject {
+ @objc public static let shared: PlaudBleSDK.PDFileSoundWave
+ @objc public func hasAvcToSoundWaveTask() -> Swift.Bool
+ @objc public func generateSoundWaveCancel()
+ @objc public func createSoundWave(_ filePath: Swift.String, _ channels: Swift.Int, _ isOgg: Swift.Bool, _ isMusic: Swift.Bool, _ callback: @escaping (Swift.Bool, Swift.Int) -> Swift.Void)
+ @objc public func avcToSoundWave(avcPath: Swift.String, channels: Swift.Int = 1, completionHandler: @escaping (Swift.Bool, Swift.Int) -> Swift.Void)
+ @objc deinit
+}
+@_inheritsConvenienceInitializers @_hasMissingDesignatedInitializers @objc public class PDRecordVolumer : ObjectiveC.NSObject {
+ @objc public static let shared: PlaudBleSDK.PDRecordVolumer
+ @objc public var waveInterval: Swift.Int
+ @objc public var volumeArr: [[Swift.Int]]
+ public var volumeMeters: [(sec: Swift.Int, volume: Swift.Int)]
+ @objc public var curSec: Swift.Int {
+ get
+ }
+ @objc public func averageVolume(_ pcmData: Foundation.Data) -> Swift.Int
+ @objc public func append(start: Swift.Int, pcmData: Foundation.Data)
+ public func middleNum(_ volumeArr: inout [Swift.Int]) -> Swift.Int
+ @objc public func reset()
+ @objc deinit
+}
+@_inheritsConvenienceInitializers @_hasMissingDesignatedInitializers @objc public class PDRecordingVolumer : ObjectiveC.NSObject {
+ @objc public static let shared: PlaudBleSDK.PDRecordingVolumer
+ @objc weak public var delegate: (any PlaudBleSDK.PDVolumeProtocol)?
+ @objc public var waveInterval: Swift.Int
+ @objc public var volumeArr: [[Swift.Int]] {
+ get
+ }
+ public var volumeMeters: [(sec: Swift.Int, volume: Swift.Int)] {
+ get
+ }
+ public var volumePerTwentyMsecs: [(perTwentyMsec: Swift.Int, volume: Swift.Int)] {
+ get
+ }
+ @objc public var curSec: Swift.Int {
+ get
+ }
+ @objc public var curMillisec: Swift.Int {
+ get
+ }
+ @objc public var curFileSize: Swift.Int {
+ get
+ }
+ @objc public func averageVolume(_ pcmData: Foundation.Data) -> CoreFoundation.CGFloat
+ @objc public func append(start: Swift.Int, pcmData: Foundation.Data, channels: Swift.Int = 1)
+ @objc public func append(_ millSec: Swift.Int, _ pcmData: Foundation.Data)
+ @objc public func setOldVolumeMeters(meters: [[Swift.Int]])
+ public func setOldVolumeMeters(meters: [(sec: Swift.Int, volume: Swift.Int)])
+ @objc public func reset()
+ @objc deinit
+}
+@objc public protocol PDVolumeProtocol {
+ @objc func onDuration(millisec: Swift.Int)
+ @objc func onVolume(sec: Swift.Int, volume: Swift.Int)
+ @objc func onVolumePerTwentyMsec(mescSecond: Swift.Int, volume: Swift.Int)
+}
+@_hasMissingDesignatedInitializers public class SecretUtil {
+ public static func decryptWithPrivateKey(_ encryptedData: Foundation.Data, privateKeyPem: Swift.String) throws -> Foundation.Data
+ public static func encryptWithChaChaPoly1305Separate(_ data: Foundation.Data, key: Foundation.Data, nonce: Foundation.Data, ad: Foundation.Data? = nil) throws -> (ciphertext: Foundation.Data, tag: Foundation.Data)
+ public static func decryptWithChaChaPoly1305Separate(_ ciphertext: Foundation.Data, tag: Foundation.Data, key: Foundation.Data, nonce: Foundation.Data, ad: Foundation.Data? = nil) throws -> Foundation.Data
+ public static func encryptWithAES256Separate(_ data: Foundation.Data, key: Foundation.Data, nonce: Foundation.Data, ad: Foundation.Data? = nil) throws -> (ciphertext: Foundation.Data, tag: Foundation.Data)
+ public static func decryptWithAES256Separate(_ ciphertext: Foundation.Data, tag: Foundation.Data, key: Foundation.Data, nonce: Foundation.Data, ad: Foundation.Data? = nil) throws -> Foundation.Data
+ public static func decryptWithFallback(ciphertext: Foundation.Data, tag: Foundation.Data, key: Foundation.Data, nonce: Foundation.Data, ad: Foundation.Data? = nil, preferAes: Swift.Bool) throws -> Foundation.Data
+ public static func decryptWithChaCha20Stream(_ ciphertext: Foundation.Data, key: Foundation.Data, nonce: Foundation.Data, counter: Swift.UInt32 = 0) throws -> Foundation.Data
+ @objc deinit
+}
+public class Signature {
+ public enum DigestType {
+ case sha1
+ case sha224
+ case sha256
+ case sha384
+ case sha512
+ public static func == (a: PlaudBleSDK.Signature.DigestType, b: PlaudBleSDK.Signature.DigestType) -> Swift.Bool
+ public func hash(into hasher: inout Swift.Hasher)
+ public var hashValue: Swift.Int {
+ get
+ }
+ }
+ final public let data: Foundation.Data
+ public init(data: Foundation.Data)
+ convenience public init(base64Encoded base64String: Swift.String) throws
+ public var base64String: Swift.String {
+ get
+ }
+ @objc deinit
+}
+public class PublicKey : PlaudBleSDK.Key {
+ final public let reference: Security.SecKey
+ final public let originalData: Foundation.Data?
+ public func pemString() throws -> Swift.String
+ required public init(reference: Security.SecKey) throws
+ required public init(data: Foundation.Data) throws
+ public static func publicKeys(pemEncoded pemString: Swift.String) -> [PlaudBleSDK.PublicKey]
+ @objc deinit
+}
+extension Foundation.Data {
+ public func prependx509Header() -> Foundation.Data
+ public func hasX509Header() throws -> Swift.Bool
+ public func isAnHeaderlessKey() throws -> Swift.Bool
+}
+public class PrivateKey : PlaudBleSDK.Key {
+ final public let reference: Security.SecKey
+ final public let originalData: Foundation.Data?
+ public func pemString() throws -> Swift.String
+ required public init(reference: Security.SecKey) throws
+ required public init(data: Foundation.Data) throws
+ @objc deinit
+}
+public protocol Message {
+ var data: Foundation.Data { get }
+ var base64String: Swift.String { get }
+ init(data: Foundation.Data)
+ init(base64Encoded base64String: Swift.String) throws
+}
+extension PlaudBleSDK.Message {
+ public var base64String: Swift.String {
+ get
+ }
+ public init(base64Encoded base64String: Swift.String) throws
+}
+public enum SwiftyRSAError : Swift.Error {
+ case pemDoesNotContainKey
+ case keyRepresentationFailed(error: CoreFoundation.CFError?)
+ case keyGenerationFailed(error: CoreFoundation.CFError?)
+ case keyCreateFailed(error: CoreFoundation.CFError?)
+ case keyAddFailed(status: Darwin.OSStatus)
+ case keyCopyFailed(status: Darwin.OSStatus)
+ case tagEncodingFailed
+ case asn1ParsingFailed
+ case invalidAsn1RootNode
+ case invalidAsn1Structure
+ case invalidBase64String
+ case chunkDecryptFailed(index: Swift.Int)
+ case chunkEncryptFailed(index: Swift.Int)
+ case stringToDataConversionFailed
+ case dataToStringConversionFailed
+ case invalidDigestSize(digestSize: Swift.Int, maxChunkSize: Swift.Int)
+ case signatureCreateFailed(status: Darwin.OSStatus)
+ case signatureVerifyFailed(status: Darwin.OSStatus)
+ case pemFileNotFound(name: Swift.String)
+ case derFileNotFound(name: Swift.String)
+ case notAPublicKey
+ case notAPrivateKey
+ case x509CertificateFailed
+}
+public class EncryptedMessage : PlaudBleSDK.Message {
+ final public let data: Foundation.Data
+ required public init(data: Foundation.Data)
+ public func decrypted(with key: PlaudBleSDK.PrivateKey, padding: PlaudBleSDK.Padding) throws -> PlaudBleSDK.ClearMessage
+ @objc deinit
+}
+public typealias Padding = Security.SecPadding
+public enum SwiftyRSA {
+ @available(iOS 10.0, watchOS 3.0, tvOS 10.0, *)
+ public static func generateRSAKeyPair(sizeInBits size: Swift.Int) throws -> (privateKey: PlaudBleSDK.PrivateKey, publicKey: PlaudBleSDK.PublicKey)
+}
+public class ClearMessage : PlaudBleSDK.Message {
+ final public let data: Foundation.Data
+ required public init(data: Foundation.Data)
+ convenience public init(string: Swift.String, using encoding: Swift.String.Encoding) throws
+ public func string(encoding: Swift.String.Encoding) throws -> Swift.String
+ public func encrypted(with key: PlaudBleSDK.PublicKey, padding: PlaudBleSDK.Padding) throws -> PlaudBleSDK.EncryptedMessage
+ public func signed(with key: PlaudBleSDK.PrivateKey, digestType: PlaudBleSDK.Signature.DigestType) throws -> PlaudBleSDK.Signature
+ public func verify(with key: PlaudBleSDK.PublicKey, signature: PlaudBleSDK.Signature, digestType: PlaudBleSDK.Signature.DigestType) throws -> Swift.Bool
+ @objc deinit
+}
+public protocol Key : AnyObject {
+ var reference: Security.SecKey { get }
+ var originalData: Foundation.Data? { get }
+ init(data: Foundation.Data) throws
+ init(reference: Security.SecKey) throws
+ init(base64Encoded base64String: Swift.String) throws
+ init(pemEncoded pemString: Swift.String) throws
+ init(pemNamed pemName: Swift.String, in bundle: Foundation.Bundle) throws
+ init(derNamed derName: Swift.String, in bundle: Foundation.Bundle) throws
+ func pemString() throws -> Swift.String
+ func data() throws -> Foundation.Data
+ func base64String() throws -> Swift.String
+}
+extension PlaudBleSDK.Key {
+ public func base64String() throws -> Swift.String
+ public func data() throws -> Foundation.Data
+ public init(base64Encoded base64String: Swift.String) throws
+ public init(pemEncoded pemString: Swift.String) throws
+ public init(pemNamed pemName: Swift.String, in bundle: Foundation.Bundle = Bundle.main) throws
+ public init(derNamed derName: Swift.String, in bundle: Foundation.Bundle = Bundle.main) throws
+}
+@_hasMissingDesignatedInitializers final public class BleLogger {
+ public static let shared: PlaudBleSDK.BleLogger
+ final public func setLog(opened: Swift.Bool, logBlock: ((Swift.String) -> Swift.Void)? = nil, wlogBlock: ((Swift.String) -> Swift.Void)? = nil, sync: Swift.Bool = false)
+ final public func log(_ text: Swift.String, data: Foundation.Data? = nil, maxBytes: Swift.Int? = 80)
+ final public func wLog(_ text: Swift.String, data: Foundation.Data? = nil, maxBytes: Swift.Int? = 80)
+ @objc deinit
+}
+public protocol BleFeatureProvider {
+ func isFeatureFlagEnabled(_ key: Swift.String) -> Swift.Bool
+ func getFeatureFlag(_ key: Swift.String) -> Any?
+ func isAppFeatureConfigEnabled(_ key: Swift.String) -> Swift.Bool
+ func getAppFeatureConfig(_ key: Swift.String) -> Any?
+}
+@_hasMissingDesignatedInitializers public class PenBleConfig {
+ public static var featureProvider: (any PlaudBleSDK.BleFeatureProvider)?
+ @objc deinit
+}
+@_inheritsConvenienceInitializers @objc open class UpdateInfo : ObjectiveC.NSObject {
+ @objc public var sn: Swift.String
+ @objc public var swVersion: Swift.String
+ @objc public var currentVersion: Swift.String
+ @objc public var version: Swift.String
+ @objc public var url: Swift.String
+ @objc public var size: Swift.Int
+ @objc public var modifyDesc: Swift.String
+ @objc public var updateDesc: Swift.String
+ @objc public var updatePreTip: Swift.String
+ @objc public var updatingTip: Swift.String
+ @objc public var failureTip: Swift.String
+ @objc public var fromVersion: Swift.String
+ @objc public var toVersion: Swift.String
+ @objc public var md5: Swift.String
+ @objc override dynamic public init()
+ @objc public func hasNewVersion(_ device: PlaudBleSDK.BleDevice) -> Swift.Bool
+ @objc public func checkMD5(path: Swift.String) -> Swift.Bool
+ @objc public func toString() -> Swift.String
+ @objc deinit
+}
+@objc(PublicKey) public class _objc_PublicKey : ObjectiveC.NSObject, PlaudBleSDK.Key {
+ @objc public var reference: Security.SecKey {
+ @objc get
+ }
+ @objc public var originalData: Foundation.Data? {
+ @objc get
+ }
+ @objc public func pemString() throws -> Swift.String
+ @objc public func data() throws -> Foundation.Data
+ @objc public func base64String() throws -> Swift.String
+ required public init(swiftValue: PlaudBleSDK.PublicKey)
+ @objc required public init(data: Foundation.Data) throws
+ @objc required public init(reference: Security.SecKey) throws
+ @objc required public init(base64Encoded base64String: Swift.String) throws
+ @objc required public init(pemEncoded pemString: Swift.String) throws
+ @objc required public init(pemNamed pemName: Swift.String, in bundle: Foundation.Bundle) throws
+ @objc required public init(derNamed derName: Swift.String, in bundle: Foundation.Bundle) throws
+ @objc public static func publicKeys(pemEncoded pemString: Swift.String) -> [PlaudBleSDK._objc_PublicKey]
+ @objc deinit
+}
+@objc(PrivateKey) public class _objc_PrivateKey : ObjectiveC.NSObject, PlaudBleSDK.Key {
+ @objc public var reference: Security.SecKey {
+ @objc get
+ }
+ @objc public var originalData: Foundation.Data? {
+ @objc get
+ }
+ @objc public func pemString() throws -> Swift.String
+ @objc public func data() throws -> Foundation.Data
+ @objc public func base64String() throws -> Swift.String
+ required public init(swiftValue: PlaudBleSDK.PrivateKey)
+ @objc required public init(data: Foundation.Data) throws
+ @objc required public init(reference: Security.SecKey) throws
+ @objc required public init(base64Encoded base64String: Swift.String) throws
+ @objc required public init(pemEncoded pemString: Swift.String) throws
+ @objc required public init(pemNamed pemName: Swift.String, in bundle: Foundation.Bundle) throws
+ @objc required public init(derNamed derName: Swift.String, in bundle: Foundation.Bundle) throws
+ @objc deinit
+}
+@_hasMissingDesignatedInitializers @objc(VerificationResult) public class _objc_VerificationResult : ObjectiveC.NSObject {
+ @objc final public let isSuccessful: Swift.Bool
+ @objc deinit
+}
+@objc(ClearMessage) public class _objc_ClearMessage : ObjectiveC.NSObject, PlaudBleSDK.Message {
+ @objc public var base64String: Swift.String {
+ @objc get
+ }
+ @objc public var data: Foundation.Data {
+ @objc get
+ }
+ required public init(swiftValue: PlaudBleSDK.ClearMessage)
+ @objc required public init(data: Foundation.Data)
+ @objc required public init(string: Swift.String, using rawEncoding: Swift.UInt) throws
+ @objc required public init(base64Encoded base64String: Swift.String) throws
+ @objc public func string(encoding rawEncoding: Swift.UInt) throws -> Swift.String
+ @objc public func encrypted(with key: PlaudBleSDK._objc_PublicKey, padding: PlaudBleSDK.Padding) throws -> PlaudBleSDK._objc_EncryptedMessage
+ @objc public func signed(with key: PlaudBleSDK._objc_PrivateKey, digestType: PlaudBleSDK._objc_Signature.DigestType) throws -> PlaudBleSDK._objc_Signature
+ @objc public func verify(with key: PlaudBleSDK._objc_PublicKey, signature: PlaudBleSDK._objc_Signature, digestType: PlaudBleSDK._objc_Signature.DigestType) throws -> PlaudBleSDK._objc_VerificationResult
+ @objc deinit
+}
+@objc(EncryptedMessage) public class _objc_EncryptedMessage : ObjectiveC.NSObject, PlaudBleSDK.Message {
+ @objc public var base64String: Swift.String {
+ @objc get
+ }
+ @objc public var data: Foundation.Data {
+ @objc get
+ }
+ required public init(swiftValue: PlaudBleSDK.EncryptedMessage)
+ @objc required public init(data: Foundation.Data)
+ @objc required public init(base64Encoded base64String: Swift.String) throws
+ @objc public func decrypted(with key: PlaudBleSDK._objc_PrivateKey, padding: PlaudBleSDK.Padding) throws -> PlaudBleSDK._objc_ClearMessage
+ @objc deinit
+}
+@objc(Signature) public class _objc_Signature : ObjectiveC.NSObject {
+ @objc public enum DigestType : Swift.Int {
+ case sha1
+ case sha224
+ case sha256
+ case sha384
+ case sha512
+ public init?(rawValue: Swift.Int)
+ public typealias RawValue = Swift.Int
+ public var rawValue: Swift.Int {
+ get
+ }
+ }
+ @objc public var base64String: Swift.String {
+ @objc get
+ }
+ @objc public var data: Foundation.Data {
+ @objc get
+ }
+ required public init(swiftValue: PlaudBleSDK.Signature)
+ @objc public init(data: Foundation.Data)
+ @objc required public init(base64Encoded base64String: Swift.String) throws
+ @objc deinit
+}
+extension PlaudBleSDK.BleAgent.ConnectStage : Swift.Equatable {}
+extension PlaudBleSDK.BleAgent.ConnectStage : Swift.Hashable {}
+extension PlaudBleSDK.BleAgent.ConnectStage : Swift.RawRepresentable {}
+extension PlaudBleSDK.CustomerAuth : Swift.Equatable {}
+extension PlaudBleSDK.CustomerAuth : Swift.Hashable {}
+extension PlaudBleSDK.SSNAuth : Swift.Equatable {}
+extension PlaudBleSDK.SSNAuth : Swift.Hashable {}
+extension PlaudBleSDK.CommonType : Swift.Equatable {}
+extension PlaudBleSDK.CommonType : Swift.Hashable {}
+extension PlaudBleSDK.CommonType : Swift.RawRepresentable {}
+extension PlaudBleSDK.CommonAction : Swift.Equatable {}
+extension PlaudBleSDK.CommonAction : Swift.Hashable {}
+extension PlaudBleSDK.CommonAction : Swift.RawRepresentable {}
+extension PlaudBleSDK.BacklightBright : Swift.Equatable {}
+extension PlaudBleSDK.BacklightBright : Swift.Hashable {}
+extension PlaudBleSDK.BacklightBright : Swift.RawRepresentable {}
+extension PlaudBleSDK.BacklightDuration : Swift.Equatable {}
+extension PlaudBleSDK.BacklightDuration : Swift.Hashable {}
+extension PlaudBleSDK.BacklightDuration : Swift.RawRepresentable {}
+extension PlaudBleSDK.LanguageType : Swift.Equatable {}
+extension PlaudBleSDK.LanguageType : Swift.Hashable {}
+extension PlaudBleSDK.LanguageType : Swift.RawRepresentable {}
+extension PlaudBleSDK.RecScene : Swift.Equatable {}
+extension PlaudBleSDK.RecScene : Swift.Hashable {}
+extension PlaudBleSDK.RecScene : Swift.RawRepresentable {}
+extension PlaudBleSDK.RecMode : Swift.Equatable {}
+extension PlaudBleSDK.RecMode : Swift.Hashable {}
+extension PlaudBleSDK.RecMode : Swift.RawRepresentable {}
+extension PlaudBleSDK.VadSensitivity : Swift.Equatable {}
+extension PlaudBleSDK.VadSensitivity : Swift.Hashable {}
+extension PlaudBleSDK.VadSensitivity : Swift.RawRepresentable {}
+extension PlaudBleSDK.VpuGain : Swift.Equatable {}
+extension PlaudBleSDK.VpuGain : Swift.Hashable {}
+extension PlaudBleSDK.VpuGain : Swift.RawRepresentable {}
+extension PlaudBleSDK.SwitchHandlerID : Swift.Equatable {}
+extension PlaudBleSDK.SwitchHandlerID : Swift.Hashable {}
+extension PlaudBleSDK.SwitchHandlerID : Swift.RawRepresentable {}
+extension PlaudBleSDK.WebsocketType : Swift.Equatable {}
+extension PlaudBleSDK.WebsocketType : Swift.Hashable {}
+extension PlaudBleSDK.WebsocketType : Swift.RawRepresentable {}
+extension PlaudBleSDK.AutoClear : Swift.Equatable {}
+extension PlaudBleSDK.AutoClear : Swift.Hashable {}
+extension PlaudBleSDK.AutoClear : Swift.RawRepresentable {}
+extension PlaudBleSDK.NetworkReachabilityManager.ConnectionType : Swift.Equatable {}
+extension PlaudBleSDK.NetworkReachabilityManager.ConnectionType : Swift.Hashable {}
+extension PlaudBleSDK.Signature.DigestType : Swift.Equatable {}
+extension PlaudBleSDK.Signature.DigestType : Swift.Hashable {}
+extension PlaudBleSDK._objc_Signature.DigestType : Swift.Equatable {}
+extension PlaudBleSDK._objc_Signature.DigestType : Swift.Hashable {}
+extension PlaudBleSDK._objc_Signature.DigestType : Swift.RawRepresentable {}
diff --git a/modules/plaud-sdk/ios/Frameworks/PlaudBleSDK.xcframework/ios-arm64/PlaudBleSDK.framework/Modules/module.modulemap b/modules/plaud-sdk/ios/Frameworks/PlaudBleSDK.xcframework/ios-arm64/PlaudBleSDK.framework/Modules/module.modulemap
new file mode 100644
index 0000000..a90e718
--- /dev/null
+++ b/modules/plaud-sdk/ios/Frameworks/PlaudBleSDK.xcframework/ios-arm64/PlaudBleSDK.framework/Modules/module.modulemap
@@ -0,0 +1,11 @@
+framework module PlaudBleSDK {
+ umbrella header "PlaudBleSDK.h"
+ export *
+
+ module * { export * }
+}
+
+module PlaudBleSDK.Swift {
+ header "PlaudBleSDK-Swift.h"
+ requires objc
+}
diff --git a/modules/plaud-sdk/ios/Frameworks/PlaudBleSDK.xcframework/ios-arm64/PlaudBleSDK.framework/PlaudBleSDK b/modules/plaud-sdk/ios/Frameworks/PlaudBleSDK.xcframework/ios-arm64/PlaudBleSDK.framework/PlaudBleSDK
new file mode 100755
index 0000000..03c9d32
Binary files /dev/null and b/modules/plaud-sdk/ios/Frameworks/PlaudBleSDK.xcframework/ios-arm64/PlaudBleSDK.framework/PlaudBleSDK differ
diff --git a/modules/plaud-sdk/ios/Frameworks/PlaudDeviceBasicSDK.xcframework/Info.plist b/modules/plaud-sdk/ios/Frameworks/PlaudDeviceBasicSDK.xcframework/Info.plist
new file mode 100644
index 0000000..2879f4e
--- /dev/null
+++ b/modules/plaud-sdk/ios/Frameworks/PlaudDeviceBasicSDK.xcframework/Info.plist
@@ -0,0 +1,27 @@
+
+
+
+
+ AvailableLibraries
+
+
+ BinaryPath
+ PlaudDeviceBasicSDK.framework/PlaudDeviceBasicSDK
+ LibraryIdentifier
+ ios-arm64
+ LibraryPath
+ PlaudDeviceBasicSDK.framework
+ SupportedArchitectures
+
+ arm64
+
+ SupportedPlatform
+ ios
+
+
+ CFBundlePackageType
+ XFWK
+ XCFrameworkFormatVersion
+ 1.0
+
+
diff --git a/modules/plaud-sdk/ios/Frameworks/PlaudDeviceBasicSDK.xcframework/ios-arm64/PlaudDeviceBasicSDK.framework/Headers/PlaudDeviceBasicSDK-Swift.h b/modules/plaud-sdk/ios/Frameworks/PlaudDeviceBasicSDK.xcframework/ios-arm64/PlaudDeviceBasicSDK.framework/Headers/PlaudDeviceBasicSDK-Swift.h
new file mode 100644
index 0000000..d17d264
--- /dev/null
+++ b/modules/plaud-sdk/ios/Frameworks/PlaudDeviceBasicSDK.xcframework/ios-arm64/PlaudDeviceBasicSDK.framework/Headers/PlaudDeviceBasicSDK-Swift.h
@@ -0,0 +1,1887 @@
+#if 0
+#elif defined(__arm64__) && __arm64__
+// Generated by Apple Swift version 6.0.3 effective-5.10 (swiftlang-6.0.3.1.10 clang-1600.0.30.1)
+#ifndef PLAUDDEVICEBASICSDK_SWIFT_H
+#define PLAUDDEVICEBASICSDK_SWIFT_H
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wgcc-compat"
+
+#if !defined(__has_include)
+# define __has_include(x) 0
+#endif
+#if !defined(__has_attribute)
+# define __has_attribute(x) 0
+#endif
+#if !defined(__has_feature)
+# define __has_feature(x) 0
+#endif
+#if !defined(__has_warning)
+# define __has_warning(x) 0
+#endif
+
+#if __has_include()
+# include
+#endif
+
+#pragma clang diagnostic ignored "-Wauto-import"
+#if defined(__OBJC__)
+#include
+#endif
+#if defined(__cplusplus)
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#else
+#include
+#include
+#include
+#include
+#endif
+#if defined(__cplusplus)
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wnon-modular-include-in-framework-module"
+#if defined(__arm64e__) && __has_include()
+# include
+#else
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wreserved-macro-identifier"
+# ifndef __ptrauth_swift_value_witness_function_pointer
+# define __ptrauth_swift_value_witness_function_pointer(x)
+# endif
+# ifndef __ptrauth_swift_class_method_pointer
+# define __ptrauth_swift_class_method_pointer(x)
+# endif
+#pragma clang diagnostic pop
+#endif
+#pragma clang diagnostic pop
+#endif
+
+#if !defined(SWIFT_TYPEDEFS)
+# define SWIFT_TYPEDEFS 1
+# if __has_include()
+# include
+# elif !defined(__cplusplus)
+typedef uint_least16_t char16_t;
+typedef uint_least32_t char32_t;
+# endif
+typedef float swift_float2 __attribute__((__ext_vector_type__(2)));
+typedef float swift_float3 __attribute__((__ext_vector_type__(3)));
+typedef float swift_float4 __attribute__((__ext_vector_type__(4)));
+typedef double swift_double2 __attribute__((__ext_vector_type__(2)));
+typedef double swift_double3 __attribute__((__ext_vector_type__(3)));
+typedef double swift_double4 __attribute__((__ext_vector_type__(4)));
+typedef int swift_int2 __attribute__((__ext_vector_type__(2)));
+typedef int swift_int3 __attribute__((__ext_vector_type__(3)));
+typedef int swift_int4 __attribute__((__ext_vector_type__(4)));
+typedef unsigned int swift_uint2 __attribute__((__ext_vector_type__(2)));
+typedef unsigned int swift_uint3 __attribute__((__ext_vector_type__(3)));
+typedef unsigned int swift_uint4 __attribute__((__ext_vector_type__(4)));
+#endif
+
+#if !defined(SWIFT_PASTE)
+# define SWIFT_PASTE_HELPER(x, y) x##y
+# define SWIFT_PASTE(x, y) SWIFT_PASTE_HELPER(x, y)
+#endif
+#if !defined(SWIFT_METATYPE)
+# define SWIFT_METATYPE(X) Class
+#endif
+#if !defined(SWIFT_CLASS_PROPERTY)
+# if __has_feature(objc_class_property)
+# define SWIFT_CLASS_PROPERTY(...) __VA_ARGS__
+# else
+# define SWIFT_CLASS_PROPERTY(...)
+# endif
+#endif
+#if !defined(SWIFT_RUNTIME_NAME)
+# if __has_attribute(objc_runtime_name)
+# define SWIFT_RUNTIME_NAME(X) __attribute__((objc_runtime_name(X)))
+# else
+# define SWIFT_RUNTIME_NAME(X)
+# endif
+#endif
+#if !defined(SWIFT_COMPILE_NAME)
+# if __has_attribute(swift_name)
+# define SWIFT_COMPILE_NAME(X) __attribute__((swift_name(X)))
+# else
+# define SWIFT_COMPILE_NAME(X)
+# endif
+#endif
+#if !defined(SWIFT_METHOD_FAMILY)
+# if __has_attribute(objc_method_family)
+# define SWIFT_METHOD_FAMILY(X) __attribute__((objc_method_family(X)))
+# else
+# define SWIFT_METHOD_FAMILY(X)
+# endif
+#endif
+#if !defined(SWIFT_NOESCAPE)
+# if __has_attribute(noescape)
+# define SWIFT_NOESCAPE __attribute__((noescape))
+# else
+# define SWIFT_NOESCAPE
+# endif
+#endif
+#if !defined(SWIFT_RELEASES_ARGUMENT)
+# if __has_attribute(ns_consumed)
+# define SWIFT_RELEASES_ARGUMENT __attribute__((ns_consumed))
+# else
+# define SWIFT_RELEASES_ARGUMENT
+# endif
+#endif
+#if !defined(SWIFT_WARN_UNUSED_RESULT)
+# if __has_attribute(warn_unused_result)
+# define SWIFT_WARN_UNUSED_RESULT __attribute__((warn_unused_result))
+# else
+# define SWIFT_WARN_UNUSED_RESULT
+# endif
+#endif
+#if !defined(SWIFT_NORETURN)
+# if __has_attribute(noreturn)
+# define SWIFT_NORETURN __attribute__((noreturn))
+# else
+# define SWIFT_NORETURN
+# endif
+#endif
+#if !defined(SWIFT_CLASS_EXTRA)
+# define SWIFT_CLASS_EXTRA
+#endif
+#if !defined(SWIFT_PROTOCOL_EXTRA)
+# define SWIFT_PROTOCOL_EXTRA
+#endif
+#if !defined(SWIFT_ENUM_EXTRA)
+# define SWIFT_ENUM_EXTRA
+#endif
+#if !defined(SWIFT_CLASS)
+# if __has_attribute(objc_subclassing_restricted)
+# define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_CLASS_EXTRA
+# define SWIFT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA
+# else
+# define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA
+# define SWIFT_CLASS_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA
+# endif
+#endif
+#if !defined(SWIFT_RESILIENT_CLASS)
+# if __has_attribute(objc_class_stub)
+# define SWIFT_RESILIENT_CLASS(SWIFT_NAME) SWIFT_CLASS(SWIFT_NAME) __attribute__((objc_class_stub))
+# define SWIFT_RESILIENT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_class_stub)) SWIFT_CLASS_NAMED(SWIFT_NAME)
+# else
+# define SWIFT_RESILIENT_CLASS(SWIFT_NAME) SWIFT_CLASS(SWIFT_NAME)
+# define SWIFT_RESILIENT_CLASS_NAMED(SWIFT_NAME) SWIFT_CLASS_NAMED(SWIFT_NAME)
+# endif
+#endif
+#if !defined(SWIFT_PROTOCOL)
+# define SWIFT_PROTOCOL(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA
+# define SWIFT_PROTOCOL_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA
+#endif
+#if !defined(SWIFT_EXTENSION)
+# define SWIFT_EXTENSION(M) SWIFT_PASTE(M##_Swift_, __LINE__)
+#endif
+#if !defined(OBJC_DESIGNATED_INITIALIZER)
+# if __has_attribute(objc_designated_initializer)
+# define OBJC_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer))
+# else
+# define OBJC_DESIGNATED_INITIALIZER
+# endif
+#endif
+#if !defined(SWIFT_ENUM_ATTR)
+# if __has_attribute(enum_extensibility)
+# define SWIFT_ENUM_ATTR(_extensibility) __attribute__((enum_extensibility(_extensibility)))
+# else
+# define SWIFT_ENUM_ATTR(_extensibility)
+# endif
+#endif
+#if !defined(SWIFT_ENUM)
+# define SWIFT_ENUM(_type, _name, _extensibility) enum _name : _type _name; enum SWIFT_ENUM_ATTR(_extensibility) SWIFT_ENUM_EXTRA _name : _type
+# if __has_feature(generalized_swift_name)
+# define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME, _extensibility) enum _name : _type _name SWIFT_COMPILE_NAME(SWIFT_NAME); enum SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_ENUM_ATTR(_extensibility) SWIFT_ENUM_EXTRA _name : _type
+# else
+# define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME, _extensibility) SWIFT_ENUM(_type, _name, _extensibility)
+# endif
+#endif
+#if !defined(SWIFT_UNAVAILABLE)
+# define SWIFT_UNAVAILABLE __attribute__((unavailable))
+#endif
+#if !defined(SWIFT_UNAVAILABLE_MSG)
+# define SWIFT_UNAVAILABLE_MSG(msg) __attribute__((unavailable(msg)))
+#endif
+#if !defined(SWIFT_AVAILABILITY)
+# define SWIFT_AVAILABILITY(plat, ...) __attribute__((availability(plat, __VA_ARGS__)))
+#endif
+#if !defined(SWIFT_WEAK_IMPORT)
+# define SWIFT_WEAK_IMPORT __attribute__((weak_import))
+#endif
+#if !defined(SWIFT_DEPRECATED)
+# define SWIFT_DEPRECATED __attribute__((deprecated))
+#endif
+#if !defined(SWIFT_DEPRECATED_MSG)
+# define SWIFT_DEPRECATED_MSG(...) __attribute__((deprecated(__VA_ARGS__)))
+#endif
+#if !defined(SWIFT_DEPRECATED_OBJC)
+# if __has_feature(attribute_diagnose_if_objc)
+# define SWIFT_DEPRECATED_OBJC(Msg) __attribute__((diagnose_if(1, Msg, "warning")))
+# else
+# define SWIFT_DEPRECATED_OBJC(Msg) SWIFT_DEPRECATED_MSG(Msg)
+# endif
+#endif
+#if defined(__OBJC__)
+#if !defined(IBSegueAction)
+# define IBSegueAction
+#endif
+#endif
+#if !defined(SWIFT_EXTERN)
+# if defined(__cplusplus)
+# define SWIFT_EXTERN extern "C"
+# else
+# define SWIFT_EXTERN extern
+# endif
+#endif
+#if !defined(SWIFT_CALL)
+# define SWIFT_CALL __attribute__((swiftcall))
+#endif
+#if !defined(SWIFT_INDIRECT_RESULT)
+# define SWIFT_INDIRECT_RESULT __attribute__((swift_indirect_result))
+#endif
+#if !defined(SWIFT_CONTEXT)
+# define SWIFT_CONTEXT __attribute__((swift_context))
+#endif
+#if !defined(SWIFT_ERROR_RESULT)
+# define SWIFT_ERROR_RESULT __attribute__((swift_error_result))
+#endif
+#if defined(__cplusplus)
+# define SWIFT_NOEXCEPT noexcept
+#else
+# define SWIFT_NOEXCEPT
+#endif
+#if !defined(SWIFT_C_INLINE_THUNK)
+# if __has_attribute(always_inline)
+# if __has_attribute(nodebug)
+# define SWIFT_C_INLINE_THUNK inline __attribute__((always_inline)) __attribute__((nodebug))
+# else
+# define SWIFT_C_INLINE_THUNK inline __attribute__((always_inline))
+# endif
+# else
+# define SWIFT_C_INLINE_THUNK inline
+# endif
+#endif
+#if defined(_WIN32)
+#if !defined(SWIFT_IMPORT_STDLIB_SYMBOL)
+# define SWIFT_IMPORT_STDLIB_SYMBOL __declspec(dllimport)
+#endif
+#else
+#if !defined(SWIFT_IMPORT_STDLIB_SYMBOL)
+# define SWIFT_IMPORT_STDLIB_SYMBOL
+#endif
+#endif
+#if defined(__OBJC__)
+#if __has_feature(objc_modules)
+#if __has_warning("-Watimport-in-framework-header")
+#pragma clang diagnostic ignored "-Watimport-in-framework-header"
+#endif
+@import AVFAudio;
+@import CoreFoundation;
+@import Foundation;
+@import ObjectiveC;
+@import PlaudBleSDK;
+@import PlaudWiFiSDK;
+@import UIKit;
+#endif
+
+#endif
+#pragma clang diagnostic ignored "-Wproperty-attribute-mismatch"
+#pragma clang diagnostic ignored "-Wduplicate-method-arg"
+#if __has_warning("-Wpragma-clang-attribute")
+# pragma clang diagnostic ignored "-Wpragma-clang-attribute"
+#endif
+#pragma clang diagnostic ignored "-Wunknown-pragmas"
+#pragma clang diagnostic ignored "-Wnullability"
+#pragma clang diagnostic ignored "-Wdollar-in-identifier-extension"
+#pragma clang diagnostic ignored "-Wunsafe-buffer-usage"
+
+#if __has_attribute(external_source_symbol)
+# pragma push_macro("any")
+# undef any
+# pragma clang attribute push(__attribute__((external_source_symbol(language="Swift", defined_in="PlaudDeviceBasicSDK",generated_declaration))), apply_to=any(function,enum,objc_interface,objc_category,objc_protocol))
+# pragma pop_macro("any")
+#endif
+
+#if defined(__OBJC__)
+
+@interface AVAudioPlayer (SWIFT_EXTENSION(PlaudDeviceBasicSDK))
+- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer * _Nonnull)_ successfully:(BOOL)flag;
+- (void)audioPlayerDecodeErrorDidOccur:(AVAudioPlayer * _Nonnull)_ error:(NSError * _Nullable)error;
+@end
+
+
+typedef SWIFT_ENUM(NSInteger, AudioDecryptorError, open) {
+ AudioDecryptorErrorInvalidHeader = 1,
+ AudioDecryptorErrorInvalidSymmetricKey = 2,
+ AudioDecryptorErrorNoEncryptedData = 3,
+ AudioDecryptorErrorDecryptionFailed = 4,
+};
+static NSString * _Nonnull const AudioDecryptorErrorDomain = @"PlaudDeviceBasicSDK.AudioDecryptorError";
+
+@class NSString;
+
+/// 音频导出回调协议(与 Android AudioExporter.ExportCallback 一致)
+SWIFT_PROTOCOL("_TtP19PlaudDeviceBasicSDK19AudioExportCallback_")
+@protocol AudioExportCallback
+/// 导出进度更新
+/// \param progress 进度百分比 (0-100)
+///
+/// \param message 状态消息
+///
+- (void)onProgress:(NSInteger)progress message:(NSString * _Nonnull)message;
+/// 导出完成
+/// \param outputPath 输出文件路径
+///
+- (void)onCompleteWithOutputPath:(NSString * _Nonnull)outputPath;
+/// 导出失败
+/// \param error 错误信息
+///
+- (void)onError:(NSString * _Nonnull)error;
+@end
+
+/// 音频导出格式枚举(与 Android AudioExportFormat 一致)
+/// 定义了 SDK 支持的音频导出格式
+typedef SWIFT_ENUM(NSInteger, AudioExportFormat, open) {
+/// PCM 格式 - 原始音频数据
+/// 需要知道采样率和声道数才能正确播放
+/// 16kHz, 16-bit, mono
+ AudioExportFormatPcm = 0,
+/// MP3 格式 - LAME 编码
+/// 通用播放格式,兼容性最好
+ AudioExportFormatMp3 = 1,
+/// WAV 格式(推荐)
+/// 带头信息的 PCM,可直接播放
+/// 包含采样率、声道数等元数据
+ AudioExportFormatWav = 2,
+/// Opus 格式 - OGG/Opus 容器
+/// 高压缩比,适合语音,文件体积小
+ AudioExportFormatOpus = 3,
+};
+
+@class PlaudEncryptHeader;
+
+/// Audio file E2EE decryptor for NotePro devices.
+/// NotePro audio files have two encryption layers:
+///
+/// -
+/// BLE Transport Layer - ChaCha20-Poly1305 (handled by BleAgent)
+///
+/// -
+/// File Content Layer - RSA encrypted key header + ChaCha20 encrypted data (handled here)
+///
+///
+SWIFT_CLASS("_TtC19PlaudDeviceBasicSDK18AudioFileDecryptor")
+@interface AudioFileDecryptor : NSObject
+/// Decrypt an E2EE encrypted audio file
+/// \param inputPath The encrypted audio file path
+///
+/// \param privateKeyPem The RSA private key in PEM format
+///
+/// \param outputPath Optional output file path. If nil, creates a temp file
+///
+///
+/// returns:
+/// The decrypted audio file path, or original path if not encrypted
++ (NSString * _Nullable)decryptAudioFileWithInputPath:(NSString * _Nonnull)inputPath privateKeyPem:(NSString * _Nonnull)privateKeyPem outputPath:(NSString * _Nullable)outputPath error:(NSError * _Nullable * _Nullable)error SWIFT_WARN_UNUSED_RESULT;
+/// Check if a file is E2EE encrypted
++ (BOOL)isFileEncryptedWithPath:(NSString * _Nonnull)path SWIFT_WARN_UNUSED_RESULT;
+/// Get the PlaudEncryptHeader from a file
++ (PlaudEncryptHeader * _Nullable)getHeaderWithPath:(NSString * _Nonnull)path SWIFT_WARN_UNUSED_RESULT;
+- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER;
+@end
+
+
+@interface BleAgent (SWIFT_EXTENSION(PlaudDeviceBasicSDK))
+/// 解密 E2EE 加密的音频文件
+- (NSString * _Nullable)decryptE2EEAudioFileWithInputPath:(NSString * _Nonnull)inputPath outputPath:(NSString * _Nullable)outputPath privateKeyPem:(NSString * _Nonnull)privateKeyPem error:(NSError * _Nullable * _Nullable)error SWIFT_WARN_UNUSED_RESULT;
+- (BOOL)isE2EEEncryptedFileWithPath:(NSString * _Nonnull)path SWIFT_WARN_UNUSED_RESULT;
+- (PlaudEncryptHeader * _Nullable)getE2EEFileHeaderWithPath:(NSString * _Nonnull)path SWIFT_WARN_UNUSED_RESULT;
+@end
+
+
+@interface BleAgent (SWIFT_EXTENSION(PlaudDeviceBasicSDK))
+@property (nonatomic, readonly) BOOL isEncryptionSupported;
+- (NSDictionary * _Nonnull)getEncryptionProtocolInfo SWIFT_WARN_UNUSED_RESULT;
+@end
+
+@protocol JXOggPlayerDelegate;
+@class JXOggPlayer;
+
+@interface BleAgent (SWIFT_EXTENSION(PlaudDeviceBasicSDK))
+- (BOOL)playDecryptedOggFileWithEncryptedFilePath:(NSString * _Nonnull)encryptedFilePath channel:(int32_t)channel delegate:(id _Nullable)delegate key:(NSString * _Nullable)key nonce:(NSString * _Nullable)nonce ad:(NSString * _Nullable)ad SWIFT_WARN_UNUSED_RESULT;
+- (void)stopOggPlayback;
+- (void)pauseOggPlayback;
+- (void)resumeOggPlayback;
+- (JXOggPlayer * _Nonnull)getOggPlayer SWIFT_WARN_UNUSED_RESULT;
+@end
+
+@class NSData;
+
+@interface BleAgent (SWIFT_EXTENSION(PlaudDeviceBasicSDK))
+/// 是否已建立加密通道
+@property (nonatomic, readonly) BOOL isSecureChannelEstablished;
+/// 获取当前加密密钥(Base64编码,用于文件解密)
+- (NSString * _Nullable)getEncryptionKey SWIFT_WARN_UNUSED_RESULT;
+/// 获取当前加密Nonce(Base64编码)
+- (NSString * _Nullable)getEncryptionNonce SWIFT_WARN_UNUSED_RESULT;
+/// 获取当前加密AD(Base64编码)
+- (NSString * _Nullable)getEncryptionAD SWIFT_WARN_UNUSED_RESULT;
+/// 获取完整的加密参数
+- (NSDictionary * _Nullable)getEncryptionParameters SWIFT_WARN_UNUSED_RESULT;
+/// 解密加密的OGG文件数据
+- (NSData * _Nullable)decryptFileData:(NSData * _Nonnull)encryptedData key:(NSString * _Nullable)key nonce:(NSString * _Nullable)nonce ad:(NSString * _Nullable)ad error:(NSError * _Nullable * _Nullable)error SWIFT_WARN_UNUSED_RESULT;
+/// 解密加密的OGG文件
+- (BOOL)decryptFileWithInputPath:(NSString * _Nonnull)inputPath outputPath:(NSString * _Nonnull)outputPath key:(NSString * _Nullable)key nonce:(NSString * _Nullable)nonce ad:(NSString * _Nullable)ad SWIFT_WARN_UNUSED_RESULT;
+/// 解密并准备OGG文件
+- (NSString * _Nullable)decryptAndPrepareOggFileWithEncryptedFilePath:(NSString * _Nonnull)encryptedFilePath channel:(int32_t)channel key:(NSString * _Nullable)key nonce:(NSString * _Nullable)nonce ad:(NSString * _Nullable)ad SWIFT_WARN_UNUSED_RESULT;
+@end
+
+
+
+
+
+typedef SWIFT_ENUM(NSInteger, EncryptionError, open) {
+ EncryptionErrorNoKey = 1,
+ EncryptionErrorNoNonce = 2,
+ EncryptionErrorNoAD = 3,
+ EncryptionErrorDataTooShort = 4,
+ EncryptionErrorDecryptionFailed = 5,
+};
+static NSString * _Nonnull const EncryptionErrorDomain = @"PlaudDeviceBasicSDK.EncryptionError";
+
+
+
+
+/// Latest version response model
+SWIFT_CLASS("_TtC19PlaudDeviceBasicSDK21LatestVersionResponse")
+@interface LatestVersionResponse : NSObject
+@property (nonatomic, readonly, copy) NSString * _Nonnull type;
+@property (nonatomic, readonly, copy) NSString * _Nonnull model;
+@property (nonatomic, readonly, copy) NSString * _Nonnull version_type;
+@property (nonatomic, readonly, copy) NSString * _Nonnull version_code;
+@property (nonatomic, readonly, copy) NSString * _Nonnull version_number;
+@property (nonatomic, readonly, copy) NSString * _Nonnull version_description;
+@property (nonatomic, readonly) BOOL is_force;
+@property (nonatomic, readonly) BOOL is_strong_guidance;
+@property (nonatomic, readonly, copy) NSString * _Nullable file_md5;
+@property (nonatomic, readonly, copy) NSString * _Nonnull download_url;
+/// Compatibility property: version number (mapped to version_number)
+@property (nonatomic, readonly, copy) NSString * _Nonnull version;
+/// Compatibility property: release notes (mapped to version_description)
+@property (nonatomic, readonly, copy) NSString * _Nullable release_notes;
+/// Compatibility property: force update (mapped to is_force)
+@property (nonatomic, readonly) BOOL force_update;
+- (nonnull instancetype)init SWIFT_UNAVAILABLE;
++ (nonnull instancetype)new SWIFT_UNAVAILABLE_MSG("-init is unavailable");
+@end
+
+
+
+
+/// Parser for standard Ogg/Opus format files
+/// Used for E2EE decrypted audio files which are in standard OGG format
+SWIFT_CLASS("_TtC19PlaudDeviceBasicSDK13OggOpusParser")
+@interface OggOpusParser : NSObject
+/// Reset the shared decoder (no-op, JXOpusDecoder manages its own lifecycle)
++ (void)resetDecoder;
+@property (nonatomic, readonly) NSInteger parsedSampleRate;
+@property (nonatomic, readonly) NSInteger parsedChannels;
+@property (nonatomic, readonly) NSInteger parsedPreSkip;
+/// Parse Ogg Opus data and extract all Opus frames
+/// \param oggData The Ogg Opus file data
+///
+///
+/// returns:
+/// Array of raw Opus frames
+- (NSArray * _Nonnull)parse:(NSData * _Nonnull)oggData SWIFT_WARN_UNUSED_RESULT;
+- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER;
+@end
+
+@class NSCoder;
+@class NSBundle;
+
+SWIFT_CLASS("_TtC19PlaudDeviceBasicSDK30PlaudAudioPlayerViewController")
+@interface PlaudAudioPlayerViewController : UIViewController
+- (nonnull instancetype)initWithSessionId:(NSInteger)sessionId OBJC_DESIGNATED_INITIALIZER;
+- (nullable instancetype)initWithCoder:(NSCoder * _Nonnull)_ SWIFT_UNAVAILABLE;
+- (void)viewDidLoad;
+- (void)viewWillDisappear:(BOOL)animated;
+- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer * _Nonnull)_ successfully:(BOOL)flag;
+- (void)audioPlayerDecodeErrorDidOccur:(AVAudioPlayer * _Nonnull)_ error:(NSError * _Nullable)error;
+- (void)audioPlayerBeginInterruption:(AVAudioPlayer * _Nonnull)_;
+- (void)audioPlayerEndInterruption:(AVAudioPlayer * _Nonnull)_ withOptions:(NSUInteger)_;
+- (nonnull instancetype)initWithNibName:(NSString * _Nullable)nibNameOrNil bundle:(NSBundle * _Nullable)nibBundleOrNil SWIFT_UNAVAILABLE;
+@end
+
+
+SWIFT_RESILIENT_CLASS("_TtC19PlaudDeviceBasicSDK14PlaudBleDevice")
+@interface PlaudBleDevice : BleDevice
+- (nonnull instancetype)initWithSn:(NSString * _Nonnull)sn OBJC_DESIGNATED_INITIALIZER;
+@end
+
+@protocol PlaudDeviceAgentProtocol;
+enum PlaudDownloadFormat : NSInteger;
+
+SWIFT_CLASS("_TtC19PlaudDeviceBasicSDK16PlaudDeviceAgent")
+@interface PlaudDeviceAgent : NSObject
+SWIFT_CLASS_PROPERTY(@property (nonatomic, class, readonly, strong) PlaudDeviceAgent * _Nonnull shared;)
++ (PlaudDeviceAgent * _Nonnull)shared SWIFT_WARN_UNUSED_RESULT;
+@property (nonatomic, strong) BleDevice * _Nullable recentConnectDevice;
+@property (nonatomic, readonly) NSInteger sceneFlag;
+/// WiFi 快传进行中标记,抑制 BLE 断连时的缓存清除和自动重连
+@property (nonatomic, readonly) BOOL isWiFiTransferActive;
+/// 是否跳过 SDK 权限检查(NotePro 新固件不需要传统的 appKey/appSecret 权限验证)
+@property (nonatomic) BOOL skipPermissionCheck;
+@property (nonatomic, weak) id _Nullable delegate;
+/// Current recording file or sync (download) file sessionId
+- (nonnull instancetype)init SWIFT_UNAVAILABLE;
++ (nonnull instancetype)new SWIFT_UNAVAILABLE_MSG("-init is unavailable");
+/// Initialize SDK (recommended)
+/// \param userAccessToken User Access Token (JWT),用于设备认证、sn-sign、gen-key。
+/// 握手 token 自动从 JWT sub 字段解析,无需手动传入。
+///
+/// \param customDomain 服务端域名(如 “platform-us.plaud.ai”),不含 https://。
+/// SDK 所有网络请求都使用此域名。
+///
+/// \param extra 额外参数(可选)
+///
+- (void)initSDKWithUserAccessToken:(NSString * _Nonnull)userAccessToken customDomain:(NSString * _Nonnull)customDomain extra:(NSDictionary * _Nonnull)extra SWIFT_METHOD_FAMILY(none);
+/// Initialize SDK (legacy, 兼容旧版本)
+/// \param hostName (已废弃)服务端 URL,被 customDomain 替代
+///
+/// \param appKey (已废弃)App key
+///
+/// \param appSecret (已废弃)App secret
+///
+/// \param bindToken (已废弃)握手 token,当 partnerToken 存在时自动从 JWT sub 字段解析
+///
+/// \param extra 额外参数
+///
+/// \param customDomain 服务端域名(如 “platform-us.plaud.ai”),不含 https://
+///
+/// \param partnerToken (已废弃)请使用 userAccessToken 参数。User Access Token (JWT)
+///
+- (void)initSDKWithHostName:(NSString * _Nonnull)hostName appKey:(NSString * _Nonnull)appKey appSecret:(NSString * _Nonnull)appSecret bindToken:(NSString * _Nonnull)bindToken extra:(NSDictionary * _Nonnull)extra customDomain:(NSString * _Nullable)customDomain partnerToken:(NSString * _Nullable)partnerToken SWIFT_METHOD_FAMILY(none);
+/// 动态更新 User Access Token
+/// 可在 SDK 初始化后调用,token 刷新时使用
+/// \param token User Access Token (JWT)
+///
+- (void)setUserAccessToken:(NSString * _Nullable)token;
+/// (已废弃)请使用 setUserAccessToken
+- (void)setPartnerToken:(NSString * _Nullable)token SWIFT_DEPRECATED_MSG("", "setUserAccessToken:");
+/// 检查 Partner API 数据是否已准备好
+- (BOOL)isPartnerDataReady SWIFT_WARN_UNUSED_RESULT;
++ (NSString * _Nonnull)getTestAppKey:(BOOL)beta SWIFT_WARN_UNUSED_RESULT;
++ (NSString * _Nonnull)getTestAppSecret:(BOOL)beta SWIFT_WARN_UNUSED_RESULT;
+- (void)depairWithClear:(BOOL)clear;
+- (void)setDeviceWiFiWithOpen:(BOOL)open;
+/// 结束 WiFi 快传模式(WiFi 断开后调用,恢复 BLE 正常行为)
+- (void)endWiFiTransfer;
+- (void)setDeviceBindingWithToken:(NSString * _Nonnull)token;
+/// Start scan
+/// @see stopScan()
+/// @see Callback bleScanResult
+- (void)startScan;
+/// End scan
+/// @see startScan()
+- (void)stopScan;
+- (BOOL)isConnected SWIFT_WARN_UNUSED_RESULT;
+/// Connect bluetooth device
+/// \param bleDevice Wrapped bluetooth device
+///
+/// \param deviceToken device token
+/// @see Callback bleConnectState
+/// @see Callback bleBind
+///
+- (void)connectBleDeviceWithBleDevice:(BleDevice * _Nonnull)bleDevice deviceToken:(NSString * _Nonnull)deviceToken;
+/// Connect bluetooth device
+/// \param bleDevice Wrapped bluetooth device
+/// @see Callback bleConnectState
+/// @see Callback bleBind
+///
+- (void)connectBleDeviceWithBleDevice:(BleDevice * _Nonnull)bleDevice;
+/// Disconnect bluetooth connection
+- (void)disconnect;
+- (void)tryReconnectLastDevice;
+/// Read recorder status, return state and privacy status
+/// @see Callback blePenState
+- (void)getState;
+/// Read recorder remaining space
+/// @see Callback bleStorage
+- (void)getStorage;
+/// Wifi sync switch
+/// @see Callback onWifiSyncEnabled
+- (void)getWifiSyncEnable;
+/// Wifi sync switch
+/// \param value 0: off 1: on
+///
+- (void)setWifiSyncEnableWithValue:(NSInteger)value;
+/// Initiate idle sync Wi-Fi test
+/// \param wifiIndex Wi-Fi number (4 bytes)
+///
+- (void)setWifiSyncTestWithWifiIndex:(uint32_t)wifiIndex;
+/// Get idle sync Wi-Fi test result
+/// \param wifiIndex Wi-Fi number (4 bytes)
+///
+- (void)getWifiSyncTestResultWithWifiIndex:(uint32_t)wifiIndex;
+/// Get battery level status
+/// @see Callback blePowerChange
+/// @see Callback bleChargingState
+- (void)getChargingState;
+/// Set microphone gain
+/// \param value Microphone gain value, range 0 - 30
+///
+- (void)setMicGainWithValue:(NSInteger)value;
+/// Get microphone gain
+/// @see bleMicGain
+- (void)readMicGain;
+/// Enable U disk mode
+/// \param onOff 1 enable; 0 disable
+///
+- (void)setUDiskModeOnOff:(BOOL)onOff;
+- (BOOL)checkIsRecording SWIFT_WARN_UNUSED_RESULT;
+- (BOOL)checkIsDownloading SWIFT_WARN_UNUSED_RESULT;
+/// Start recording
+/// If recording starts successfully, need to call syncFile to sync file yourself
+/// Can display real-time recording duration through sync file offset
+/// @see Callback bleRecordStart
+- (void)startRecord;
+/// Wake/sleep setting
+/// 0: sleep; 1: wake
+- (void)setDeviceActiveWithStatus:(NSInteger)status;
+/// Stop current recording
+/// @see Callback bleRecordStop
+- (void)stopRecord;
+/// Set device name
+- (void)setDeviceName:(NSString * _Nonnull)name;
+- (NSInteger)getCurrentSessionID SWIFT_WARN_UNUSED_RESULT;
+/// Pause recording
+/// Resume through resumeRecord()
+/// @see Callback bleRecordPause
+- (void)pauseRecord;
+/// Resume recording
+/// @see Callback bleRecordResume
+- (void)resumeRecord;
+/// Get session list (get file list after a certain sessionId)
+/// This command is not available during recording
+/// This command is not available in U disk mode
+/// \param uid Used to distinguish different commands
+///
+/// \param sessionId Which file to start syncing from, 0 means sync all
+/// @see Callback bleFileList
+///
+- (void)getFileListWithStartSessionId:(NSInteger)startSessionId;
+/// This command is not available during recording
+/// This command is not available in U disk mode
+/// \param sessionId File id
+/// Query file corresponding to this sessionId (get real-time recording file length after real-time recording ends)
+/// @see Callback bleFileList
+///
+- (void)getFileWithSessionId:(NSInteger)sessionId;
+/// Sync (download) file
+/// \param sessionId Recording file unique id
+///
+/// \param start Recording file start position (bytes)
+///
+/// \param end Sync to where? Generally pass 0, means sync to file end (bytes)
+/// @see Callback bleSyncFileHead
+/// @see Callback bleSyncFileTail
+/// @see Callback bleData
+/// @see Callback bleDecodeFail
+/// @see Callback bleDataComplete
+/// @see Callback blePcmData
+///
+- (void)syncFileWithSessionId:(NSInteger)sessionId start:(NSInteger)start end:(NSInteger)end;
+/// Download composite file (complete file)
+/// \param sessionId File unique ID
+///
+/// \param desiredOutputPath Desired output path (without extension)
+///
+/// \param format Output format. Options: .wav (recommended, playable), .pcm (raw audio data)
+/// @see Callback bleDownloadFile
+///
+- (void)downloadFileWithSessionId:(NSInteger)sessionId desiredOutputPath:(NSString * _Nonnull)desiredOutputPath format:(enum PlaudDownloadFormat)format;
+/// Stop file download
+/// @see Callback bleDownloadFileStop
+- (void)stopDownloadFile;
+/// 导出音频文件(与 Android SDK 接口一致)
+/// 此方法会自动完成以下步骤:
+///
+/// -
+/// 检查本地是否已有缓存文件
+///
+/// -
+/// 如果没有,从设备下载文件
+///
+/// -
+/// 进行 E2EE 解密(如果需要)
+///
+/// -
+/// 转换为目标格式并保存
+///
+///
+///
+/// -
+/// Example:
+///
+///
+/// \code
+/// // Android:
+/// // NiceBuildSdk.exportAudio(sessionId, outputDir, format, channels, callback)
+/// //
+/// // iOS:
+/// deviceAgent.exportAudio(
+/// sessionId: 1234567890,
+/// outputDir: documentsPath,
+/// format: .wav,
+/// channels: 1,
+/// callback: self
+/// )
+///
+/// \endcode\param sessionId 录音文件唯一标识
+///
+/// \param outputDir 输出目录路径
+///
+/// \param format 输出格式 (.wav 推荐, .pcm)
+///
+/// \param channels 声道数(默认 1,单声道)
+///
+/// \param callback 导出回调(进度、完成、错误)
+///
+- (void)exportAudioWithSessionId:(NSInteger)sessionId outputDir:(NSString * _Nonnull)outputDir format:(enum AudioExportFormat)format channels:(NSInteger)channels callback:(id _Nonnull)callback;
+/// End file sync (download)
+/// @see Callback bleSyncFileStop
+- (void)stopSyncFile;
+/// Delete file
+/// \param sessionId Recording file unique id
+/// @see Callback bleDeleteFile
+///
+- (void)deleteFileWithSessionId:(NSInteger)sessionId;
+/// Clear all files
+/// @see Callback bleClearAllFile
+- (void)clearAllFiles;
+/// Factory reset
+/// No callback
+- (void)restoreFactory;
+/// Get idle sync WiFi configuration
+/// \param wifiIndex Wi-Fi number (4 bytes)
+///
+- (void)getWifiSyncConfigWithWifiIndex:(uint32_t)wifiIndex;
+/// Set idle sync WiFi configuration
+/// \param operation Operation type 1: add, 2: modify)
+///
+/// \param wifiIndex Wi-Fi number (4 bytes)
+///
+/// \param ssid Wi-Fi SSID
+///
+/// \param password Wi-Fi password
+///
+- (void)setWifiSyncConfigWithOperation:(NSInteger)operation wifiIndex:(uint32_t)wifiIndex ssid:(NSString * _Nonnull)ssid password:(NSString * _Nonnull)password;
+/// Get idle sync WiFi list
+- (void)getWifiSyncList;
+/// Delete idle sync WiFi configuration
+/// \param wifiIndices Array of Wi-Fi numbers to delete (each number is 4 bytes)
+///
+- (void)deleteWifiSyncConfigWithWifiIndices:(NSArray * _Nonnull)wifiIndices;
+@end
+
+
+
+
+
+@interface PlaudDeviceAgent (SWIFT_EXTENSION(PlaudDeviceBasicSDK))
+- (void)onBinaryFileReqWithType:(NSInteger)type packageOffset:(NSInteger)packageOffset packageSize:(NSInteger)packageSize endStatus:(NSInteger)endStatus;
+- (void)onBinaryFileEndWithResult:(NSInteger)result;
+@end
+
+
+@interface PlaudDeviceAgent (SWIFT_EXTENSION(PlaudDeviceBasicSDK))
+/// Clears the stored SDK credentials (AppKey and AppSecret) from UserDefaults
+- (void)clearSDKCredentials;
+@end
+
+
+
+@interface PlaudDeviceAgent (SWIFT_EXTENSION(PlaudDeviceBasicSDK))
+/// Show update confirmation alert
+/// \param versionInfo version information
+///
+/// \param completion user selection callback
+///
+- (void)showUpdateConfirmationWithVersionInfo:(LatestVersionResponse * _Nonnull)versionInfo completion:(void (^ _Nonnull)(BOOL))completion;
+/// Simplified check for latest version for Objective-C
+/// \param model Device model (required)
+///
+/// \param snType Device type, options: note, notepin, notepro, other, default: notepin
+///
+/// \param versionType Version type, options: T, G, V, default: V
+///
+/// \param hasUpdate Callback with update available flag and version info
+///
+/// \param failure Failure callback with error message
+///
+- (void)checkLatestVersionForModel:(NSString * _Nonnull)model snType:(NSString * _Nonnull)snType versionType:(NSString * _Nonnull)versionType hasUpdate:(void (^ _Nonnull)(BOOL, LatestVersionResponse * _Nullable))hasUpdate failure:(void (^ _Nonnull)(NSString * _Nonnull))failure;
+/// Simplified download update for Objective-C
+/// \param versionInfo Version information to download
+///
+/// \param progress Progress callback with percentage (0.0 to 1.0)
+///
+/// \param success Success callback with local file path
+///
+/// \param failure Failure callback with error message
+///
+- (void)downloadUpdateForVersion:(LatestVersionResponse * _Nonnull)versionInfo progress:(void (^ _Nonnull)(float))progress success:(void (^ _Nonnull)(NSString * _Nonnull))success failure:(void (^ _Nonnull)(NSString * _Nonnull))failure;
+@end
+
+@class PlaudFirmwareCheckResult;
+enum PlaudFirmwarePhase : NSInteger;
+@class PlaudFirmwareUpdateResult;
+
+@interface PlaudDeviceAgent (SWIFT_EXTENSION(PlaudDeviceBasicSDK))
+/// 上报设备元数据(电量、固件版本、存储等)
+/// 连接成功后 SDK 自动调用,App 层通常无需手动调用
+- (void)reportDeviceMetadata;
+- (void)checkFirmwareUpdateWithCompletion:(void (^ _Nonnull)(PlaudFirmwareCheckResult * _Nonnull))completion;
+- (void)startFirmwareUpdateWithProgress:(void (^ _Nonnull)(enum PlaudFirmwarePhase, float))progress completion:(void (^ _Nonnull)(PlaudFirmwareUpdateResult * _Nonnull))completion;
+- (void)pushFirmwareFileWithFilePath:(NSString * _Nonnull)filePath toVersion:(NSString * _Nonnull)toVersion progress:(void (^ _Nonnull)(enum PlaudFirmwarePhase, float))progress completion:(void (^ _Nonnull)(PlaudFirmwareUpdateResult * _Nonnull))completion;
+@end
+
+
+@class BleFile;
+@class BleRecordMarkingTag;
+
+@interface PlaudDeviceAgent (SWIFT_EXTENSION(PlaudDeviceBasicSDK))
+- (void)bleScanResultWithBleDevices:(NSArray * _Nonnull)bleDevices;
+- (void)bleScanOverTime;
+- (void)bleAppKeyStateWithResult:(NSInteger)result;
+- (void)bleConnectStateWithState:(NSInteger)state;
+- (void)bleBindWithSn:(NSString * _Nullable)sn status:(NSInteger)status protVersion:(NSInteger)protVersion timezone:(NSInteger)timezone;
+- (void)blePenStateWithState:(NSInteger)state privacy:(NSInteger)privacy keyState:(NSInteger)keyState uDisk:(NSInteger)uDisk findMyToken:(NSInteger)findMyToken hasSndpKey:(NSInteger)hasSndpKey deviceAccessToken:(NSInteger)deviceAccessToken versionType:(NSString * _Nonnull)versionType versionCode:(NSInteger)versionCode;
+- (void)bleStorageWithTotal:(NSInteger)total free:(NSInteger)free duration:(NSInteger)duration;
+- (void)blePowerChangeWithPower:(NSInteger)power oldPower:(NSInteger)oldPower;
+- (void)bleChargingStateWithIsCharging:(BOOL)isCharging level:(NSInteger)level;
+- (void)bleFileListWithBleFiles:(NSArray * _Nonnull)bleFiles;
+- (void)bleDataComplete;
+- (void)bleRecordStartWithSessionId:(NSInteger)sessionId start:(NSInteger)start status:(NSInteger)status scene:(NSInteger)scene startTime:(NSInteger)startTime;
+- (void)bleRecordStopWithSessionId:(NSInteger)sessionId reason:(NSInteger)reason fileExist:(BOOL)fileExist fileSize:(NSInteger)fileSize;
+- (void)bleRecordPauseWithSessionId:(NSInteger)sessionId reason:(NSInteger)reason fileExist:(BOOL)fileExist fileSize:(NSInteger)fileSize;
+- (void)bleRecordResumeWithSessionId:(NSInteger)sessionId start:(NSInteger)start status:(NSInteger)status scene:(NSInteger)scene startTime:(NSInteger)startTime;
+- (void)bleSyncFileHeadWithSessionId:(NSInteger)sessionId status:(NSInteger)status;
+- (void)bleSyncFileTailWithSessionId:(NSInteger)sessionId crc:(NSInteger)crc;
+- (void)bleDataWithSessionId:(NSInteger)sessionId start:(NSInteger)start data:(NSData * _Nonnull)data;
+- (void)blePcmDataWithSessionId:(NSInteger)sessionId millsec:(NSInteger)millsec pcmData:(NSData * _Nonnull)pcmData isMusic:(BOOL)isMusic;
+- (void)bleDecodeFailWithStart:(NSInteger)start;
+- (void)bleSyncFileStop;
+- (void)bleDeleteFileWithSessionId:(NSInteger)sessionId status:(NSInteger)status;
+- (void)bleDepair:(NSInteger)status;
+- (void)bleMicGain:(NSInteger)value;
+- (void)onSyncIdleWifiConfigReceivedWithIndex:(uint32_t)index ssid:(NSString * _Nonnull)ssid password:(NSString * _Nonnull)password;
+- (void)onSyncIdleWifiConfigSetWithResult:(NSInteger)result;
+- (void)onSyncIdleWifiListReceivedWithList:(NSArray * _Nonnull)list;
+- (void)onSyncIdleWifiDeleteResultWithResult:(NSInteger)result;
+- (void)onSyncIdleWifiTestStartedWithIndex:(uint32_t)index;
+- (void)onSyncIdleWillStartWithSeconds:(NSInteger)seconds;
+- (void)onSyncIdleWifiTestResultWithIndex:(uint32_t)index result:(NSInteger)result rawCode:(NSInteger)rawCode;
+- (void)bleSyncWhenIdleEnabled:(NSInteger)value;
+- (void)bleUDiskErrWithFuncName:(NSString * _Nonnull)funcName;
+- (void)bleWiFiOpen:(NSInteger)status :(NSString * _Nonnull)wifiName :(NSString * _Nonnull)wholeName :(NSString * _Nonnull)wifiPass;
+- (void)bleDeviceNameWithName:(NSString * _Nullable)name;
+- (void)bleFotaResultWithUid:(NSInteger)uid status:(NSInteger)status errmsg:(NSString * _Nullable)errmsg;
+- (void)bleFotaPackReqWithUid:(NSInteger)uid start:(NSInteger)start end:(NSInteger)end;
+- (void)bleFotaPackFinWithUid:(NSInteger)uid status:(NSInteger)status errmsg:(NSString * _Nullable)errmsg;
+- (void)bleOtaDataSendFail;
+- (void)bleRateWithLossRate:(double)lossRate rate:(NSInteger)rate instantRate:(NSInteger)instantRate;
+- (void)bleSetActiveWithStatus:(NSInteger)status;
+- (void)bleHeartbeatWithStatus:(NSInteger)status;
+- (void)bleBatteryMode:(NSInteger)mode;
+- (void)bleDeviceStatusWithStatus:(NSArray * _Nonnull)status;
+- (void)bleNewFeatureWithData:(NSData * _Nonnull)data;
+- (void)bleGetRecordMarkingTagsWithUid:(NSInteger)uid totals:(NSInteger)totals index:(NSInteger)index tags:(NSArray * _Nonnull)tags;
+- (void)deviceLogDataWithStart:(NSInteger)start data:(NSData * _Nonnull)data logType:(NSInteger)logType;
+- (void)onGetDeviceLogListWithData:(NSData * _Nonnull)data;
+- (void)onSyncDeviceLogStartWithData:(NSData * _Nonnull)data;
+- (void)onSyncDeviceLogStop;
+- (void)onSyncDeviceLogEndWithData:(NSData * _Nonnull)data;
+- (void)onDeviceLogDeletedWithData:(NSData * _Nonnull)data;
+- (void)bleUpdatePowerLowErr;
+- (void)bleDeviceDisconnectErr;
+- (void)bleStateWithPowered:(BOOL)powered;
+- (void)bleHandshakeWaitWithTimeout:(NSInteger)timeout;
+- (void)blePenTimeWithStamp:(NSInteger)stamp timezone:(NSInteger)timezone zoneMin:(NSInteger)zoneMin;
+- (void)blePasswordResetWithPassword:(NSInteger)password;
+- (void)bleBacklightDuration:(NSInteger)duration;
+- (void)bleBacklightBright:(NSInteger)bright;
+- (void)bleLanguage:(NSInteger)type;
+- (void)bleRecScene:(NSInteger)scene;
+- (void)bleRecMode:(NSInteger)mode;
+- (void)bleVadSensitivity:(NSInteger)value;
+- (void)bleVpuGain:(NSInteger)value;
+- (void)bleSwitchHandler:(NSInteger)id;
+- (void)bleAutoPowerOff:(NSInteger)value;
+- (void)bleRawWaveEnabled:(NSInteger)value;
+- (void)bleRecordingAfterDisConnetEnabled:(NSInteger)value;
+- (void)bleFindMyState:(NSInteger)value;
+- (void)bleVPUCLKState:(NSInteger)value;
+- (void)bleStopRecordingAfterCharging:(NSInteger)value;
+- (void)bleAutoClear:(BOOL)open;
+- (void)bleVad:(BOOL)open;
+- (void)bleWiFiClose:(NSInteger)status;
+- (void)bleSetWiFiSsidWithStatus:(NSInteger)status;
+- (void)bleGetWiFiSsidWithStatus:(NSInteger)status ssid:(NSString * _Nullable)ssid;
+- (void)bleVoiceAbnormalWithStatus:(NSInteger)status;
+- (void)bleWebsocketProfile:(NSInteger)type :(NSString * _Nullable)conent;
+- (void)bleWebsocketTest:(NSInteger)status;
+- (void)bleLedStateOnOff:(NSInteger)onOff;
+- (void)bleSetLedStateOnOff:(NSInteger)onOff;
+- (void)bleMarkingWithSessionId:(NSInteger)sessionId status:(NSInteger)status markList:(NSArray * _Nonnull)markList;
+- (void)bleAnglesWithPitchAngle:(float)pitchAngle rollbackAngle:(float)rollbackAngle yawAngle:(float)yawAngle;
+- (void)blePrivacyWithPrivacy:(NSInteger)privacy;
+- (void)bleClearAllFileWithStatus:(NSInteger)status;
+- (void)bleAlarmRecWithStart:(NSInteger)start duration:(NSInteger)duration repeatMode:(NSInteger)repeatMode;
+- (void)onResetFindmyResultWithResult:(NSInteger)result;
+- (void)onCommonParamsSetResultWithSuccess:(BOOL)success dataType:(NSInteger)dataType value:(NSString * _Nullable)value;
+- (void)onCommonParamsGetResultWithSuccess:(BOOL)success dataType:(NSInteger)dataType value:(NSString * _Nullable)value;
+- (void)onSetSoundPlusTokenResultWithLicenseKey:(NSString * _Nonnull)licenseKey;
+- (void)onGetSDFlashCIDResultWithCid:(NSString * _Nonnull)cid;
+@end
+
+
+SWIFT_PROTOCOL("_TtP19PlaudDeviceBasicSDK24PlaudDeviceAgentProtocol_")
+@protocol PlaudDeviceAgentProtocol
+@optional
+/// AppKey verification result
+/// \param result Verification result 0 temporary 1 success 2 failure
+///
+- (void)bleAppKeyStateWithResult:(NSInteger)result;
+@required
+/// Return status
+/// \param state Customized according to project (4099(0x00001003) indicates recorder is recording, 1 seems to be recording)
+///
+/// \param privacy Privacy setting status
+///
+/// \param keySatte Toggle switch status (new in protocol version 4)
+///
+/// \param uDisk Whether U disk is enabled
+/// Other two parameters are directly placed in BleAgent
+///
+/// \param scene Current recording scene (0 when not recording)
+///
+/// \param findMyToken Whether findmy token exists (NotePin device)
+///
+/// \param hasSndpKey Whether sound plus license token exists
+///
+/// \param deviceAccessToken Whether device idle sync AccessToken exists
+///
+/// \param sessionId Current session id (0 when not recording)
+///
+- (void)blePenStateWithState:(NSInteger)state privacy:(NSInteger)privacy keyState:(NSInteger)keyState uDisk:(NSInteger)uDisk findMyToken:(NSInteger)findMyToken hasSndpKey:(NSInteger)hasSndpKey deviceAccessToken:(NSInteger)deviceAccessToken;
+@optional
+/// Device name
+/// \param name Device name
+///
+- (void)bleDeviceNameWithName:(NSString * _Nullable)name;
+/// Bluetooth device scan callback
+/// \param bleDevices Bluetooth device list
+///
+- (void)bleScanResultWithBleDevices:(NSArray * _Nonnull)bleDevices;
+/// Scan timeout end
+/// @see startScan
+- (void)bleScanOverTime;
+/// Bluetooth connection status
+///
+/// -
+/// Parameters state: 0 disconnected or not connected; 1 connection successful; 2 connection failed
+///
+///
+- (void)bleConnectStateWithState:(NSInteger)state;
+/// Connection callback
+/// \param status Status, 0: success, >0: rejected 1: Token mismatch 2: Screen project, currently recording, user cannot confirm temporarily 3: Screen project, user manually rejected 255: Recorder not in connection mode, reject handshake request in non-connection mode (unique to Heili three-stage switch) <0 verification failed -1: no SSN -2: network exception -3: server data exception or verification incorrect
+///
+/// \param protVersion Protocol version number
+///
+/// \param timezone Current timezone on pen side
+///
+- (void)bleBindWithSn:(NSString * _Nullable)sn status:(NSInteger)status protVersion:(NSInteger)protVersion timezone:(NSInteger)timezone;
+/// Microphone sensitivity
+/// \param value 1- 30
+///
+- (void)bleMicGain:(NSInteger)value;
+/// Device space
+/// \param total Total space size (bytes)
+///
+/// \param free Remaining space size (bytes)
+///
+/// \param duration Recorder’s estimated remaining recording duration (milliseconds)
+///
+- (void)bleStorageWithTotal:(NSInteger)total free:(NSInteger)free duration:(NSInteger)duration;
+/// Battery level change
+/// \param power Current battery level
+///
+/// \param oldPower Previous battery level (used to determine low battery reminders from 20%->19% and 10%->9%)
+///
+- (void)blePowerChangeWithPower:(NSInteger)power oldPower:(NSInteger)oldPower;
+/// Battery level status
+/// \param isCharging Whether charger is plugged in 0 not plugged in 1 plugged in (BleDevice has an isCharging property that will be set after this callback, can compare previous value to determine charging status change)
+///
+/// \param level Battery level 0-100
+///
+- (void)bleChargingStateWithIsCharging:(BOOL)isCharging level:(NSInteger)level;
+/// Get file list callback
+/// \param bleFiles File list
+///
+- (void)bleFileListWithBleFiles:(NSArray * _Nonnull)bleFiles;
+/// Start recording callback
+/// \param sessionId Recording file unique id, 0 timezone timestamp, to convert to phone current timestamp need to subtract timezone
+///
+/// \param start Recorded duration (file offset, bytes) (returns 0 if not recording before; if recording before, returns recorded duration)
+///
+/// \param status 0: success, >0: failure 1: space full; 2: U disk mode; 3: hardware exception; 4: currently busy; 255: wrong mode (recorder not in recording mode, unique to Heili three-stage switch)
+///
+/// \param scene Recording mode
+///
+/// \param startTime Start time
+///
+- (void)bleRecordStartWithSessionId:(NSInteger)sessionId start:(NSInteger)start status:(NSInteger)status scene:(NSInteger)scene startTime:(NSInteger)startTime reason:(NSInteger)reason;
+/// End recording callback
+/// \param sessionId Recording file unique id, 0 timezone timestamp, to convert to phone current timestamp need to subtract timezone
+///
+/// \param reason Reason (others undefined)
+/// 1.MMI_REC_STOP_FROM_DEV /// Device side stop recording
+/// 2.MMI_REC_STOP_FROM_APP /// APP side stop recording
+/// 3.MMI_REC_STOP_BY_SPLIT /// Automatic time slice stop recording
+/// 4.MMI_REC_STOP_BY_SWITCH /// Switch toggle stop recording)
+///
+/// \param fileExist Whether file is saved
+///
+/// \param fileSize File size (if available, bytes)
+///
+- (void)bleRecordStopWithSessionId:(NSInteger)sessionId reason:(NSInteger)reason fileExist:(BOOL)fileExist fileSize:(NSInteger)fileSize;
+/// Recording pause callback
+/// \param sessionId Recording file unique id, 0 timezone timestamp, to convert to phone current timestamp need to subtract timezone
+///
+/// \param reason Reason (currently undefined)
+///
+/// \param fileExist Whether file is saved
+///
+/// \param fileSize File size (if available, bytes)
+///
+- (void)bleRecordPauseWithSessionId:(NSInteger)sessionId reason:(NSInteger)reason fileExist:(BOOL)fileExist fileSize:(NSInteger)fileSize;
+/// Recording resume
+///
+/// -
+/// Parameters:
+///
+/// -
+/// sessionId: Recording file unique id, 0 timezone timestamp, to convert to phone current timestamp need to subtract timezone
+///
+/// -
+/// start: Recorded duration (file offset, bytes) (returns 0 if not recording before; if recording before, returns recorded duration)
+///
+/// -
+/// status: 0: success, >0: failure 1: space full; 2: U disk mode; 3: hardware exception
+///
+/// -
+/// scene: Recording mode (depends on project, version number)
+///
+/// -
+/// startTime: Start time (depends on project, version number)
+///
+///
+- (void)bleRecordResumeWithSessionId:(NSInteger)sessionId start:(NSInteger)start status:(NSInteger)status scene:(NSInteger)scene startTime:(NSInteger)startTime;
+/// Sync (download) file start callback
+/// \param sessionId File unique id
+///
+/// \param status Status, 0: success; >0: failure 1: file system currently unavailable 2: file does not exist 3: interrupted
+///
+- (void)bleSyncFileHeadWithSessionId:(NSInteger)sessionId status:(NSInteger)status;
+/// Sync (download) file end
+/// \param sessionId File unique id
+///
+/// \param crc File checksum code, verify file integrity (don’t use after recorder changed to egg file saving)
+///
+- (void)bleSyncFileTailWithSessionId:(NSInteger)sessionId crc:(NSInteger)crc;
+/// Voice data return
+/// \param sessionId File id, protocol 7 support
+///
+/// \param start Data offset in undecoded file (bytes)
+///
+/// \param data Data (may be ogg data or opus pure audio, determined by firmware)
+///
+- (void)bleDataWithSessionId:(NSInteger)sessionId start:(NSInteger)start data:(NSData * _Nonnull)data;
+/// Return decoded pcm data
+/// \param sessionId File id, protocol 7 support
+///
+/// \param millsec Current voice millisecond value
+///
+/// \param pcmData Decoded data, will not callback if decoding not required when starting recording; if recording is dual channel, will process to single channel; music mode is dual channel 48k sampling rate, will process to single channel 48k, not usable for recognition
+///
+/// \param isMusic Is it music mode? Music mode returned pcm is not normal pcm, is 6 shorts take one, used to generate waveform, cannot be used for recognition
+///
+- (void)blePcmDataWithSessionId:(NSInteger)sessionId millsec:(NSInteger)millsec pcmData:(NSData * _Nonnull)pcmData isMusic:(BOOL)isMusic;
+/// Data reception completed
+- (void)bleDataComplete;
+/// Voice data decoding failed
+/// \param start Data offset in undecoded file
+///
+- (void)bleDecodeFailWithStart:(NSInteger)start;
+/// Sync file terminated
+- (void)bleSyncFileStop;
+/// Sync composite file callback
+/// \param sessionId File unique id
+///
+/// \param sessionId Output file path
+///
+/// \param status 0 normal -1 error
+///
+/// \param progress Progress 0-100
+///
+/// \param tips Tips
+///
+- (void)bleDownloadFileWithSessionId:(NSInteger)sessionId desiredOutputPath:(NSString * _Nonnull)desiredOutputPath status:(NSInteger)status progress:(NSInteger)progress tips:(NSString * _Nonnull)tips;
+/// Sync file terminated
+- (void)bleDownloadFileStop;
+/// Delete file
+/// \param sessionId Protocol version 7 support
+///
+/// \param status Status, 0: delete successful; 1: recording not allowed to delete 2: favorited not allowed to delete; 3: playing not allowed to delete
+///
+- (void)bleDeleteFileWithSessionId:(NSInteger)sessionId status:(NSInteger)status;
+/// Unbind
+/// \param status 0 success; 1 working 2 upgrading
+///
+- (void)bleDepair:(NSInteger)status;
+- (void)onWifiSyncConfigReceivedWithIndex:(uint32_t)index ssid:(NSString * _Nonnull)ssid password:(NSString * _Nonnull)password;
+/// Set idle sync WiFi configuration result
+/// \param result Result code (0: success, 1: already exists, 2: device not found for deletion, 3: change not found, 4: operation code exception, 5: queue full, other: other errors)
+///
+- (void)onWifiSyncConfigSetWithResult:(NSInteger)result;
+/// Idle sync WiFi list reception
+/// \param list WiFi index list
+///
+- (void)onWifiSyncListReceivedWithList:(NSArray * _Nonnull)list;
+/// Idle sync WiFi delete result
+/// \param result Result code (0: success, -1: failure)
+///
+- (void)onWifiSyncDeleteResultWithResult:(NSInteger)result;
+/// Idle sync WiFi test start
+/// \param index WiFi number
+///
+- (void)onWifiSyncTestStartedWithIndex:(uint32_t)index;
+/// Idle sync about to start
+/// \param second Seconds until start
+///
+- (void)onWifiSyncWillStartWithSeconds:(NSInteger)seconds;
+/// Idle sync WiFi test result
+/// \param index WiFi number
+///
+/// \param result Test result: 0, test successful 1, wifi not found 2, Wifi password incorrect 3, Wifi connection failed 4, data transmission failed
+///
+/// \param rawCode Original error code
+///
+- (void)onWifiSyncTestResultWithIndex:(uint32_t)index result:(NSInteger)result rawCode:(NSInteger)rawCode;
+- (void)onWifiSyncUrlWithUrl:(NSString * _Nonnull)url;
+/// WiFi RSSI measurement request confirmed
+/// \param status Status code (0: success, other: error)
+///
+- (void)onWifiRssiRequestConfirmedWithStatus:(NSInteger)status;
+- (void)onSdkFetchPermissionResultWithPass:(BOOL)pass tips:(NSString * _Nonnull)tips;
+- (void)onSdkCheckPermissionResultWithPass:(BOOL)pass tips:(NSString * _Nonnull)tips;
+- (void)onSdkCheckResourceResultWithPass:(BOOL)pass tips:(NSString * _Nonnull)tips;
+/// Idle sync
+/// \param value 0: off 1: on
+///
+- (void)onWifiSyncEnabled:(NSInteger)value;
+- (void)onCommonMsgChannelWithType:(NSInteger)type value:(NSInteger)value tips:(NSString * _Nonnull)tips;
+/// WiFi open notification
+/// \param status 0 normal, >1 forbidden to open 1 recording status, 2 U disk status
+///
+/// \param wifiName Recording pen hotspot name
+///
+/// \param wholeName Determine whether to append 4-digit sn suffix name
+///
+/// \param wifiPass Recording pen hotspot password
+///
+- (void)bleWiFiOpen:(NSInteger)status :(NSString * _Nonnull)wifiName :(NSString * _Nonnull)wholeName :(NSString * _Nonnull)wifiPass;
+/// OTA notification
+/// \param uid Identifier
+///
+/// \param status Status 0 normal, 1. upgrade failed 2. version information mismatch 3. FLASH write failed 4. file too large 5. too many attempts 6. U disk mode; 7. recording in progress; 8. U disk insufficient remaining space; 9. working; 10. G101 glasses only allow upgrade in charging mode; 11. G101 glasses insufficient battery; 12. G101 glasses received upgrade protocol and preparing to adjust to OTA_MODE; 255: mode incorrect (recording pen not in recording mode, specific to Heili three-way switch)
+///
+/// \param errmsg Protocol version 4, if upgrade successful, returns upgraded version here; if failed, still returns error message.
+///
+- (void)bleFotaResultWithUid:(NSInteger)uid status:(NSInteger)status errmsg:(NSString * _Nullable)errmsg;
+/// OTA package request, recording pen requests to send upgrade package data
+/// \param uid Identifier
+///
+/// \param start Start position (bytes)
+///
+/// \param end End position (bytes)
+///
+- (void)bleFotaPackReqWithUid:(NSInteger)uid start:(NSInteger)start end:(NSInteger)end;
+/// OTA package reception completed
+/// \param uid Identifier
+///
+/// \param status Status 0 normal, 1. upgrade failed 2. version information mismatch 3. FLASH write failed 4. file too large 5. too many attempts 6. U disk mode; 7. recording in progress; 8. U disk insufficient remaining space
+///
+/// \param errmsg Protocol version 4, if upgrade successful, returns upgraded version here; if failed, still returns error message.
+///
+- (void)bleFotaPackFinWithUid:(NSInteger)uid status:(NSInteger)status errmsg:(NSString * _Nullable)errmsg;
+/// OTA data send failed
+- (void)bleOtaDataSendFail;
+/// Wake/sleep setting
+/// 0: sleep; 1: wake
+- (void)bleSetActiveWithStatus:(NSInteger)status;
+- (void)bleCommonSettingWithSetting:(NSInteger)setting;
+/// Bluetooth transmission rate callback
+/// \param lossRate Packet loss rate
+///
+/// \param rate Average rate, bytes/S
+///
+/// \param instantRate Real-time rate
+///
+- (void)bleRateWithLossRate:(double)lossRate rate:(NSInteger)rate instantRate:(NSInteger)instantRate;
+@end
+
+/// 文件下载输出格式
+typedef SWIFT_ENUM(NSInteger, PlaudDownloadFormat, open) {
+/// PCM 格式 - 原始音频数据,需要知道采样率才能正确播放
+ PlaudDownloadFormatPcm = 0,
+/// MP3 格式 - 暂不支持
+ PlaudDownloadFormatMp3 = 1,
+/// WAV 格式(推荐)- 带头信息的 PCM,可直接播放
+ PlaudDownloadFormatWav = 2,
+};
+
+
+/// E2EE encryption header for Plaud audio files.
+/// The header is 512 bytes and contains encryption metadata.
+/// NotePro audio files have two encryption layers:
+///
+/// -
+/// BLE Transport Layer - ChaCha20-Poly1305 (handled by BleAgent)
+///
+/// -
+/// File Content Layer - RSA encrypted key header + ChaCha20 encrypted data (handled here)
+///
+///
+SWIFT_CLASS("_TtC19PlaudDeviceBasicSDK18PlaudEncryptHeader")
+@interface PlaudEncryptHeader : NSObject
+SWIFT_CLASS_PROPERTY(@property (nonatomic, class, readonly) NSInteger headerSize;)
++ (NSInteger)headerSize SWIFT_WARN_UNUSED_RESULT;
+SWIFT_CLASS_PROPERTY(@property (nonatomic, class, readonly, copy) NSString * _Nonnull magicString;)
++ (NSString * _Nonnull)magicString SWIFT_WARN_UNUSED_RESULT;
+@property (nonatomic, readonly, copy) NSData * _Nonnull magic;
+@property (nonatomic, readonly) uint16_t version;
+@property (nonatomic, readonly) uint16_t headerSizeValue;
+@property (nonatomic, readonly) uint32_t crc;
+@property (nonatomic, readonly, copy) NSData * _Nonnull userId;
+@property (nonatomic, readonly) uint16_t fileType;
+@property (nonatomic, readonly) uint16_t channel;
+@property (nonatomic, readonly) uint16_t encryptType;
+@property (nonatomic, readonly) uint32_t duration;
+@property (nonatomic, readonly, copy) NSData * _Nonnull reserved;
+@property (nonatomic, readonly) uint32_t counter;
+@property (nonatomic, readonly, copy) NSData * _Nonnull nonce;
+@property (nonatomic, readonly) uint32_t segment;
+@property (nonatomic, readonly, copy) NSData * _Nonnull algParams;
+@property (nonatomic, readonly, copy) NSData * _Nonnull keyCipher;
+/// Parse header from raw data
+- (nullable instancetype)initWithData:(NSData * _Nonnull)data OBJC_DESIGNATED_INITIALIZER;
+/// Read header from file
++ (PlaudEncryptHeader * _Nullable)fromFileWithPath:(NSString * _Nonnull)path SWIFT_WARN_UNUSED_RESULT;
+/// Check if the file is encrypted (magic == “PLAUD.AI”)
+@property (nonatomic, readonly) BOOL isEncrypted;
+/// Get userId as string
+@property (nonatomic, readonly, copy) NSString * _Nonnull userIdString;
+@property (nonatomic, readonly, copy) NSString * _Nonnull description;
+- (nonnull instancetype)init SWIFT_UNAVAILABLE;
++ (nonnull instancetype)new SWIFT_UNAVAILABLE_MSG("-init is unavailable");
+@end
+
+
+SWIFT_CLASS("_TtC19PlaudDeviceBasicSDK17PlaudFileUploader")
+@interface PlaudFileUploader : NSObject
+SWIFT_CLASS_PROPERTY(@property (nonatomic, class, readonly, strong) PlaudFileUploader * _Nonnull shared;)
++ (PlaudFileUploader * _Nonnull)shared SWIFT_WARN_UNUSED_RESULT;
+@property (nonatomic, strong) BleDevice * _Nullable device;
+- (nonnull instancetype)init SWIFT_UNAVAILABLE;
++ (nonnull instancetype)new SWIFT_UNAVAILABLE_MSG("-init is unavailable");
+- (void)uploadRecordingWithSn:(NSString * _Nonnull)sn sessionId:(NSInteger)sessionId duration:(double)duration onProgress:(void (^ _Nonnull)(double))onProgress onSuccess:(void (^ _Nonnull)(NSDictionary * _Nonnull))onSuccess onFailure:(void (^ _Nonnull)(NSError * _Nonnull))onFailure;
+/// Upload log file
+/// \param filePath Path to the log file
+///
+/// \param sn Device serial number
+///
+/// \param onProgress Upload progress callback (0.0 to 1.0)
+///
+/// \param onSuccess Success callback with upload result
+///
+/// \param onFailure Failure callback with error
+///
+- (void)uploadLogFileWithFilePath:(NSString * _Nonnull)filePath sn:(NSString * _Nonnull)sn onProgress:(void (^ _Nonnull)(double))onProgress onSuccess:(void (^ _Nonnull)(NSDictionary * _Nonnull))onSuccess onFailure:(void (^ _Nonnull)(NSError * _Nonnull))onFailure;
++ (NSString * _Nonnull)calculateSnTypeWithSn:(NSString * _Nonnull)sn SWIFT_WARN_UNUSED_RESULT;
+@end
+
+
+/// 固件版本检查结果
+SWIFT_CLASS("_TtC19PlaudDeviceBasicSDK24PlaudFirmwareCheckResult")
+@interface PlaudFirmwareCheckResult : NSObject
+@property (nonatomic, readonly) BOOL hasUpdate;
+@property (nonatomic, readonly, copy) NSString * _Nonnull currentVersion;
+@property (nonatomic, readonly, copy) NSString * _Nonnull latestVersion;
+@property (nonatomic, readonly) NSInteger versionCode;
+@property (nonatomic, readonly, copy) NSString * _Nonnull releaseNotes;
+@property (nonatomic, readonly, copy) NSString * _Nonnull downloadUrl;
+@property (nonatomic, readonly, copy) NSString * _Nonnull md5;
+@property (nonatomic, readonly) BOOL isForce;
+- (nonnull instancetype)init SWIFT_UNAVAILABLE;
++ (nonnull instancetype)new SWIFT_UNAVAILABLE_MSG("-init is unavailable");
+@end
+
+/// 固件升级进度
+typedef SWIFT_ENUM(NSInteger, PlaudFirmwarePhase, open) {
+ PlaudFirmwarePhaseDownloading = 0,
+ PlaudFirmwarePhaseInstalling = 1,
+ PlaudFirmwarePhaseRestarting = 2,
+ PlaudFirmwarePhaseComplete = 3,
+};
+
+
+/// 固件升级结果
+SWIFT_CLASS("_TtC19PlaudDeviceBasicSDK25PlaudFirmwareUpdateResult")
+@interface PlaudFirmwareUpdateResult : NSObject
+@property (nonatomic, readonly) BOOL success;
+@property (nonatomic, readonly, copy) NSString * _Nonnull version;
+@property (nonatomic, readonly, copy) NSString * _Nullable errorMessage;
+- (nonnull instancetype)init SWIFT_UNAVAILABLE;
++ (nonnull instancetype)new SWIFT_UNAVAILABLE_MSG("-init is unavailable");
+@end
+
+
+/// Centralized log configuration manager for all Plaud SDK modules
+/// Located in PenBleSDK to avoid reverse dependency issues
+SWIFT_CLASS("_TtC19PlaudDeviceBasicSDK14PlaudLogConfig")
+@interface PlaudLogConfig : NSObject
+SWIFT_CLASS_PROPERTY(@property (nonatomic, class, readonly, strong) PlaudLogConfig * _Nonnull shared;)
++ (PlaudLogConfig * _Nonnull)shared SWIFT_WARN_UNUSED_RESULT;
+- (nonnull instancetype)init SWIFT_UNAVAILABLE;
++ (nonnull instancetype)new SWIFT_UNAVAILABLE_MSG("-init is unavailable");
+/// Maximum number of log files to keep
+@property (nonatomic, readonly) NSInteger maxFileCount;
+/// Maximum age of log files in seconds (default: 7 days)
+@property (nonatomic, readonly) NSTimeInterval maxFileAge;
+/// Maximum size of individual log file in bytes (default: 10MB)
+@property (nonatomic, readonly) int64_t maxFileSize;
+/// Upload interval in seconds (DEBUG: 1 minute, RELEASE: 5 minutes)
+@property (nonatomic, readonly) NSTimeInterval uploadInterval;
+/// Upload timeout in seconds (default: 30 seconds)
+@property (nonatomic, readonly) NSTimeInterval uploadTimeout;
+/// Update log file management configuration
+/// \param maxFileCount Maximum number of log files to keep (1-50)
+///
+/// \param maxFileAge Maximum age of log files in seconds (1 hour - 30 days)
+///
+/// \param maxFileSize Maximum size of individual log file in bytes (1MB - 100MB)
+///
+- (void)updateFileConfigurationWithMaxFileCount:(NSInteger)maxFileCount maxFileAge:(NSTimeInterval)maxFileAge maxFileSize:(int64_t)maxFileSize;
+/// Update upload configuration
+/// \param uploadInterval Upload interval in seconds (60s - 3600s)
+///
+/// \param uploadTimeout Upload timeout in seconds (10s - 300s)
+///
+- (void)updateUploadConfigurationWithUploadInterval:(NSTimeInterval)uploadInterval uploadTimeout:(NSTimeInterval)uploadTimeout;
+/// Reset configuration to default values
+- (void)resetToDefaults;
+/// Get current configuration as dictionary
+- (NSDictionary * _Nonnull)getCurrentConfiguration SWIFT_WARN_UNUSED_RESULT;
+/// Get max file age in days
+@property (nonatomic, readonly) NSInteger maxFileAgeDays;
+/// Get max file size in MB
+@property (nonatomic, readonly) NSInteger maxFileSizeMB;
+/// Get upload interval in minutes
+@property (nonatomic, readonly) NSInteger uploadIntervalMinutes;
+/// Get upload timeout in seconds
+@property (nonatomic, readonly) NSInteger uploadTimeoutSeconds;
+@end
+
+
+@interface PlaudLogConfig (SWIFT_EXTENSION(PlaudDeviceBasicSDK))
+/// Validate current configuration
+- (BOOL)validateConfiguration SWIFT_WARN_UNUSED_RESULT;
+/// Get configuration description for debugging
+- (NSString * _Nonnull)getConfigurationDescription SWIFT_WARN_UNUSED_RESULT;
+@end
+
+@class NSURL;
+
+/// 加密日志导出器,生成与 Android SDK 兼容的 .plaud 格式
+/// 格式:ChaCha20(ZIP(log files + sdk_info.txt))
+SWIFT_CLASS_NAMED("PlaudLogEncryption")
+@interface PlaudLogEncryption : NSObject
++ (NSURL * _Nullable)exportEncryptedLogs SWIFT_WARN_UNUSED_RESULT;
+- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER;
+@end
+
+
+/// Log file rotation manager
+/// Responsible for unified management of log file switching logic, ensuring immediate switch to new file after upload
+SWIFT_CLASS("_TtC19PlaudDeviceBasicSDK27PlaudLogFileRotationManager")
+@interface PlaudLogFileRotationManager : NSObject
+SWIFT_CLASS_PROPERTY(@property (nonatomic, class, readonly, strong) PlaudLogFileRotationManager * _Nonnull shared;)
++ (PlaudLogFileRotationManager * _Nonnull)shared SWIFT_WARN_UNUSED_RESULT;
+- (nonnull instancetype)init SWIFT_UNAVAILABLE;
++ (nonnull instancetype)new SWIFT_UNAVAILABLE_MSG("-init is unavailable");
+/// Force rotate current log file
+/// Usually called after successful upload to ensure subsequent logs are written to new file
+- (void)forceRotateCurrentLogFile;
+/// Check and perform size-based rotation
+/// \param filePath Log file path
+///
+/// \param additionalSize Size of data to be written
+///
+///
+/// returns:
+/// Whether rotation was performed
+- (BOOL)checkAndRotateIfNeededWithFilePath:(NSString * _Nonnull)filePath additionalSize:(int64_t)additionalSize SWIFT_WARN_UNUSED_RESULT;
+/// Get current active log file path
+- (NSString * _Nonnull)getCurrentLogFilePath SWIFT_WARN_UNUSED_RESULT;
+/// Notify manager that upload is completed, suggest file rotation
+- (void)notifyUploadCompleted;
+@end
+
+typedef SWIFT_ENUM(NSInteger, PlaudLogUploadError, open) {
+ PlaudLogUploadErrorAlreadyUploading = 0,
+ PlaudLogUploadErrorDirectoryNotFound = 1,
+ PlaudLogUploadErrorPartialUpload = 2,
+};
+static NSString * _Nonnull const PlaudLogUploadErrorDomain = @"PlaudDeviceBasicSDK.PlaudLogUploadError";
+
+
+/// Log upload manager for automatic periodic upload and management
+SWIFT_CLASS("_TtC19PlaudDeviceBasicSDK21PlaudLogUploadManager")
+@interface PlaudLogUploadManager : NSObject
+SWIFT_CLASS_PROPERTY(@property (nonatomic, class, readonly, strong) PlaudLogUploadManager * _Nonnull shared;)
++ (PlaudLogUploadManager * _Nonnull)shared SWIFT_WARN_UNUSED_RESULT;
+- (nonnull instancetype)init SWIFT_UNAVAILABLE;
++ (nonnull instancetype)new SWIFT_UNAVAILABLE_MSG("-init is unavailable");
+/// Enable or disable automatic log upload
+/// \param enabled true to enable auto upload, false to disable
+///
+- (void)setAutoUploadEnabled:(BOOL)enabled;
+/// Start automatic log upload timer
+- (void)startAutoUpload;
+/// Stop automatic log upload timer
+- (void)stopAutoUpload;
+/// Upload log files with progress tracking
+/// \param onProgress Progress callback (0.0 to 1.0)
+///
+/// \param onSuccess Success callback with upload results
+///
+/// \param onFailure Failure callback with error
+///
+- (void)uploadLogFilesOnProgress:(void (^ _Nonnull)(double))onProgress onSuccess:(void (^ _Nonnull)(NSDictionary * _Nonnull))onSuccess onFailure:(void (^ _Nonnull)(NSError * _Nonnull))onFailure;
+/// Manually trigger log cleanup
+- (void)cleanupLogFiles;
+/// Get upload statistics
+///
+/// returns:
+/// Dictionary with upload statistics
+- (NSDictionary * _Nonnull)getUploadStatistics SWIFT_WARN_UNUSED_RESULT;
+/// Upload log files with specific device serial number
+/// \param sn Device serial number
+///
+/// \param onProgress Progress callback (0.0 to 1.0)
+///
+/// \param onSuccess Success callback with upload results
+///
+/// \param onFailure Failure callback with error
+///
+- (void)uploadLogFilesWithDeviceSNWithSn:(NSString * _Nonnull)sn onProgress:(void (^ _Nonnull)(double))onProgress onSuccess:(void (^ _Nonnull)(NSDictionary * _Nonnull))onSuccess onFailure:(void (^ _Nonnull)(NSError * _Nonnull))onFailure;
+/// Upload logs after recording upload completion
+/// \param sn Device serial number
+///
+/// \param sessionId Session ID
+///
+/// \param onCompletion Completion callback
+///
+- (void)uploadLogsAfterRecordingWithSn:(NSString * _Nonnull)sn sessionId:(NSInteger)sessionId onCompletion:(void (^ _Nonnull)(BOOL, NSError * _Nullable))onCompletion;
+@end
+
+
+/// PCM 文件播放器 - 直接播放 PCM 文件,避免 MP3 转换引入的噪音
+SWIFT_CLASS("_TtC19PlaudDeviceBasicSDK14PlaudPCMPlayer")
+@interface PlaudPCMPlayer : NSObject
+@property (nonatomic, readonly) BOOL isPlaying;
+@property (nonatomic, readonly) BOOL isPaused;
+@property (nonatomic, readonly) NSTimeInterval duration;
+@property (nonatomic, readonly) NSTimeInterval currentTime;
+@property (nonatomic, copy) void (^ _Nullable onPlaybackFinished)(void);
+@property (nonatomic, copy) void (^ _Nullable onError)(NSString * _Nonnull);
+- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER;
+/// 加载 PCM 文件
+- (BOOL)loadFileWithPath:(NSString * _Nonnull)path SWIFT_WARN_UNUSED_RESULT;
+/// 播放
+- (void)play;
+/// 暂停
+- (void)pause;
+/// 停止
+- (void)stop;
+@end
+
+
+SWIFT_CLASS("_TtC19PlaudDeviceBasicSDK14PlaudSDKLogger")
+@interface PlaudSDKLogger : NSObject
++ (void)logEvent:(NSString * _Nonnull)eventName parameters:(NSDictionary * _Nullable)parameters;
+- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER;
+@end
+
+@protocol PlaudWiFiAgentProtocol;
+
+SWIFT_CLASS("_TtC19PlaudDeviceBasicSDK14PlaudWiFiAgent")
+@interface PlaudWiFiAgent : NSObject
+SWIFT_CLASS_PROPERTY(@property (nonatomic, class, readonly, strong) PlaudWiFiAgent * _Nonnull shared;)
++ (PlaudWiFiAgent * _Nonnull)shared SWIFT_WARN_UNUSED_RESULT;
+@property (nonatomic, weak) id _Nullable delegate;
+/// Device information needs to be passed from Bluetooth module
+@property (nonatomic, strong) BleDevice * _Nullable bleDevice;
+/// Whether currently downloading file
+@property (nonatomic, readonly) BOOL isDownloading;
+/// Current sync file sessionId
+@property (nonatomic, readonly) NSInteger currentSessionId;
+/// Whether connection has been established
+@property (nonatomic, readonly) BOOL isConnected;
+/// Get current download speed (KB/s)
+@property (nonatomic, readonly) double currentDownloadSpeedKBps;
+/// Get formatted download speed string
+- (NSString * _Nonnull)getFormattedDownloadSpeed SWIFT_WARN_UNUSED_RESULT;
+/// Whether currently batch downloading
+@property (nonatomic, readonly) BOOL isDownloadingAll;
+- (nonnull instancetype)init SWIFT_UNAVAILABLE;
++ (nonnull instancetype)new SWIFT_UNAVAILABLE_MSG("-init is unavailable");
+/// Enable SDK debug logs or callback logs
+- (void)openLog:(BOOL)opened :(void (^ _Nullable)(NSString * _Nonnull))backBlock;
+/// Use this method for iOS 11.0 and below, will loop to check if connected to specified WiFi until timeout
+/// \param ssid WiFi name
+///
+/// \param overtimeSec Timeout duration, default 30 seconds
+///
+- (void)listenPort:(NSString * _Nonnull)ssid :(NSInteger)overtimeSec;
+/// Connect to specified WiFi using WiFi name and password
+/// iOS 11.0 and above use this method for direct WiFi connection, earlier versions need popup to guide user to settings for manual connection
+/// \param ssid WiFi name
+///
+/// \param passphrase Password
+///
+/// \param overtimeSec Timeout duration, default 60 seconds
+///
+- (void)connectWifi:(NSString * _Nonnull)ssid :(NSString * _Nonnull)passphrase :(NSInteger)overtimeSec SWIFT_AVAILABILITY(ios,introduced=11.0);
+/// Disconnect
+- (void)disconnect;
+/// Check if currently connected to specified WiFi
+/// \param ssid WiFi name
+///
+///
+/// returns:
+/// Whether connected
+- (BOOL)isConnectedTo:(NSString * _Nonnull)ssid SWIFT_WARN_UNUSED_RESULT;
+/// Get current connection status description
+///
+/// returns:
+/// Connection status description
+- (NSString * _Nonnull)getConnectionStatusDescription SWIFT_WARN_UNUSED_RESULT;
+/// Get current connected WiFi name
+- (NSString * _Nullable)getCurrentWiFiName SWIFT_WARN_UNUSED_RESULT;
+/// Get file list (app initiated cmd=11)
+/// \param uid Request uid, new requests will naturally override old requests
+///
+/// \param sessionId Starting sessionId
+///
+/// \param single Whether to only get current file information, default false
+///
+- (void)getFileList:(NSInteger)uid :(NSInteger)sessionId :(BOOL)single;
+/// File sync (cmd=12)
+/// \param sessionId Recording ID
+///
+/// \param start Start position (file offset, not time)
+///
+/// \param end End position (default 0, to end of file)
+///
+/// \param scene Recording scene, default 1
+///
+- (void)syncFile:(NSInteger)sessionId :(NSInteger)start :(NSInteger)end :(NSInteger)scene;
+/// Stop file sync (cmd=15)
+/// \param sessionId Recording ID
+///
+/// \param scene Scene, default 1
+///
+- (void)stopSyncFile:(NSInteger)sessionId :(NSInteger)scene;
+/// Delete file (cmd=14)
+/// \param sessionId Recording ID
+///
+/// \param scene Scene, default 1
+///
+- (void)deleteFile:(NSInteger)sessionId :(NSInteger)scene;
+/// Start downloading all files
+/// First get file list, then download one by one
+- (void)startDownloadAll;
+/// Stop downloading all files
+- (void)stopDownloadAll;
+/// Rate test (cmd=100)
+/// \param onOff Start or end
+///
+/// \param packSize Test package size
+///
+- (void)startRateTest:(BOOL)onOff :(NSInteger)packSize;
+/// Pen-side log retrieval (cmd=101)
+/// \param begin Start or end
+///
+- (void)getDeviceLogs:(BOOL)begin;
+/// Whether WebSocket connection has been successfully established (prerequisite for app to send requests)
+- (BOOL)isWebSocketConnected SWIFT_WARN_UNUSED_RESULT;
+@end
+
+
+@interface PlaudWiFiAgent (SWIFT_EXTENSION(PlaudDeviceBasicSDK))
+- (void)wifiCommonErr:(NSInteger)cmd :(NSInteger)status;
+- (void)wifiHandshake:(NSInteger)status;
+- (void)wifiPower:(NSInteger)power :(NSInteger)voltage;
+- (void)wifiFileListFail:(NSInteger)status;
+- (void)wifiFileList:(NSArray * _Nonnull)files;
+- (void)wifiSyncFile:(NSInteger)sessionId :(NSInteger)status;
+- (void)wifiSyncFileData:(NSInteger)sessionId :(NSInteger)offset :(NSInteger)count :(NSData * _Nonnull)binData;
+- (void)wifiDataComplete;
+- (void)wifiSyncFileStop:(NSInteger)status;
+- (void)wifiFileDelete:(NSInteger)sessionId :(NSInteger)status;
+- (void)wifiClientFail;
+- (void)wifiClose:(NSInteger)status;
+- (void)wifiRateFail:(NSInteger)status;
+- (void)wifiRate:(NSInteger)instantRate :(NSInteger)averageRate :(double)lossRate;
+- (void)wifiLogsFail:(NSInteger)status;
+- (void)wifiLogs:(NSData * _Nullable)logData;
+- (void)wifiTips:(NSInteger)tips;
+- (void)penRequestOTADataWithStart:(NSInteger)start end:(NSInteger)end payloadSize:(NSInteger)payloadSize uid:(NSInteger)uid sendRatePPS:(NSInteger)sendRatePPS;
+- (void)wifiOTAStatus:(NSInteger)status :(NSInteger)uid;
+@end
+
+
+SWIFT_PROTOCOL("_TtP19PlaudDeviceBasicSDK22PlaudWiFiAgentProtocol_")
+@protocol PlaudWiFiAgentProtocol
+@optional
+/// Common error
+/// \param cmd Error command
+///
+/// \param status Error code
+///
+- (void)wifiCommonErr:(NSInteger)cmd :(NSInteger)status;
+/// Handshake result
+/// \param status 0 success, others failure
+///
+- (void)wifiHandshake:(NSInteger)status;
+/// WiFi connection status change
+/// \param ssid WiFi name
+///
+/// \param connected Whether connection succeeded
+///
+- (void)wifiConnectionStatus:(NSString * _Nonnull)ssid :(BOOL)connected;
+/// Battery level and voltage
+/// \param power Battery level, percentage
+///
+/// \param voltage Battery voltage, mv
+///
+- (void)wifiPower:(NSInteger)power :(NSInteger)voltage;
+/// Failed to get recording list
+/// \param status Error code
+///
+- (void)wifiFileListFail:(NSInteger)status;
+/// Get recording list
+/// \param files Recording list
+///
+- (void)wifiFileList:(NSArray * _Nonnull)files;
+/// File sync–file status
+/// \param sessionId Recording ID
+///
+/// \param status Status
+///
+- (void)wifiSyncFile:(NSInteger)sessionId :(NSInteger)status;
+/// File sync–file data
+/// \param sessionId Recording ID
+///
+/// \param offset File offset (bytes)
+///
+/// \param count File length (bytes)
+///
+/// \param binData Data
+///
+- (void)wifiSyncFileData:(NSInteger)sessionId :(NSInteger)offset :(NSInteger)count :(NSData * _Nonnull)binData;
+/// A file download completed
+- (void)wifiDataComplete;
+/// File sync stop
+/// \param status Status 0 success
+///
+- (void)wifiSyncFileStop:(NSInteger)status;
+/// File deletion result
+/// \param sessionId Recording ID
+///
+/// \param status Deletion result 0 success, >0 failure reason
+///
+- (void)wifiFileDelete:(NSInteger)sessionId :(NSInteger)status;
+/// Client exception disconnect, waiting for reconnection
+/// Please set BleAgent.shared.setWiFiState(false)
+- (void)wifiClientFail;
+/// WiFi close notification
+/// \param status Status -1 is didFailWithError; -2 is timeout not connected; -3 NEHotspotConfigurationManager direct connection exception
+///
+- (void)wifiClose:(NSInteger)status;
+/// Rate test failed
+/// \param status Error code
+///
+- (void)wifiRateFail:(NSInteger)status;
+/// Rate test
+/// \param instantRate Instantaneous rate
+///
+/// \param averageRate Average rate
+///
+/// \param lossRate Packet loss rate
+///
+- (void)wifiRate:(NSInteger)instantRate :(NSInteger)averageRate :(double)lossRate;
+/// Failed to get pen-side logs
+/// \param status Error code
+///
+- (void)wifiLogsFail:(NSInteger)status;
+/// Pen-side logs
+/// \param logData Log data
+///
+- (void)wifiLogs:(NSData * _Nullable)logData;
+/// Pen sends tips to app
+/// \param tips 0 no tip, 1 pen recording key pressed
+///
+- (void)wifiTips:(NSInteger)tips;
+/// Batch download progress callback
+/// \param totalFiles Total number of files
+///
+/// \param currentFileIndex Current file index (starting from 1)
+///
+/// \param currentFile Currently downloading file
+///
+/// \param totalProgress Overall download progress (0.0-1.0)
+///
+- (void)wifiDownloadAllProgress:(NSInteger)totalFiles :(NSInteger)currentFileIndex :(BleFile * _Nullable)currentFile :(double)totalProgress;
+/// Batch download completed
+/// \param completedFiles Number of completed files
+///
+/// \param failedFiles Number of failed files
+///
+- (void)wifiDownloadAllCompleted:(NSInteger)completedFiles :(NSInteger)failedFiles;
+@end
+
+
+SWIFT_CLASS("_TtC19PlaudDeviceBasicSDK19PlaudWifiAddingPage")
+@interface PlaudWifiAddingPage : UIViewController
+- (nullable instancetype)initWithCoder:(NSCoder * _Nonnull)coder SWIFT_UNAVAILABLE;
+- (void)viewDidLoad;
+- (nonnull instancetype)initWithNibName:(NSString * _Nullable)nibNameOrNil bundle:(NSBundle * _Nullable)nibBundleOrNil SWIFT_UNAVAILABLE;
+@end
+
+
+SWIFT_CLASS("_TtC19PlaudDeviceBasicSDK20PlaudWifiSettingPage")
+@interface PlaudWifiSettingPage : UIViewController
+- (void)bleAppKeyStateWithResult:(NSInteger)_;
+- (void)onWifiSyncUrlWithUrl:(NSString * _Nonnull)url;
+- (void)blePenStateWithState:(NSInteger)_ privacy:(NSInteger)_ keyState:(NSInteger)_ uDisk:(NSInteger)_ findMyToken:(NSInteger)_ hasSndpKey:(NSInteger)_ deviceAccessToken:(NSInteger)_;
+- (void)bleConnectStateWithState:(NSInteger)state;
+- (void)onWifiSyncEnabled:(NSInteger)value;
+- (void)onWifiSyncListReceivedWithList:(NSArray * _Nonnull)list;
+- (void)onWifiSyncConfigReceivedWithIndex:(uint32_t)index ssid:(NSString * _Nonnull)ssid password:(NSString * _Nonnull)password;
+- (void)onWifiSyncConfigSetWithResult:(NSInteger)result;
+- (void)onWifiSyncDeleteResultWithResult:(NSInteger)_;
+- (void)onWifiSyncTestResultWithIndex:(uint32_t)index result:(NSInteger)result rawCode:(NSInteger)_;
+/// WiFi RSSI measurement request confirmed callback
+- (void)onWifiRssiRequestConfirmedWithStatus:(NSInteger)status;
+- (void)viewDidLoad;
+- (void)observeValueForKeyPath:(NSString * _Nullable)keyPath ofObject:(id _Nullable)object change:(NSDictionary * _Nullable)_ context:(void * _Nullable)_;
+- (nonnull instancetype)initWithNibName:(NSString * _Nullable)nibNameOrNil bundle:(NSBundle * _Nullable)nibBundleOrNil OBJC_DESIGNATED_INITIALIZER;
+- (nullable instancetype)initWithCoder:(NSCoder * _Nonnull)coder OBJC_DESIGNATED_INITIALIZER;
+@end
+
+@class UITableView;
+@class NSIndexPath;
+@class UITableViewCell;
+
+@interface PlaudWifiSettingPage (SWIFT_EXTENSION(PlaudDeviceBasicSDK))
+- (NSInteger)tableView:(UITableView * _Nonnull)_ numberOfRowsInSection:(NSInteger)_ SWIFT_WARN_UNUSED_RESULT;
+- (CGFloat)tableView:(UITableView * _Nonnull)_ heightForRowAtIndexPath:(NSIndexPath * _Nonnull)_ SWIFT_WARN_UNUSED_RESULT;
+- (UITableViewCell * _Nonnull)tableView:(UITableView * _Nonnull)tableView cellForRowAtIndexPath:(NSIndexPath * _Nonnull)indexPath SWIFT_WARN_UNUSED_RESULT;
+- (void)tableView:(UITableView * _Nonnull)tableView didSelectRowAtIndexPath:(NSIndexPath * _Nonnull)indexPath;
+@end
+
+
+/// // a base class of vc to write bottom view
+SWIFT_CLASS("_TtC19PlaudDeviceBasicSDK15PresentBottomVC")
+@interface PresentBottomVC : UIViewController
+- (void)viewDidLoad;
+- (void)viewDidDisappear:(BOOL)animated;
+- (nonnull instancetype)initWithNibName:(NSString * _Nullable)nibNameOrNil bundle:(NSBundle * _Nullable)nibBundleOrNil OBJC_DESIGNATED_INITIALIZER;
+- (nullable instancetype)initWithCoder:(NSCoder * _Nonnull)coder OBJC_DESIGNATED_INITIALIZER;
+@end
+
+
+SWIFT_CLASS("_TtC19PlaudDeviceBasicSDK9TestAgent")
+@interface TestAgent : NSObject
+/// Singleton
+SWIFT_CLASS_PROPERTY(@property (nonatomic, class, readonly, strong) TestAgent * _Nonnull shared;)
++ (TestAgent * _Nonnull)shared SWIFT_WARN_UNUSED_RESULT;
+- (nonnull instancetype)init SWIFT_UNAVAILABLE;
++ (nonnull instancetype)new SWIFT_UNAVAILABLE_MSG("-init is unavailable");
+/// Whether device is connected (WiFi or Bluetooth)
+- (NSString * _Nonnull)testFunc SWIFT_WARN_UNUSED_RESULT;
+@end
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+@class UIPresentationController;
+
+@interface UIViewController (SWIFT_EXTENSION(PlaudDeviceBasicSDK))
+- (UIPresentationController * _Nullable)presentationControllerForPresentedViewController:(UIViewController * _Nonnull)presented presentingViewController:(UIViewController * _Nullable)presenting sourceViewController:(UIViewController * _Nonnull)source SWIFT_WARN_UNUSED_RESULT;
+@end
+
+
+#endif
+#if __has_attribute(external_source_symbol)
+# pragma clang attribute pop
+#endif
+#if defined(__cplusplus)
+#endif
+#pragma clang diagnostic pop
+#endif
+
+#else
+#error unsupported Swift architecture
+#endif
diff --git a/modules/plaud-sdk/ios/Frameworks/PlaudDeviceBasicSDK.xcframework/ios-arm64/PlaudDeviceBasicSDK.framework/Headers/PlaudDeviceBasicSDK.h b/modules/plaud-sdk/ios/Frameworks/PlaudDeviceBasicSDK.xcframework/ios-arm64/PlaudDeviceBasicSDK.framework/Headers/PlaudDeviceBasicSDK.h
new file mode 100644
index 0000000..74980a0
--- /dev/null
+++ b/modules/plaud-sdk/ios/Frameworks/PlaudDeviceBasicSDK.xcframework/ios-arm64/PlaudDeviceBasicSDK.framework/Headers/PlaudDeviceBasicSDK.h
@@ -0,0 +1,22 @@
+//
+// PlaudDeviceBasicSDK.h
+// PlaudDeviceBasicSDK
+//
+// Created by Xiong on 2025/4/28.
+// Copyright © 2025 NiceBuild. All rights reserved.
+//
+
+#import
+
+//! Project version number for PlaudDeviceBasicSDK.
+FOUNDATION_EXPORT double PlaudDeviceBasicSDKVersionNumber;
+
+//! Project version string for PlaudDeviceBasicSDK.
+FOUNDATION_EXPORT const unsigned char PlaudDeviceBasicSDKVersionString[];
+
+// In this header, you should import all the public headers of your framework using statements like #import
+
+#import
+#import
+
+//#import
diff --git a/modules/plaud-sdk/ios/Frameworks/PlaudDeviceBasicSDK.xcframework/ios-arm64/PlaudDeviceBasicSDK.framework/Headers/PlaudLogRedirect.h b/modules/plaud-sdk/ios/Frameworks/PlaudDeviceBasicSDK.xcframework/ios-arm64/PlaudDeviceBasicSDK.framework/Headers/PlaudLogRedirect.h
new file mode 100644
index 0000000..21eacb6
--- /dev/null
+++ b/modules/plaud-sdk/ios/Frameworks/PlaudDeviceBasicSDK.xcframework/ios-arm64/PlaudDeviceBasicSDK.framework/Headers/PlaudLogRedirect.h
@@ -0,0 +1,69 @@
+//
+// PlaudLogRedirect.h
+// PlaudSDK
+//
+// Created by Plaud Team on 2024/12/19.
+// Copyright © 2024 Plaud. All rights reserved.
+//
+
+#import
+
+NS_ASSUME_NONNULL_BEGIN
+
+/// Macro definition for redirecting NSLog to file
+/// Usage: #import "PlaudLogRedirect.h" in files that need redirection
+/// Then use PLAUD_NSLOG(@"message") instead of NSLog(@"message")
+/// Note: This macro outputs to both console and saves to file
+
+#define PLAUD_NSLOG(format, ...) \
+ do { \
+ NSString *message = [NSString stringWithFormat:format, ##__VA_ARGS__]; \
+ NSLog(@"%@", message); \
+ [PlaudLogRedirect saveNSLogToFile:message]; \
+ } while(0)
+
+/// Log redirection manager
+@interface PlaudLogRedirect : NSObject
+
+/// Save NSLog message to file
+/// @param message Log message
++ (void)saveNSLogToFile:(NSString *)message;
+
+/// Add a log entry from the host app to the unified SDK log file.
+/// Use this method to contribute application-level logs for diagnostics.
+/// @param message Log message
++ (void)addLog:(NSString *)message;
+
+/// Add a log entry with a custom level tag.
+/// @param message Log message
+/// @param level Log level tag (e.g., "INFO", "ERROR", "WIFI", "BLE")
++ (void)addLog:(NSString *)message level:(NSString *)level;
+
+/// Get all log file paths
+/// @return Array of log file paths
++ (NSArray *)getAllLogFilePaths;
+
+/// Get current log file path
+/// @return Current log file path
++ (NSString *)getCurrentLogFilePath;
+
+/// Export encrypted .plaud log file for sharing via UIActivityViewController.
+/// The .plaud format is a ChaCha20-encrypted ZIP archive containing all log files and SDK info,
+/// compatible with the Android SDK's .plaud format.
+/// @return File URL of the .plaud file, or nil on failure
++ (nullable NSURL *)exportEncryptedLogFile;
+
+/// Manually clean up old/excess log files (rotation)
++ (void)cleanupLogFiles;
+
+/// Delete all log files (e.g., after successful export)
++ (void)deleteAllLogFiles;
+
+/// Export log files to specified directory
+/// @param destinationPath Target directory path
+/// @param completion Completion callback
++ (void)exportLogFilesToPath:(NSString *)destinationPath completion:(void(^)(BOOL success, NSError * _Nullable error))completion;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/modules/plaud-sdk/ios/Frameworks/PlaudDeviceBasicSDK.xcframework/ios-arm64/PlaudDeviceBasicSDK.framework/Headers/PrintManager.h b/modules/plaud-sdk/ios/Frameworks/PlaudDeviceBasicSDK.xcframework/ios-arm64/PlaudDeviceBasicSDK.framework/Headers/PrintManager.h
new file mode 100644
index 0000000..3ea1642
--- /dev/null
+++ b/modules/plaud-sdk/ios/Frameworks/PlaudDeviceBasicSDK.xcframework/ios-arm64/PlaudDeviceBasicSDK.framework/Headers/PrintManager.h
@@ -0,0 +1,12 @@
+
+#import
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface PrintManager : NSObject
+
++ (void)printMenthod;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/modules/plaud-sdk/ios/Frameworks/PlaudDeviceBasicSDK.xcframework/ios-arm64/PlaudDeviceBasicSDK.framework/Info.plist b/modules/plaud-sdk/ios/Frameworks/PlaudDeviceBasicSDK.xcframework/ios-arm64/PlaudDeviceBasicSDK.framework/Info.plist
new file mode 100644
index 0000000..063499b
Binary files /dev/null and b/modules/plaud-sdk/ios/Frameworks/PlaudDeviceBasicSDK.xcframework/ios-arm64/PlaudDeviceBasicSDK.framework/Info.plist differ
diff --git a/modules/plaud-sdk/ios/Frameworks/PlaudDeviceBasicSDK.xcframework/ios-arm64/PlaudDeviceBasicSDK.framework/Modules/PlaudDeviceBasicSDK.swiftmodule/Project/arm64-apple-ios.swiftsourceinfo b/modules/plaud-sdk/ios/Frameworks/PlaudDeviceBasicSDK.xcframework/ios-arm64/PlaudDeviceBasicSDK.framework/Modules/PlaudDeviceBasicSDK.swiftmodule/Project/arm64-apple-ios.swiftsourceinfo
new file mode 100644
index 0000000..a485286
Binary files /dev/null and b/modules/plaud-sdk/ios/Frameworks/PlaudDeviceBasicSDK.xcframework/ios-arm64/PlaudDeviceBasicSDK.framework/Modules/PlaudDeviceBasicSDK.swiftmodule/Project/arm64-apple-ios.swiftsourceinfo differ
diff --git a/modules/plaud-sdk/ios/Frameworks/PlaudDeviceBasicSDK.xcframework/ios-arm64/PlaudDeviceBasicSDK.framework/Modules/PlaudDeviceBasicSDK.swiftmodule/arm64-apple-ios.swiftdoc b/modules/plaud-sdk/ios/Frameworks/PlaudDeviceBasicSDK.xcframework/ios-arm64/PlaudDeviceBasicSDK.framework/Modules/PlaudDeviceBasicSDK.swiftmodule/arm64-apple-ios.swiftdoc
new file mode 100644
index 0000000..782551d
Binary files /dev/null and b/modules/plaud-sdk/ios/Frameworks/PlaudDeviceBasicSDK.xcframework/ios-arm64/PlaudDeviceBasicSDK.framework/Modules/PlaudDeviceBasicSDK.swiftmodule/arm64-apple-ios.swiftdoc differ
diff --git a/modules/plaud-sdk/ios/Frameworks/PlaudDeviceBasicSDK.xcframework/ios-arm64/PlaudDeviceBasicSDK.framework/Modules/PlaudDeviceBasicSDK.swiftmodule/arm64-apple-ios.swiftinterface b/modules/plaud-sdk/ios/Frameworks/PlaudDeviceBasicSDK.xcframework/ios-arm64/PlaudDeviceBasicSDK.framework/Modules/PlaudDeviceBasicSDK.swiftmodule/arm64-apple-ios.swiftinterface
new file mode 100644
index 0000000..37f0e1b
--- /dev/null
+++ b/modules/plaud-sdk/ios/Frameworks/PlaudDeviceBasicSDK.xcframework/ios-arm64/PlaudDeviceBasicSDK.framework/Modules/PlaudDeviceBasicSDK.swiftmodule/arm64-apple-ios.swiftinterface
@@ -0,0 +1,1764 @@
+// swift-interface-format-version: 1.0
+// swift-compiler-version: Apple Swift version 6.0.3 effective-5.10 (swiftlang-6.0.3.1.10 clang-1600.0.30.1)
+// swift-module-flags: -target arm64-apple-ios13 -enable-objc-interop -enable-library-evolution -swift-version 5 -enforce-exclusivity=checked -O -enable-bare-slash-regex -module-name PlaudDeviceBasicSDK
+// swift-module-flags-ignorable: -no-verify-emitted-module-interface
+import AVFoundation
+import AVKit
+import CoreTelephony.CTCellularData
+import CommonCrypto
+import CoreBluetooth
+import CoreLocation
+import CoreTelephony
+import CryptoKit
+import Foundation
+import MediaPlayer
+import MobileCoreServices
+import ObjectiveC
+import Photos
+@_exported import PlaudBleSDK
+@_exported import PlaudDeviceBasicSDK
+import PlaudWiFiSDK
+import Security
+import Swift
+import UIKit
+import WebKit
+import _Concurrency
+import _StringProcessing
+import _SwiftConcurrencyShims
+@_hasMissingDesignatedInitializers @objc @_Concurrency.MainActor @preconcurrency public class PlaudWifiAddingPage : UIKit.UIViewController {
+ @_Concurrency.MainActor @preconcurrency public var completion: ((PlaudDeviceBasicSDK.PlaudWifiInfo?) -> Swift.Void)?
+ @_Concurrency.MainActor @preconcurrency public init(isEditing: Swift.Bool = true)
+ @_Concurrency.MainActor @preconcurrency @objc override dynamic public func viewDidLoad()
+ @_Concurrency.MainActor @preconcurrency public func setWifiInfo(name: Swift.String, password: Swift.String = "", wifiIndex: Swift.UInt32?, isConnected: Swift.Bool = false)
+ @objc deinit
+}
+public struct PlaudWifiInfo {
+ public init(name: Swift.String, password: Swift.String, isConnected: Swift.Bool, index: Swift.UInt32 = 0, rssi: Swift.Int32? = nil)
+}
+@_inheritsConvenienceInitializers @objc @_Concurrency.MainActor @preconcurrency public class PlaudWifiSettingPage : UIKit.UIViewController, PlaudDeviceBasicSDK.PlaudDeviceAgentProtocol {
+ @_Concurrency.MainActor @preconcurrency public static func resetTempTestWifiIndex()
+ @_Concurrency.MainActor @preconcurrency @objc public func bleAppKeyState(result _: Swift.Int)
+ @_Concurrency.MainActor @preconcurrency @objc public func onWifiSyncUrl(url: Swift.String)
+ @_Concurrency.MainActor @preconcurrency @objc public func blePenState(state _: Swift.Int, privacy _: Swift.Int, keyState _: Swift.Int, uDisk _: Swift.Int, findMyToken _: Swift.Int, hasSndpKey _: Swift.Int, deviceAccessToken _: Swift.Int)
+ @_Concurrency.MainActor @preconcurrency @objc public func bleConnectState(state: Swift.Int)
+ @_Concurrency.MainActor @preconcurrency @objc public func onWifiSyncEnabled(_ value: Swift.Int)
+ @_Concurrency.MainActor @preconcurrency @objc public func onWifiSyncListReceived(list: [Swift.UInt32])
+ @_Concurrency.MainActor @preconcurrency @objc public func onWifiSyncConfigReceived(index: Swift.UInt32, ssid: Swift.String, password: Swift.String)
+ @_Concurrency.MainActor @preconcurrency @objc public func onWifiSyncConfigSet(result: Swift.Int)
+ @_Concurrency.MainActor @preconcurrency @objc public func onWifiSyncDeleteResult(result _: Swift.Int)
+ @_Concurrency.MainActor @preconcurrency @objc public func onWifiSyncTestResult(index: Swift.UInt32, result: Swift.Int, rawCode _: Swift.Int)
+ @_Concurrency.MainActor @preconcurrency public func getWifiTestTips(result: Swift.Int) -> Swift.String
+ @_Concurrency.MainActor @preconcurrency @objc public func onWifiRssiRequestConfirmed(status: Swift.Int)
+ @_Concurrency.MainActor @preconcurrency @objc override dynamic public func viewDidLoad()
+ @_Concurrency.MainActor @preconcurrency @objc override dynamic public func observeValue(forKeyPath keyPath: Swift.String?, of object: Any?, change _: [Foundation.NSKeyValueChangeKey : Any]?, context _: Swift.UnsafeMutableRawPointer?)
+ @objc deinit
+ @_Concurrency.MainActor @preconcurrency public func updateWifiListVisibility()
+ @_Concurrency.MainActor @preconcurrency public static func testWifiConnection(ssid: Swift.String, password: Swift.String, wifiIndex: Swift.UInt32?, edit: Swift.Bool, completion: @escaping (Swift.Bool, Swift.String) -> Swift.Void)
+ @_Concurrency.MainActor @preconcurrency @objc override dynamic public init(nibName nibNameOrNil: Swift.String?, bundle nibBundleOrNil: Foundation.Bundle?)
+ @_Concurrency.MainActor @preconcurrency @objc required dynamic public init?(coder: Foundation.NSCoder)
+}
+extension PlaudDeviceBasicSDK.PlaudWifiSettingPage : UIKit.UITableViewDataSource, UIKit.UITableViewDelegate {
+ @_Concurrency.MainActor @preconcurrency @objc dynamic public func tableView(_: UIKit.UITableView, numberOfRowsInSection _: Swift.Int) -> Swift.Int
+ @_Concurrency.MainActor @preconcurrency @objc dynamic public func tableView(_: UIKit.UITableView, heightForRowAt _: Foundation.IndexPath) -> CoreFoundation.CGFloat
+ @_Concurrency.MainActor @preconcurrency @objc dynamic public func tableView(_ tableView: UIKit.UITableView, cellForRowAt indexPath: Foundation.IndexPath) -> UIKit.UITableViewCell
+ @_Concurrency.MainActor @preconcurrency @objc dynamic public func tableView(_ tableView: UIKit.UITableView, didSelectRowAt indexPath: Foundation.IndexPath)
+}
+extension Swift.Array {
+ public mutating func appendDistinct(contentsOf newElements: S, where condition: @escaping (Element, Element) -> Swift.Bool) where Element == S.Element, S : Swift.Sequence
+}
+extension UIKit.UIColor {
+ convenience public init(hex: Swift.UInt32)
+}
+public enum Model : Swift.String {
+ case simulator, iPod1, iPod2, iPod3, iPod4, iPod5, iPod6, iPod7, iPad2, iPad3, iPad4, iPadAir, iPadAir2, iPadAir3, iPadAir4, iPadAir5, iPad5, iPad6, iPad7, iPad8, iPad9, iPadMini, iPadMini2, iPadMini3, iPadMini4, iPadMini5, iPadMini6, iPadPro9_7, iPadPro10_5, iPadPro11, iPadPro2_11, iPadPro3_11, iPadPro12_9, iPadPro2_12_9, iPadPro3_12_9, iPadPro4_12_9, iPadPro5_12_9, iPhone4, iPhone4S, iPhone5, iPhone5S, iPhone5C, iPhone6, iPhone6Plus, iPhone6S, iPhone6SPlus, iPhoneSE, iPhone7, iPhone7Plus, iPhone8, iPhone8Plus, iPhoneX, iPhoneXS, iPhoneXSMax, iPhoneXR, iPhone11, iPhone11Pro, iPhone11ProMax, iPhoneSE2, iPhone12Mini, iPhone12, iPhone12Pro, iPhone12ProMax, iPhone13Mini, iPhone13, iPhone13Pro, iPhone13ProMax, iPhoneSE3, iPhone14, iPhone14Plus, iPhone14Pro, iPhone14ProMax, AppleWatch1, AppleWatchS1, AppleWatchS2, AppleWatchS3, AppleWatchS4, AppleWatchS5, AppleWatchSE, AppleWatchS6, AppleWatchS7, AppleTV1, AppleTV2, AppleTV3, AppleTV4, AppleTV_4K, AppleTV2_4K, unrecognized
+ public init?(rawValue: Swift.String)
+ public typealias RawValue = Swift.String
+ public var rawValue: Swift.String {
+ get
+ }
+}
+extension UIKit.UIDevice {
+ @_Concurrency.MainActor @preconcurrency public var type: PlaudDeviceBasicSDK.Model {
+ get
+ }
+ @_Concurrency.MainActor @preconcurrency public static func getOSInfo() -> Swift.String
+}
+extension UIKit.UIViewController {
+ @_Concurrency.MainActor @preconcurrency public var isCurrentVisible: Swift.Bool {
+ get
+ }
+ @_Concurrency.MainActor @preconcurrency public func currentIS(_ vcClass: Swift.AnyClass) -> Swift.Bool
+ @_Concurrency.MainActor @preconcurrency public var currentVCClass: UIKit.UIViewController? {
+ get
+ }
+}
+extension UIKit.UINavigationController {
+ @_Concurrency.MainActor @preconcurrency public func pushViewController(_ viewController: UIKit.UIViewController, animated: Swift.Bool = true, completion: (() -> Swift.Void)? = nil)
+}
+extension Foundation.Date {
+ public var minSec: Swift.Int {
+ get
+ }
+ public var maxSec: Swift.Int {
+ get
+ }
+ public var formatyyyyMMdd: Swift.String {
+ get
+ }
+ public var yyyyMMddValue: Swift.Int {
+ get
+ }
+}
+extension Dispatch.DispatchTime : Swift.ExpressibleByIntegerLiteral {
+ public init(integerLiteral value: Swift.Int)
+ public typealias IntegerLiteralType = Swift.Int
+}
+extension Dispatch.DispatchTime : Swift.ExpressibleByFloatLiteral {
+ public init(floatLiteral value: Swift.Double)
+ public typealias FloatLiteralType = Swift.Double
+}
+extension Swift.Int {
+ public func loopRun(task: () -> Swift.Void)
+}
+extension Swift.Character {
+ public func intValue() -> Swift.Int
+}
+extension CoreFoundation.CGFloat {
+ public static func random(lower: CoreFoundation.CGFloat = 0, upper: CoreFoundation.CGFloat = 1) -> CoreFoundation.CGFloat
+}
+extension Swift.String {
+ public var local: Swift.String {
+ get
+ }
+ public var image: UIKit.UIImage? {
+ get
+ }
+ public func simpleEncrypt() -> Swift.String
+}
+extension Foundation.FileManager {
+ public func findFiles(path: Swift.String, filterTypes: [Swift.String]) -> [Swift.String]
+ public func fileSize(path: Swift.String) -> Swift.Int
+ public func folderSize(dir: Swift.String) -> Swift.Int
+ public func clearFolder(dir: Swift.String)
+ @discardableResult
+ public func createIfNotExist(atPath path: Swift.String) -> Swift.Bool
+ public func copyFile(filePath: Swift.String, withName newName: Swift.String) -> Swift.String?
+ public func copy(from orginPath: Swift.String, to targetPath: Swift.String, callback: @escaping (Swift.Bool) -> Swift.Void)
+}
+public protocol PresentBottomVCProtocol {
+ var controllerHeight: CoreFoundation.CGFloat { get }
+}
+@objc @_inheritsConvenienceInitializers @_Concurrency.MainActor @preconcurrency public class PresentBottomVC : UIKit.UIViewController, PlaudDeviceBasicSDK.PresentBottomVCProtocol {
+ @_Concurrency.MainActor @preconcurrency public var controllerHeight: CoreFoundation.CGFloat {
+ get
+ }
+ @_Concurrency.MainActor @preconcurrency @objc override dynamic public func viewDidLoad()
+ @_Concurrency.MainActor @preconcurrency @objc override dynamic public func viewDidDisappear(_ animated: Swift.Bool)
+ @_Concurrency.MainActor @preconcurrency @objc override dynamic public init(nibName nibNameOrNil: Swift.String?, bundle nibBundleOrNil: Foundation.Bundle?)
+ @_Concurrency.MainActor @preconcurrency @objc required dynamic public init?(coder: Foundation.NSCoder)
+ @objc deinit
+}
+public let PresentBottomHideKey: Swift.String
+extension UIKit.UIViewController : UIKit.UIViewControllerTransitioningDelegate {
+ @_Concurrency.MainActor @preconcurrency public func presentBottom(_ vc: PlaudDeviceBasicSDK.PresentBottomVC)
+ @_Concurrency.MainActor @preconcurrency @objc dynamic public func presentationController(forPresented presented: UIKit.UIViewController, presenting: UIKit.UIViewController?, source: UIKit.UIViewController) -> UIKit.UIPresentationController?
+}
+public protocol WaveProtocol : ObjectiveC.NSObjectProtocol {
+ func onTimeChange(millisec: Swift.Int, end: Swift.Bool)
+}
+public protocol JXWaveformProtocol : ObjectiveC.NSObjectProtocol {
+ func onPlayOrPauseClick()
+ func onTimeChange(millisec: Swift.Int, end: Swift.Bool)
+ func onInfoClick()
+ func onShareClick()
+ func onStopRecordClick()
+}
+public enum SoundCategory {
+ case ambient
+ case soloAmbient
+ case playback
+ case record
+ case playAndRecord
+ public static func == (a: PlaudDeviceBasicSDK.SoundCategory, b: PlaudDeviceBasicSDK.SoundCategory) -> Swift.Bool
+ public func hash(into hasher: inout Swift.Hasher)
+ public var hashValue: Swift.Int {
+ get
+ }
+}
+open class Sound {
+ public static var playersPerSound: Swift.Int {
+ get
+ set
+ }
+ public static var session: any PlaudDeviceBasicSDK.Session
+ public static var category: PlaudDeviceBasicSDK.SoundCategory {
+ get
+ set
+ }
+ public static var enabled: Swift.Bool {
+ get
+ set
+ }
+ public static var playerClass: any PlaudDeviceBasicSDK.Player.Type
+ public static var soundsBundle: Foundation.Bundle
+ public init?(url: Foundation.URL)
+ @objc deinit
+ @discardableResult
+ public func play(numberOfLoops: Swift.Int = 0, completion: PlaudDeviceBasicSDK.PlayerCompletion? = nil) -> Swift.Bool
+ public func stop()
+ public func pause()
+ @discardableResult
+ public func resume() -> Swift.Bool
+ public var playing: Swift.Bool {
+ get
+ }
+ public var paused: Swift.Bool {
+ get
+ }
+ @discardableResult
+ public func prepare() -> Swift.Bool
+ @discardableResult
+ public static func play(file: Swift.String, fileExtension: Swift.String? = nil, numberOfLoops: Swift.Int = 0) -> Swift.Bool
+ @discardableResult
+ public static func play(url: Foundation.URL, numberOfLoops: Swift.Int = 0) -> Swift.Bool
+ public static func stop(for url: Foundation.URL)
+ public var duration: Foundation.TimeInterval {
+ get
+ }
+ public var volume: Swift.Float {
+ get
+ set
+ }
+ public static func stop(file: Swift.String, fileExtension: Swift.String? = nil)
+ public static func stopAll()
+}
+public protocol Player : AnyObject {
+ func play(numberOfLoops: Swift.Int, completion: PlaudDeviceBasicSDK.PlayerCompletion?) -> Swift.Bool
+ func stop()
+ func pause()
+ func resume()
+ func prepareToPlay() -> Swift.Bool
+ init(contentsOf url: Foundation.URL) throws
+ var duration: Foundation.TimeInterval { get }
+ var volume: Swift.Float { get set }
+ var isPlaying: Swift.Bool { get }
+}
+public typealias PlayerCompletion = (Swift.Bool) -> Swift.Void
+extension AVFAudio.AVAudioPlayer : PlaudDeviceBasicSDK.Player, AVFAudio.AVAudioPlayerDelegate {
+ public func play(numberOfLoops: Swift.Int, completion: PlaudDeviceBasicSDK.PlayerCompletion?) -> Swift.Bool
+ public func resume()
+ @objc dynamic public func audioPlayerDidFinishPlaying(_: AVFAudio.AVAudioPlayer, successfully flag: Swift.Bool)
+ @objc dynamic public func audioPlayerDecodeErrorDidOccur(_: AVFAudio.AVAudioPlayer, error: (any Swift.Error)?)
+}
+public protocol Session : AnyObject {
+ func setCategory(_ category: AVFAudio.AVAudioSession.Category) throws
+}
+extension AVFAudio.AVAudioSession : PlaudDeviceBasicSDK.Session {
+}
+@_hasMissingDesignatedInitializers @objc @_Concurrency.MainActor @preconcurrency public class PlaudAudioPlayerViewController : UIKit.UIViewController, AVFAudio.AVAudioPlayerDelegate {
+ @objc @_Concurrency.MainActor @preconcurrency public init(sessionId: Swift.Int)
+ @_Concurrency.MainActor @preconcurrency @objc override dynamic public func viewDidLoad()
+ @_Concurrency.MainActor @preconcurrency @objc override dynamic public func viewWillDisappear(_ animated: Swift.Bool)
+ @_Concurrency.MainActor @preconcurrency @objc public func audioPlayerDidFinishPlaying(_: AVFAudio.AVAudioPlayer, successfully flag: Swift.Bool)
+ @_Concurrency.MainActor @preconcurrency @objc public func audioPlayerDecodeErrorDidOccur(_: AVFAudio.AVAudioPlayer, error: (any Swift.Error)?)
+ @_Concurrency.MainActor @preconcurrency @objc public func audioPlayerBeginInterruption(_: AVFAudio.AVAudioPlayer)
+ @_Concurrency.MainActor @preconcurrency @objc public func audioPlayerEndInterruption(_: AVFAudio.AVAudioPlayer, withOptions _: Swift.Int)
+ @objc deinit
+}
+@_inheritsConvenienceInitializers @objc public class PlaudPCMPlayer : ObjectiveC.NSObject {
+ @objc public var isPlaying: Swift.Bool {
+ get
+ }
+ @objc public var isPaused: Swift.Bool {
+ get
+ }
+ @objc public var duration: Swift.Double {
+ get
+ }
+ @objc public var currentTime: Swift.Double {
+ get
+ }
+ @objc public var onPlaybackFinished: (() -> Swift.Void)?
+ @objc public var onError: ((Swift.String) -> Swift.Void)?
+ @objc override dynamic public init()
+ @objc deinit
+ @objc public func loadFile(path: Swift.String) -> Swift.Bool
+ @objc public func play()
+ @objc public func pause()
+ @objc public func stop()
+}
+public struct AnyCodable : Swift.Codable {
+ public let value: Any
+ public init(_ value: Any)
+ public init(from decoder: any Swift.Decoder) throws
+ public func encode(to encoder: any Swift.Encoder) throws
+}
+@_hasMissingDesignatedInitializers public class PlaudDomainManager {
+ public enum Region : Swift.String, Swift.CaseIterable {
+ case cn
+ case us
+ case jp
+ public init?(rawValue: Swift.String)
+ public typealias AllCases = [PlaudDeviceBasicSDK.PlaudDomainManager.Region]
+ public typealias RawValue = Swift.String
+ nonisolated public static var allCases: [PlaudDeviceBasicSDK.PlaudDomainManager.Region] {
+ get
+ }
+ public var rawValue: Swift.String {
+ get
+ }
+ }
+ public static let shared: PlaudDeviceBasicSDK.PlaudDomainManager
+ @objc deinit
+ @objc public func setCustomDomain(_ domain: Swift.String)
+ public func setAutoLanguageAssociation(_ enabled: Swift.Bool)
+ public func isAutoLanguageAssociationEnabled() -> Swift.Bool
+ public func setRegion(_ region: PlaudDeviceBasicSDK.PlaudDomainManager.Region)
+ public func setRegionForLanguage(_ languageCode: Swift.String)
+ public func getCurrentRegion() -> PlaudDeviceBasicSDK.PlaudDomainManager.Region
+ public func getCurrentDomain() -> Swift.String
+ public func getCurrentBaseURL() -> Swift.String
+ public func getDomain(for region: PlaudDeviceBasicSDK.PlaudDomainManager.Region) -> Swift.String
+ public func getBaseURL(for region: PlaudDeviceBasicSDK.PlaudDomainManager.Region) -> Swift.String
+ public func buildAPIURL(path: Swift.String) -> Swift.String
+ public func buildAPIURL(path: Swift.String, for region: PlaudDeviceBasicSDK.PlaudDomainManager.Region) -> Swift.String
+ public func buildAPIURL(path: Swift.String, for languageCode: Swift.String) -> Swift.String
+ public func getRegionForCurrentLanguage() -> PlaudDeviceBasicSDK.PlaudDomainManager.Region
+ public func getCurrentLanguageCode() -> Swift.String
+}
+@_inheritsConvenienceInitializers @_hasMissingDesignatedInitializers @objc public class PlaudFileUploader : ObjectiveC.NSObject {
+ @objc public static let shared: PlaudDeviceBasicSDK.PlaudFileUploader
+ @objc public var device: PlaudBleSDK.BleDevice?
+ public func checkRecordingExist(sessionId: Swift.Int) -> Swift.Bool
+ public func getDownloadedRecordingPath(sessionId: Swift.Int, desiredPath: Swift.String) -> Swift.String
+ @objc public func uploadRecording(sn: Swift.String, sessionId: Swift.Int, duration: Swift.Double, onProgress: @escaping (Swift.Double) -> Swift.Void, onSuccess: @escaping ([Swift.String : Any]) -> Swift.Void, onFailure: @escaping (any Swift.Error) -> Swift.Void)
+ @objc public func uploadLogFile(filePath: Swift.String, sn: Swift.String, onProgress: @escaping (Swift.Double) -> Swift.Void, onSuccess: @escaping ([Swift.String : Any]) -> Swift.Void, onFailure: @escaping (any Swift.Error) -> Swift.Void)
+ @objc public static func calculateSnType(sn: Swift.String) -> Swift.String
+ public func bindDevice(ownerId: Swift.String, sn: Swift.String, completion: @escaping (Swift.Result<[Swift.String : Any], any Swift.Error>) -> Swift.Void)
+ public func unbindDevice(ownerId: Swift.String, sn: Swift.String, completion: @escaping (Swift.Result<[Swift.String : Any], any Swift.Error>) -> Swift.Void)
+ @objc deinit
+}
+@_hasMissingDesignatedInitializers public class PlaudLocalizationManager {
+ public static let shared: PlaudDeviceBasicSDK.PlaudLocalizationManager
+ public func setCustomBundlePath(_ path: Swift.String)
+ public func setLanguage(_ language: Swift.String)
+ public func getCurrentLanguage() -> Swift.String
+ public func checkSDKBundle() -> Swift.Bool
+ public func localizedString(for key: Swift.String) -> Swift.String
+ @objc deinit
+}
+extension Swift.String {
+ public var plaudLocalized: Swift.String {
+ get
+ }
+}
+@_inheritsConvenienceInitializers @_hasMissingDesignatedInitializers @objc public class PlaudLogUploadManager : ObjectiveC.NSObject {
+ @objc public static let shared: PlaudDeviceBasicSDK.PlaudLogUploadManager
+ @objc deinit
+ @objc public func setAutoUploadEnabled(_ enabled: Swift.Bool)
+ @objc public func startAutoUpload()
+ @objc public func stopAutoUpload()
+ @objc public func uploadLogFiles(onProgress: @escaping (Swift.Double) -> Swift.Void, onSuccess: @escaping ([Swift.String : Any]) -> Swift.Void, onFailure: @escaping (any Swift.Error) -> Swift.Void)
+ @objc public func cleanupLogFiles()
+ @objc public func getUploadStatistics() -> [Swift.String : Any]
+ @objc public func uploadLogFilesWithDeviceSN(sn: Swift.String, onProgress: @escaping (Swift.Double) -> Swift.Void, onSuccess: @escaping ([Swift.String : Any]) -> Swift.Void, onFailure: @escaping (any Swift.Error) -> Swift.Void)
+ @objc public func uploadLogsAfterRecording(sn: Swift.String, sessionId: Swift.Int, onCompletion: @escaping (Swift.Bool, (any Swift.Error)?) -> Swift.Void)
+}
+@objc public enum PlaudLogUploadError : Swift.Int, Swift.Error {
+ case alreadyUploading = 0
+ case directoryNotFound = 1
+ case partialUpload = 2
+ public var localizedDescription: Swift.String {
+ get
+ }
+ public init?(rawValue: Swift.Int)
+ public typealias RawValue = Swift.Int
+ public static var _nsErrorDomain: Swift.String {
+ get
+ }
+ public var rawValue: Swift.Int {
+ get
+ }
+}
+public struct PlaudLogUploadPartialError : Swift.Error {
+ public let result: [Swift.String : Any]
+ public init(result: [Swift.String : Any])
+ public var localizedDescription: Swift.String {
+ get
+ }
+}
+public struct PlaudPartnerSnSignRequest : Swift.Codable {
+ public let type: Swift.String
+ public let sn: Swift.String
+ public init(type: Swift.String, sn: Swift.String)
+ public func encode(to encoder: any Swift.Encoder) throws
+ public init(from decoder: any Swift.Decoder) throws
+}
+public struct PlaudPartnerSnSignResponse : Swift.Codable {
+ public let signature: Swift.String?
+ public init(signature: Swift.String?)
+ public func encode(to encoder: any Swift.Encoder) throws
+ public init(from decoder: any Swift.Decoder) throws
+}
+public struct PlaudPartnerGenKeyResponse : Swift.Codable {
+ public let publicKey: Swift.String?
+ public let privateKey: Swift.String?
+ public init(publicKey: Swift.String?, privateKey: Swift.String?)
+ public func encode(to encoder: any Swift.Encoder) throws
+ public init(from decoder: any Swift.Decoder) throws
+}
+public struct PlaudPartnerApiErrorResponse : Swift.Codable {
+ public let detail: Swift.String?
+ public init(detail: Swift.String?)
+ public func encode(to encoder: any Swift.Encoder) throws
+ public init(from decoder: any Swift.Decoder) throws
+}
+public enum PlaudPartnerApiError : Swift.Error, Foundation.LocalizedError {
+ case invalidParameter(Swift.String)
+ case noUserAccessToken
+ case invalidURL(Swift.String)
+ case invalidResponse
+ case unauthorized(detail: Swift.String?)
+ case serverError(code: Swift.Int, body: Swift.String?)
+ case requestEncodeFailed(any Swift.Error)
+ case responseDecodeFailed(any Swift.Error)
+ case networkError(any Swift.Error)
+ public var errorDescription: Swift.String? {
+ get
+ }
+}
+@_hasMissingDesignatedInitializers final public class PlaudPartnerApiManager {
+ public static let shared: PlaudDeviceBasicSDK.PlaudPartnerApiManager
+ final public func setUserAccessToken(_ token: Swift.String?)
+ final public func getUserAccessToken() -> Swift.String?
+ final public func signDeviceSn(deviceType: Swift.String, sn: Swift.String, completion: @escaping (Swift.Result) -> Swift.Void)
+ final public func generateRsaKeyPair(completion: @escaping (Swift.Result) -> Swift.Void)
+ @objc deinit
+}
+@_inheritsConvenienceInitializers @objc public class PlaudSDKLogger : ObjectiveC.NSObject {
+ @objc public static func logEvent(_ eventName: Swift.String, parameters: Foundation.NSDictionary? = nil)
+ @objc override dynamic public init()
+ @objc deinit
+}
+public enum WorkflowStatus : Swift.String, Swift.Codable {
+ case pending
+ case running
+ case progress
+ case success
+ case failure
+ case cancelled
+ case timeout
+ public var localizedDescription: Swift.String {
+ get
+ }
+ public var isFinished: Swift.Bool {
+ get
+ }
+ public var isSuccess: Swift.Bool {
+ get
+ }
+ public init(from decoder: any Swift.Decoder) throws
+ public init?(rawValue: Swift.String)
+ public typealias RawValue = Swift.String
+ public var rawValue: Swift.String {
+ get
+ }
+}
+public enum WorkflowTaskType : Swift.String, Swift.Codable, Swift.CaseIterable {
+ case audioTranscribe
+ case aiSummarize
+ case aiEtl
+ case audioMerge
+ case custom
+ case unknown
+ public var localizedDescription: Swift.String {
+ get
+ }
+ public init?(rawValue: Swift.String)
+ public typealias AllCases = [PlaudDeviceBasicSDK.WorkflowTaskType]
+ public typealias RawValue = Swift.String
+ nonisolated public static var allCases: [PlaudDeviceBasicSDK.WorkflowTaskType] {
+ get
+ }
+ public var rawValue: Swift.String {
+ get
+ }
+}
+public struct WorkflowTaskParams : Swift.Codable {
+ public let parameters: [Swift.String : PlaudDeviceBasicSDK.AnyCodable]?
+ public init(parameters: [Swift.String : Any]? = nil)
+ public init(fileId: Swift.String, language: Swift.String = "en", diarization: Swift.Bool = true, extras: [Swift.String : Any] = [:])
+ public init(etlType: Swift.String, extras: [Swift.String : Any] = [:])
+ public init(fileIdList: [Swift.String], groupId: Swift.String)
+ public init(summaryType: Swift.String, extras: [Swift.String : Any] = [:])
+ public func encode(to encoder: any Swift.Encoder) throws
+ public init(from decoder: any Swift.Decoder) throws
+}
+public struct WorkflowTask : Swift.Codable {
+ public let taskType: PlaudDeviceBasicSDK.WorkflowTaskType
+ public let taskParams: [Swift.String : PlaudDeviceBasicSDK.AnyCodable]?
+ public init(taskType: PlaudDeviceBasicSDK.WorkflowTaskType, parameters: [Swift.String : Any]? = nil)
+ public init(taskType: PlaudDeviceBasicSDK.WorkflowTaskType, taskParams: PlaudDeviceBasicSDK.WorkflowTaskParams)
+ public func encode(to encoder: any Swift.Encoder) throws
+ public init(from decoder: any Swift.Decoder) throws
+}
+public struct WorkflowMetadata : Swift.Codable {
+ public let organizationId: Swift.String?
+ public let ownerId: Swift.String?
+ public let deviceSn: Swift.String?
+ public let customData: [Swift.String : PlaudDeviceBasicSDK.AnyCodable]?
+ public init(organizationId: Swift.String? = nil, ownerId: Swift.String? = nil, deviceSn: Swift.String? = nil, customData: [Swift.String : Any]? = nil)
+ public func encode(to encoder: any Swift.Encoder) throws
+ public init(from decoder: any Swift.Decoder) throws
+}
+public struct WorkflowSubmitRequest : Swift.Codable {
+ public let workflows: [PlaudDeviceBasicSDK.WorkflowTask]
+ public let metadata: PlaudDeviceBasicSDK.WorkflowMetadata
+ public let version: Swift.String
+ public init(workflows: [PlaudDeviceBasicSDK.WorkflowTask], metadata: PlaudDeviceBasicSDK.WorkflowMetadata = WorkflowMetadata(), version: Swift.String = "1.0")
+ public func encode(to encoder: any Swift.Encoder) throws
+ public init(from decoder: any Swift.Decoder) throws
+}
+public struct WorkflowSubmitResponse : Swift.Codable {
+ public let id: Swift.String
+ public let status: PlaudDeviceBasicSDK.WorkflowStatus
+ public var endTime: Swift.String?
+ public let updateTime: Swift.String?
+ public let fileId: Swift.String?
+ public let startTime: Swift.Int64?
+ public let version: Swift.String?
+ public let ownerId: Swift.String?
+ public let metadataJson: [Swift.String : PlaudDeviceBasicSDK.AnyCodable]?
+ public let totalTasks: Swift.Int?
+ public let completedTasks: Swift.Int?
+ public let config: [PlaudDeviceBasicSDK.WorkflowTask]?
+ public init(from decoder: any Swift.Decoder) throws
+ public func encode(to encoder: any Swift.Encoder) throws
+}
+public struct PartialWorkflowStatusResponse : Swift.Codable {
+ public let id: Swift.String?
+ public let status: Swift.String?
+ public let endTime: Swift.String?
+ public let updateTime: Swift.String?
+ public let fileId: Swift.String?
+ public let startTime: Swift.Int64?
+ public let version: Swift.String?
+ public let ownerId: Swift.String?
+ public let metadataJson: [Swift.String : PlaudDeviceBasicSDK.AnyCodable]?
+ public let completedTasks: Swift.Int?
+ public let totalTasks: Swift.Int?
+ public let progress: Swift.Double?
+ public let message: Swift.String?
+ public let estimatedCompletionTime: Swift.String?
+ public let taskStatuses: [Swift.String : Swift.String]?
+ public let config: [PlaudDeviceBasicSDK.AnyCodable]?
+ public init(from decoder: any Swift.Decoder) throws
+ public func encode(to encoder: any Swift.Encoder) throws
+}
+public struct WorkflowStatusResponse : Swift.Codable {
+ public let id: Swift.String
+ public let status: PlaudDeviceBasicSDK.WorkflowStatus
+ public let endTime: Swift.String?
+ public let updateTime: Swift.String?
+ public let fileId: Swift.String?
+ public let startTime: Swift.Int64?
+ public let version: Swift.String?
+ public let ownerId: Swift.String?
+ public let metadataJson: [Swift.String : PlaudDeviceBasicSDK.AnyCodable]?
+ public let completedTasks: Swift.Int?
+ public let totalTasks: Swift.Int?
+ public let progress: Swift.Double?
+ public let message: Swift.String?
+ public let estimatedCompletionTime: Swift.String?
+ public let taskStatuses: [Swift.String : PlaudDeviceBasicSDK.WorkflowStatus]?
+ public let config: [PlaudDeviceBasicSDK.WorkflowTask]?
+ public init(from decoder: any Swift.Decoder) throws
+ public func encode(to encoder: any Swift.Encoder) throws
+}
+public struct TranscriptSegment : Swift.Codable {
+ public let start: Swift.Double
+ public let end: Swift.Double
+ public let speaker: Swift.String
+ public let text: Swift.String
+ public let index: Swift.Int?
+ public init(start: Swift.Double, end: Swift.Double, speaker: Swift.String, text: Swift.String, index: Swift.Int? = nil)
+ public func encode(to encoder: any Swift.Encoder) throws
+ public init(from decoder: any Swift.Decoder) throws
+}
+public struct TranscriptResult : Swift.Codable {
+ public let segments: [PlaudDeviceBasicSDK.TranscriptSegment]
+ public let embeddings: [Swift.String : [Swift.Double]]?
+ public let status: Swift.Int?
+ public init(segments: [PlaudDeviceBasicSDK.TranscriptSegment], embeddings: [Swift.String : [Swift.Double]]? = nil, status: Swift.Int? = nil)
+ public init(from decoder: any Swift.Decoder) throws
+ public func encode(to encoder: any Swift.Encoder) throws
+ public var allSpeakers: [Swift.String] {
+ get
+ }
+ public var totalDuration: Foundation.TimeInterval {
+ get
+ }
+ public var textBySpeaker: [Swift.String : Swift.String] {
+ get
+ }
+ public var allText: Swift.String {
+ get
+ }
+ public var hasEmbeddings: Swift.Bool {
+ get
+ }
+ public func getEmbeddings(for speaker: Swift.String) -> [Swift.Double]?
+}
+public struct CommunicationFeedback : Swift.Codable {
+ public let highlight: Swift.String?
+ public let suggestion: Swift.String?
+ public init(highlight: Swift.String? = nil, suggestion: Swift.String? = nil)
+ public func encode(to encoder: any Swift.Encoder) throws
+ public init(from decoder: any Swift.Decoder) throws
+}
+public struct DealIntention : Swift.Codable {
+ public let description: Swift.String?
+ public let rating: Swift.String?
+ public init(description: Swift.String? = nil, rating: Swift.String? = nil)
+ public func encode(to encoder: any Swift.Encoder) throws
+ public init(from decoder: any Swift.Decoder) throws
+}
+public struct DealReason : Swift.Codable {
+ public let description: Swift.String?
+ public let reason: [Swift.String]?
+ public init(description: Swift.String? = nil, reason: [Swift.String]? = nil)
+ public func encode(to encoder: any Swift.Encoder) throws
+ public init(from decoder: any Swift.Decoder) throws
+}
+public struct NoDealReason : Swift.Codable {
+ public let description: Swift.String?
+ public let suggestion: Swift.String?
+ public let reason: [Swift.String]?
+ public init(description: Swift.String? = nil, suggestion: Swift.String? = nil, reason: [Swift.String]? = nil)
+ public func encode(to encoder: any Swift.Encoder) throws
+ public init(from decoder: any Swift.Decoder) throws
+}
+public struct DealAnalysis : Swift.Codable {
+ public let status: Swift.String?
+ public let intention: PlaudDeviceBasicSDK.DealIntention?
+ public let dealReason: PlaudDeviceBasicSDK.DealReason?
+ public let noDealReason: PlaudDeviceBasicSDK.NoDealReason?
+ public init(status: Swift.String? = nil, intention: PlaudDeviceBasicSDK.DealIntention? = nil, dealReason: PlaudDeviceBasicSDK.DealReason? = nil, noDealReason: PlaudDeviceBasicSDK.NoDealReason? = nil)
+ public func encode(to encoder: any Swift.Encoder) throws
+ public init(from decoder: any Swift.Decoder) throws
+}
+public struct AIEtlResult : Swift.Codable {
+ public let assessmentTreatmentPairs: [PlaudDeviceBasicSDK.AnyCodable]?
+ public let appellation: Swift.String?
+ public let communicationFeedback: PlaudDeviceBasicSDK.CommunicationFeedback?
+ public let clinicalReport: Swift.String?
+ public let mapped: [Swift.String : PlaudDeviceBasicSDK.AnyCodable]?
+ public let transcription: PlaudDeviceBasicSDK.TranscriptResult?
+ public let summary: Swift.String?
+ public let customerProjects: [PlaudDeviceBasicSDK.AnyCodable]?
+ public let unmapped: [PlaudDeviceBasicSDK.AnyCodable]?
+ public let dealAnalysis: PlaudDeviceBasicSDK.DealAnalysis?
+ public let doctorProjects: [PlaudDeviceBasicSDK.AnyCodable]?
+ public let content: Swift.String?
+ public init(from decoder: any Swift.Decoder) throws
+ public func encode(to encoder: any Swift.Encoder) throws
+}
+public struct AISummaryResult : Swift.Codable {
+ public let summary: Swift.String?
+ public let keyPoints: [Swift.String]?
+ public let actionItems: [Swift.String]?
+ public let participants: [Swift.String]?
+ public let duration: Swift.String?
+ public let template: Swift.String?
+ public let model: Swift.String?
+ public let content: Swift.String?
+ public let status: Swift.String?
+ public let result: PlaudDeviceBasicSDK.AISummaryInnerResult?
+ public let text: Swift.String?
+ public init(from decoder: any Swift.Decoder) throws
+ public init(summary: Swift.String?, keyPoints: [Swift.String]?, actionItems: [Swift.String]?, participants: [Swift.String]?, duration: Swift.String?, template: Swift.String?, model: Swift.String?, content: Swift.String?, status: Swift.String?, result: PlaudDeviceBasicSDK.AISummaryInnerResult?, text: Swift.String?)
+ public var extractedSummary: Swift.String? {
+ get
+ }
+ public var extractedKeyPoints: [Swift.String]? {
+ get
+ }
+ public var extractedActionItems: [Swift.String]? {
+ get
+ }
+ public var extractedParticipants: [Swift.String]? {
+ get
+ }
+ public var extractedModel: Swift.String? {
+ get
+ }
+ public var extractedLanguage: Swift.String? {
+ get
+ }
+ public var extractedMarkdown: Swift.String? {
+ get
+ }
+ public func encode(to encoder: any Swift.Encoder) throws
+}
+public struct AISummaryInnerResult : Swift.Codable {
+ public let status: Swift.String?
+ public let result: PlaudDeviceBasicSDK.AISummaryDetailedResult?
+ public let text: Swift.String?
+ public func encode(to encoder: any Swift.Encoder) throws
+ public init(from decoder: any Swift.Decoder) throws
+}
+public struct AISummaryDetailedResult : Swift.Codable {
+ public let summaryId: Swift.String?
+ public let selectPromptType: Swift.String?
+ public let speakerMapping: [Swift.String]?
+ public let usePersona: Swift.Bool?
+ public let version: Swift.String?
+ public let tokensLens: Swift.Int?
+ public let retryCount: Swift.Int?
+ public let header: PlaudDeviceBasicSDK.AISummaryHeader?
+ public let summary: Swift.String?
+ public let aiSuggestion: Swift.String?
+ public let language: Swift.String?
+ public let markdown: Swift.String?
+ public let form: PlaudDeviceBasicSDK.AISummaryForm?
+ public let endpoint: Swift.String?
+ public let contents: [PlaudDeviceBasicSDK.AISummaryContent]?
+ public let model: Swift.String?
+ public let textLens: Swift.Int?
+ public func encode(to encoder: any Swift.Encoder) throws
+ public init(from decoder: any Swift.Decoder) throws
+}
+public struct AISummaryHeader : Swift.Codable {
+ public let category: Swift.String?
+ public let industryCategory: Swift.String?
+ public let languageCode: Swift.String?
+ public let keywords: [Swift.String]?
+ public let recommendQuestions: [PlaudDeviceBasicSDK.AISummaryQuestion]?
+ public let summaryType: Swift.String?
+ public let originalCategory: Swift.String?
+ public let summaryId: Swift.String?
+ public let headline: Swift.String?
+ public func encode(to encoder: any Swift.Encoder) throws
+ public init(from decoder: any Swift.Decoder) throws
+}
+public struct AISummaryQuestion : Swift.Codable {
+ public let question: Swift.String?
+ public let category: Swift.String?
+ public let mainPurpose: Swift.String?
+ public func encode(to encoder: any Swift.Encoder) throws
+ public init(from decoder: any Swift.Decoder) throws
+}
+public struct AISummaryForm : Swift.Codable {
+ public let arrangements: Swift.String?
+ public let info: Swift.String?
+ public let location: Swift.String?
+ public let aiSuggestions: Swift.String?
+ public let insertMore: Swift.String?
+ public let notes: Swift.String?
+ public let conclusion: Swift.String?
+ public let dateTime: Swift.String?
+ public let attendees: Swift.String?
+ public func encode(to encoder: any Swift.Encoder) throws
+ public init(from decoder: any Swift.Decoder) throws
+}
+public struct AISummaryContent : Swift.Codable {
+ public let speakerNameMapping: [Swift.String]?
+ public let arrangements: [Swift.String]?
+ public let topics: [PlaudDeviceBasicSDK.AISummaryTopic]?
+ public let theme: Swift.String?
+ public let aiSuggestion: Swift.String?
+ public func encode(to encoder: any Swift.Encoder) throws
+ public init(from decoder: any Swift.Decoder) throws
+}
+public struct AISummaryTopic : Swift.Codable {
+ public let topic: Swift.String?
+ public let conclusion: Swift.String?
+ public let description: Swift.String?
+ public func encode(to encoder: any Swift.Encoder) throws
+ public init(from decoder: any Swift.Decoder) throws
+}
+public struct PartialWorkflowResultResponse : Swift.Codable {
+ public let id: Swift.String?
+ public let status: Swift.String?
+ public let metadata: [Swift.String : PlaudDeviceBasicSDK.AnyCodable]?
+ public let results: [Swift.String : PlaudDeviceBasicSDK.AnyCodable]?
+ public let taskResults: [Swift.String : PlaudDeviceBasicSDK.AnyCodable]?
+ public let completedAt: Swift.String?
+ public let duration: Swift.Double?
+ public let message: Swift.String?
+ public let progress: Swift.Double?
+ public let estimatedCompletionTime: Swift.String?
+ public let taskStatuses: [Swift.String : Swift.String]?
+ public let tasks: [PlaudDeviceBasicSDK.AnyCodable]?
+ public init(from decoder: any Swift.Decoder) throws
+ public func encode(to encoder: any Swift.Encoder) throws
+}
+public enum WorkflowResult {
+ case success(T)
+ case failure(any Swift.Error)
+}
+public enum WorkflowError : Swift.Error, Foundation.LocalizedError {
+ case invalidURL
+ case networkError(any Swift.Error)
+ case invalidResponse
+ case serverError(Swift.String)
+ case workflowNotFound
+ case workflowFailed(Swift.String)
+ case timeout
+ case noApiToken
+ case urlBuildFailed(Swift.String)
+ public var errorDescription: Swift.String? {
+ get
+ }
+}
+@_hasMissingDesignatedInitializers public class PlaudWorkflowManager {
+ public static let shared: PlaudDeviceBasicSDK.PlaudWorkflowManager
+ public func submitWorkflow(_ request: PlaudDeviceBasicSDK.WorkflowSubmitRequest, completion: @escaping (PlaudDeviceBasicSDK.WorkflowResult) -> Swift.Void)
+ public func getWorkflowStatus(_ workflowId: Swift.String, completion: @escaping (PlaudDeviceBasicSDK.WorkflowResult) -> Swift.Void)
+ public func getWorkflowResults(_ workflowId: Swift.String, completion: @escaping (PlaudDeviceBasicSDK.WorkflowResult) -> Swift.Void)
+ public func submitAndWaitForCompletion(_ request: PlaudDeviceBasicSDK.WorkflowSubmitRequest, timeout: Foundation.TimeInterval = 3600.0, progressHandler: ((PlaudDeviceBasicSDK.WorkflowStatusResponse) -> Swift.Void)? = nil, completion: @escaping (PlaudDeviceBasicSDK.WorkflowResult) -> Swift.Void)
+ public func pollWorkflowStatus(workflowId: Swift.String, timeout: Foundation.TimeInterval, progressHandler: ((PlaudDeviceBasicSDK.WorkflowStatusResponse) -> Swift.Void)? = nil, completion: @escaping (PlaudDeviceBasicSDK.WorkflowResult) -> Swift.Void)
+ @objc deinit
+}
+extension PlaudDeviceBasicSDK.PlaudWorkflowManager {
+ public func createAudioTranscribeWorkflow(fileId: Swift.String, language: Swift.String = "en", diarization: Swift.Bool = true, transcriptType: Swift.String? = nil, completion: @escaping (PlaudDeviceBasicSDK.WorkflowResult) -> Swift.Void)
+ public func createAIEtlWorkflow(etlType: Swift.String, extras: [Swift.String : Any] = [:], completion: @escaping (PlaudDeviceBasicSDK.WorkflowResult) -> Swift.Void)
+ public func createAudioMergeWorkflow(fileIdList: [Swift.String], groupId: Swift.String, completion: @escaping (PlaudDeviceBasicSDK.WorkflowResult) -> Swift.Void)
+ public func createTranscribeAndAnalysisWorkflow(fileId: Swift.String, language: Swift.String = "en", diarization: Swift.Bool = true, transcriptType: Swift.String? = nil, etlType: Swift.String, completion: @escaping (PlaudDeviceBasicSDK.WorkflowResult) -> Swift.Void)
+ public func createMergeAndAnalysisWorkflow(fileIdList: [Swift.String], groupId: Swift.String, etlType: Swift.String, completion: @escaping (PlaudDeviceBasicSDK.WorkflowResult) -> Swift.Void)
+ public func doAudioTranscribeWorkflow(fileId: Swift.String, language: Swift.String = "en", diarization: Swift.Bool = true, transcriptType: Swift.String? = nil, timeout: Foundation.TimeInterval = 3600.0, progressHandler: ((PlaudDeviceBasicSDK.WorkflowStatusResponse) -> Swift.Void)? = nil, completion: @escaping (PlaudDeviceBasicSDK.WorkflowResult) -> Swift.Void)
+ public func doTranscribeAndAnalysisWorkflow(fileId: Swift.String, language: Swift.String = "en", diarization: Swift.Bool = true, transcriptType: Swift.String? = nil, etlType: Swift.String, timeout: Foundation.TimeInterval = 3600.0, progressHandler: ((PlaudDeviceBasicSDK.WorkflowStatusResponse) -> Swift.Void)? = nil, completion: @escaping (PlaudDeviceBasicSDK.WorkflowResult) -> Swift.Void)
+ public func doTranscribeAndAISummaryWorkflow(fileId: Swift.String, language: Swift.String = "en", diarization: Swift.Bool = true, transcriptType: Swift.String? = nil, templateId: Swift.String = "MEETING", prompt: Swift.String? = nil, model: Swift.String = "openai", startTime: Swift.Int = 0, timeout: Foundation.TimeInterval = 3600.0, progressHandler: ((PlaudDeviceBasicSDK.WorkflowStatusResponse) -> Swift.Void)? = nil, completion: @escaping (PlaudDeviceBasicSDK.WorkflowResult) -> Swift.Void)
+ public func doAudioMergeWorkflow(fileIdList: [Swift.String], groupId: Swift.String, timeout: Foundation.TimeInterval = 3600.0, progressHandler: ((PlaudDeviceBasicSDK.WorkflowStatusResponse) -> Swift.Void)? = nil, completion: @escaping (PlaudDeviceBasicSDK.WorkflowResult) -> Swift.Void)
+ public func doMergeAndAnalysisWorkflow(fileIdList: [Swift.String], groupId: Swift.String, etlType: Swift.String, timeout: Foundation.TimeInterval = 3600.0, progressHandler: ((PlaudDeviceBasicSDK.WorkflowStatusResponse) -> Swift.Void)? = nil, completion: @escaping (PlaudDeviceBasicSDK.WorkflowResult) -> Swift.Void)
+}
+@_hasMissingDesignatedInitializers public class PlaudWorkflowManagerTest {
+ public static func runCompleteWorkflowTest()
+ public static func testAudioTranscribeWorkflow(fileId: Swift.String)
+ public static func testAIEtlWorkflow()
+ public static func testTranscribeAndAnalysisWorkflow(fileId: Swift.String, completion: @escaping (Swift.Bool) -> Swift.Void)
+ public static func testAudioMergeWorkflow(fileIdList: [Swift.String])
+ public static func testMergeAndAnalysisWorkflow(fileId: Swift.String, completion: @escaping (Swift.Bool) -> Swift.Void)
+ public static func testCustomWorkflow()
+ public static func testJSONParsingFix()
+ public static func testDoAudioTranscribeWorkflow(fileId: Swift.String)
+ public static func testURLBuilding()
+ public static func testWorkflowStatusResponseParsing()
+ public static func testNewWorkflowResultResponseParsing()
+ public static func testWorkflowResultResponseWithAIEtl()
+ public static func testTranscribeAndAISummaryWorkflow()
+ public static func testWorkflowResultResponseWithComplexAISummary()
+ public static func pollWorkflowCompletion(workflowId _: Swift.String, description: Swift.String, completion: @escaping (Swift.Bool) -> Swift.Void = { _ in })
+ @objc deinit
+}
+@_hasMissingDesignatedInitializers public class PlaudWorkflowManagerExample {
+ public static func runAllExamples()
+ public static func simpleTranscribeExample()
+ public static func batchProcessingExample()
+ @objc deinit
+}
+@_inheritsConvenienceInitializers @_hasMissingDesignatedInitializers @objc public class TestAgent : ObjectiveC.NSObject {
+ @objc public static let shared: PlaudDeviceBasicSDK.TestAgent
+ @objc public func testFunc() -> Swift.String
+ @objc deinit
+}
+public struct WorkflowResultResponse : Swift.Codable {
+ public let id: Swift.String
+ public let status: Swift.String
+ public let ownerId: Swift.String?
+ public let metadataJson: [Swift.String : PlaudDeviceBasicSDK.AnyCodable]?
+ public let fileId: Swift.String?
+ public let tasks: [PlaudDeviceBasicSDK.WorkflowTaskResult]
+ public let metadata: [Swift.String : PlaudDeviceBasicSDK.AnyCodable]?
+ public let results: [Swift.String : PlaudDeviceBasicSDK.AnyCodable]?
+ public let taskResults: [Swift.String : PlaudDeviceBasicSDK.AnyCodable]?
+ public let completedAt: Swift.String?
+ public let duration: Swift.Double?
+ public let message: Swift.String?
+ public let progress: Swift.Double?
+ public let estimatedCompletionTime: Swift.String?
+ public let taskStatuses: [Swift.String : Swift.String]?
+ public init(from decoder: any Swift.Decoder) throws
+ public func encode(to encoder: any Swift.Encoder) throws
+ public var legacyResults: [Swift.String : Any]? {
+ get
+ }
+ public var legacyTaskResults: [Swift.String : Any]? {
+ get
+ }
+ public var legacyCompletedAt: Swift.String? {
+ get
+ }
+ public var legacyDuration: Foundation.TimeInterval? {
+ get
+ }
+ public var legacyProgress: Swift.Double? {
+ get
+ }
+ public var legacyMessage: Swift.String? {
+ get
+ }
+ public var legacyEstimatedCompletionTime: Swift.String? {
+ get
+ }
+ public var legacyTaskStatuses: [Swift.String : Swift.String]? {
+ get
+ }
+ public var firstTranscriptResult: PlaudDeviceBasicSDK.TranscriptResult? {
+ get
+ }
+ public var firstAIEtlResult: PlaudDeviceBasicSDK.AIEtlResult? {
+ get
+ }
+ public var firstAISummaryResult: PlaudDeviceBasicSDK.AISummaryResult? {
+ get
+ }
+ public var allTranscriptText: Swift.String {
+ get
+ }
+ public var transcriptBySpeaker: [Swift.String : Swift.String] {
+ get
+ }
+ public var transcriptTask: PlaudDeviceBasicSDK.WorkflowTaskResult? {
+ get
+ }
+ public var aiEtlTask: PlaudDeviceBasicSDK.WorkflowTaskResult? {
+ get
+ }
+ public var aiSummaryTask: PlaudDeviceBasicSDK.WorkflowTaskResult? {
+ get
+ }
+ public var transcriptDuration: Swift.Int64? {
+ get
+ }
+ public var aiEtlDuration: Swift.Int64? {
+ get
+ }
+ public var aiSummaryDurationSeconds: Swift.Double? {
+ get
+ }
+ public var transcriptDurationSeconds: Swift.Double? {
+ get
+ }
+ public var aiEtlDurationSeconds: Swift.Double? {
+ get
+ }
+ public var isSuccess: Swift.Bool {
+ get
+ }
+ public var segmentCount: Swift.Int {
+ get
+ }
+ public var allSpeakers: [Swift.String] {
+ get
+ }
+ public var speakers: [Swift.String] {
+ get
+ }
+ public var transcriptTotalDuration: Foundation.TimeInterval {
+ get
+ }
+ public var aiEtlSummary: Swift.String? {
+ get
+ }
+ public var aiSummaryText: Swift.String? {
+ get
+ }
+ public var aiSummaryKeyPoints: [Swift.String]? {
+ get
+ }
+ public var aiSummaryActionItems: [Swift.String]? {
+ get
+ }
+ public var aiSummaryParticipants: [Swift.String]? {
+ get
+ }
+ public var aiSummaryTemplate: Swift.String? {
+ get
+ }
+ public var aiSummaryModel: Swift.String? {
+ get
+ }
+ public var aiSummaryDuration: Swift.String? {
+ get
+ }
+ public var aiSummaryHeadline: Swift.String? {
+ get
+ }
+ public var aiSummaryTopics: [PlaudDeviceBasicSDK.AISummaryTopic]? {
+ get
+ }
+ public var clinicalReport: Swift.String? {
+ get
+ }
+ public var dealStatus: Swift.String? {
+ get
+ }
+ public var dealIntentionRating: Swift.String? {
+ get
+ }
+ public var communicationHighlight: Swift.String? {
+ get
+ }
+ public var communicationSuggestion: Swift.String? {
+ get
+ }
+ public var customerAppellation: Swift.String? {
+ get
+ }
+ public var hasAIEtlTask: Swift.Bool {
+ get
+ }
+ public var hasAISummaryTask: Swift.Bool {
+ get
+ }
+ public var hasTranscriptTask: Swift.Bool {
+ get
+ }
+ public var taskTypes: [Swift.String] {
+ get
+ }
+ public var embeddingsData: [Swift.String : [Swift.Double]]? {
+ get
+ }
+ public var hasEmbeddings: Swift.Bool {
+ get
+ }
+ public var transcriptStatusCode: Swift.Int? {
+ get
+ }
+}
+public struct WorkflowTaskResult : Swift.Codable {
+ public let taskId: Swift.String
+ public let taskType: Swift.String
+ public let status: Swift.String
+ public let startTime: Swift.Int64?
+ public let endTime: Swift.Int64?
+ public let result: PlaudDeviceBasicSDK.AnyCodable?
+ public init(taskId: Swift.String, taskType: Swift.String, status: Swift.String, startTime: Swift.Int64?, endTime: Swift.Int64?, result: PlaudDeviceBasicSDK.AnyCodable?)
+ public init(from decoder: any Swift.Decoder) throws
+ public func encode(to encoder: any Swift.Encoder) throws
+ public func debugPrintTaskResult()
+ public var transcriptResult: PlaudDeviceBasicSDK.TranscriptResult? {
+ get
+ }
+ public var aiEtlResult: PlaudDeviceBasicSDK.AIEtlResult? {
+ get
+ }
+ public var aiSummaryResult: PlaudDeviceBasicSDK.AISummaryResult? {
+ get
+ }
+}
+public enum WorkflowParsingError : Swift.Error, Foundation.LocalizedError {
+ case missingRequiredField(Swift.String)
+ case invalidDataStructure(Swift.String)
+ case unsupportedFormat(Swift.String)
+ public var errorDescription: Swift.String? {
+ get
+ }
+}
+@_inheritsConvenienceInitializers @objc public class AudioFileDecryptor : ObjectiveC.NSObject {
+ @objc public static func decryptAudioFile(inputPath: Swift.String, privateKeyPem: Swift.String, outputPath: Swift.String? = nil) throws -> Swift.String
+ public static func decryptAudioToOgg(inputPath: Swift.String, privateKeyPem: Swift.String, outputPath: Swift.String? = nil) throws -> Swift.String?
+ @objc public static func isFileEncrypted(path: Swift.String) -> Swift.Bool
+ @objc public static func getHeader(path: Swift.String) -> PlaudDeviceBasicSDK.PlaudEncryptHeader?
+ @objc override dynamic public init()
+ @objc deinit
+}
+@objc public enum AudioDecryptorError : Swift.Int, Swift.Error {
+ case invalidHeader = 1
+ case invalidSymmetricKey = 2
+ case noEncryptedData = 3
+ case decryptionFailed = 4
+ public var localizedDescription: Swift.String {
+ get
+ }
+ public init?(rawValue: Swift.Int)
+ public typealias RawValue = Swift.Int
+ public static var _nsErrorDomain: Swift.String {
+ get
+ }
+ public var rawValue: Swift.Int {
+ get
+ }
+}
+@_hasMissingDesignatedInitializers public class ChaCha20 {
+ public static func decrypt(data: Foundation.Data, key: Foundation.Data, nonce: Foundation.Data, counter: Swift.UInt32 = 0) throws -> Foundation.Data
+ @objc deinit
+}
+public enum ChaCha20Error : Swift.Error {
+ case invalidKeyLength
+ case invalidNonceLength
+ public static func == (a: PlaudDeviceBasicSDK.ChaCha20Error, b: PlaudDeviceBasicSDK.ChaCha20Error) -> Swift.Bool
+ public func hash(into hasher: inout Swift.Hasher)
+ public var hashValue: Swift.Int {
+ get
+ }
+}
+extension PlaudDeviceBasicSDK.ChaCha20 {
+ public static func verifyRFC7539TestVector() -> Swift.Bool
+}
+@_inheritsConvenienceInitializers @objc public class OggOpusParser : ObjectiveC.NSObject {
+ @objc public static func resetDecoder()
+ @objc public var parsedSampleRate: Swift.Int {
+ @objc get
+ }
+ @objc public var parsedChannels: Swift.Int {
+ @objc get
+ }
+ @objc public var parsedPreSkip: Swift.Int {
+ @objc get
+ }
+ @objc public func parse(_ oggData: Foundation.Data) -> [Foundation.Data]
+ @objc override dynamic public init()
+ @objc deinit
+}
+@objc public enum PlaudDownloadFormat : Swift.Int {
+ case pcm = 0
+ @available(*, unavailable, message: "MP3 format is not supported")
+ case mp3 = 1
+ case wav = 2
+ public init?(rawValue: Swift.Int)
+ public typealias RawValue = Swift.Int
+ public var rawValue: Swift.Int {
+ get
+ }
+}
+@objc public enum AudioExportFormat : Swift.Int {
+ case pcm = 0
+ case mp3 = 1
+ case wav = 2
+ case opus = 3
+ public var fileExtension: Swift.String {
+ get
+ }
+ public init?(rawValue: Swift.Int)
+ public typealias RawValue = Swift.Int
+ public var rawValue: Swift.Int {
+ get
+ }
+}
+@objc public protocol AudioExportCallback {
+ @objc func onProgress(_ progress: Swift.Int, message: Swift.String)
+ @objc func onComplete(outputPath: Swift.String)
+ @objc func onError(_ error: Swift.String)
+}
+@_inheritsConvenienceInitializers @objc public class PlaudBleDevice : PlaudBleSDK.BleDevice {
+ @objc override public init(sn: Swift.String)
+ override public init(peripheral: CoreBluetooth.CBPeripheral, rssi: Foundation.NSNumber, manufacturerData: Foundation.Data, localName: Swift.String?)
+ @objc deinit
+}
+@objc public protocol PlaudDeviceAgentProtocol {
+ @objc optional func bleAppKeyState(result: Swift.Int)
+ @objc func blePenState(state: Swift.Int, privacy: Swift.Int, keyState: Swift.Int, uDisk: Swift.Int, findMyToken: Swift.Int, hasSndpKey: Swift.Int, deviceAccessToken: Swift.Int)
+ @objc optional func bleDeviceName(name: Swift.String?)
+ @objc optional func bleScanResult(bleDevices: [PlaudBleSDK.BleDevice])
+ @objc optional func bleScanOverTime()
+ @objc optional func bleConnectState(state: Swift.Int)
+ @objc optional func bleBind(sn: Swift.String?, status: Swift.Int, protVersion: Swift.Int, timezone: Swift.Int)
+ @objc optional func bleMicGain(_ value: Swift.Int)
+ @objc optional func bleStorage(total: Swift.Int, free: Swift.Int, duration: Swift.Int)
+ @objc optional func blePowerChange(power: Swift.Int, oldPower: Swift.Int)
+ @objc optional func bleChargingState(isCharging: Swift.Bool, level: Swift.Int)
+ @objc optional func bleFileList(bleFiles: [PlaudBleSDK.BleFile])
+ @objc optional func bleRecordStart(sessionId: Swift.Int, start: Swift.Int, status: Swift.Int, scene: Swift.Int, startTime: Swift.Int, reason: Swift.Int)
+ @objc optional func bleRecordStop(sessionId: Swift.Int, reason: Swift.Int, fileExist: Swift.Bool, fileSize: Swift.Int)
+ @objc optional func bleRecordPause(sessionId: Swift.Int, reason: Swift.Int, fileExist: Swift.Bool, fileSize: Swift.Int)
+ @objc optional func bleRecordResume(sessionId: Swift.Int, start: Swift.Int, status: Swift.Int, scene: Swift.Int, startTime: Swift.Int)
+ @objc optional func bleSyncFileHead(sessionId: Swift.Int, status: Swift.Int)
+ @objc optional func bleSyncFileTail(sessionId: Swift.Int, crc: Swift.Int)
+ @objc optional func bleData(sessionId: Swift.Int, start: Swift.Int, data: Foundation.Data)
+ @objc optional func blePcmData(sessionId: Swift.Int, millsec: Swift.Int, pcmData: Foundation.Data, isMusic: Swift.Bool)
+ @objc optional func bleDataComplete()
+ @objc optional func bleDecodeFail(start: Swift.Int)
+ @objc optional func bleSyncFileStop()
+ @objc optional func bleDownloadFile(sessionId: Swift.Int, desiredOutputPath: Swift.String, status: Swift.Int, progress: Swift.Int, tips: Swift.String)
+ @objc optional func bleDownloadFileStop()
+ @objc optional func bleDeleteFile(sessionId: Swift.Int, status: Swift.Int)
+ @objc optional func bleDepair(_ status: Swift.Int)
+ @objc optional func onWifiSyncConfigReceived(index: Swift.UInt32, ssid: Swift.String, password: Swift.String)
+ @objc optional func onWifiSyncConfigSet(result: Swift.Int)
+ @objc optional func onWifiSyncListReceived(list: [Swift.UInt32])
+ @objc optional func onWifiSyncDeleteResult(result: Swift.Int)
+ @objc optional func onWifiSyncTestStarted(index: Swift.UInt32)
+ @objc optional func onWifiSyncWillStart(seconds: Swift.Int)
+ @objc optional func onWifiSyncTestResult(index: Swift.UInt32, result: Swift.Int, rawCode: Swift.Int)
+ @objc optional func onWifiSyncUrl(url: Swift.String)
+ @objc optional func onWifiRssiRequestConfirmed(status: Swift.Int)
+ @objc optional func onSdkFetchPermissionResult(pass: Swift.Bool, tips: Swift.String)
+ @objc optional func onSdkCheckPermissionResult(pass: Swift.Bool, tips: Swift.String)
+ @objc optional func onSdkCheckResourceResult(pass: Swift.Bool, tips: Swift.String)
+ @objc optional func onWifiSyncEnabled(_ value: Swift.Int)
+ @objc optional func onCommonMsgChannel(type: Swift.Int, value: Swift.Int, tips: Swift.String)
+ @objc optional func bleWiFiOpen(_ status: Swift.Int, _ wifiName: Swift.String, _ wholeName: Swift.String, _ wifiPass: Swift.String)
+ @objc optional func bleFotaResult(uid: Swift.Int, status: Swift.Int, errmsg: Swift.String?)
+ @objc optional func bleFotaPackReq(uid: Swift.Int, start: Swift.Int, end: Swift.Int)
+ @objc optional func bleFotaPackFin(uid: Swift.Int, status: Swift.Int, errmsg: Swift.String?)
+ @objc optional func bleOtaDataSendFail()
+ @objc optional func bleSetActive(status: Swift.Int)
+ @objc optional func bleCommonSetting(setting: Swift.Int)
+ @objc optional func bleRate(lossRate: Swift.Double, rate: Swift.Int, instantRate: Swift.Int)
+}
+@_inheritsConvenienceInitializers @_hasMissingDesignatedInitializers @objc public class PlaudDeviceAgent : ObjectiveC.NSObject {
+ @objc public static let shared: PlaudDeviceBasicSDK.PlaudDeviceAgent
+ public var bleAgent: PlaudBleSDK.BleAgent?
+ @objc public var recentConnectDevice: PlaudBleSDK.BleDevice?
+ @objc public var sceneFlag: Swift.Int {
+ get
+ }
+ @objc public var isWiFiTransferActive: Swift.Bool {
+ get
+ }
+ @objc public var skipPermissionCheck: Swift.Bool
+ @objc weak public var delegate: (any PlaudDeviceBasicSDK.PlaudDeviceAgentProtocol)? {
+ @objc get
+ @objc set
+ }
+ @objc deinit
+ @objc public func initSDK(userAccessToken: Swift.String, customDomain: Swift.String, extra: [Swift.String : Swift.String] = [:])
+ @objc public func initSDK(hostName: Swift.String, appKey: Swift.String, appSecret: Swift.String, bindToken: Swift.String = "", extra: [Swift.String : Swift.String] = [:], customDomain: Swift.String? = nil, partnerToken: Swift.String? = nil)
+ @objc public func setUserAccessToken(_ token: Swift.String?)
+ @available(*, deprecated, renamed: "setUserAccessToken")
+ @objc public func setPartnerToken(_ token: Swift.String?)
+ public func getPartnerApiManager() -> PlaudDeviceBasicSDK.PlaudPartnerApiManager
+ @objc public func isPartnerDataReady() -> Swift.Bool
+ @objc public static func getTestAppKey(_ beta: Swift.Bool = false) -> Swift.String
+ @objc public static func getTestAppSecret(_ beta: Swift.Bool = false) -> Swift.String
+ @objc public func depair(clear: Swift.Bool = false)
+ @objc public func setDeviceWiFi(open: Swift.Bool)
+ @objc public func endWiFiTransfer()
+ @objc public func setDeviceBinding(token: Swift.String)
+ @objc public func startScan()
+ @objc public func stopScan()
+ @objc public func isConnected() -> Swift.Bool
+ @objc public func connectBleDevice(bleDevice: PlaudBleSDK.BleDevice, deviceToken: Swift.String)
+ @objc public func connectBleDevice(bleDevice: PlaudBleSDK.BleDevice)
+ @objc public func disconnect()
+ @objc public func tryReconnectLastDevice()
+ @objc public func getState()
+ @objc public func getStorage()
+ @objc public func getWifiSyncEnable()
+ @objc public func setWifiSyncEnable(value: Swift.Int)
+ @objc public func setWifiSyncTest(wifiIndex: Swift.UInt32)
+ @objc public func getWifiSyncTestResult(wifiIndex: Swift.UInt32)
+ @objc public func getChargingState()
+ @objc public func setMicGain(value: Swift.Int)
+ @objc public func readMicGain()
+ @objc public func setUDiskMode(onOff: Swift.Bool)
+ @objc public func checkIsRecording() -> Swift.Bool
+ @objc public func checkIsDownloading() -> Swift.Bool
+ @objc public func startRecord()
+ @objc public func setDeviceActive(status: Swift.Int)
+ @objc public func stopRecord()
+ @objc public func setDeviceName(_ name: Swift.String)
+ @objc public func getCurrentSessionID() -> Swift.Int
+ @objc public func pauseRecord()
+ @objc public func resumeRecord()
+ @objc public func getFileList(startSessionId: Swift.Int)
+ @objc public func getFile(sessionId: Swift.Int)
+ @objc public func syncFile(sessionId: Swift.Int, start: Swift.Int, end: Swift.Int)
+ @objc public func downloadFile(sessionId: Swift.Int, desiredOutputPath: Swift.String, format: PlaudDeviceBasicSDK.PlaudDownloadFormat = .wav)
+ @objc public func stopDownloadFile()
+ @objc public func exportAudio(sessionId: Swift.Int, outputDir: Swift.String, format: PlaudDeviceBasicSDK.AudioExportFormat, channels: Swift.Int = 1, callback: any PlaudDeviceBasicSDK.AudioExportCallback)
+ public static func getSupportedExportFormats() -> [PlaudDeviceBasicSDK.AudioExportFormat]
+ @objc public func stopSyncFile()
+ @objc public func deleteFile(sessionId: Swift.Int)
+ @objc public func clearAllFiles()
+ @objc public func restoreFactory()
+ @objc public func getWifiSyncConfig(wifiIndex: Swift.UInt32)
+ @objc public func setWifiSyncConfig(operation: Swift.Int, wifiIndex: Swift.UInt32, ssid: Swift.String, password: Swift.String)
+ @objc public func getWifiSyncList()
+ @objc public func deleteWifiSyncConfig(wifiIndices: [Swift.UInt32])
+}
+extension PlaudDeviceBasicSDK.PlaudDeviceAgent : PlaudBleSDK.BleAgentProtocol {
+ @objc dynamic public func bleScanResult(bleDevices: [PlaudBleSDK.BleDevice])
+ @objc dynamic public func bleScanOverTime()
+ @objc dynamic public func bleAppKeyState(result: Swift.Int)
+ @objc dynamic public func bleConnectState(state: Swift.Int)
+ @objc dynamic public func bleBind(sn: Swift.String?, status: Swift.Int, protVersion: Swift.Int, timezone: Swift.Int)
+ @objc dynamic public func blePenState(state: Swift.Int, privacy: Swift.Int, keyState: Swift.Int, uDisk: Swift.Int, findMyToken: Swift.Int, hasSndpKey: Swift.Int, deviceAccessToken: Swift.Int, versionType: Swift.String, versionCode: Swift.Int)
+ @objc dynamic public func bleStorage(total: Swift.Int, free: Swift.Int, duration: Swift.Int)
+ @objc dynamic public func blePowerChange(power: Swift.Int, oldPower: Swift.Int)
+ @objc dynamic public func bleChargingState(isCharging: Swift.Bool, level: Swift.Int)
+ @objc dynamic public func bleFileList(bleFiles: [PlaudBleSDK.BleFile])
+ @objc dynamic public func bleDataComplete()
+ @objc dynamic public func bleRecordStart(sessionId: Swift.Int, start: Swift.Int, status: Swift.Int, scene: Swift.Int, startTime: Swift.Int)
+ @objc dynamic public func bleRecordStop(sessionId: Swift.Int, reason: Swift.Int, fileExist: Swift.Bool, fileSize: Swift.Int)
+ @objc dynamic public func bleRecordPause(sessionId: Swift.Int, reason: Swift.Int, fileExist: Swift.Bool, fileSize: Swift.Int)
+ @objc dynamic public func bleRecordResume(sessionId: Swift.Int, start: Swift.Int, status: Swift.Int, scene: Swift.Int, startTime: Swift.Int)
+ @objc dynamic public func bleSyncFileHead(sessionId: Swift.Int, status: Swift.Int)
+ @objc dynamic public func bleSyncFileTail(sessionId: Swift.Int, crc: Swift.Int)
+ @objc dynamic public func bleData(sessionId: Swift.Int, start: Swift.Int, data: Foundation.Data)
+ @objc dynamic public func blePcmData(sessionId: Swift.Int, millsec: Swift.Int, pcmData: Foundation.Data, isMusic: Swift.Bool)
+ @objc dynamic public func bleDecodeFail(start: Swift.Int)
+ @objc dynamic public func bleSyncFileStop()
+ @objc dynamic public func bleDeleteFile(sessionId: Swift.Int, status: Swift.Int)
+ @objc dynamic public func bleDepair(_ status: Swift.Int)
+ @objc dynamic public func bleMicGain(_ value: Swift.Int)
+ @objc dynamic public func onSyncIdleWifiConfigReceived(index: Swift.UInt32, ssid: Swift.String, password: Swift.String)
+ @objc dynamic public func onSyncIdleWifiConfigSet(result: Swift.Int)
+ @objc dynamic public func onSyncIdleWifiListReceived(list: [Swift.UInt32])
+ @objc dynamic public func onSyncIdleWifiDeleteResult(result: Swift.Int)
+ @objc dynamic public func onSyncIdleWifiTestStarted(index: Swift.UInt32)
+ @objc dynamic public func onSyncIdleWillStart(seconds: Swift.Int)
+ @objc dynamic public func onSyncIdleWifiTestResult(index: Swift.UInt32, result: Swift.Int, rawCode: Swift.Int)
+ public func onWifiRssiRequestConfirmed(status: Swift.Int)
+ @objc dynamic public func bleSyncWhenIdleEnabled(_ value: Swift.Int)
+ @objc dynamic public func bleUDiskErr(funcName: Swift.String)
+ @objc dynamic public func bleWiFiOpen(_ status: Swift.Int, _ wifiName: Swift.String, _ wholeName: Swift.String, _ wifiPass: Swift.String)
+ @objc dynamic public func bleDeviceName(name: Swift.String?)
+ @objc dynamic public func bleFotaResult(uid: Swift.Int, status: Swift.Int, errmsg: Swift.String?)
+ @objc dynamic public func bleFotaPackReq(uid: Swift.Int, start: Swift.Int, end: Swift.Int)
+ @objc dynamic public func bleFotaPackFin(uid: Swift.Int, status: Swift.Int, errmsg: Swift.String?)
+ @objc dynamic public func bleOtaDataSendFail()
+ @objc dynamic public func bleRate(lossRate: Swift.Double, rate: Swift.Int, instantRate: Swift.Int)
+ @objc dynamic public func bleSetActive(status: Swift.Int)
+ public func bleCommonSetting(_ setting: Swift.Int)
+ @objc dynamic public func bleHeartbeat(status: Swift.Int)
+ @objc dynamic public func bleBatteryMode(_ mode: Swift.Int)
+ @objc dynamic public func bleDeviceStatus(status: [Swift.UInt8])
+ @objc dynamic public func bleNewFeature(data: Foundation.Data)
+ @objc dynamic public func bleGetRecordMarkingTags(uid: Swift.Int, totals: Swift.Int, index: Swift.Int, tags: [PlaudBleSDK.BleRecordMarkingTag])
+ @objc dynamic public func deviceLogData(start: Swift.Int, data: Foundation.Data, logType: Swift.Int)
+ @objc dynamic public func onGetDeviceLogList(data: Foundation.Data)
+ @objc dynamic public func onSyncDeviceLogStart(data: Foundation.Data)
+ @objc dynamic public func onSyncDeviceLogStop()
+ @objc dynamic public func onSyncDeviceLogEnd(data: Foundation.Data)
+ @objc dynamic public func onDeviceLogDeleted(data: Foundation.Data)
+ @objc dynamic public func bleUpdatePowerLowErr()
+ @objc dynamic public func bleDeviceDisconnectErr()
+ @objc dynamic public func bleState(powered: Swift.Bool)
+ @objc dynamic public func bleHandshakeWait(timeout: Swift.Int)
+ @objc dynamic public func blePenTime(stamp: Swift.Int, timezone: Swift.Int, zoneMin: Swift.Int)
+ @objc dynamic public func blePasswordReset(password: Swift.Int)
+ @objc dynamic public func bleBacklightDuration(_ duration: Swift.Int)
+ @objc dynamic public func bleBacklightBright(_ bright: Swift.Int)
+ @objc dynamic public func bleLanguage(_ type: Swift.Int)
+ @objc dynamic public func bleRecScene(_ scene: Swift.Int)
+ @objc dynamic public func bleRecMode(_ mode: Swift.Int)
+ @objc dynamic public func bleVadSensitivity(_ value: Swift.Int)
+ @objc dynamic public func bleVpuGain(_ value: Swift.Int)
+ @objc dynamic public func bleSwitchHandler(_ id: Swift.Int)
+ @objc dynamic public func bleAutoPowerOff(_ value: Swift.Int)
+ @objc dynamic public func bleRawWaveEnabled(_ value: Swift.Int)
+ @objc dynamic public func bleRecordingAfterDisConnetEnabled(_ value: Swift.Int)
+ @objc dynamic public func bleFindMyState(_ value: Swift.Int)
+ @objc dynamic public func bleVPUCLKState(_ value: Swift.Int)
+ @objc dynamic public func bleStopRecordingAfterCharging(_ value: Swift.Int)
+ @objc dynamic public func bleAutoClear(_ open: Swift.Bool)
+ @objc dynamic public func bleVad(_ open: Swift.Bool)
+ @objc dynamic public func bleWiFiClose(_ status: Swift.Int)
+ @objc dynamic public func bleSetWiFiSsid(status: Swift.Int)
+ @objc dynamic public func bleGetWiFiSsid(status: Swift.Int, ssid: Swift.String?)
+ @objc dynamic public func bleVoiceAbnormal(status: Swift.Int)
+ @objc dynamic public func bleWebsocketProfile(_ type: Swift.Int, _ conent: Swift.String?)
+ @objc dynamic public func bleWebsocketTest(_ status: Swift.Int)
+ @objc dynamic public func bleLedState(onOff: Swift.Int)
+ @objc dynamic public func bleSetLedState(onOff: Swift.Int)
+ @objc dynamic public func bleMarking(sessionId: Swift.Int, status: Swift.Int, markList: [Swift.UInt32])
+ @objc dynamic public func bleAngles(pitchAngle: Swift.Float, rollbackAngle: Swift.Float, yawAngle: Swift.Float)
+ @objc dynamic public func blePrivacy(privacy: Swift.Int)
+ @objc dynamic public func bleClearAllFile(status: Swift.Int)
+ @objc dynamic public func bleAlarmRec(start: Swift.Int, duration: Swift.Int, repeatMode: Swift.Int)
+ @objc dynamic public func onResetFindmyResult(result: Swift.Int)
+ @objc dynamic public func onCommonParamsSetResult(success: Swift.Bool, dataType: Swift.Int, value: Swift.String?)
+ @objc dynamic public func onCommonParamsGetResult(success: Swift.Bool, dataType: Swift.Int, value: Swift.String?)
+ @objc dynamic public func onSetSoundPlusTokenResult(licenseKey: Swift.String)
+ @objc dynamic public func onGetSDFlashCIDResult(cid: Swift.String)
+}
+extension PlaudDeviceBasicSDK.PlaudDeviceAgent {
+ @objc dynamic public func reportDeviceMetadata()
+ @objc dynamic public func checkFirmwareUpdate(completion: @escaping (PlaudDeviceBasicSDK.PlaudFirmwareCheckResult) -> Swift.Void)
+ @objc dynamic public func startFirmwareUpdate(progress: @escaping (PlaudDeviceBasicSDK.PlaudFirmwarePhase, Swift.Float) -> Swift.Void, completion: @escaping (PlaudDeviceBasicSDK.PlaudFirmwareUpdateResult) -> Swift.Void)
+ @objc dynamic public func pushFirmwareFile(filePath: Swift.String, toVersion: Swift.String, progress: @escaping (PlaudDeviceBasicSDK.PlaudFirmwarePhase, Swift.Float) -> Swift.Void, completion: @escaping (PlaudDeviceBasicSDK.PlaudFirmwareUpdateResult) -> Swift.Void)
+}
+extension PlaudDeviceBasicSDK.PlaudDeviceAgent {
+ public func sendApiToken(token: Swift.String, callback: @escaping (Swift.Bool, Swift.String) -> Swift.Void)
+ public func sendBinaryFile(type: Swift.Int, data: Foundation.Data?, callback: @escaping (Swift.Bool, Swift.String) -> Swift.Void)
+ @objc dynamic public func onBinaryFileReq(type: Swift.Int, packageOffset: Swift.Int, packageSize: Swift.Int, endStatus: Swift.Int)
+ @objc dynamic public func onBinaryFileEnd(result: Swift.Int)
+}
+extension PlaudDeviceBasicSDK.PlaudDeviceAgent {
+ public func checkDeviceState(state _: Swift.Int, privacy _: Swift.Int, keyState _: Swift.Int, uDisk _: Swift.Int, findMyToken _: Swift.Int, hasSndpKey _: Swift.Int, deviceAccessToken: Swift.Int)
+}
+extension PlaudBleSDK.BleAgent {
+ @objc dynamic public var isSecureChannelEstablished: Swift.Bool {
+ @objc get
+ }
+ @objc dynamic public func getEncryptionKey() -> Swift.String?
+ @objc dynamic public func getEncryptionNonce() -> Swift.String?
+ @objc dynamic public func getEncryptionAD() -> Swift.String?
+ @objc dynamic public func getEncryptionParameters() -> [Swift.String : Swift.String]?
+ @objc dynamic public func decryptFileData(_ encryptedData: Foundation.Data, key: Swift.String? = nil, nonce: Swift.String? = nil, ad: Swift.String? = nil) throws -> Foundation.Data
+ @objc dynamic public func decryptFile(inputPath: Swift.String, outputPath: Swift.String, key: Swift.String? = nil, nonce: Swift.String? = nil, ad: Swift.String? = nil) -> Swift.Bool
+ @objc dynamic public func decryptAndPrepareOggFile(encryptedFilePath: Swift.String, channel: Swift.Int32, key: Swift.String? = nil, nonce: Swift.String? = nil, ad: Swift.String? = nil) -> Swift.String?
+}
+@objc public enum EncryptionError : Swift.Int, Swift.Error {
+ case noKey = 1
+ case noNonce = 2
+ case noAD = 3
+ case dataTooShort = 4
+ case decryptionFailed = 5
+ public var localizedDescription: Swift.String {
+ get
+ }
+ public init?(rawValue: Swift.Int)
+ public typealias RawValue = Swift.Int
+ public static var _nsErrorDomain: Swift.String {
+ get
+ }
+ public var rawValue: Swift.Int {
+ get
+ }
+}
+extension PlaudBleSDK.BleAgent {
+ @objc dynamic public func playDecryptedOggFile(encryptedFilePath: Swift.String, channel: Swift.Int32 = 1, delegate: (any PlaudBleSDK.JXOggPlayerDelegate)? = nil, key: Swift.String? = nil, nonce: Swift.String? = nil, ad: Swift.String? = nil) -> Swift.Bool
+ @objc dynamic public func stopOggPlayback()
+ @objc dynamic public func pauseOggPlayback()
+ @objc dynamic public func resumeOggPlayback()
+ @objc dynamic public func getOggPlayer() -> PlaudBleSDK.JXOggPlayer
+}
+extension PlaudBleSDK.BleAgent {
+ @objc dynamic public func decryptE2EEAudioFile(inputPath: Swift.String, outputPath: Swift.String? = nil, privateKeyPem: Swift.String) throws -> Swift.String
+ @objc dynamic public func isE2EEEncryptedFile(path: Swift.String) -> Swift.Bool
+ @objc dynamic public func getE2EEFileHeader(path: Swift.String) -> PlaudDeviceBasicSDK.PlaudEncryptHeader?
+}
+extension PlaudBleSDK.BleAgent {
+ @objc dynamic public var isEncryptionSupported: Swift.Bool {
+ @objc get
+ }
+ @objc dynamic public func getEncryptionProtocolInfo() -> [Swift.String : Any]
+}
+@objc public enum PlaudFirmwarePhase : Swift.Int {
+ case downloading = 0
+ case installing = 1
+ case restarting = 2
+ case complete = 3
+ public init?(rawValue: Swift.Int)
+ public typealias RawValue = Swift.Int
+ public var rawValue: Swift.Int {
+ get
+ }
+}
+@_hasMissingDesignatedInitializers @objc public class PlaudFirmwareUpdateResult : ObjectiveC.NSObject {
+ @objc final public let success: Swift.Bool
+ @objc final public let version: Swift.String
+ @objc final public let errorMessage: Swift.String?
+ @objc deinit
+}
+@_hasMissingDesignatedInitializers @objc public class PlaudFirmwareCheckResult : ObjectiveC.NSObject {
+ @objc final public let hasUpdate: Swift.Bool
+ @objc final public let currentVersion: Swift.String
+ @objc final public let latestVersion: Swift.String
+ @objc final public let versionCode: Swift.Int
+ @objc final public let releaseNotes: Swift.String
+ @objc final public let downloadUrl: Swift.String
+ @objc final public let md5: Swift.String
+ @objc final public let isForce: Swift.Bool
+ @objc deinit
+}
+extension PlaudDeviceBasicSDK.PlaudDeviceAgent {
+ @objc dynamic public func clearSDKCredentials()
+}
+extension PlaudDeviceBasicSDK.PlaudDeviceAgent {
+ public func quickUpdateCheck(device: PlaudBleSDK.BleDevice, showUI: Swift.Bool = true, completion: @escaping (PlaudDeviceBasicSDK.UpdateStatus) -> Swift.Void)
+ public func quickUpdateCheck(model: Swift.String, snType: Swift.String = "notepin", versionType: Swift.String = "V", showUI: Swift.Bool = true, completion: ((Swift.Bool, Swift.String?) -> Swift.Void)? = nil)
+ public func silentUpdateCheck(model: Swift.String, snType: Swift.String = "notepin", versionType: Swift.String = "V", completion: @escaping (Swift.Bool, PlaudDeviceBasicSDK.LatestVersionResponse?, (any Swift.Error)?) -> Swift.Void)
+ public func downloadUpdatePackage(downloadURL: Swift.String, model: Swift.String, versionNumber: Swift.String, versionCode: Swift.String = "", fileMD5: Swift.String? = nil, showProgress: Swift.Bool = false, completion: @escaping (Swift.Bool, Swift.String?) -> Swift.Void)
+ public func checkForceUpdate(model: Swift.String, snType: Swift.String = "notepin", versionType: Swift.String = "V", completion: @escaping (Swift.Bool, PlaudDeviceBasicSDK.LatestVersionResponse?) -> Swift.Void)
+ public func getDownloadedUpdatePackages() -> [Swift.String]
+ @discardableResult
+ public func cleanDownloadedUpdatePackages() -> Swift.Bool
+}
+extension PlaudDeviceBasicSDK.PlaudDeviceAgent {
+ public func compareVersions(_ version1: Swift.String, _ version2: Swift.String) -> Swift.Int
+ public func shouldUpdate(currentVersion: Swift.String, latestVersion: Swift.String) -> Swift.Bool
+ public func formatFileSize(_ bytes: Swift.Int64) -> Swift.String
+}
+public func PlaudQuickUpdateCheck(model: Swift.String, snType: Swift.String = "notepin", versionType: Swift.String = "V", showUI: Swift.Bool = true, completion: ((Swift.Bool, Swift.String?) -> Swift.Void)? = nil)
+public func PlaudSilentUpdateCheck(model: Swift.String, snType: Swift.String = "notepin", versionType: Swift.String = "V", completion: @escaping (Swift.Bool, PlaudDeviceBasicSDK.LatestVersionResponse?, (any Swift.Error)?) -> Swift.Void)
+extension PlaudDeviceBasicSDK.PlaudDeviceAgent {
+ public func checkSdkResource()
+}
+@objc public class LatestVersionResponse : ObjectiveC.NSObject, Swift.Codable {
+ @objc final public let type: Swift.String
+ @objc final public let model: Swift.String
+ @objc final public let version_type: Swift.String
+ @objc final public let version_code: Swift.String
+ @objc final public let version_number: Swift.String
+ @objc final public let version_description: Swift.String
+ @objc final public let is_force: Swift.Bool
+ @objc final public let is_strong_guidance: Swift.Bool
+ @objc final public let file_md5: Swift.String?
+ @objc final public let download_url: Swift.String
+ public init(type: Swift.String, model: Swift.String, version_type: Swift.String, version_code: Swift.String, version_number: Swift.String, version_description: Swift.String, is_force: Swift.Bool, is_strong_guidance: Swift.Bool, file_md5: Swift.String?, download_url: Swift.String)
+ @objc public var version: Swift.String {
+ @objc get
+ }
+ @objc public var release_notes: Swift.String? {
+ @objc get
+ }
+ @objc public var force_update: Swift.Bool {
+ @objc get
+ }
+ @objc deinit
+ public func encode(to encoder: any Swift.Encoder) throws
+ required public init(from decoder: any Swift.Decoder) throws
+}
+public enum UpdateStatus {
+ case checking
+ case available(PlaudDeviceBasicSDK.LatestVersionResponse)
+ case notAvailable
+ case downloading(progress: Swift.Float)
+ case downloaded(localPath: Swift.String)
+ case failed(any Swift.Error)
+}
+public enum UpdateError : Swift.Error, Foundation.LocalizedError {
+ case networkError(Swift.String)
+ case invalidResponse
+ case downloadFailed(Swift.String)
+ case fileSystemError(Swift.String)
+ case noUpdateAvailable
+ case userCancelled
+ public var errorDescription: Swift.String? {
+ get
+ }
+}
+extension PlaudDeviceBasicSDK.PlaudDeviceAgent {
+ public typealias UpdateStatusCallback = (PlaudDeviceBasicSDK.UpdateStatus) -> Swift.Void
+ public typealias UserConfirmationCallback = (Swift.Bool) -> Swift.Void
+ public func checkLatestVersion(model: Swift.String, snType: Swift.String = "notepin", versionType: Swift.String = "V", callback: @escaping PlaudDeviceBasicSDK.PlaudDeviceAgent.UpdateStatusCallback)
+ @objc dynamic public func showUpdateConfirmation(versionInfo: PlaudDeviceBasicSDK.LatestVersionResponse, completion: @escaping (Swift.Bool) -> Swift.Void)
+ public func downloadUpdate(versionInfo: PlaudDeviceBasicSDK.LatestVersionResponse, callback: @escaping PlaudDeviceBasicSDK.PlaudDeviceAgent.UpdateStatusCallback)
+ public func performUpdateCheck(model: Swift.String, snType: Swift.String = "notepin", versionType: Swift.String = "V", callback: @escaping PlaudDeviceBasicSDK.PlaudDeviceAgent.UpdateStatusCallback)
+ @objc dynamic public func checkLatestVersionForModel(_ model: Swift.String, snType: Swift.String, versionType: Swift.String, hasUpdate: @escaping (Swift.Bool, PlaudDeviceBasicSDK.LatestVersionResponse?) -> Swift.Void, failure: @escaping (Swift.String) -> Swift.Void)
+ @objc dynamic public func downloadUpdateForVersion(_ versionInfo: PlaudDeviceBasicSDK.LatestVersionResponse, progress: @escaping (Swift.Float) -> Swift.Void, success: @escaping (Swift.String) -> Swift.Void, failure: @escaping (Swift.String) -> Swift.Void)
+}
+@objc public class PlaudEncryptHeader : ObjectiveC.NSObject {
+ @objc public static let headerSize: Swift.Int
+ @objc public static let magicString: Swift.String
+ @objc final public let magic: Foundation.Data
+ @objc final public let version: Swift.UInt16
+ @objc final public let headerSizeValue: Swift.UInt16
+ @objc final public let crc: Swift.UInt32
+ @objc final public let userId: Foundation.Data
+ @objc final public let fileType: Swift.UInt16
+ @objc final public let channel: Swift.UInt16
+ @objc final public let encryptType: Swift.UInt16
+ @objc final public let duration: Swift.UInt32
+ @objc final public let reserved: Foundation.Data
+ @objc final public let counter: Swift.UInt32
+ @objc final public let nonce: Foundation.Data
+ @objc final public let segment: Swift.UInt32
+ @objc final public let algParams: Foundation.Data
+ @objc final public let keyCipher: Foundation.Data
+ @objc public init?(data: Foundation.Data)
+ @objc public static func fromFile(path: Swift.String) -> PlaudDeviceBasicSDK.PlaudEncryptHeader?
+ @objc public var isEncrypted: Swift.Bool {
+ @objc get
+ }
+ @objc public var userIdString: Swift.String {
+ @objc get
+ }
+ @objc override dynamic public var description: Swift.String {
+ @objc get
+ }
+ @objc deinit
+}
+@_inheritsConvenienceInitializers @_hasMissingDesignatedInitializers @objc public class PlaudLogConfig : ObjectiveC.NSObject {
+ @objc public static let shared: PlaudDeviceBasicSDK.PlaudLogConfig
+ @objc public var maxFileCount: Swift.Int {
+ get
+ }
+ @objc public var maxFileAge: Swift.Double {
+ get
+ }
+ @objc public var maxFileSize: Swift.Int64 {
+ get
+ }
+ @objc public var uploadInterval: Foundation.TimeInterval {
+ get
+ }
+ @objc public var uploadTimeout: Swift.Double {
+ get
+ }
+ @objc public func updateFileConfiguration(maxFileCount: Swift.Int = 10, maxFileAge: Foundation.TimeInterval = 7 * 24 * 60 * 60, maxFileSize: Swift.Int64 = 10 * 1024 * 1024)
+ @objc public func updateUploadConfiguration(uploadInterval: Foundation.TimeInterval = {
+ return 300
+ }(), uploadTimeout: Foundation.TimeInterval = 30)
+ @objc public func resetToDefaults()
+ @objc public func getCurrentConfiguration() -> [Swift.String : Any]
+ @objc public var maxFileAgeDays: Swift.Int {
+ @objc get
+ }
+ @objc public var maxFileSizeMB: Swift.Int {
+ @objc get
+ }
+ @objc public var uploadIntervalMinutes: Swift.Int {
+ @objc get
+ }
+ @objc public var uploadTimeoutSeconds: Swift.Int {
+ @objc get
+ }
+ @objc deinit
+}
+extension Foundation.NSNotification.Name {
+ public static let plaudLogConfigurationChanged: Foundation.NSNotification.Name
+}
+extension PlaudDeviceBasicSDK.PlaudLogConfig {
+ @objc dynamic public func validateConfiguration() -> Swift.Bool
+ @objc dynamic public func getConfigurationDescription() -> Swift.String
+}
+@_inheritsConvenienceInitializers @_hasMissingDesignatedInitializers @objc public class PlaudLogFileRotationManager : ObjectiveC.NSObject {
+ @objc public static let shared: PlaudDeviceBasicSDK.PlaudLogFileRotationManager
+ @objc public func forceRotateCurrentLogFile()
+ @objc public func checkAndRotateIfNeeded(filePath: Swift.String, additionalSize: Swift.Int64) -> Swift.Bool
+ @objc public func getCurrentLogFilePath() -> Swift.String
+ @objc public func notifyUploadCompleted()
+ @objc deinit
+}
+@objc public protocol PlaudWiFiAgentProtocol {
+ @objc optional func wifiCommonErr(_ cmd: Swift.Int, _ status: Swift.Int)
+ @objc optional func wifiHandshake(_ status: Swift.Int)
+ @objc optional func wifiConnectionStatus(_ ssid: Swift.String, _ connected: Swift.Bool)
+ @objc optional func wifiPower(_ power: Swift.Int, _ voltage: Swift.Int)
+ @objc optional func wifiFileListFail(_ status: Swift.Int)
+ @objc optional func wifiFileList(_ files: [PlaudBleSDK.BleFile])
+ @objc optional func wifiSyncFile(_ sessionId: Swift.Int, _ status: Swift.Int)
+ @objc optional func wifiSyncFileData(_ sessionId: Swift.Int, _ offset: Swift.Int, _ count: Swift.Int, _ binData: Foundation.Data)
+ @objc optional func wifiDataComplete()
+ @objc optional func wifiSyncFileStop(_ status: Swift.Int)
+ @objc optional func wifiFileDelete(_ sessionId: Swift.Int, _ status: Swift.Int)
+ @objc optional func wifiClientFail()
+ @objc optional func wifiClose(_ status: Swift.Int)
+ @objc optional func wifiRateFail(_ status: Swift.Int)
+ @objc optional func wifiRate(_ instantRate: Swift.Int, _ averageRate: Swift.Int, _ lossRate: Swift.Double)
+ @objc optional func wifiLogsFail(_ status: Swift.Int)
+ @objc optional func wifiLogs(_ logData: Foundation.Data?)
+ @objc optional func wifiTips(_ tips: Swift.Int)
+ @objc optional func wifiDownloadAllProgress(_ totalFiles: Swift.Int, _ currentFileIndex: Swift.Int, _ currentFile: PlaudBleSDK.BleFile?, _ totalProgress: Swift.Double)
+ @objc optional func wifiDownloadAllCompleted(_ completedFiles: Swift.Int, _ failedFiles: Swift.Int)
+}
+@_inheritsConvenienceInitializers @_hasMissingDesignatedInitializers @objc public class PlaudWiFiAgent : ObjectiveC.NSObject {
+ @objc public static let shared: PlaudDeviceBasicSDK.PlaudWiFiAgent
+ @objc weak public var delegate: (any PlaudDeviceBasicSDK.PlaudWiFiAgentProtocol)? {
+ @objc get
+ @objc set
+ }
+ @objc public var bleDevice: PlaudBleSDK.BleDevice? {
+ @objc get
+ @objc set
+ }
+ @objc public var isDownloading: Swift.Bool {
+ @objc get
+ }
+ @objc public var currentSessionId: Swift.Int {
+ @objc get
+ }
+ @objc public var isConnected: Swift.Bool {
+ @objc get
+ }
+ @objc public var currentDownloadSpeedKBps: Swift.Double {
+ @objc get
+ }
+ @objc public func getFormattedDownloadSpeed() -> Swift.String
+ @objc public var isDownloadingAll: Swift.Bool {
+ get
+ }
+ @objc public func openLog(_ opened: Swift.Bool, _ backBlock: ((Swift.String) -> Swift.Void)? = nil)
+ @objc public func listenPort(_ ssid: Swift.String, _ overtimeSec: Swift.Int = 30)
+ @available(iOS 11.0, *)
+ @objc public func connectWifi(_ ssid: Swift.String, _ passphrase: Swift.String, _ overtimeSec: Swift.Int = 60)
+ @objc public func disconnect()
+ @objc public func isConnectedTo(_ ssid: Swift.String) -> Swift.Bool
+ @objc public func getConnectionStatusDescription() -> Swift.String
+ @objc public func getCurrentWiFiName() -> Swift.String?
+ @objc public func getFileList(_ uid: Swift.Int, _ sessionId: Swift.Int, _ single: Swift.Bool = false)
+ @objc public func syncFile(_ sessionId: Swift.Int, _ start: Swift.Int, _ end: Swift.Int = 0, _ scene: Swift.Int = 1)
+ @objc public func stopSyncFile(_ sessionId: Swift.Int, _ scene: Swift.Int = 1)
+ @objc public func deleteFile(_ sessionId: Swift.Int, _ scene: Swift.Int = 1)
+ public func exportAudioViaWiFi(sessionId: Swift.Int, outputDir: Swift.String, format: PlaudDeviceBasicSDK.AudioExportFormat, channels: Swift.Int = 1, callback: any PlaudDeviceBasicSDK.AudioExportCallback)
+ @objc public func startDownloadAll()
+ @objc public func stopDownloadAll()
+ @objc public func startRateTest(_ onOff: Swift.Bool, _ packSize: Swift.Int)
+ @objc public func getDeviceLogs(_ begin: Swift.Bool)
+ @objc public func isWebSocketConnected() -> Swift.Bool
+ @objc deinit
+}
+extension PlaudDeviceBasicSDK.PlaudWiFiAgent : PlaudWiFiSDK.WiFiAgentProtocol {
+ @objc dynamic public func wifiCommonErr(_ cmd: Swift.Int, _ status: Swift.Int)
+ @objc dynamic public func wifiHandshake(_ status: Swift.Int)
+ public func wifiConnectionStatus(_ ssid: Swift.String, _ connected: Swift.Bool)
+ @objc dynamic public func wifiPower(_ power: Swift.Int, _ voltage: Swift.Int)
+ @objc dynamic public func wifiFileListFail(_ status: Swift.Int)
+ @objc dynamic public func wifiFileList(_ files: [PlaudBleSDK.BleFile])
+ @objc dynamic public func wifiSyncFile(_ sessionId: Swift.Int, _ status: Swift.Int)
+ @objc dynamic public func wifiSyncFileData(_ sessionId: Swift.Int, _ offset: Swift.Int, _ count: Swift.Int, _ binData: Foundation.Data)
+ @objc dynamic public func wifiDataComplete()
+ @objc dynamic public func wifiSyncFileStop(_ status: Swift.Int)
+ @objc dynamic public func wifiFileDelete(_ sessionId: Swift.Int, _ status: Swift.Int)
+ @objc dynamic public func wifiClientFail()
+ @objc dynamic public func wifiClose(_ status: Swift.Int)
+ @objc dynamic public func wifiRateFail(_ status: Swift.Int)
+ @objc dynamic public func wifiRate(_ instantRate: Swift.Int, _ averageRate: Swift.Int, _ lossRate: Swift.Double)
+ @objc dynamic public func wifiLogsFail(_ status: Swift.Int)
+ @objc dynamic public func wifiLogs(_ logData: Foundation.Data?)
+ @objc dynamic public func wifiTips(_ tips: Swift.Int)
+ @objc dynamic public func penRequestOTAData(start: Swift.Int, end: Swift.Int, payloadSize: Swift.Int, uid: Swift.Int, sendRatePPS: Swift.Int)
+ @objc dynamic public func wifiOTAStatus(_ status: Swift.Int, _ uid: Swift.Int)
+}
+@_hasMissingDesignatedInitializers public class RSASecretConfig {
+ public static let defaultPublicKey: Swift.String
+ public static let defaultPrivateKey: Swift.String
+ public static func setKeys(publicKey: Swift.String, privateKey: Swift.String)
+ public static func getSnSignature(for sn: Swift.String) -> Swift.String?
+ public static func setSnSignature(_ signature: Swift.String, for sn: Swift.String)
+ public static func clearSnSignature(for sn: Swift.String)
+ public static func clearAllSnSignatures()
+ public static func clearKeys()
+ public static func getCurrentPublicKey() -> Swift.String
+ public static func getCurrentPrivateKey() -> Swift.String
+ public static func getPublicKey() throws -> PlaudBleSDK.PublicKey
+ public static func getPrivateKey() throws -> PlaudBleSDK.PrivateKey
+ public static func hasCustomKeys() -> Swift.Bool
+ @objc deinit
+}
+@_inheritsConvenienceInitializers @objc(PlaudLogEncryption) public class PlaudLogEncryption : ObjectiveC.NSObject {
+ @objc public static func exportEncryptedLogs() -> Foundation.NSURL?
+ @objc override dynamic public init()
+ @objc deinit
+}
+extension PlaudDeviceBasicSDK.Model : Swift.Equatable {}
+extension PlaudDeviceBasicSDK.Model : Swift.Hashable {}
+extension PlaudDeviceBasicSDK.Model : Swift.RawRepresentable {}
+extension PlaudDeviceBasicSDK.SoundCategory : Swift.Equatable {}
+extension PlaudDeviceBasicSDK.SoundCategory : Swift.Hashable {}
+extension PlaudDeviceBasicSDK.PlaudDomainManager.Region : Swift.Equatable {}
+extension PlaudDeviceBasicSDK.PlaudDomainManager.Region : Swift.Hashable {}
+extension PlaudDeviceBasicSDK.PlaudDomainManager.Region : Swift.RawRepresentable {}
+extension PlaudDeviceBasicSDK.PlaudLogUploadError : Swift.Equatable {}
+extension PlaudDeviceBasicSDK.PlaudLogUploadError : Swift.Hashable {}
+extension PlaudDeviceBasicSDK.PlaudLogUploadError : Swift.RawRepresentable {}
+extension PlaudDeviceBasicSDK.WorkflowStatus : Swift.Equatable {}
+extension PlaudDeviceBasicSDK.WorkflowStatus : Swift.Hashable {}
+extension PlaudDeviceBasicSDK.WorkflowStatus : Swift.RawRepresentable {}
+extension PlaudDeviceBasicSDK.WorkflowTaskType : Swift.Equatable {}
+extension PlaudDeviceBasicSDK.WorkflowTaskType : Swift.Hashable {}
+extension PlaudDeviceBasicSDK.WorkflowTaskType : Swift.RawRepresentable {}
+extension PlaudDeviceBasicSDK.AudioDecryptorError : Swift.Equatable {}
+extension PlaudDeviceBasicSDK.AudioDecryptorError : Swift.Hashable {}
+extension PlaudDeviceBasicSDK.AudioDecryptorError : Swift.RawRepresentable {}
+extension PlaudDeviceBasicSDK.ChaCha20Error : Swift.Equatable {}
+extension PlaudDeviceBasicSDK.ChaCha20Error : Swift.Hashable {}
+extension PlaudDeviceBasicSDK.PlaudDownloadFormat : Swift.Equatable {}
+extension PlaudDeviceBasicSDK.PlaudDownloadFormat : Swift.Hashable {}
+extension PlaudDeviceBasicSDK.PlaudDownloadFormat : Swift.RawRepresentable {}
+extension PlaudDeviceBasicSDK.AudioExportFormat : Swift.Equatable {}
+extension PlaudDeviceBasicSDK.AudioExportFormat : Swift.Hashable {}
+extension PlaudDeviceBasicSDK.AudioExportFormat : Swift.RawRepresentable {}
+extension PlaudDeviceBasicSDK.EncryptionError : Swift.Equatable {}
+extension PlaudDeviceBasicSDK.EncryptionError : Swift.Hashable {}
+extension PlaudDeviceBasicSDK.EncryptionError : Swift.RawRepresentable {}
+extension PlaudDeviceBasicSDK.PlaudFirmwarePhase : Swift.Equatable {}
+extension PlaudDeviceBasicSDK.PlaudFirmwarePhase : Swift.Hashable {}
+extension PlaudDeviceBasicSDK.PlaudFirmwarePhase : Swift.RawRepresentable {}
diff --git a/modules/plaud-sdk/ios/Frameworks/PlaudDeviceBasicSDK.xcframework/ios-arm64/PlaudDeviceBasicSDK.framework/Modules/module.modulemap b/modules/plaud-sdk/ios/Frameworks/PlaudDeviceBasicSDK.xcframework/ios-arm64/PlaudDeviceBasicSDK.framework/Modules/module.modulemap
new file mode 100644
index 0000000..e96fcbc
--- /dev/null
+++ b/modules/plaud-sdk/ios/Frameworks/PlaudDeviceBasicSDK.xcframework/ios-arm64/PlaudDeviceBasicSDK.framework/Modules/module.modulemap
@@ -0,0 +1,11 @@
+framework module PlaudDeviceBasicSDK {
+ umbrella header "PlaudDeviceBasicSDK.h"
+ export *
+
+ module * { export * }
+}
+
+module PlaudDeviceBasicSDK.Swift {
+ header "PlaudDeviceBasicSDK-Swift.h"
+ requires objc
+}
diff --git a/modules/plaud-sdk/ios/Frameworks/PlaudDeviceBasicSDK.xcframework/ios-arm64/PlaudDeviceBasicSDK.framework/PlaudDeviceBasicSDK b/modules/plaud-sdk/ios/Frameworks/PlaudDeviceBasicSDK.xcframework/ios-arm64/PlaudDeviceBasicSDK.framework/PlaudDeviceBasicSDK
new file mode 100644
index 0000000..d83920e
Binary files /dev/null and b/modules/plaud-sdk/ios/Frameworks/PlaudDeviceBasicSDK.xcframework/ios-arm64/PlaudDeviceBasicSDK.framework/PlaudDeviceBasicSDK differ
diff --git a/modules/plaud-sdk/ios/Frameworks/PlaudDeviceBasicSDK.xcframework/ios-arm64/PlaudDeviceBasicSDK.framework/PlaudDeviceBasicSDK.bundle/Info.plist b/modules/plaud-sdk/ios/Frameworks/PlaudDeviceBasicSDK.xcframework/ios-arm64/PlaudDeviceBasicSDK.framework/PlaudDeviceBasicSDK.bundle/Info.plist
new file mode 100644
index 0000000..08cb0fb
--- /dev/null
+++ b/modules/plaud-sdk/ios/Frameworks/PlaudDeviceBasicSDK.xcframework/ios-arm64/PlaudDeviceBasicSDK.framework/PlaudDeviceBasicSDK.bundle/Info.plist
@@ -0,0 +1,29 @@
+
+
+
+
+ CFBundleDevelopmentRegion
+ en
+ CFBundleIdentifier
+ com.plaud.PlaudDeviceBasicSDK
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ PlaudDeviceBasicSDK
+ CFBundlePackageType
+ BNDL
+ CFBundleShortVersionString
+ 1.0
+ CFBundleVersion
+ 1
+ CFBundleSupportedPlatforms
+
+ iPhoneOS
+
+ CFBundleLocalizations
+
+ en
+ zh-Hans
+
+
+
diff --git a/modules/plaud-sdk/ios/Frameworks/PlaudDeviceBasicSDK.xcframework/ios-arm64/PlaudDeviceBasicSDK.framework/PlaudDeviceBasicSDK.bundle/en.lproj/Localizable.strings b/modules/plaud-sdk/ios/Frameworks/PlaudDeviceBasicSDK.xcframework/ios-arm64/PlaudDeviceBasicSDK.framework/PlaudDeviceBasicSDK.bundle/en.lproj/Localizable.strings
new file mode 100644
index 0000000..8ff533c
--- /dev/null
+++ b/modules/plaud-sdk/ios/Frameworks/PlaudDeviceBasicSDK.xcframework/ios-arm64/PlaudDeviceBasicSDK.framework/PlaudDeviceBasicSDK.bundle/en.lproj/Localizable.strings
@@ -0,0 +1,149 @@
+// Common
+"ok" = "OK";
+"cancel" = "Cancel";
+"confirm" = "Confirm";
+"error" = "Error";
+
+// Permission
+"permission_init_failed" = "SDK permission initialization failed, please contact developer platform";
+"permission_denied" = "No permission for this feature, please contact developer platform";
+
+// Print
+"print_error" = "Print Error";
+"print_success" = "Print Success";
+"print_cancelled" = "Print Cancelled";
+"print_test_framework" = "Testing Static Library --framework";
+
+// SDK Resource
+"sdk_resource_init_failed" = "Resource initialization failed. Please check if the Host App has correctly added PlaudDeviceBasicSDK.bundle";
+
+// Binary File
+"binary_file_empty" = "Binary file data is empty";
+"binary_data_not_available" = "Error: Binary data is not available";
+"invalid_package_offset_size" = "Error: Invalid package offset or size";
+"binary_file_transfer_complete" = "transfer binary file complete";
+"binary_file_transfer_succeed" = "transfer binary file succeed";
+
+
+// Device Scanning and Connection
+"scan_device" = "Scan Device";
+"refresh" = "Refresh";
+"connect" = "Connect";
+"signal_strength_format" = "Signal Strength: %ld dBm";
+"sn_format" = "SN: %@";
+"status_unbound" = "Status: Unbound";
+"status_bound" = "Status: Bound";
+"device_connecting" = "Device Connecting";
+"device_disconnected" = "Device Disconnected";
+"device_connect_failed" = "Device Connection Failed";
+"device_connect_unknown" = "Unknown Connection Status";
+"device_already_bound" = "Device is already bound, cannot bind to a new device";
+
+// WiFi Settings
+"wifi_setup" = "Wi-Fi Setup";
+"wifi_24g_only" = "Only supports 2.4GHz networks";
+"wifi_name" = "Name";
+"wifi_password" = "Password";
+"wifi_name_placeholder" = "Enter Wi-Fi name";
+"wifi_password_placeholder" = "Enter Wi-Fi password";
+"wifi_test_connection" = "Test Connection";
+"wifi_connected" = "Connected";
+"wifi_connecting" = "Connecting, please wait...";
+"wifi_forget" = "Ignore Network";
+"wifi_edit" = "Edit";
+"wifi_done" = "Done";
+"wifi_alert_title" = "Notice";
+"wifi_alert_input_required" = "Please enter both Wi-Fi name and password";
+"wifi_alert_connection_success" = "Connection Success";
+"wifi_alert_connection_success_message" = "Wi-Fi connection test successful";
+"wifi_alert_connection_failed" = "Connection Failed";
+"wifi_alert_forget_title" = "Ignore Network";
+"wifi_alert_forget_message" = "Are you sure you want to forget this Wi-Fi network?";
+"wifi_alert_forget_confirm" = "Forget";
+
+// WiFi Setting Page
+"wifi_cloud_title" = "Wi-Fi Cloud Sync";
+"wifi_cloud_desc" = "NotePin will automatically connect to your configured Wi-Fi networks to upload recordings to the cloud. You can add multiple networks (e.g., home, work). Only 2.4GHz networks are supported.";
+"wifi_cloud_switch" = "Wi-Fi Cloud Sync";
+"wifi_cloud_set_address" = "Set Sync Address";
+"wifi_cloud_info" = "Private Cloud Sync is Plaud.AI's dedicated private cloud space for each user, ensuring secure data backup and preventing loss.";
+"wifi_configure" = "Configure Wi-Fi";
+"wifi_network_list" = "Network List";
+"wifi_other" = "Other...";
+"wifi_set_address_title" = "Set Sync Address";
+"wifi_set_address_message" = "Please enter server address";
+"wifi_test_timeout" = "Timeout Error";
+"wifi_test_not_found" = "Connection failed: Wi-Fi not found";
+"wifi_test_wrong_password" = "Connection failed: Wrong Wi-Fi password";
+"wifi_test_failed" = "Wi-Fi connection failed";
+"wifi_test_data_failed" = "Connection failed: Data transfer error";
+"wifi_add_limit_title" = "Add Failed";
+"wifi_add_limit_message" = "Maximum 5 Wi-Fi networks allowed. Please delete one first";
+
+// Audio Player
+"audio_player_title" = "Audio Player";
+"audio_status_ready" = "Ready to Play";
+"audio_status_playing" = "Playing...";
+"audio_status_paused" = "Paused";
+"audio_status_finished" = "Finished";
+"audio_status_complete" = "Playback Complete";
+"audio_status_error" = "Playback Error";
+"audio_load_failed_format" = "Audio Load Failed: %@";
+"audio_decode_error_format" = "Decode Error: %@";
+"audio_unknown_error" = "Unknown Error";
+
+// WiFi Test
+"wifi_test_timeout" = "Timeout Error";
+
+// File Download
+"file_downloading" = "Stream file downloading in progress";
+"file_transcoding" = "Transcoding...";
+"file_download_complete" = "Download file complete";
+"file_transcode_error" = "Transcoding error";
+"file_transcode_error_no_permission" = "Transcoding error, no permission";
+
+
+// Workflow Status
+"pending" = "Pending";
+"running" = "Running";
+"progress" = "In Progress";
+"success" = "Success";
+"failure" = "Failed";
+"cancelled" = "Cancelled";
+"timeout" = "Timeout";
+
+// Workflow Task Types
+"ai_etl" = "AI ETL";
+"audio_merge" = "Audio Merge";
+"custom" = "Custom";
+"unknown" = "Unknown";
+"audio_transcribe" = "Audio Transcription";
+"ai_summarize" = "AI Summary";
+
+// Workflow Errors
+"invalid_url" = "Invalid URL";
+"network_error" = "Network Error";
+"invalid_response" = "Invalid Response";
+"server_error" = "Server Error";
+"workflow_not_found" = "Workflow Not Found";
+"workflow_failed" = "Workflow Failed";
+"no_api_token" = "No API Token";
+
+// Update Manager
+"update.message.no_update_available" = "No update available";
+"update.message.user_cancelled" = "Update cancelled by user";
+"update.error.network" = "Network error: %@";
+"update.error.invalid_response" = "Invalid response from server";
+"update.error.download_failed" = "Download failed: %@";
+"update.error.file_system" = "File system error: %@";
+"update.error.no_update_available" = "No update available";
+"update.error.user_cancelled" = "Update cancelled by user";
+"update.error.unknown" = "Unknown error occurred";
+
+// Update Alerts
+"update.alert.title.force" = "Force Update";
+"update.alert.title.new_version" = "New Version Available";
+"update.alert.new_version" = "New Version: %@";
+"update.alert.ask_to_download" = "Download and install now?";
+"update.alert.action.remind_later" = "Remind Me Later";
+"update.alert.action.update_now" = "Update Now";
diff --git a/modules/plaud-sdk/ios/Frameworks/PlaudDeviceBasicSDK.xcframework/ios-arm64/PlaudDeviceBasicSDK.framework/PlaudDeviceBasicSDK.bundle/zh-Hans.lproj/Localizable.strings b/modules/plaud-sdk/ios/Frameworks/PlaudDeviceBasicSDK.xcframework/ios-arm64/PlaudDeviceBasicSDK.framework/PlaudDeviceBasicSDK.bundle/zh-Hans.lproj/Localizable.strings
new file mode 100644
index 0000000..3555871
--- /dev/null
+++ b/modules/plaud-sdk/ios/Frameworks/PlaudDeviceBasicSDK.xcframework/ios-arm64/PlaudDeviceBasicSDK.framework/PlaudDeviceBasicSDK.bundle/zh-Hans.lproj/Localizable.strings
@@ -0,0 +1,150 @@
+// Common
+"ok" = "确定";
+"cancel" = "取消";
+"confirm" = "确认";
+"error" = "错误";
+
+// Permission
+"permission_init_failed" = "SDK权限初始化失败,请联系开发者平台";
+"permission_denied" = "该功能暂无权限,请联系开发者平台";
+
+// Print
+"print_error" = "打印错误";
+"print_success" = "打印成功";
+"print_cancelled" = "打印已取消";
+"print_test_framework" = "测试静态库 --framework";
+
+// SDK Resource
+"sdk_resource_init_failed" = "资源初始化失败,请检查Host App 是否正确添加PlaudDeviceBasicSDK.bundle";
+
+// Binary File
+"binary_file_empty" = "二进制文件数据为空";
+"binary_data_not_available" = "错误:二进制数据不可用";
+"invalid_package_offset_size" = "错误:无效的数据包偏移量或大小";
+"binary_file_transfer_complete" = "二进制文件传输完成";
+"binary_file_transfer_succeed" = "二进制文件传输成功";
+
+
+
+// Device Scanning and Connection
+"scan_device" = "扫描设备";
+"refresh" = "刷新";
+"connect" = "连接";
+"signal_strength_format" = "信号强度: %ld dBm";
+"sn_format" = "SN: %@";
+"status_unbound" = "状态: 未绑定";
+"status_bound" = "状态: 已绑定";
+"device_connecting" = "设备连接中";
+"device_disconnected" = "设备未连接";
+"device_connect_failed" = "设备连接失败";
+"device_connect_unknown" = "未知连接状态";
+"device_already_bound" = "设备已绑定,不能绑定到新的设备";
+
+// WiFi Settings
+"wifi_setup" = "设置 Wi-Fi";
+"wifi_24g_only" = "仅支持 2.4GHz 网络";
+"wifi_name" = "名称";
+"wifi_password" = "密码";
+"wifi_name_placeholder" = "请输入Wi-Fi名称";
+"wifi_password_placeholder" = "请输入Wi-Fi密码";
+"wifi_test_connection" = "测试连接";
+"wifi_connected" = "已连接";
+"wifi_connecting" = "连接中,请稍候...";
+"wifi_forget" = "忘记此网络";
+"wifi_edit" = "编辑";
+"wifi_done" = "完成";
+"wifi_alert_title" = "提示";
+"wifi_alert_input_required" = "请输入完整的WiFi名称和密码";
+"wifi_alert_connection_success" = "连接成功";
+"wifi_alert_connection_success_message" = "WiFi连接测试成功";
+"wifi_alert_connection_failed" = "连接失败";
+"wifi_alert_forget_title" = "忘记网络";
+"wifi_alert_forget_message" = "确定要忘记这个WiFi网络吗?";
+"wifi_alert_forget_confirm" = "忘记";
+
+// WiFi Setting Page
+"wifi_cloud_title" = "Wi-Fi上云";
+"wifi_cloud_desc" = "NotePin 会自动连接到你配置的 Wi-Fi 网络,将录音上传到云端。你可以添加多个常用网络(例如家里、工作)。目前仅支持 2.4GHz 网络。";
+"wifi_cloud_switch" = "Wi-Fi上云";
+"wifi_cloud_set_address" = "设置地址";
+"wifi_cloud_info" = "Private Cloud Sync 是 Plaud.AI 为每位用户提供的独立私有云空间,用于安全备份数据并防止丢失。";
+"wifi_configure" = "配置 Wi-Fi";
+"wifi_network_list" = "网络列表";
+"wifi_other" = "其他...";
+"wifi_set_address_title" = "设置上传地址";
+"wifi_set_address_message" = "请输入服务器地址";
+"wifi_test_timeout" = "超时错误";
+"wifi_test_not_found" = "连接失败,未找到wifi";
+"wifi_test_wrong_password" = "连接失败,Wifi密码不正确";
+"wifi_test_failed" = "Wifi连接失败";
+"wifi_test_data_failed" = "连接失败,数据传输失败";
+"wifi_add_limit_title" = "添加失败";
+"wifi_add_limit_message" = "最多能配置 5 个 Wi-Fi,请先删除";
+
+// Audio Player
+"audio_player_title" = "音频播放";
+"audio_status_ready" = "准备播放";
+"audio_status_playing" = "播放中...";
+"audio_status_paused" = "已暂停";
+"audio_status_finished" = "已结束";
+"audio_status_complete" = "播放完成";
+"audio_status_error" = "播放出错";
+"audio_load_failed_format" = "音频加载失败: %@";
+"audio_decode_error_format" = "解码错误: %@";
+"audio_unknown_error" = "未知错误";
+
+// WiFi Test
+"wifi_test_timeout" = "超时错误";
+
+// File Download
+"file_downloading" = "流式文件下载中";
+"file_transcoding" = "转码中...";
+"file_download_complete" = "下载并转码完成";
+"file_transcode_error" = "转码错误";
+"file_transcode_error_no_permission" = "转码错误, 无权限";
+
+// Workflow Status
+"success" = "成功";
+"failure" = "失败";
+"cancelled" = "已取消";
+"timeout" = "超时";
+"pending" = "等待中";
+"running" = "运行中";
+"progress" = "进行中";
+
+
+// Workflow Task Types
+"audio_transcribe" = "音频转写";
+"ai_summarize" = "AI总结";
+"ai_etl" = "AI ETL";
+"audio_merge" = "音频合并";
+"custom" = "自定义";
+"unknown" = "未知";
+
+// Workflow Errors
+"invalid_url" = "无效URL";
+"network_error" = "网络错误";
+"invalid_response" = "无效响应";
+"server_error" = "服务器错误";
+"workflow_not_found" = "工作流未找到";
+"workflow_failed" = "工作流失败";
+"no_api_token" = "无API令牌";
+
+// Update Manager
+"update.message.no_update_available" = "暂无可用更新";
+"update.message.user_cancelled" = "用户已取消更新";
+"update.error.network" = "网络错误:%@";
+"update.error.invalid_response" = "服务器响应无效";
+"update.error.download_failed" = "下载失败:%@";
+"update.error.file_system" = "文件系统错误:%@";
+"update.error.no_update_available" = "暂无可用更新";
+"update.error.user_cancelled" = "用户已取消更新";
+"update.error.unknown" = "发生未知错误";
+
+// Update Alerts
+"update.alert.title.force" = "强制更新";
+"update.alert.title.new_version" = "发现新版本";
+"update.alert.new_version" = "新版本: %@";
+"update.alert.ask_to_download" = "是否立即下载更新?";
+"update.alert.action.remind_later" = "稍后提醒";
+"update.alert.action.update_now" = "立即更新";
diff --git a/modules/plaud-sdk/ios/Frameworks/PlaudDeviceBasicSDK.xcframework/ios-arm64/PlaudDeviceBasicSDK.framework/_CodeSignature/CodeDirectory b/modules/plaud-sdk/ios/Frameworks/PlaudDeviceBasicSDK.xcframework/ios-arm64/PlaudDeviceBasicSDK.framework/_CodeSignature/CodeDirectory
new file mode 100644
index 0000000..c113f71
Binary files /dev/null and b/modules/plaud-sdk/ios/Frameworks/PlaudDeviceBasicSDK.xcframework/ios-arm64/PlaudDeviceBasicSDK.framework/_CodeSignature/CodeDirectory differ
diff --git a/modules/plaud-sdk/ios/Frameworks/PlaudDeviceBasicSDK.xcframework/ios-arm64/PlaudDeviceBasicSDK.framework/_CodeSignature/CodeRequirements b/modules/plaud-sdk/ios/Frameworks/PlaudDeviceBasicSDK.xcframework/ios-arm64/PlaudDeviceBasicSDK.framework/_CodeSignature/CodeRequirements
new file mode 100644
index 0000000..648997d
Binary files /dev/null and b/modules/plaud-sdk/ios/Frameworks/PlaudDeviceBasicSDK.xcframework/ios-arm64/PlaudDeviceBasicSDK.framework/_CodeSignature/CodeRequirements differ
diff --git a/modules/plaud-sdk/ios/Frameworks/PlaudDeviceBasicSDK.xcframework/ios-arm64/PlaudDeviceBasicSDK.framework/_CodeSignature/CodeRequirements-1 b/modules/plaud-sdk/ios/Frameworks/PlaudDeviceBasicSDK.xcframework/ios-arm64/PlaudDeviceBasicSDK.framework/_CodeSignature/CodeRequirements-1
new file mode 100644
index 0000000..2522204
Binary files /dev/null and b/modules/plaud-sdk/ios/Frameworks/PlaudDeviceBasicSDK.xcframework/ios-arm64/PlaudDeviceBasicSDK.framework/_CodeSignature/CodeRequirements-1 differ
diff --git a/modules/plaud-sdk/ios/Frameworks/PlaudDeviceBasicSDK.xcframework/ios-arm64/PlaudDeviceBasicSDK.framework/_CodeSignature/CodeResources b/modules/plaud-sdk/ios/Frameworks/PlaudDeviceBasicSDK.xcframework/ios-arm64/PlaudDeviceBasicSDK.framework/_CodeSignature/CodeResources
new file mode 100644
index 0000000..962ac82
--- /dev/null
+++ b/modules/plaud-sdk/ios/Frameworks/PlaudDeviceBasicSDK.xcframework/ios-arm64/PlaudDeviceBasicSDK.framework/_CodeSignature/CodeResources
@@ -0,0 +1,341 @@
+
+
+
+
+ files
+
+ Headers/PlaudDeviceBasicSDK-Swift.h
+
+ MyJZKC2Dxib20/XKyIURHoNxxr8=
+
+ Headers/PlaudDeviceBasicSDK.h
+
+ +3ARYwQKIi29DkheSViaejyPmH8=
+
+ Headers/PlaudLogRedirect.h
+
+ ckzEvXu6/1FI10b3oKL0zXEbS3A=
+
+ Headers/PrintManager.h
+
+ VT4L7jLk+wVGCEFGnF3JweGFM/Q=
+
+ Info.plist
+
+ X47w1KADRTseISgGpC3sEPLhiIM=
+
+ Modules/PlaudDeviceBasicSDK.swiftmodule/Project/arm64-apple-ios.swiftsourceinfo
+
+ rrnDB/HVPhr5QyYyy+Z6g97p0+A=
+
+ Modules/PlaudDeviceBasicSDK.swiftmodule/arm64-apple-ios.abi.json
+
+ AHKGNG17Br/tVF9A4Ou7mYQDNJ8=
+
+ Modules/PlaudDeviceBasicSDK.swiftmodule/arm64-apple-ios.private.swiftinterface
+
+ R1g7NA8TG68Cqt0xoJxW+SNkh4w=
+
+ Modules/PlaudDeviceBasicSDK.swiftmodule/arm64-apple-ios.swiftdoc
+
+ 11egdFo9RVS5Oclw3eOWENsxw6Y=
+
+ Modules/PlaudDeviceBasicSDK.swiftmodule/arm64-apple-ios.swiftinterface
+
+ R1g7NA8TG68Cqt0xoJxW+SNkh4w=
+
+ Modules/PlaudDeviceBasicSDK.swiftmodule/arm64-apple-ios.swiftmodule
+
+ ekU8jiThottTBjZAu9F2raMlfMM=
+
+ Modules/module.modulemap
+
+ ZJvUCCKKCV47/yuYtJPmSszr5KY=
+
+ PlaudDeviceBasicSDK.bundle/Info.plist
+
+ 5y3sypvdnO7MC5O2E9hFiqbrO0M=
+
+ PlaudDeviceBasicSDK.bundle/en.lproj/Localizable.strings
+
+ hash
+
+ wMAmf73xxnfRA5adBiJcjpHv0WA=
+
+ optional
+
+
+ PlaudDeviceBasicSDK.bundle/zh-Hans.lproj/Localizable.strings
+
+ hash
+
+ bApgxzM1OZkEyoSVAZ2qq04LOmA=
+
+ optional
+
+
+ plaud_ai_data.txt
+
+ ka+Py3CnSLpccrtN1aFwvFtl5Ec=
+
+
+ files2
+
+ Headers/PlaudDeviceBasicSDK-Swift.h
+
+ hash
+
+ MyJZKC2Dxib20/XKyIURHoNxxr8=
+
+ hash2
+
+ bcX/LnCiK9CyTGbgc2fe7B5xuAnUINuGvyAwkkNUM4U=
+
+
+ Headers/PlaudDeviceBasicSDK.h
+
+ hash
+
+ +3ARYwQKIi29DkheSViaejyPmH8=
+
+ hash2
+
+ /amvzBOtoprFzLs7cx1e3UWBQwXSttj2LKk6+wb8V0w=
+
+
+ Headers/PlaudLogRedirect.h
+
+ hash
+
+ ckzEvXu6/1FI10b3oKL0zXEbS3A=
+
+ hash2
+
+ gV4LIMvMfvdE0gLWQJE10XDV9121caPYVua/f4DkZFk=
+
+
+ Headers/PrintManager.h
+
+ hash
+
+ VT4L7jLk+wVGCEFGnF3JweGFM/Q=
+
+ hash2
+
+ w0E7hV+SQJ54ZIY+IbgLShpQal6cv3lyub7tNy4/cyA=
+
+
+ Modules/PlaudDeviceBasicSDK.swiftmodule/Project/arm64-apple-ios.swiftsourceinfo
+
+ hash
+
+ rrnDB/HVPhr5QyYyy+Z6g97p0+A=
+
+ hash2
+
+ aWQuIUuSroGXrP9/gJ5VbrYzqHJwn7/jbSP7zigqplA=
+
+
+ Modules/PlaudDeviceBasicSDK.swiftmodule/arm64-apple-ios.abi.json
+
+ hash
+
+ AHKGNG17Br/tVF9A4Ou7mYQDNJ8=
+
+ hash2
+
+ a1IVjMjuqxf6azljtaV1vxXFPlEadlQ/7UiOtTOMYco=
+
+
+ Modules/PlaudDeviceBasicSDK.swiftmodule/arm64-apple-ios.private.swiftinterface
+
+ hash
+
+ R1g7NA8TG68Cqt0xoJxW+SNkh4w=
+
+ hash2
+
+ aCjNl4w08Tjfz0Pp8AWm0O8OK+YQP7iGgfHhIbakoPM=
+
+
+ Modules/PlaudDeviceBasicSDK.swiftmodule/arm64-apple-ios.swiftdoc
+
+ hash
+
+ 11egdFo9RVS5Oclw3eOWENsxw6Y=
+
+ hash2
+
+ 2+6SEbG9EJL2RD/1gfQfTdY+8UcC9mwp/bsB9hqpQTY=
+
+
+ Modules/PlaudDeviceBasicSDK.swiftmodule/arm64-apple-ios.swiftinterface
+
+ hash
+
+ R1g7NA8TG68Cqt0xoJxW+SNkh4w=
+
+ hash2
+
+ aCjNl4w08Tjfz0Pp8AWm0O8OK+YQP7iGgfHhIbakoPM=
+
+
+ Modules/PlaudDeviceBasicSDK.swiftmodule/arm64-apple-ios.swiftmodule
+
+ hash
+
+ ekU8jiThottTBjZAu9F2raMlfMM=
+
+ hash2
+
+ iXpqfO7mx1PxR3TxcTF7r0Sg8IG0rQM4+cp4s31eas0=
+
+
+ Modules/module.modulemap
+
+ hash
+
+ ZJvUCCKKCV47/yuYtJPmSszr5KY=
+
+ hash2
+
+ Yr6dni0J5v/6LMztrNMzGleM8nVoaWjnXZsHHJ9YPIo=
+
+
+ PlaudDeviceBasicSDK.bundle/Info.plist
+
+ hash
+
+ 5y3sypvdnO7MC5O2E9hFiqbrO0M=
+
+ hash2
+
+ FJBbA3UyOe5tSm5M+QJ9+ZfsgooQYcaTRaslCUfYoqM=
+
+
+ PlaudDeviceBasicSDK.bundle/en.lproj/Localizable.strings
+
+ hash
+
+ wMAmf73xxnfRA5adBiJcjpHv0WA=
+
+ hash2
+
+ G0pY2fvF/epULhD9i2hy6v22XRRrHv6rDd+w4uyIhoU=
+
+ optional
+
+
+ PlaudDeviceBasicSDK.bundle/zh-Hans.lproj/Localizable.strings
+
+ hash
+
+ bApgxzM1OZkEyoSVAZ2qq04LOmA=
+
+ hash2
+
+ 5jyMPl73wOz+N+XmsXCNY3Eeb+pdUXZS97EWu6kn75M=
+
+ optional
+
+
+ plaud_ai_data.txt
+
+ hash
+
+ ka+Py3CnSLpccrtN1aFwvFtl5Ec=
+
+ hash2
+
+ U2l4bAmm40GRd2I9mBcTaH7FRhI3h3CT31kan1c8D+8=
+
+
+
+ rules
+
+ ^.*
+
+ ^.*\.lproj/
+
+ optional
+
+ weight
+ 1000
+
+ ^.*\.lproj/locversion.plist$
+
+ omit
+
+ weight
+ 1100
+
+ ^Base\.lproj/
+
+ weight
+ 1010
+
+ ^version.plist$
+
+
+ rules2
+
+ .*\.dSYM($|/)
+
+ weight
+ 11
+
+ ^(.*/)?\.DS_Store$
+
+ omit
+
+ weight
+ 2000
+
+ ^.*
+
+ ^.*\.lproj/
+
+ optional
+
+ weight
+ 1000
+
+ ^.*\.lproj/locversion.plist$
+
+ omit
+
+ weight
+ 1100
+
+ ^Base\.lproj/
+
+ weight
+ 1010
+
+ ^Info\.plist$
+
+ omit
+
+ weight
+ 20
+
+ ^PkgInfo$
+
+ omit
+
+ weight
+ 20
+
+ ^embedded\.provisionprofile$
+
+ weight
+ 20
+
+ ^version\.plist$
+
+ weight
+ 20
+
+
+
+
diff --git a/modules/plaud-sdk/ios/Frameworks/PlaudDeviceBasicSDK.xcframework/ios-arm64/PlaudDeviceBasicSDK.framework/_CodeSignature/CodeSignature b/modules/plaud-sdk/ios/Frameworks/PlaudDeviceBasicSDK.xcframework/ios-arm64/PlaudDeviceBasicSDK.framework/_CodeSignature/CodeSignature
new file mode 100644
index 0000000..9e3f683
Binary files /dev/null and b/modules/plaud-sdk/ios/Frameworks/PlaudDeviceBasicSDK.xcframework/ios-arm64/PlaudDeviceBasicSDK.framework/_CodeSignature/CodeSignature differ
diff --git a/modules/plaud-sdk/ios/Frameworks/PlaudDeviceBasicSDK.xcframework/ios-arm64/PlaudDeviceBasicSDK.framework/plaud_ai_data.txt b/modules/plaud-sdk/ios/Frameworks/PlaudDeviceBasicSDK.xcframework/ios-arm64/PlaudDeviceBasicSDK.framework/plaud_ai_data.txt
new file mode 100644
index 0000000..044a960
--- /dev/null
+++ b/modules/plaud-sdk/ios/Frameworks/PlaudDeviceBasicSDK.xcframework/ios-arm64/PlaudDeviceBasicSDK.framework/plaud_ai_data.txt
@@ -0,0 +1,1702 @@
+
+
+type1:
+{
+ "status" : "SUCCESS",
+ "id" : "wf_01984467-041c-4ab2-97d4-1c39dac0c8d2",
+ "owner_id" : "test-001",
+ "metadata_json" : {
+
+ },
+ "tasks" : [
+ {
+ "task_type" : "audio_transcribe",
+ "status" : "SUCCESS",
+ "result" : {
+ "status" : 3,
+ "embeddings" : {
+ "Speaker 1" : [
+ -0.19234217703342438,
+ 0.15948718786239624,
+ -0.10121628642082214,
+ 0.09667099267244339,
+ -0.10816331207752228,
+ 0.14343123137950897,
+ -0.094416134059429169,
+ 0.14881746470928192,
+ -0.072478733956813812,
+ -0.088625960052013397,
+ -0.11696280539035797,
+ -0.17257097363471985,
+ 0.19466535747051239,
+ 0.27258849143981934,
+ -0.034721933305263519,
+ 0.26778826117515564,
+ 0.01423680130392313,
+ 0.16383779048919678,
+ 0.14811916649341583,
+ 0.1229625791311264,
+ -0.26089936494827271,
+ 0.048276558518409729,
+ -0.29667317867279053,
+ -0.059747211635112762,
+ 0.2219168096780777,
+ 0.0029855130705982447,
+ 0.074563905596733093,
+ 0.073401913046836853,
+ -0.067731454968452454,
+ 0.13082771003246307,
+ 0.26649996638298035,
+ -0.22226500511169434,
+ -0.071649461984634399,
+ 0.40993419289588928,
+ 0.09660310298204422,
+ 0.017572876065969467,
+ -0.01206977479159832,
+ -0.11588973551988602,
+ 0.18956200778484344,
+ -0.11792318522930145,
+ -0.07967609167098999,
+ -0.1645093709230423,
+ 0.01715848408639431,
+ 0.10080588608980179,
+ 0.027268635109066963,
+ 0.07046113908290863,
+ -0.013552744872868061,
+ -0.21095576882362366,
+ -0.086705341935157776,
+ 0.19767187535762787,
+ -0.16107642650604248,
+ -0.013121266849339008,
+ 0.042569279670715332,
+ -0.093373171985149384,
+ -0.20870651304721832,
+ -0.079430930316448212,
+ -0.10380082577466965,
+ 0.047178130596876144,
+ -0.071631968021392822,
+ 0.028615860268473625,
+ 0.14288191497325897,
+ -0.25993448495864868,
+ 0.17642973363399506,
+ 0.025652721524238586,
+ 0.1193835660815239,
+ 0.2705918550491333,
+ -0.26632535457611084,
+ 0.10181724280118942,
+ 0.12000474333763123,
+ 0.21866343915462494,
+ -0.014766930602490902,
+ -0.01777997799217701,
+ 0.13665838539600372,
+ -0.036518480628728867,
+ 0.24088461697101593,
+ 0.1331581175327301,
+ 0.24392800033092499,
+ -0.048006385564804077,
+ 0.14288094639778137,
+ -0.31120264530181885,
+ -0.19795562326908112,
+ 0.18933898210525513,
+ 0.051715798676013947,
+ 0.018272586166858673,
+ -0.10932342708110809,
+ -0.05836234986782074,
+ 0.18826363980770111,
+ -0.052310489118099213,
+ 0.10870229452848434,
+ -0.14970879256725311,
+ 0.065227203071117401,
+ -0.037733990699052811,
+ 0.087010063230991364,
+ 0.10531853139400482,
+ -0.0015284419059753418,
+ -0.1226126030087471,
+ 0.10196753591299057,
+ 0.13909898698329926,
+ -0.18919757008552551,
+ -0.026061775162816048,
+ 0.046619832515716553,
+ 0.061219368129968643,
+ 0.1937614232301712,
+ 0.23604753613471985,
+ 0.049536067992448807,
+ 0.10689438879489899,
+ -0.066332891583442688,
+ 0.20075637102127075,
+ 0.096797734498977661,
+ 0.10916589200496674,
+ -0.038406968116760254,
+ 0.10934307426214218,
+ -0.23431545495986938,
+ 0.37497475743293762,
+ -0.027763955295085907,
+ -0.099452003836631775,
+ 0.065108262002468109,
+ -0.13913810253143311,
+ -0.061214033514261246,
+ 0.020255215466022491,
+ 0.076258979737758636,
+ -0.28872641921043396,
+ -0.031529378145933151,
+ 0.028386011719703674,
+ 0.0015066558262333274,
+ 0.13335064053535461,
+ -0.18243856728076935,
+ 0.008845135569572449,
+ 0.014226892963051796,
+ -0.091008566319942474,
+ 0.15394964814186096,
+ 0.17845408618450165,
+ 0.13104711472988129,
+ -0.013807497918605804,
+ 0.20593200623989105,
+ -0.029723070561885834,
+ 0.11704555153846741,
+ 0.19933998584747314,
+ 0.093228578567504883,
+ 0.20425538718700409,
+ 0.035895369946956635,
+ -0.003707759315147996,
+ 0.011053327471017838,
+ -0.062130790203809738,
+ 0.092562086880207062,
+ -0.099022693932056427,
+ -0.15061657130718231,
+ 0.051656432449817657,
+ 0.24526003003120422,
+ -0.25799405574798584,
+ -0.004706541541963816,
+ 0.021352224051952362,
+ -0.14497277140617371,
+ -0.19192571938037872,
+ -0.14999799430370331,
+ 0.24017837643623352,
+ -0.18151266872882843,
+ 0.062906302511692047,
+ 0.18438664078712463,
+ 0.16227760910987854,
+ -0.045849699527025223,
+ -0.014836857095360756,
+ -0.10389851778745651,
+ 0.15956704318523407,
+ 0.047496210783720016,
+ -0.013092847540974617,
+ -0.089076630771160126,
+ -0.022118842229247093,
+ 0.21509920060634613,
+ 0.039225015789270401,
+ 0.073112688958644867,
+ 0.10146018862724304,
+ -0.11946260184049606,
+ -0.19580845534801483,
+ -0.16934537887573242,
+ -0.036426417529582977,
+ 0.044822379946708679,
+ 0.0066635315306484699,
+ -0.12034671008586884,
+ 0.033571489155292511,
+ -0.14462937414646149,
+ -0.081339575350284576,
+ 0.033895552158355713,
+ -0.02190169133245945,
+ 0.14421048760414124,
+ -0.063272669911384583,
+ -0.032736964523792267,
+ -0.14766211807727814,
+ 0.12916681170463562,
+ 0.075516536831855774,
+ -0.13715338706970215,
+ 0.10289894044399261,
+ -0.11953147500753403,
+ -0.25960412621498108,
+ -0.17824186384677887,
+
+ 0.065146192908287048,
+ 0.058506675064563751,
+ -0.060783509165048599,
+ 0.014332784339785576,
+ 0.024016814306378365,
+ -0.15361899137496948,
+ -0.17037390172481537,
+ 0.053834732621908188,
+ 0.068668335676193237,
+ 0.22225691378116608,
+ 0.055594194680452347,
+ 0.15268510580062866,
+ -0.087633624672889709,
+ -0.15043497085571289,
+ 0.33224472403526306,
+ -0.021008389070630074,
+ -0.052215460687875748,
+ 0.12713024020195007,
+ -0.24183684587478638,
+ 0.12800848484039307,
+ 0.007440058048814535,
+ -0.18693780899047852,
+ -0.062327243387699127,
+ 0.20647658407688141,
+ -0.39140555262565613,
+ 0.11960991472005844,
+ 0.089925825595855713,
+ -0.04516398161649704,
+ -0.37922877073287964,
+ -0.16119140386581421,
+ -0.061166856437921524,
+ -0.045589271932840347,
+ -0.029988175258040428,
+ -0.20828233659267426,
+ -0.21009369194507599,
+ 0.12811474502086639,
+ 0.05009855329990387,
+ 0.18589450418949127,
+ 0.066524937748908997,
+ -0.3960881233215332,
+ 0.20921915769577026,
+ -0.1141706258058548,
+ -0.14732800424098969,
+ -0.31457120180130005,
+ -0.25601106882095337,
+ -0.57838451862335205,
+ -0.044736035168170929,
+ -0.095158882439136505,
+ -0.095164597034454346,
+ -0.18723849952220917,
+ 0.068853452801704407,
+ -0.33071690797805786,
+ 0.014438859187066555,
+ -0.18069943785667419,
+ -0.054355964064598083,
+ 0.35814380645751953,
+ -0.25015285611152649,
+ -0.27810752391815186,
+ 0.20590695738792419,
+ 0.1270439475774765,
+ 0.066699407994747162
+ ]
+ },
+ "segments" : [
+ {
+ "text" : "如何做产品怎么干,是JK去年与同僚的最多的话题,是销中上市时创下了70倍PE的市值6月18日饮食市值继续大涨逼近800亿元,资本市场再次一片狂欢,不同于其他公司上市后普发福利红包的热闹与喧嚣饮食公司内部的气氛却一如既往的平静与忙碌,员工该赶项目的赶项目该加班的加班,不同的是,所有人都因为饮食换了一种身份。",
+ "speaker" : "Speaker 1",
+ "end" : 33220,
+ "start" : 1200
+ },
+ {
+ "text" : "而被受注目,上市这件事情和结婚一样意味着自己的义务变了,虽然兴奋但是身上的担子更重了,JK在采访里提到雷锋网了解到近两个月来饮食进行了一轮较大范围的组织架构调整将多条产品线进行重新整合多番调整下饮食又何变化欢迎添加微信和Q501一起交流,年初至今饮食的团队规模扩充了不少。",
+ "speaker" : "Speaker 1",
+ "end" : 63931,
+ "start" : 33220
+ },
+ {
+ "text" : "调整的过程虽有些波折但对内部来说,这场变化也是为了让员工快速适应饮食的成长与规模化,从而去应对三家争霸饮食今年压力最大前有DJI 后有追秘都在布局全景相继有一次JK与众欣赏地说,我们需要全面备战一位饮食员工说道,赛道内一眼望去全是实力雄厚的对手,饮食的处境比想象中的艰难,而IPO只是一个分水岭。",
+ "speaker" : "Speaker 1",
+ "end" : 95392,
+ "start" : 64292
+ },
+ {
+ "text" : "如果说以前的饮食需要证明自己能稳定盈利,那么现在的饮食则至少需要回答市场三个关键问题屋子里的大象来势汹汹饮食怎么应对,饮食到底值不值70倍的皮未来是否能守得住自己的市场份额,竞争如此胶着管理层是什么思考的,01,dji 濒临城下影视如何应对今年 jk 在年会上承认在 dji 面前他们确实还是弟弟承认归承认。",
+ "speaker" : "Speaker 1",
+ "end" : 129763,
+ "start" : 96222
+ },
+ {
+ "text" : "jk 也同时在内部放话战术上重视战略上升为做好打印帐跑马拉松的准备,他认为就像人跑马拉松那个半跑的人或领跑的人还是很重要的,竞争对手给到你的启发远大于从你手上剥夺的东西,影视备战的第一步是先发之人因斯特360 x5在4月抢先发布这距离上一代产品x4发布仅过去一年的时间,要知道此前x2 x3两代的产品周期基本都是两年另一边。",
+ "speaker" : "Speaker 1",
+ "end" : 165874,
+ "start" : 130283
+ },
+ {
+ "text" : "影视进一步强化产品和品牌营销让消费者形成认知全景就是因斯特360的天下,今年二月以来影视开始不遗余力为产品造势小刀运动相机出,大到发布新的全景相机X5通过广告投放加大了对目标消费者的市场渗透,坊间流传,今年NST360 X5的广告预算比以往高出不少,雷锋网了解到,X5的广告营销。",
+ "speaker" : "Speaker 1",
+ "end" : 197466,
+ "start" : 166374
+ },
+ {
+ "text" : "基本覆盖了各个渠道的KOL,凭借全新的产品在大幅度的广告投流下影视X5发布初期就取得了比较可观的销量,大规模投放下X5销量情况如何,欢迎添加微信QQ501一起交流至少目前来看,影视的策略是有章法的,影视网罗了硬件3C领域绝大多数的KOL只要有新的KOL开始冒头都会被影视抢先遣下在长期重视营销的结果下。",
+ "speaker" : "Speaker 1",
+ "end" : 230296,
+ "start" : 197466
+ },
+ {
+ "text" : "影视逐渐形成了一套围绕KOL的营销方法论,而对面的DJI在营销上的态度始终模棱两可时而强,时而入此前方健有说法称营销曾经是DJI的眼前的公司不开展会汪涛也不会在公众露面市场他也不愿意投品牌也不投,因为汪涛算不清楚这笔账的投入和产出比算不清楚他就不投,汪涛不愿意给KOL花钱他觉得这些人什么都没干。",
+ "speaker" : "Speaker 1",
+ "end" : 261690,
+ "start" : 230296
+ },
+ {
+ "text" : "躺着就赚了DJI的钱,谁都不能躺着赚我的钱,熟悉DJI的人是李洋向雷锋网投,2020年以前DJI是比较重视KOL营销的很多渠道的KOL都投了,谢家走了之后这些合作项目就都停了,很长一段时间里DJI的市场团队一度是最没有存在感的部分,人手凋零没几个人对这些人来说要想在汪涛那里拿到市场预算就得向汪涛证明。",
+ "speaker" : "Speaker 1",
+ "end" : 292780,
+ "start" : 261690
+ },
+ {
+ "text" : "这些预算投了出去能得到多少钱的回报这个问题没有人能回答出来也因此,dji的市场人员阵亡率很高某种程度上 dji不太重视营销与他在无人机市场的强势领导地位有关,王涛认为只要产品领导力在营销就是可有可无的但当dji开始不断拖新品牌竞争对手的战力指数也更高时,几乎没有人能忽视营销的buff 意识到威胁后现在的dji也一反常态通过加大市场营销投入穷追不舍。",
+ "speaker" : "Speaker 1",
+ "end" : 329132,
+ "start" : 292780
+ },
+ {
+ "text" : "2024年火爆全网络的炮",
+ "speaker" : "Speaker 1",
+ "end" : 332051,
+ "start" : 329952
+ }
+ ]
+ },
+ "start_time" : 1750835685115,
+ "end_time" : 1750835705133,
+ "task_id" : "task_6586838c-09bf-411f-bc6b-4e0fd76b470b"
+ },
+ {
+ "task_type" : "ai_summarize",
+ "status" : "SUCCESS",
+ "result" : {
+ "status" : "GatewayTaskStatus.COMPLETED",
+ "result" : {
+ "summary_id" : "20250625071508-v2@26337868f9362d731fce60",
+ "select_prompt_type" : null,
+ "speaker_mapping" : null,
+ "use_persona" : false,
+ "version" : "0.5.0.24",
+ "tokens_lens" : 1215,
+ "retry_count" : 0,
+ "header" : {
+ "category" : "会议纪要",
+ "industry_category" : "食品和饮料",
+ "language_code" : "zh",
+ "keywords" : [
+ "饮食公司",
+ "市场挑战",
+ "营销策略"
+ ],
+ "recommend_questions" : [
+ {
+ "question" : "饮食公司如何应对市场竞争,尤其是与DJI的竞争?",
+ "category" : "question_category_content",
+ "main_purpose" : "分析饮食公司上市后的市场表现和挑战"
+ },
+ {
+ "question" : "饮食公司如何证明其市值合理性并保持市场份额?",
+ "category" : "question_category_content",
+ "main_purpose" : "分析饮食公司上市后的市场表现和挑战"
+ },
+ {
+ "question" : "饮食公司在市场竞争中面临的压力和挑战是什么?",
+ "category" : "question_category_content",
+ "main_purpose" : "分析饮食公司上市后的市场表现和挑战"
+ },
+ {
+ "question" : "识别饮食公司在市场竞争中的最大风险是什么?",
+ "category" : "question_category_shortcut",
+ "main_purpose" : "分析饮食公司上市后的市场表现和挑战"
+ },
+ {
+ "question" : "如何快速评估饮食公司的营销策略效果?",
+ "category" : "question_category_shortcut",
+ "main_purpose" : "分析饮食公司上市后的市场表现和挑战"
+ },
+ {
+ "question" : "饮食公司如何快速调整以应对市场变化?",
+ "category" : "question_category_shortcut",
+ "main_purpose" : "分析饮食公司上市后的市场表现和挑战"
+ }
+ ],
+ "summary_type" : "MEETING",
+ "original_category" : "会议纪要",
+ "summary_id" : "20250625071508-v2@26337868f9362d731fce60",
+ "headline" : "会议:饮食公司上市后的变化与市场挑战"
+ },
+ "summary" : null,
+ "ai_suggestion" : "AI已识别出会议中未解决或缺乏明确行动项的问题,请注意:\n1. 饮食公司如何应对市场竞争,尤其是与DJI的竞争,需进一步讨论以制定有效策略。\n2. 饮食公司需要进一步明确如何保持市场份额并证明其市值合理性,以确保公司持续增长。\n3. 饮食公司在市场竞争中面临的压力和挑战,需要深入分析并制定解决方案以降低风险。",
+ "language" : "简体中文",
+ "markdown" : "饮食公司 市场挑战 营销策略\n---\n## ⏰ 会议信息\n* 日期和时间: $[audio_start_time]\n* 地点:[输入地点]\n* 与会人员:[输入与会人员]\n## 📝 会议记录\n1. **饮食公司上市后的变化**\n 饮食公司上市时创下70倍PE市值,6月18日市值逼近800亿元,内部气氛依旧平静,员工继续忙碌。公司进行了较大范围的组织架构调整,重新整合多条产品线,并扩充了团队规模,旨在让员工快速适应公司的成长与规模化,以应对市场竞争。\n2. **饮食公司面临的市场挑战**\n 饮食公司面临巨大压力,前有DJI,后有追觅等竞争对手都在布局全景市场。IPO只是分水岭,公司需回答市场三个关键问题:如何应对来势汹汹的竞争对手、是否值70倍PE、未来能否守住市场份额。管理层(JK)在年会上承认在DJI面前仍是“弟弟”,但强调战术上重视、战略上要做好“跑马拉松”的准备,认为竞争对手带来的启发远大于其剥夺的东西。\n3. **饮食公司的营销策略**\n 饮食公司备战的第一步是先发制人,于4月抢先发布Insta360 X5,相较于前代产品缩短了发布周期。公司进一步强化产品和品牌营销,旨在让消费者形成“全景就是Insta360的天下”的认知。自今年2月以来,饮食公司不遗余力地为产品造势,通过广告投放加大市场渗透。坊间流传X5的广告预算远超以往,其营销基本覆盖了各个渠道的KOL。凭借新产品和大规模广告投入,X5发布初期取得了可观销量。饮食公司网罗了硬件3C领域绝大多数KOL,并逐渐形成了一套围绕KOL的营销方法论。\n4. **DJI的营销态度变化**\n DJI在营销上的态度曾模棱两可,时而强时而弱。坊间流传,其创始人汪涛不愿投入市场和品牌营销,因无法算清投入产出比,也不愿为KOL花钱,认为他们“躺着赚钱”。据熟悉DJI的人士透露,2020年以前DJI曾重视KOL营销,但后来合作项目停止,市场团队一度存在感低、人手凋零,且难以向汪涛证明市场预算的回报,导致市场人员“阵亡率”很高。DJI过去不重视营销,部分原因在于其在无人机市场的强势领导地位,汪涛认为只要产品领导力在,营销可有可无。然而,随着DJI不断推出新品牌,且竞争对手的战力指数提高,DJI意识到威胁,一反常态地通过加大市场营销投入来“穷追不舍”。\n## 📅 下一步安排\n- [ ] [输入更多内容]\n\n> **AI建议**\n> AI已识别出会议中未解决或缺乏明确行动项的问题,请注意:\n> 1. 饮食公司如何应对市场竞争,尤其是与DJI的竞争,需进一步讨论以制定有效策略。\n> 2. 饮食公司需要进一步明确如何保持市场份额并证明其市值合理性,以确保公司持续增长。\n> 3. 饮食公司在市场竞争中面临的压力和挑战,需要深入分析并制定解决方案以降低风险。",
+ "form" : {
+ "arrangements" : "📅 下一步安排",
+ "info" : "⏰ 会议信息",
+ "location" : "地点:[输入地点]",
+ "ai_suggestions" : "AI建议",
+ "insert_more" : "[输入更多内容]",
+ "notes" : "📝 会议记录",
+ "conclusion" : "结论",
+ "date_time" : "日期和时间:",
+ "attendees" : "与会人员:[输入与会人员]"
+ },
+ "endpoint" : "azure-gpt-4o-sc",
+ "contents" : [
+ {
+ "speaker_name_mapping" : [
+
+ ],
+ "arrangements" : [
+
+ ],
+ "topics" : [
+ {
+ "topic" : "饮食公司上市后的变化",
+ "conclusion" : "",
+ "description" : "饮食公司上市后市值大涨至800亿元,内部气氛依旧平静,员工继续忙碌。公司进行了组织架构调整,扩充团队规模,以适应市场竞争。"
+ },
+ {
+ "topic" : "饮食公司面临的市场挑战",
+ "conclusion" : "",
+ "description" : "饮食公司需要回答市场三个关键问题:如何应对竞争对手、是否值70倍PE、能否保持市场份额。管理层承认在DJI面前仍处于劣势,但强调战略重要性。"
+ },
+ {
+ "topic" : "饮食公司的营销策略",
+ "conclusion" : "",
+ "description" : "饮食公司通过强化产品和品牌营销,形成全景相机市场的认知。X5产品发布后取得可观销量,广告预算较以往增加,覆盖各渠道KOL。"
+ },
+ {
+ "topic" : "DJI的营销态度变化",
+ "conclusion" : "",
+ "description" : "DJI过去对KOL营销态度模棱两可,市场团队存在感低。随着竞争加剧,DJI开始加大市场营销投入。"
+ }
+ ],
+ "theme" : "饮食公司上市后的市场竞争与营销策略",
+ "ai_suggestion" : "未解决的问题:饮食公司如何应对市场竞争,尤其是与DJI的竞争。任务细节不明确:饮食公司需要进一步明确如何保持市场份额并证明其市值合理性。项目风险:饮食公司在市场竞争中面临的压力和挑战,需要进一步讨论和解决。"
+ }
+ ],
+ "model" : "gpt-4.1",
+ "text_lens" : 1661
+ },
+ "text" : "Speaker 1: 如何做产品怎么干,是JK去年与同僚的最多的话题,是销中上市时创下了70倍PE的市值6月18日饮食市值继续大涨逼近800亿元,资本市场再次一片狂欢,不同于其他公司上市后普发福利红包的热闹与喧嚣饮食公司内部的气氛却一如既往的平静与忙碌,员工该赶项目的赶项目该加班的加班,不同的是,所有人都因为饮食换了一种身份。\nSpeaker 1: 而被受注目,上市这件事情和结婚一样意味着自己的义务变了,虽然兴奋但是身上的担子更重了,JK在采访里提到雷锋网了解到近两个月来饮食进行了一轮较大范围的组织架构调整将多条产品线进行重新整合多番调整下饮食又何变化欢迎添加微信和Q501一起交流,年初至今饮食的团队规模扩充了不少。\nSpeaker 1: 调整的过程虽有些波折但对内部来说,这场变化也是为了让员工快速适应饮食的成长与规模化,从而去应对三家争霸饮食今年压力最大前有DJI 后有追秘都在布局全景相继有一次JK与众欣赏地说,我们需要全面备战一位饮食员工说道,赛道内一眼望去全是实力雄厚的对手,饮食的处境比想象中的艰难,而IPO只是一个分水岭。\nSpeaker 1: 如果说以前的饮食需要证明自己能稳定盈利,那么现在的饮食则至少需要回答市场三个关键问题屋子里的大象来势汹汹饮食怎么应对,饮食到底值不值70倍的皮未来是否能守得住自己的市场份额,竞争如此胶着管理层是什么思考的,01,dji 濒临城下影视如何应对今年 jk 在年会上承认在 dji 面前他们确实还是弟弟承认归承认。\nSpeaker 1: jk 也同时在内部放话战术上重视战略上升为做好打印帐跑马拉松的准备,他认为就像人跑马拉松那个半跑的人或领跑的人还是很重要的,竞争对手给到你的启发远大于从你手上剥夺的东西,影视备战的第一步是先发之人因斯特360 x5在4月抢先发布这距离上一代产品x4发布仅过去一年的时间,要知道此前x2 x3两代的产品周期基本都是两年另一边。\nSpeaker 1: 影视进一步强化产品和品牌营销让消费者形成认知全景就是因斯特360的天下,今年二月以来影视开始不遗余力为产品造势小刀运动相机出,大到发布新的全景相机X5通过广告投放加大了对目标消费者的市场渗透,坊间流传,今年NST360 X5的广告预算比以往高出不少,雷锋网了解到,X5的广告营销。\nSpeaker 1: 基本覆盖了各个渠道的KOL,凭借全新的产品在大幅度的广告投流下影视X5发布初期就取得了比较可观的销量,大规模投放下X5销量情况如何,欢迎添加微信QQ501一起交流至少目前来看,影视的策略是有章法的,影视网罗了硬件3C领域绝大多数的KOL只要有新的KOL开始冒头都会被影视抢先遣下在长期重视营销的结果下。\nSpeaker 1: 影视逐渐形成了一套围绕KOL的营销方法论,而对面的DJI在营销上的态度始终模棱两可时而强,时而入此前方健有说法称营销曾经是DJI的眼前的公司不开展会汪涛也不会在公众露面市场他也不愿意投品牌也不投,因为汪涛算不清楚这笔账的投入和产出比算不清楚他就不投,汪涛不愿意给KOL花钱他觉得这些人什么都没干。\nSpeaker 1: 躺着就赚了DJI的钱,谁都不能躺着赚我的钱,熟悉DJI的人是李洋向雷锋网投,2020年以前DJI是比较重视KOL营销的很多渠道的KOL都投了,谢家走了之后这些合作项目就都停了,很长一段时间里DJI的市场团队一度是最没有存在感的部分,人手凋零没几个人对这些人来说要想在汪涛那里拿到市场预算就得向汪涛证明。\nSpeaker 1: 这些预算投了出去能得到多少钱的回报这个问题没有人能回答出来也因此,dji的市场人员阵亡率很高某种程度上 dji不太重视营销与他在无人机市场的强势领导地位有关,王涛认为只要产品领导力在营销就是可有可无的但当dji开始不断拖新品牌竞争对手的战力指数也更高时,几乎没有人能忽视营销的buff 意识到威胁后现在的dji也一反常态通过加大市场营销投入穷追不舍。\nSpeaker 1: 2024年火爆全网络的炮"
+ },
+ "start_time" : 1750835707579,
+ "end_time" : 1750835761292,
+ "task_id" : "task_b702b0b5-4493-495e-8eda-45eb58213965"
+ }
+ ],
+ "file_id" : "file_3c57ce78-4860-4efb-8e2b-e394e9d5ea55"
+}
+
+
+type2:
+{
+ "status" : "SUCCESS",
+ "id" : "wf_f4d449c4-ce10-4409-971c-9f7f2efa56d0",
+ "owner_id" : "test-001",
+ "metadata_json" : {
+
+ },
+ "tasks" : [
+ {
+ "task_type" : "audio_transcribe",
+ "status" : "SUCCESS",
+ "result" : {
+ "segments" : [
+ {
+ "start" : 1.5700000000000001,
+ "speaker" : "speaker_1",
+ "end" : 2.3199999999999998,
+ "text" : "如何做产品?"
+ },
+ {
+ "start" : 2.3999999999999999,
+ "speaker" : "speaker_1",
+ "end" : 3,
+ "text" : "怎么干?"
+ },
+ {
+ "start" : 3.1600000000000001,
+ "speaker" : "speaker_1",
+ "end" : 6.7599999999999998,
+ "text" : "DJI 是 JK 去年与投资人聊的最多的话题。"
+ },
+ {
+ "start" : 8.0690000000000008,
+ "speaker" : "speaker_1",
+ "end" : 10.898999999999999,
+ "text" : "直销中上市时创下了70倍 PE 的市值。"
+ },
+ {
+ "start" : 11.179,
+ "speaker" : "speaker_1",
+ "end" : 16.818999999999999,
+ "text" : "6月18日,饮食市值继续大涨,逼近800亿元,资本市场再次一片狂欢。"
+ },
+ {
+ "start" : 18.059999999999999,
+ "speaker" : "speaker_1",
+ "end" : 27.690000000000001,
+ "text" : "不同于其他公司上市后普发福利红包的热闹与喧嚣,影视公司内部的气氛却一如既往的平静与忙碌,员工该赶项目的赶项目。"
+ },
+ {
+ "start" : 28.23,
+ "speaker" : "speaker_1",
+ "end" : 34.299999999999997,
+ "text" : "该加班的加班,不同的是,所有人都因为饮食换了一种身份而备受瞩目。"
+ },
+ {
+ "start" : 35.299999999999997,
+ "speaker" : "speaker_1",
+ "end" : 39.100000000000001,
+ "text" : "上市这件事情和结婚一样,意味着自己的义务变了。"
+ },
+ {
+ "start" : 39.909999999999997,
+ "speaker" : "speaker_1",
+ "end" : 42.469999999999999,
+ "text" : "虽然兴奋,但是身上的担子更重了。"
+ },
+ {
+ "start" : 43.189999999999998,
+ "speaker" : "speaker_1",
+ "end" : 51.229999999999997,
+ "text" : "JK 在采访里提到,雷锋网了解到,近两个月来,影视进行了一轮较大范围的组织架构调整。"
+ },
+ {
+ "start" : 51.759999999999998,
+ "speaker" : "speaker_1",
+ "end" : 57.359999999999999,
+ "text" : "将多条产品线进行重新整合,多番调整下饮食有何变化?"
+ },
+ {
+ "start" : 57.560000000000002,
+ "speaker" : "speaker_1",
+ "end" : 60.359999999999999,
+ "text" : "欢迎添加微信 QQ501一起交流。"
+ },
+ {
+ "start" : 60.719999999999999,
+ "speaker" : "speaker_1",
+ "end" : 72.599999999999994,
+ "text" : "年初至今饮食的团队规模扩充了不少,调整的过程虽有些波折,但对内部来说,这场变化也是为了让员工快速适应饮食的成长与规模化。"
+ },
+ {
+ "start" : 73.090000000000003,
+ "speaker" : "speaker_1",
+ "end" : 80.969999999999999,
+ "text" : "从而去应对三家争霸,饮食今年压力最大,前有 DJI 后有追觅,都在布局全景相机。"
+ },
+ {
+ "start" : 81.329999999999998,
+ "speaker" : "speaker_1",
+ "end" : 83.689999999999998,
+ "text" : "有一次 JK 语重心长地说。"
+ },
+ {
+ "start" : 84.040000000000006,
+ "speaker" : "speaker_1",
+ "end" : 87.629999999999995,
+ "text" : "我们需要全面备战,一位饮食员工说道。"
+ },
+ {
+ "start" : 88.269999999999996,
+ "speaker" : "speaker_1",
+ "end" : 93.629999999999995,
+ "text" : "赛道内一眼望去全是实力雄厚的对手,饮食的处境比想象中的艰难。"
+ },
+ {
+ "start" : 94.040000000000006,
+ "speaker" : "speaker_1",
+ "end" : 95.510000000000005,
+ "text" : "而 IPO 只是一个分水岭。"
+ },
+ {
+ "start" : 96.510000000000005,
+ "speaker" : "speaker_1",
+ "end" : 104.43000000000001,
+ "text" : "如果说以前的饮食需要证明自己能稳定盈利,那么现在的饮食则至少需要回答市场三个关键问题。"
+ },
+ {
+ "start" : 105.23999999999999,
+ "speaker" : "speaker_1",
+ "end" : 108.52,
+ "text" : "屋子里的大象来势汹汹,饮食怎么应对?"
+ },
+ {
+ "start" : 109.23999999999999,
+ "speaker" : "speaker_1",
+ "end" : 114.2,
+ "text" : "饮食到底值不值70倍的 PE 未来是否能守得住自己的市场份额?"
+ },
+ {
+ "start" : 114.92,
+ "speaker" : "speaker_1",
+ "end" : 116,
+ "text" : "竞争如此胶灼。"
+ },
+ {
+ "start" : 116.59999999999999,
+ "speaker" : "speaker_1",
+ "end" : 118,
+ "text" : "管理层是什么思考呢?"
+ },
+ {
+ "start" : 118.8,
+ "speaker" : "speaker_1",
+ "end" : 123.04000000000001,
+ "text" : "0 DJI 兵临城下,饮食如何应对?"
+ },
+ {
+ "start" : 123.64,
+ "speaker" : "speaker_1",
+ "end" : 128.03999999999999,
+ "text" : "今年 JK 在年会上承认,在 DJI 面前他们确实还是弟弟。"
+ },
+ {
+ "start" : 128.88,
+ "speaker" : "speaker_1",
+ "end" : 129.96000000000001,
+ "text" : "承认归承认。"
+ },
+ {
+ "start" : 130.47,
+ "speaker" : "speaker_1",
+ "end" : 137.91,
+ "text" : "JK 也同时在内部放话,战术上重视,战略上升维,做好打硬仗、跑马拉松的准备。"
+ },
+ {
+ "start" : 138.55000000000001,
+ "speaker" : "speaker_1",
+ "end" : 140.71000000000001,
+ "text" : "他认为就像人跑马拉松。"
+ },
+ {
+ "start" : 141.11000000000001,
+ "speaker" : "speaker_1",
+ "end" : 144.13999999999999,
+ "text" : "那个半跑的人或领跑的人还是很重要的。"
+ },
+
+ {
+ "start" : 144.41999999999999,
+ "speaker" : "speaker_1",
+ "end" : 148.62,
+ "text" : "竞争对手给到你的启发远大于从你手上剥夺的东西。"
+ },
+ {
+ "start" : 149.5,
+ "speaker" : "speaker_1",
+ "end" : 151.66,
+ "text" : "饮食备战的第一步是先发制人。"
+ },
+ {
+ "start" : 153.08000000000001,
+ "speaker" : "speaker_1",
+ "end" : 159.80000000000001,
+ "text" : "Insta 3六0 x 五在4月抢先发布,这距离上一代产品 X4发布仅过去一年的时间。"
+ },
+ {
+ "start" : 160.03999999999999,
+ "speaker" : "speaker_1",
+ "end" : 164.75999999999999,
+ "text" : "要知道此前 X2、X3两代的产品周期基本都是2年。"
+ },
+ {
+ "start" : 165.63999999999999,
+ "speaker" : "speaker_1",
+ "end" : 174.34999999999999,
+ "text" : "另一边,饮食进一步强化产品和品牌营销,让消费者形成认知,全景就是 Instar 360的天下。"
+ },
+ {
+ "start" : 174.94999999999999,
+ "speaker" : "speaker_1",
+ "end" : 187.75,
+ "text" : "今年2月以来影石开始不遗余力为产品造势,小到运动相机出了个手柄配件,大到发布新的全景相机 X5,通过广告投放加大了对目标消费者的市场渗透。"
+ },
+ {
+ "start" : 188.739,
+ "speaker" : "speaker_1",
+ "end" : 199.84999999999999,
+ "text" : "雷锋网了解到,X5的广告营销基本覆盖了各个渠道的 KOL。"
+ },
+ {
+ "start" : 188.84999999999999,
+ "speaker" : "speaker_1",
+ "end" : 194.21000000000001,
+ "text" : "坊间流传,今年 NST 三六零 x 五的广告预算比以往高出不少。"
+ },
+ {
+ "start" : 201.21000000000001,
+ "speaker" : "speaker_1",
+ "end" : 208.72999999999999,
+ "text" : "凭借全新的产品,在大幅度的广告投流下,影石 X5发布初期就取得了比较可观的销量。"
+ },
+ {
+ "start" : 209.28999999999999,
+ "speaker" : "speaker_1",
+ "end" : 212.09,
+ "text" : "大规模投放下,X5销量情况如何?"
+ },
+ {
+ "start" : 212.50899999999999,
+ "speaker" : "speaker_1",
+ "end" : 223.02000000000001,
+ "text" : "饮食网罗了硬件3C 领域绝大多数的 KOL。"
+ },
+ {
+ "start" : 212.53999999999999,
+ "speaker" : "speaker_1",
+ "end" : 215.30000000000001,
+ "text" : "欢迎添加微信 QQ501一起交流。"
+ },
+ {
+ "start" : 215.81999999999999,
+ "speaker" : "speaker_1",
+ "end" : 219.34,
+ "text" : "至少目前来看,饮食的策略是有章法的。"
+ },
+ {
+ "start" : 223.68000000000001,
+ "speaker" : "speaker_1",
+ "end" : 227.72,
+ "text" : "只要有新的 KOL 开始冒头,都会被饮食抢先签下。"
+ },
+ {
+ "start" : 228.40000000000001,
+ "speaker" : "speaker_1",
+ "end" : 234.44,
+ "text" : "在长期重视营销的结果下,饮食逐渐形成了一套围绕 KOL 的营销方法论。"
+ },
+ {
+ "start" : 235.41,
+ "speaker" : "speaker_1",
+ "end" : 240.80000000000001,
+ "text" : "而对面的 DGI 在营销上的态度始终模棱两可,时而强,时而弱。"
+ },
+ {
+ "start" : 241.36000000000001,
+ "speaker" : "speaker_1",
+ "end" : 245.19999999999999,
+ "text" : "此前坊间有说法称营销曾经是 DGI 的盐碱地。"
+ },
+ {
+ "start" : 245.78,
+ "speaker" : "speaker_1",
+ "end" : 255.46000000000001,
+ "text" : "公司不开展会,汪涛也不会在公众露面,市场他也不愿意投,品牌也不投,因为汪涛算不清楚这笔账的投入和产出比。"
+ },
+ {
+ "start" : 255.83000000000001,
+ "speaker" : "speaker_1",
+ "end" : 257.02999999999997,
+ "text" : "算不清楚他就不投。"
+ },
+ {
+ "start" : 257.91000000000003,
+ "speaker" : "speaker_1",
+ "end" : 265.67000000000002,
+ "text" : "王涛不愿意给 KOL 花钱,他觉得这些人什么都没干,躺着就赚了 DJI 的钱,谁都不能躺着赚我的钱。"
+ },
+ {
+ "start" : 266.39999999999998,
+ "speaker" : "speaker_1",
+ "end" : 275.12,
+ "text" : "熟悉 DGI 的人士李阳向雷锋网透露,2020年以前,DGI 是比较重视 KOL 营销的,很多渠道的 KOL 都投了。"
+ },
+ {
+ "start" : 275.92000000000002,
+ "speaker" : "speaker_1",
+ "end" : 279.14999999999998,
+ "text" : "谢佳走了之后这些合作项目就都停了。"
+ },
+ {
+ "start" : 279.67000000000002,
+ "speaker" : "speaker_1",
+ "end" : 286.91000000000003,
+ "text" : "很长一段时间里,DGI 的市场团队一度是最没有存在感的部门,人手凋零,没几个人。"
+ },
+ {
+ "start" : 287.68000000000001,
+ "speaker" : "speaker_1",
+ "end" : 298.43000000000001,
+ "text" : "对这些人来说,要想在汪涛那里拿到市场预算,就得向汪涛证明这些预算投了出去能得到多少钱的回报,这个问题没有人能回答出来。"
+ },
+ {
+ "start" : 299.18000000000001,
+ "speaker" : "speaker_1",
+ "end" : 302.41000000000003,
+ "text" : "也因此,DJI 的市场人员阵亡率很高。"
+ },
+ {
+ "start" : 303.00999999999999,
+ "speaker" : "speaker_1",
+ "end" : 309.29000000000002,
+ "text" : "某种程度上,DJI 不太重视营销,与它在无人机市场的强势领导地位有关。"
+ },
+ {
+ "start" : 310.02999999999997,
+ "speaker" : "speaker_1",
+ "end" : 314.43000000000001,
+ "text" : "王涛认为,只要产品领导力在,营销就是可有可无的。"
+ },
+ {
+ "start" : 314.75,
+ "speaker" : "speaker_1",
+ "end" : 319.58999999999997,
+ "text" : "但当 DGI 开始不断拓新品类,竞争对手的战力指数也更高时。"
+ },
+ {
+ "start" : 320.13999999999999,
+ "speaker" : "speaker_1",
+ "end" : 329.22000000000003,
+ "text" : "几乎没有人能忽视营销的 buff 意识到威胁后,现在的 DGI 也一反常态,通过加大市场营销投入,穷追不舍。"
+ },
+ {
+ "start" : 330.26999999999998,
+ "speaker" : "speaker_1",
+ "end" : 332.23000000000002,
+ "text" : "2024年火爆全网络的 pop"
+ }
+ ]
+ },
+ "start_time" : 1750835827056,
+ "end_time" : 1750835868313,
+ "task_id" : "task_b0e404c5-cf03-4a80-973b-ba36585637c2"
+ }
+ ],
+ "file_id" : "file_3c57ce78-4860-4efb-8e2b-e394e9d5ea55"
+}
+
+
+type3:
+{
+ "status" : "SUCCESS",
+ "id" : "wf_6d3b16fc-1fd3-41ad-a822-50035761048b",
+ "owner_id" : "test-001",
+ "metadata_json" : {
+
+ },
+ "tasks" : [
+ {
+ "task_type" : "audio_transcribe",
+ "status" : "SUCCESS",
+ "result" : {
+ "segments" : [
+ {
+ "start" : 1.5700000000000001,
+ "speaker" : "speaker_1",
+ "end" : 2.3199999999999998,
+ "text" : "如何做产品?"
+ },
+ {
+ "start" : 2.3999999999999999,
+ "speaker" : "speaker_1",
+ "end" : 3,
+ "text" : "怎么干?"
+ },
+ {
+ "start" : 3.1600000000000001,
+ "speaker" : "speaker_1",
+ "end" : 6.7599999999999998,
+ "text" : "DJI 是 JK 去年与投资人聊的最多的话题。"
+ },
+ {
+ "start" : 8.0690000000000008,
+ "speaker" : "speaker_1",
+ "end" : 10.898999999999999,
+ "text" : "直销中上市时创下了70倍 PE 的市值。"
+ },
+ {
+ "start" : 11.179,
+ "speaker" : "speaker_1",
+ "end" : 16.818999999999999,
+ "text" : "6月18日,饮食市值继续大涨,逼近800亿元,资本市场再次一片狂欢。"
+ },
+ {
+ "start" : 18.059999999999999,
+ "speaker" : "speaker_1",
+ "end" : 27.690000000000001,
+ "text" : "不同于其他公司上市后普发福利红包的热闹与喧嚣,影视公司内部的气氛却一如既往的平静与忙碌,员工该赶项目的赶项目。"
+ },
+ {
+ "start" : 28.23,
+ "speaker" : "speaker_1",
+ "end" : 34.299999999999997,
+ "text" : "该加班的加班,不同的是,所有人都因为饮食换了一种身份而备受瞩目。"
+ },
+ {
+ "start" : 35.299999999999997,
+ "speaker" : "speaker_1",
+ "end" : 39.100000000000001,
+ "text" : "上市这件事情和结婚一样,意味着自己的义务变了。"
+ },
+ {
+ "start" : 39.909999999999997,
+ "speaker" : "speaker_1",
+ "end" : 42.469999999999999,
+ "text" : "虽然兴奋,但是身上的担子更重了。"
+ },
+ {
+ "start" : 43.189999999999998,
+ "speaker" : "speaker_1",
+ "end" : 51.229999999999997,
+ "text" : "JK 在采访里提到,雷锋网了解到,近两个月来,影视进行了一轮较大范围的组织架构调整。"
+ },
+ {
+ "start" : 51.759999999999998,
+ "speaker" : "speaker_1",
+ "end" : 57.359999999999999,
+ "text" : "将多条产品线进行重新整合,多番调整下饮食有何变化?"
+ },
+ {
+ "start" : 57.560000000000002,
+ "speaker" : "speaker_1",
+ "end" : 60.359999999999999,
+ "text" : "欢迎添加微信 QQ501一起交流。"
+ },
+ {
+ "start" : 60.719999999999999,
+ "speaker" : "speaker_1",
+ "end" : 72.599999999999994,
+ "text" : "年初至今饮食的团队规模扩充了不少,调整的过程虽有些波折,但对内部来说,这场变化也是为了让员工快速适应饮食的成长与规模化。"
+ },
+ {
+ "start" : 73.090000000000003,
+ "speaker" : "speaker_1",
+ "end" : 80.969999999999999,
+ "text" : "从而去应对三家争霸,饮食今年压力最大,前有 DJI 后有追觅,都在布局全景相机。"
+ },
+ {
+ "start" : 81.329999999999998,
+ "speaker" : "speaker_1",
+ "end" : 83.689999999999998,
+ "text" : "有一次 JK 语重心长地说。"
+ },
+ {
+ "start" : 84.040000000000006,
+ "speaker" : "speaker_1",
+ "end" : 87.629999999999995,
+ "text" : "我们需要全面备战,一位饮食员工说道。"
+ },
+ {
+ "start" : 88.269999999999996,
+ "speaker" : "speaker_1",
+ "end" : 93.629999999999995,
+ "text" : "赛道内一眼望去全是实力雄厚的对手,饮食的处境比想象中的艰难。"
+ },
+ {
+ "start" : 94.040000000000006,
+ "speaker" : "speaker_1",
+ "end" : 95.510000000000005,
+ "text" : "而 IPO 只是一个分水岭。"
+ },
+ {
+ "start" : 96.510000000000005,
+ "speaker" : "speaker_1",
+ "end" : 104.43000000000001,
+ "text" : "如果说以前的饮食需要证明自己能稳定盈利,那么现在的饮食则至少需要回答市场三个关键问题。"
+ },
+ {
+ "start" : 105.23999999999999,
+ "speaker" : "speaker_1",
+ "end" : 108.52,
+ "text" : "屋子里的大象来势汹汹,饮食怎么应对?"
+ },
+ {
+ "start" : 109.23999999999999,
+ "speaker" : "speaker_1",
+ "end" : 114.2,
+ "text" : "饮食到底值不值70倍的 PE 未来是否能守得住自己的市场份额?"
+ },
+ {
+ "start" : 114.92,
+ "speaker" : "speaker_1",
+ "end" : 116,
+ "text" : "竞争如此胶灼。"
+ },
+ {
+ "start" : 116.59999999999999,
+ "speaker" : "speaker_1",
+ "end" : 118,
+ "text" : "管理层是什么思考呢?"
+ },
+ {
+ "start" : 118.8,
+ "speaker" : "speaker_1",
+ "end" : 123.04000000000001,
+ "text" : "0 DJI 兵临城下,饮食如何应对?"
+ },
+ {
+ "start" : 123.64,
+ "speaker" : "speaker_1",
+ "end" : 128.03999999999999,
+ "text" : "今年 JK 在年会上承认,在 DJI 面前他们确实还是弟弟。"
+ },
+ {
+ "start" : 128.88,
+ "speaker" : "speaker_1",
+ "end" : 129.96000000000001,
+ "text" : "承认归承认。"
+ },
+ {
+ "start" : 130.47,
+ "speaker" : "speaker_1",
+ "end" : 137.91,
+ "text" : "JK 也同时在内部放话,战术上重视,战略上升维,做好打硬仗、跑马拉松的准备。"
+ },
+ {
+ "start" : 138.55000000000001,
+ "speaker" : "speaker_1",
+ "end" : 140.71000000000001,
+ "text" : "他认为就像人跑马拉松。"
+ },
+ {
+ "start" : 141.11000000000001,
+ "speaker" : "speaker_1",
+ "end" : 144.13999999999999,
+ "text" : "那个半跑的人或领跑的人还是很重要的。"
+ },
+
+ {
+ "start" : 144.41999999999999,
+ "speaker" : "speaker_1",
+ "end" : 148.62,
+ "text" : "竞争对手给到你的启发远大于从你手上剥夺的东西。"
+ },
+ {
+ "start" : 149.5,
+ "speaker" : "speaker_1",
+ "end" : 151.66,
+ "text" : "饮食备战的第一步是先发制人。"
+ },
+ {
+ "start" : 153.08000000000001,
+ "speaker" : "speaker_1",
+ "end" : 159.80000000000001,
+ "text" : "Insta 3六0 x 五在4月抢先发布,这距离上一代产品 X4发布仅过去一年的时间。"
+ },
+ {
+ "start" : 160.03999999999999,
+ "speaker" : "speaker_1",
+ "end" : 164.75999999999999,
+ "text" : "要知道此前 X2、X3两代的产品周期基本都是2年。"
+ },
+ {
+ "start" : 165.63999999999999,
+ "speaker" : "speaker_1",
+ "end" : 174.34999999999999,
+ "text" : "另一边,饮食进一步强化产品和品牌营销,让消费者形成认知,全景就是 Instar 360的天下。"
+ },
+ {
+ "start" : 174.94999999999999,
+ "speaker" : "speaker_1",
+ "end" : 187.75,
+ "text" : "今年2月以来影石开始不遗余力为产品造势,小到运动相机出了个手柄配件,大到发布新的全景相机 X5,通过广告投放加大了对目标消费者的市场渗透。"
+ },
+ {
+ "start" : 188.739,
+ "speaker" : "speaker_1",
+ "end" : 199.84999999999999,
+ "text" : "雷锋网了解到,X5的广告营销基本覆盖了各个渠道的 KOL。"
+ },
+ {
+ "start" : 188.84999999999999,
+ "speaker" : "speaker_1",
+ "end" : 194.21000000000001,
+ "text" : "坊间流传,今年 NST 三六零 x 五的广告预算比以往高出不少。"
+ },
+ {
+ "start" : 201.21000000000001,
+ "speaker" : "speaker_1",
+ "end" : 208.72999999999999,
+ "text" : "凭借全新的产品,在大幅度的广告投流下,影石 X5发布初期就取得了比较可观的销量。"
+ },
+ {
+ "start" : 209.28999999999999,
+ "speaker" : "speaker_1",
+ "end" : 212.09,
+ "text" : "大规模投放下,X5销量情况如何?"
+ },
+ {
+ "start" : 212.50899999999999,
+ "speaker" : "speaker_1",
+ "end" : 223.02000000000001,
+ "text" : "饮食网罗了硬件3C 领域绝大多数的 KOL。"
+ },
+ {
+ "start" : 212.53999999999999,
+ "speaker" : "speaker_1",
+ "end" : 215.30000000000001,
+ "text" : "欢迎添加微信 QQ501一起交流。"
+ },
+ {
+ "start" : 215.81999999999999,
+ "speaker" : "speaker_1",
+ "end" : 219.34,
+ "text" : "至少目前来看,饮食的策略是有章法的。"
+ },
+ {
+ "start" : 223.68000000000001,
+ "speaker" : "speaker_1",
+ "end" : 227.72,
+ "text" : "只要有新的 KOL 开始冒头,都会被饮食抢先签下。"
+ },
+ {
+ "start" : 228.40000000000001,
+ "speaker" : "speaker_1",
+ "end" : 234.44,
+ "text" : "在长期重视营销的结果下,饮食逐渐形成了一套围绕 KOL 的营销方法论。"
+ },
+ {
+ "start" : 235.41,
+ "speaker" : "speaker_1",
+ "end" : 240.80000000000001,
+ "text" : "而对面的 DGI 在营销上的态度始终模棱两可,时而强,时而弱。"
+ },
+ {
+ "start" : 241.36000000000001,
+ "speaker" : "speaker_1",
+ "end" : 245.19999999999999,
+ "text" : "此前坊间有说法称营销曾经是 DGI 的盐碱地。"
+ },
+ {
+ "start" : 245.78,
+ "speaker" : "speaker_1",
+ "end" : 255.46000000000001,
+ "text" : "公司不开展会,汪涛也不会在公众露面,市场他也不愿意投,品牌也不投,因为汪涛算不清楚这笔账的投入和产出比。"
+ },
+ {
+ "start" : 255.83000000000001,
+ "speaker" : "speaker_1",
+ "end" : 257.02999999999997,
+ "text" : "算不清楚他就不投。"
+ },
+ {
+ "start" : 257.91000000000003,
+ "speaker" : "speaker_1",
+ "end" : 265.67000000000002,
+ "text" : "王涛不愿意给 KOL 花钱,他觉得这些人什么都没干,躺着就赚了 DJI 的钱,谁都不能躺着赚我的钱。"
+ },
+ {
+ "start" : 266.39999999999998,
+ "speaker" : "speaker_1",
+ "end" : 275.12,
+ "text" : "熟悉 DGI 的人士李阳向雷锋网透露,2020年以前,DGI 是比较重视 KOL 营销的,很多渠道的 KOL 都投了。"
+ },
+ {
+ "start" : 275.92000000000002,
+ "speaker" : "speaker_1",
+ "end" : 279.14999999999998,
+ "text" : "谢佳走了之后这些合作项目就都停了。"
+ },
+ {
+ "start" : 279.67000000000002,
+ "speaker" : "speaker_1",
+ "end" : 286.91000000000003,
+ "text" : "很长一段时间里,DGI 的市场团队一度是最没有存在感的部门,人手凋零,没几个人。"
+ },
+ {
+ "start" : 287.68000000000001,
+ "speaker" : "speaker_1",
+ "end" : 298.43000000000001,
+ "text" : "对这些人来说,要想在汪涛那里拿到市场预算,就得向汪涛证明这些预算投了出去能得到多少钱的回报,这个问题没有人能回答出来。"
+ },
+ {
+ "start" : 299.18000000000001,
+ "speaker" : "speaker_1",
+ "end" : 302.41000000000003,
+ "text" : "也因此,DJI 的市场人员阵亡率很高。"
+ },
+ {
+ "start" : 303.00999999999999,
+ "speaker" : "speaker_1",
+ "end" : 309.29000000000002,
+ "text" : "某种程度上,DJI 不太重视营销,与它在无人机市场的强势领导地位有关。"
+ },
+ {
+ "start" : 310.02999999999997,
+ "speaker" : "speaker_1",
+ "end" : 314.43000000000001,
+ "text" : "王涛认为,只要产品领导力在,营销就是可有可无的。"
+ },
+ {
+ "start" : 314.75,
+ "speaker" : "speaker_1",
+ "end" : 319.58999999999997,
+ "text" : "但当 DGI 开始不断拓新品类,竞争对手的战力指数也更高时。"
+ },
+ {
+ "start" : 320.13999999999999,
+ "speaker" : "speaker_1",
+ "end" : 329.22000000000003,
+ "text" : "几乎没有人能忽视营销的 buff 意识到威胁后,现在的 DGI 也一反常态,通过加大市场营销投入,穷追不舍。"
+ },
+ {
+ "start" : 330.26999999999998,
+ "speaker" : "speaker_1",
+ "end" : 332.23000000000002,
+ "text" : "2024年火爆全网络的 pop"
+ }
+ ]
+ },
+ "start_time" : 1750836108518,
+ "end_time" : 1750836149644,
+ "task_id" : "task_7e7d474a-22b1-49c7-bdb6-fc86cf25f68c"
+ },
+ {
+ "task_type" : "ai_etl",
+ "status" : "SUCCESS",
+ "result" : {
+ "assessment_treatment_pairs" : [
+
+ ],
+ "appellation" : "客户",
+ "communication_feedback" : {
+ "highlight" : "无医美相关沟通内容,无法识别有效亮点。",
+ "suggestion" : "对话内容严重偏离主题,建议加强咨询师专业培训和流程管理。"
+ },
+ "clinical_report" : "【接诊医生】\n无相关信息\n\n【接诊咨询师】\n无相关信息\n\n【客户信息】\n无相关信息\n\n【主诉检查】\n无相关信息\n\n【治疗方案】\n无相关信息\n\n【后续建议】\n1. 核实对话录音是否存在上传错误\n2. 重新培训咨询师掌握基础医美知识及对话引导技巧\n3. 建立咨询前问卷筛选机制,避免无效咨询占用资源",
+ "mapped" : {
+
+ },
+ "transcription" : {
+ "segments" : [
+ {
+ "start" : 1.5700000000000001,
+ "speaker" : "咨询师",
+ "end" : 2.3199999999999998,
+ "index" : 1,
+ "text" : "如何做产品?"
+ },
+ {
+ "start" : 2.3999999999999999,
+ "speaker" : "咨询师",
+ "end" : 3,
+ "index" : 2,
+ "text" : "怎么干?"
+ },
+ {
+ "start" : 3.1600000000000001,
+ "speaker" : "咨询师",
+ "end" : 6.7599999999999998,
+ "index" : 3,
+ "text" : "DJI 是 JK 去年与投资人聊的最多的话题。"
+ },
+ {
+ "start" : 8.0690000000000008,
+ "speaker" : "咨询师",
+ "end" : 10.898999999999999,
+ "index" : 4,
+ "text" : "直销中上市时创下了70倍 PE 的市值。"
+ },
+ {
+ "start" : 11.179,
+ "speaker" : "咨询师",
+ "end" : 16.818999999999999,
+ "index" : 5,
+ "text" : "6月18日,饮食市值继续大涨,逼近800亿元,资本市场再次一片狂欢。"
+ },
+ {
+ "start" : 18.059999999999999,
+ "speaker" : "咨询师",
+ "end" : 27.690000000000001,
+ "index" : 6,
+ "text" : "不同于其他公司上市后普发福利红包的热闹与喧嚣,影视公司内部的气氛却一如既往的平静与忙碌,员工该赶项目的赶项目。"
+ },
+ {
+ "start" : 28.23,
+ "speaker" : "咨询师",
+ "end" : 34.299999999999997,
+ "index" : 7,
+ "text" : "该加班的加班,不同的是,所有人都因为饮食换了一种身份而备受瞩目。"
+ },
+ {
+ "start" : 35.299999999999997,
+ "speaker" : "咨询师",
+ "end" : 39.100000000000001,
+ "index" : 8,
+ "text" : "上市这件事情和结婚一样,意味着自己的义务变了。"
+ },
+ {
+ "start" : 39.909999999999997,
+ "speaker" : "咨询师",
+ "end" : 42.469999999999999,
+ "index" : 9,
+ "text" : "虽然兴奋,但是身上的担子更重了。"
+ },
+ {
+ "start" : 43.189999999999998,
+ "speaker" : "咨询师",
+ "end" : 51.229999999999997,
+ "index" : 10,
+ "text" : "JK 在采访里提到,雷锋网了解到,近两个月来,影视进行了一轮较大范围的组织架构调整。"
+ },
+ {
+ "start" : 51.759999999999998,
+ "speaker" : "咨询师",
+ "end" : 57.359999999999999,
+ "index" : 11,
+ "text" : "将多条产品线进行重新整合,多番调整下饮食有何变化?"
+ },
+ {
+ "start" : 57.560000000000002,
+ "speaker" : "咨询师",
+ "end" : 60.359999999999999,
+ "index" : 12,
+ "text" : "欢迎添加微信 QQ501一起交流。"
+ },
+ {
+ "start" : 60.719999999999999,
+ "speaker" : "咨询师",
+ "end" : 72.599999999999994,
+ "index" : 13,
+ "text" : "年初至今饮食的团队规模扩充了不少,调整的过程虽有些波折,但对内部来说,这场变化也是为了让员工快速适应饮食的成长与规模化。"
+ },
+ {
+ "start" : 73.090000000000003,
+ "speaker" : "咨询师",
+ "end" : 80.969999999999999,
+ "index" : 14,
+ "text" : "从而去应对三家争霸,饮食今年压力最大,前有 DJI 后有追觅,都在布局全景相机。"
+ },
+ {
+ "start" : 81.329999999999998,
+ "speaker" : "咨询师",
+ "end" : 83.689999999999998,
+ "index" : 15,
+ "text" : "有一次 JK 语重心长地说。"
+ },
+ {
+ "start" : 84.040000000000006,
+ "speaker" : "咨询师",
+ "end" : 87.629999999999995,
+ "index" : 16,
+ "text" : "我们需要全面备战,一位饮食员工说道。"
+ },
+ {
+ "start" : 88.269999999999996,
+ "speaker" : "咨询师",
+ "end" : 93.629999999999995,
+ "index" : 17,
+ "text" : "赛道内一眼望去全是实力雄厚的对手,饮食的处境比想象中的艰难。"
+ },
+ {
+ "start" : 94.040000000000006,
+ "speaker" : "咨询师",
+ "end" : 95.510000000000005,
+ "index" : 18,
+ "text" : "而 IPO 只是一个分水岭。"
+ },
+ {
+ "start" : 96.510000000000005,
+ "speaker" : "咨询师",
+ "end" : 104.43000000000001,
+ "index" : 19,
+ "text" : "如果说以前的饮食需要证明自己能稳定盈利,那么现在的饮食则至少需要回答市场三个关键问题。"
+ },
+ {
+ "start" : 105.23999999999999,
+ "speaker" : "咨询师",
+ "end" : 108.52,
+ "index" : 20,
+ "text" : "屋子里的大象来势汹汹,饮食怎么应对?"
+ },
+ {
+ "start" : 109.23999999999999,
+ "speaker" : "咨询师",
+ "end" : 114.2,
+ "index" : 21,
+ "text" : "饮食到底值不值70倍的 PE 未来是否能守得住自己的市场份额?"
+ },
+ {
+ "start" : 114.92,
+ "speaker" : "咨询师",
+ "end" : 116,
+ "index" : 22,
+ "text" : "竞争如此胶灼。"
+ },
+ {
+ "start" : 116.59999999999999,
+ "speaker" : "咨询师",
+ "end" : 118,
+ "index" : 23,
+ "text" : "管理层是什么思考呢?"
+ },
+ {
+ "start" : 118.8,
+ "speaker" : "咨询师",
+ "end" : 123.04000000000001,
+ "index" : 24,
+ "text" : "0 DJI 兵临城下,饮食如何应对?"
+ },
+ {
+ "start" : 123.64,
+ "speaker" : "咨询师",
+ "end" : 128.03999999999999,
+ "index" : 25,
+ "text" : "今年 JK 在年会上承认,在 DJI 面前他们确实还是弟弟。"
+ },
+ {
+ "start" : 128.88,
+ "speaker" : "咨询师",
+ "end" : 129.96000000000001,
+ "index" : 26,
+ "text" : "承认归承认。"
+ },
+ {
+ "start" : 130.47,
+ "speaker" : "咨询师",
+ "end" : 137.91,
+ "index" : 27,
+ "text" : "JK 也同时在内部放话,战术上重视,战略上升维,做好打硬仗、跑马拉松的准备。"
+ },
+ {
+ "start" : 138.55000000000001,
+ "speaker" : "咨询师",
+ "end" : 140.71000000000001,
+ "index" : 28,
+ "text" : "他认为就像人跑马拉松。"
+ },
+ {
+ "start" : 141.11000000000001,
+ "speaker" : "咨询师",
+ "end" : 144.13999999999999,
+ "index" : 29,
+ "text" : "那个半跑的人或领跑的人还是很重要的。"
+ },
+ {
+ "start" : 144.41999999999999,
+ "speaker" : "咨询师",
+ "end" : 148.62,
+ "index" : 30,
+ "text" : "竞争对手给到你的启发远大于从你手上剥夺的东西。"
+ },
+ {
+ "start" : 149.5,
+ "speaker" : "咨询师",
+ "end" : 151.66,
+ "index" : 31,
+ "text" : "饮食备战的第一步是先发制人。"
+ },
+ {
+ "start" : 153.08000000000001,
+ "speaker" : "咨询师",
+ "end" : 159.80000000000001,
+ "index" : 32,
+ "text" : "Insta 3六0 x 五在4月抢先发布,这距离上一代产品 X4发布仅过去一年的时间。"
+ },
+ {
+ "start" : 160.03999999999999,
+ "speaker" : "咨询师",
+ "end" : 164.75999999999999,
+ "index" : 33,
+ "text" : "要知道此前 X2、X3两代的产品周期基本都是2年。"
+ },
+ {
+ "start" : 165.63999999999999,
+ "speaker" : "咨询师",
+ "end" : 174.34999999999999,
+ "index" : 34,
+ "text" : "另一边,饮食进一步强化产品和品牌营销,让消费者形成认知,全景就是 Instar 360的天下。"
+ },
+ {
+ "start" : 174.94999999999999,
+ "speaker" : "咨询师",
+ "end" : 187.75,
+ "index" : 35,
+ "text" : "今年2月以来影石开始不遗余力为产品造势,小到运动相机出了个手柄配件,大到发布新的全景相机 X5,通过广告投放加大了对目标消费者的市场渗透。"
+ },
+ {
+ "start" : 188.739,
+ "speaker" : "咨询师",
+ "end" : 199.84999999999999,
+ "index" : 36,
+ "text" : "雷锋网了解到,X5的广告营销基本覆盖了各个渠道的 KOL。"
+ },
+ {
+ "start" : 188.84999999999999,
+ "speaker" : "咨询师",
+ "end" : 194.21000000000001,
+ "index" : 37,
+ "text" : "坊间流传,今年 NST 三六零 x 五的广告预算比以往高出不少。"
+ },
+ {
+ "start" : 201.21000000000001,
+ "speaker" : "咨询师",
+ "end" : 208.72999999999999,
+ "index" : 38,
+ "text" : "凭借全新的产品,在大幅度的广告投流下,影石 X5发布初期就取得了比较可观的销量。"
+ },
+ {
+ "start" : 209.28999999999999,
+ "speaker" : "咨询师",
+ "end" : 212.09,
+ "index" : 39,
+ "text" : "大规模投放下,X5销量情况如何?"
+ },
+ {
+ "start" : 212.50899999999999,
+ "speaker" : "咨询师",
+ "end" : 223.02000000000001,
+ "index" : 40,
+ "text" : "饮食网罗了硬件3C 领域绝大多数的 KOL。"
+ },
+ {
+ "start" : 212.53999999999999,
+ "speaker" : "咨询师",
+ "end" : 215.30000000000001,
+ "index" : 41,
+ "text" : "欢迎添加微信 QQ501一起交流。"
+ },
+ {
+ "start" : 215.81999999999999,
+ "speaker" : "咨询师",
+ "end" : 219.34,
+ "index" : 42,
+
+ "text" : "至少目前来看,饮食的策略是有章法的。"
+ },
+ {
+ "start" : 223.68000000000001,
+ "speaker" : "咨询师",
+ "end" : 227.72,
+ "index" : 43,
+ "text" : "只要有新的 KOL 开始冒头,都会被饮食抢先签下。"
+ },
+ {
+ "start" : 228.40000000000001,
+ "speaker" : "咨询师",
+ "end" : 234.44,
+ "index" : 44,
+ "text" : "在长期重视营销的结果下,饮食逐渐形成了一套围绕 KOL 的营销方法论。"
+ },
+ {
+ "start" : 235.41,
+ "speaker" : "咨询师",
+ "end" : 240.80000000000001,
+ "index" : 45,
+ "text" : "而对面的 DGI 在营销上的态度始终模棱两可,时而强,时而弱。"
+ },
+ {
+ "start" : 241.36000000000001,
+ "speaker" : "咨询师",
+ "end" : 245.19999999999999,
+ "index" : 46,
+ "text" : "此前坊间有说法称营销曾经是 DGI 的盐碱地。"
+ },
+ {
+ "start" : 245.78,
+ "speaker" : "咨询师",
+ "end" : 255.46000000000001,
+ "index" : 47,
+ "text" : "公司不开展会,汪涛也不会在公众露面,市场他也不愿意投,品牌也不投,因为汪涛算不清楚这笔账的投入和产出比。"
+ },
+ {
+ "start" : 255.83000000000001,
+ "speaker" : "咨询师",
+ "end" : 257.02999999999997,
+ "index" : 48,
+ "text" : "算不清楚他就不投。"
+ },
+ {
+ "start" : 257.91000000000003,
+ "speaker" : "咨询师",
+ "end" : 265.67000000000002,
+ "index" : 49,
+ "text" : "王涛不愿意给 KOL 花钱,他觉得这些人什么都没干,躺着就赚了 DJI 的钱,谁都不能躺着赚我的钱。"
+ },
+ {
+ "start" : 266.39999999999998,
+ "speaker" : "咨询师",
+ "end" : 275.12,
+ "index" : 50,
+ "text" : "熟悉 DGI 的人士李阳向雷锋网透露,2020年以前,DGI 是比较重视 KOL 营销的,很多渠道的 KOL 都投了。"
+ },
+ {
+ "start" : 275.92000000000002,
+ "speaker" : "咨询师",
+ "end" : 279.14999999999998,
+ "index" : 51,
+ "text" : "谢佳走了之后这些合作项目就都停了。"
+ },
+ {
+ "start" : 279.67000000000002,
+ "speaker" : "咨询师",
+ "end" : 286.91000000000003,
+ "index" : 52,
+ "text" : "很长一段时间里,DGI 的市场团队一度是最没有存在感的部门,人手凋零,没几个人。"
+ },
+ {
+ "start" : 287.68000000000001,
+ "speaker" : "咨询师",
+ "end" : 298.43000000000001,
+ "index" : 53,
+ "text" : "对这些人来说,要想在汪涛那里拿到市场预算,就得向汪涛证明这些预算投了出去能得到多少钱的回报,这个问题没有人能回答出来。"
+ },
+ {
+ "start" : 299.18000000000001,
+ "speaker" : "咨询师",
+ "end" : 302.41000000000003,
+ "index" : 54,
+ "text" : "也因此,DJI 的市场人员阵亡率很高。"
+ },
+ {
+ "start" : 303.00999999999999,
+ "speaker" : "咨询师",
+ "end" : 309.29000000000002,
+ "index" : 55,
+ "text" : "某种程度上,DJI 不太重视营销,与它在无人机市场的强势领导地位有关。"
+ },
+ {
+ "start" : 310.02999999999997,
+ "speaker" : "咨询师",
+ "end" : 314.43000000000001,
+ "index" : 56,
+ "text" : "王涛认为,只要产品领导力在,营销就是可有可无的。"
+ },
+ {
+ "start" : 314.75,
+ "speaker" : "咨询师",
+ "end" : 319.58999999999997,
+ "index" : 57,
+ "text" : "但当 DGI 开始不断拓新品类,竞争对手的战力指数也更高时。"
+ },
+ {
+ "start" : 320.13999999999999,
+ "speaker" : "咨询师",
+ "end" : 329.22000000000003,
+ "index" : 58,
+ "text" : "几乎没有人能忽视营销的 buff 意识到威胁后,现在的 DGI 也一反常态,通过加大市场营销投入,穷追不舍。"
+ },
+ {
+ "start" : 330.26999999999998,
+ "speaker" : "咨询师",
+ "end" : 332.23000000000002,
+ "index" : 59,
+ "text" : "2024年火爆全网络的 pop"
+ }
+ ]
+ },
+ "summary" : "对话内容与医美咨询无关,咨询师全程未提及任何医美项目或服务。",
+ "customer_projects" : [
+
+ ],
+ "unmapped" : [
+
+ ],
+ "deal_analysis" : {
+ "status" : "未成交",
+ "intention" : {
+ "description" : "对话内容与医美咨询无关,咨询师全程未提及任何医美项目或服务,客户也未表达任何美容需求或兴趣。",
+ "rating" : "低"
+ },
+ "deal_reason" : {
+ "description" : "对话中未发现任何成交驱动因素。",
+ "reason" : [
+
+ ]
+ },
+ "no_deal_reason" : {
+ "description" : "对话内容完全偏离医美主题,咨询师未进行任何有效咨询引导,客户也未表达任何相关需求。",
+ "suggestion" : "1. 核实对话录音是否存在上传错误\n2. 重新培训咨询师掌握基础医美知识及对话引导技巧\n3. 建立咨询前问卷筛选机制,避免无效咨询占用资源",
+ "reason" : [
+ "需求不明确"
+ ]
+ }
+ },
+ "doctor_projects" : [
+
+ ],
+ "content" : "如何做产品? 怎么干? DJI 是 JK 去年与投资人聊的最多的话题。 直销中上市时创下了70倍 PE 的市值。 6月18日,饮食市值继续大涨,逼近800亿元,资本市场再次一片狂欢。 不同于其他公司上市后普发福利红包的热闹与喧嚣,影视公司内部的气氛却一如既往的平静与忙碌,员工该赶项目的赶项目。 该加班的加班,不同的是,所有人都因为饮食换了一种身份而备受瞩目。 上市这件事情和结婚一样,意味着自己的义务变了。 虽然兴奋,但是身上的担子更重了。 JK 在采访里提到,雷锋网了解到,近两个月来,影视进行了一轮较大范围的组织架构调整。 将多条产品线进行重新整合,多番调整下饮食有何变化? 欢迎添加微信 QQ501一起交流。 年初至今饮食的团队规模扩充了不少,调整的过程虽有些波折,但对内部来说,这场变化也是为了让员工快速适应饮食的成长与规模化。 从而去应对三家争霸,饮食今年压力最大,前有 DJI 后有追觅,都在布局全景相机。 有一次 JK 语重心长地说。 我们需要全面备战,一位饮食员工说道。 赛道内一眼望去全是实力雄厚的对手,饮食的处境比想象中的艰难。 而 IPO 只是一个分水岭。 如果说以前的饮食需要证明自己能稳定盈利,那么现在的饮食则至少需要回答市场三个关键问题。 屋子里的大象来势汹汹,饮食怎么应对? 饮食到底值不值70倍的 PE 未来是否能守得住自己的市场份额? 竞争如此胶灼。 管理层是什么思考呢? 0 DJI 兵临城下,饮食如何应对? 今年 JK 在年会上承认,在 DJI 面前他们确实还是弟弟。 承认归承认。 JK 也同时在内部放话,战术上重视,战略上升维,做好打硬仗、跑马拉松的准备。 他认为就像人跑马拉松。 那个半跑的人或领跑的人还是很重要的。 竞争对手给到你的启发远大于从你手上剥夺的东西。 饮食备战的第一步是先发制人。 Insta 3六0 x 五在4月抢先发布,这距离上一代产品 X4发布仅过去一年的时间。 要知道此前 X2、X3两代的产品周期基本都是2年。 另一边,饮食进一步强化产品和品牌营销,让消费者形成认知,全景就是 Instar 360的天下。 今年2月以来影石开始不遗余力为产品造势,小到运动相机出了个手柄配件,大到发布新的全景相机 X5,通过广告投放加大了对目标消费者的市场渗透。 雷锋网了解到,X5的广告营销基本覆盖了各个渠道的 KOL。 坊间流传,今年 NST 三六零 x 五的广告预算比以往高出不少。 凭借全新的产品,在大幅度的广告投流下,影石 X5发布初期就取得了比较可观的销量。 大规模投放下,X5销量情况如何? 饮食网罗了硬件3C 领域绝大多数的 KOL。 欢迎添加微信 QQ501一起交流。 至少目前来看,饮食的策略是有章法的。 只要有新的 KOL 开始冒头,都会被饮食抢先签下。 在长期重视营销的结果下,饮食逐渐形成了一套围绕 KOL 的营销方法论。 而对面的 DGI 在营销上的态度始终模棱两可,时而强,时而弱。 此前坊间有说法称营销曾经是 DGI 的盐碱地。 公司不开展会,汪涛也不会在公众露面,市场他也不愿意投,品牌也不投,因为汪涛算不清楚这笔账的投入和产出比。 算不清楚他就不投。 王涛不愿意给 KOL 花钱,他觉得这些人什么都没干,躺着就赚了 DJI 的钱,谁都不能躺着赚我的钱。 熟悉 DGI 的人士李阳向雷锋网透露,2020年以前,DGI 是比较重视 KOL 营销的,很多渠道的 KOL 都投了。 谢佳走了之后这些合作项目就都停了。 很长一段时间里,DGI 的市场团队一度是最没有存在感的部门,人手凋零,没几个人。 对这些人来说,要想在汪涛那里拿到市场预算,就得向汪涛证明这些预算投了出去能得到多少钱的回报,这个问题没有人能回答出来。 也因此,DJI 的市场人员阵亡率很高。 某种程度上,DJI 不太重视营销,与它在无人机市场的强势领导地位有关。 王涛认为,只要产品领导力在,营销就是可有可无的。 但当 DGI 开始不断拓新品类,竞争对手的战力指数也更高时。 几乎没有人能忽视营销的 buff 意识到威胁后,现在的 DGI 也一反常态,通过加大市场营销投入,穷追不舍。 2024年火爆全网络的 pop"
+ },
+ "start_time" : 1750836151869,
+ "end_time" : 1750836175418,
+ "task_id" : "task_7449d414-91cf-48c8-a6aa-be1691012141"
+ }
+ ],
+ "file_id" : "file_3c57ce78-4860-4efb-8e2b-e394e9d5ea55"
+}
+
diff --git a/modules/plaud-sdk/ios/Frameworks/PlaudWiFiSDK.xcframework/Info.plist b/modules/plaud-sdk/ios/Frameworks/PlaudWiFiSDK.xcframework/Info.plist
new file mode 100644
index 0000000..a4666c7
--- /dev/null
+++ b/modules/plaud-sdk/ios/Frameworks/PlaudWiFiSDK.xcframework/Info.plist
@@ -0,0 +1,27 @@
+
+
+
+
+ AvailableLibraries
+
+
+ BinaryPath
+ PlaudWiFiSDK.framework/PlaudWiFiSDK
+ LibraryIdentifier
+ ios-arm64
+ LibraryPath
+ PlaudWiFiSDK.framework
+ SupportedArchitectures
+
+ arm64
+
+ SupportedPlatform
+ ios
+
+
+ CFBundlePackageType
+ XFWK
+ XCFrameworkFormatVersion
+ 1.0
+
+
diff --git a/modules/plaud-sdk/ios/Frameworks/PlaudWiFiSDK.xcframework/ios-arm64/PlaudWiFiSDK.framework/Headers/JXWebSocketServer.h b/modules/plaud-sdk/ios/Frameworks/PlaudWiFiSDK.xcframework/ios-arm64/PlaudWiFiSDK.framework/Headers/JXWebSocketServer.h
new file mode 100644
index 0000000..52c571b
--- /dev/null
+++ b/modules/plaud-sdk/ios/Frameworks/PlaudWiFiSDK.xcframework/ios-arm64/PlaudWiFiSDK.framework/Headers/JXWebSocketServer.h
@@ -0,0 +1,44 @@
+//
+// JXWebSocketServer.h
+// PenBleSDK
+//
+// Created by 天诺泰 on 2019/12/13.
+// Copyright © 2019 天诺泰. All rights reserved.
+//
+
+#import
+
+
+NS_ASSUME_NONNULL_BEGIN
+
+@protocol JXWebSocketServerDelegate
+
+- (void)serverDidStart;
+- (void)serverDidFailWithError:(NSError *)error;
+- (void)serverDidStop;
+
+- (void)clientDidOpen;
+- (void)clientDidReceiveText:(NSString *)text;
+- (void)clientDidReceiveData:(NSData *)data;
+- (void)clientDidFailWithError:(NSError *)error;
+- (void)clientDidCloseWithCode:(NSInteger)code reason:(NSString *)reason wasClean:(BOOL)wasClean;
+
+@end
+
+@interface JXWebSocketServer : NSObject
+
+#pragma mark - Properties
+
+@property (nonatomic, weak) id delegate;
+
+#pragma mark - Actions
+
+- (void)startListen:(NSInteger)port;
+- (void)sendText:(NSString *)text;
+- (void)sendData:(NSData *)data;
+- (void)closeClient;
+- (void)close;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/modules/plaud-sdk/ios/Frameworks/PlaudWiFiSDK.xcframework/ios-arm64/PlaudWiFiSDK.framework/Headers/PlaudWiFiSDK-Swift.h b/modules/plaud-sdk/ios/Frameworks/PlaudWiFiSDK.xcframework/ios-arm64/PlaudWiFiSDK.framework/Headers/PlaudWiFiSDK-Swift.h
new file mode 100644
index 0000000..6413abc
--- /dev/null
+++ b/modules/plaud-sdk/ios/Frameworks/PlaudWiFiSDK.xcframework/ios-arm64/PlaudWiFiSDK.framework/Headers/PlaudWiFiSDK-Swift.h
@@ -0,0 +1,587 @@
+#if 0
+#elif defined(__arm64__) && __arm64__
+// Generated by Apple Swift version 6.0.3 effective-5.10 (swiftlang-6.0.3.1.10 clang-1600.0.30.1)
+#ifndef PLAUDWIFISDK_SWIFT_H
+#define PLAUDWIFISDK_SWIFT_H
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wgcc-compat"
+
+#if !defined(__has_include)
+# define __has_include(x) 0
+#endif
+#if !defined(__has_attribute)
+# define __has_attribute(x) 0
+#endif
+#if !defined(__has_feature)
+# define __has_feature(x) 0
+#endif
+#if !defined(__has_warning)
+# define __has_warning(x) 0
+#endif
+
+#if __has_include()
+# include
+#endif
+
+#pragma clang diagnostic ignored "-Wauto-import"
+#if defined(__OBJC__)
+#include
+#endif
+#if defined(__cplusplus)
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#else
+#include
+#include
+#include
+#include
+#endif
+#if defined(__cplusplus)
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wnon-modular-include-in-framework-module"
+#if defined(__arm64e__) && __has_include()
+# include
+#else
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wreserved-macro-identifier"
+# ifndef __ptrauth_swift_value_witness_function_pointer
+# define __ptrauth_swift_value_witness_function_pointer(x)
+# endif
+# ifndef __ptrauth_swift_class_method_pointer
+# define __ptrauth_swift_class_method_pointer(x)
+# endif
+#pragma clang diagnostic pop
+#endif
+#pragma clang diagnostic pop
+#endif
+
+#if !defined(SWIFT_TYPEDEFS)
+# define SWIFT_TYPEDEFS 1
+# if __has_include()
+# include
+# elif !defined(__cplusplus)
+typedef uint_least16_t char16_t;
+typedef uint_least32_t char32_t;
+# endif
+typedef float swift_float2 __attribute__((__ext_vector_type__(2)));
+typedef float swift_float3 __attribute__((__ext_vector_type__(3)));
+typedef float swift_float4 __attribute__((__ext_vector_type__(4)));
+typedef double swift_double2 __attribute__((__ext_vector_type__(2)));
+typedef double swift_double3 __attribute__((__ext_vector_type__(3)));
+typedef double swift_double4 __attribute__((__ext_vector_type__(4)));
+typedef int swift_int2 __attribute__((__ext_vector_type__(2)));
+typedef int swift_int3 __attribute__((__ext_vector_type__(3)));
+typedef int swift_int4 __attribute__((__ext_vector_type__(4)));
+typedef unsigned int swift_uint2 __attribute__((__ext_vector_type__(2)));
+typedef unsigned int swift_uint3 __attribute__((__ext_vector_type__(3)));
+typedef unsigned int swift_uint4 __attribute__((__ext_vector_type__(4)));
+#endif
+
+#if !defined(SWIFT_PASTE)
+# define SWIFT_PASTE_HELPER(x, y) x##y
+# define SWIFT_PASTE(x, y) SWIFT_PASTE_HELPER(x, y)
+#endif
+#if !defined(SWIFT_METATYPE)
+# define SWIFT_METATYPE(X) Class
+#endif
+#if !defined(SWIFT_CLASS_PROPERTY)
+# if __has_feature(objc_class_property)
+# define SWIFT_CLASS_PROPERTY(...) __VA_ARGS__
+# else
+# define SWIFT_CLASS_PROPERTY(...)
+# endif
+#endif
+#if !defined(SWIFT_RUNTIME_NAME)
+# if __has_attribute(objc_runtime_name)
+# define SWIFT_RUNTIME_NAME(X) __attribute__((objc_runtime_name(X)))
+# else
+# define SWIFT_RUNTIME_NAME(X)
+# endif
+#endif
+#if !defined(SWIFT_COMPILE_NAME)
+# if __has_attribute(swift_name)
+# define SWIFT_COMPILE_NAME(X) __attribute__((swift_name(X)))
+# else
+# define SWIFT_COMPILE_NAME(X)
+# endif
+#endif
+#if !defined(SWIFT_METHOD_FAMILY)
+# if __has_attribute(objc_method_family)
+# define SWIFT_METHOD_FAMILY(X) __attribute__((objc_method_family(X)))
+# else
+# define SWIFT_METHOD_FAMILY(X)
+# endif
+#endif
+#if !defined(SWIFT_NOESCAPE)
+# if __has_attribute(noescape)
+# define SWIFT_NOESCAPE __attribute__((noescape))
+# else
+# define SWIFT_NOESCAPE
+# endif
+#endif
+#if !defined(SWIFT_RELEASES_ARGUMENT)
+# if __has_attribute(ns_consumed)
+# define SWIFT_RELEASES_ARGUMENT __attribute__((ns_consumed))
+# else
+# define SWIFT_RELEASES_ARGUMENT
+# endif
+#endif
+#if !defined(SWIFT_WARN_UNUSED_RESULT)
+# if __has_attribute(warn_unused_result)
+# define SWIFT_WARN_UNUSED_RESULT __attribute__((warn_unused_result))
+# else
+# define SWIFT_WARN_UNUSED_RESULT
+# endif
+#endif
+#if !defined(SWIFT_NORETURN)
+# if __has_attribute(noreturn)
+# define SWIFT_NORETURN __attribute__((noreturn))
+# else
+# define SWIFT_NORETURN
+# endif
+#endif
+#if !defined(SWIFT_CLASS_EXTRA)
+# define SWIFT_CLASS_EXTRA
+#endif
+#if !defined(SWIFT_PROTOCOL_EXTRA)
+# define SWIFT_PROTOCOL_EXTRA
+#endif
+#if !defined(SWIFT_ENUM_EXTRA)
+# define SWIFT_ENUM_EXTRA
+#endif
+#if !defined(SWIFT_CLASS)
+# if __has_attribute(objc_subclassing_restricted)
+# define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_CLASS_EXTRA
+# define SWIFT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA
+# else
+# define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA
+# define SWIFT_CLASS_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA
+# endif
+#endif
+#if !defined(SWIFT_RESILIENT_CLASS)
+# if __has_attribute(objc_class_stub)
+# define SWIFT_RESILIENT_CLASS(SWIFT_NAME) SWIFT_CLASS(SWIFT_NAME) __attribute__((objc_class_stub))
+# define SWIFT_RESILIENT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_class_stub)) SWIFT_CLASS_NAMED(SWIFT_NAME)
+# else
+# define SWIFT_RESILIENT_CLASS(SWIFT_NAME) SWIFT_CLASS(SWIFT_NAME)
+# define SWIFT_RESILIENT_CLASS_NAMED(SWIFT_NAME) SWIFT_CLASS_NAMED(SWIFT_NAME)
+# endif
+#endif
+#if !defined(SWIFT_PROTOCOL)
+# define SWIFT_PROTOCOL(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA
+# define SWIFT_PROTOCOL_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA
+#endif
+#if !defined(SWIFT_EXTENSION)
+# define SWIFT_EXTENSION(M) SWIFT_PASTE(M##_Swift_, __LINE__)
+#endif
+#if !defined(OBJC_DESIGNATED_INITIALIZER)
+# if __has_attribute(objc_designated_initializer)
+# define OBJC_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer))
+# else
+# define OBJC_DESIGNATED_INITIALIZER
+# endif
+#endif
+#if !defined(SWIFT_ENUM_ATTR)
+# if __has_attribute(enum_extensibility)
+# define SWIFT_ENUM_ATTR(_extensibility) __attribute__((enum_extensibility(_extensibility)))
+# else
+# define SWIFT_ENUM_ATTR(_extensibility)
+# endif
+#endif
+#if !defined(SWIFT_ENUM)
+# define SWIFT_ENUM(_type, _name, _extensibility) enum _name : _type _name; enum SWIFT_ENUM_ATTR(_extensibility) SWIFT_ENUM_EXTRA _name : _type
+# if __has_feature(generalized_swift_name)
+# define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME, _extensibility) enum _name : _type _name SWIFT_COMPILE_NAME(SWIFT_NAME); enum SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_ENUM_ATTR(_extensibility) SWIFT_ENUM_EXTRA _name : _type
+# else
+# define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME, _extensibility) SWIFT_ENUM(_type, _name, _extensibility)
+# endif
+#endif
+#if !defined(SWIFT_UNAVAILABLE)
+# define SWIFT_UNAVAILABLE __attribute__((unavailable))
+#endif
+#if !defined(SWIFT_UNAVAILABLE_MSG)
+# define SWIFT_UNAVAILABLE_MSG(msg) __attribute__((unavailable(msg)))
+#endif
+#if !defined(SWIFT_AVAILABILITY)
+# define SWIFT_AVAILABILITY(plat, ...) __attribute__((availability(plat, __VA_ARGS__)))
+#endif
+#if !defined(SWIFT_WEAK_IMPORT)
+# define SWIFT_WEAK_IMPORT __attribute__((weak_import))
+#endif
+#if !defined(SWIFT_DEPRECATED)
+# define SWIFT_DEPRECATED __attribute__((deprecated))
+#endif
+#if !defined(SWIFT_DEPRECATED_MSG)
+# define SWIFT_DEPRECATED_MSG(...) __attribute__((deprecated(__VA_ARGS__)))
+#endif
+#if !defined(SWIFT_DEPRECATED_OBJC)
+# if __has_feature(attribute_diagnose_if_objc)
+# define SWIFT_DEPRECATED_OBJC(Msg) __attribute__((diagnose_if(1, Msg, "warning")))
+# else
+# define SWIFT_DEPRECATED_OBJC(Msg) SWIFT_DEPRECATED_MSG(Msg)
+# endif
+#endif
+#if defined(__OBJC__)
+#if !defined(IBSegueAction)
+# define IBSegueAction
+#endif
+#endif
+#if !defined(SWIFT_EXTERN)
+# if defined(__cplusplus)
+# define SWIFT_EXTERN extern "C"
+# else
+# define SWIFT_EXTERN extern
+# endif
+#endif
+#if !defined(SWIFT_CALL)
+# define SWIFT_CALL __attribute__((swiftcall))
+#endif
+#if !defined(SWIFT_INDIRECT_RESULT)
+# define SWIFT_INDIRECT_RESULT __attribute__((swift_indirect_result))
+#endif
+#if !defined(SWIFT_CONTEXT)
+# define SWIFT_CONTEXT __attribute__((swift_context))
+#endif
+#if !defined(SWIFT_ERROR_RESULT)
+# define SWIFT_ERROR_RESULT __attribute__((swift_error_result))
+#endif
+#if defined(__cplusplus)
+# define SWIFT_NOEXCEPT noexcept
+#else
+# define SWIFT_NOEXCEPT
+#endif
+#if !defined(SWIFT_C_INLINE_THUNK)
+# if __has_attribute(always_inline)
+# if __has_attribute(nodebug)
+# define SWIFT_C_INLINE_THUNK inline __attribute__((always_inline)) __attribute__((nodebug))
+# else
+# define SWIFT_C_INLINE_THUNK inline __attribute__((always_inline))
+# endif
+# else
+# define SWIFT_C_INLINE_THUNK inline
+# endif
+#endif
+#if defined(_WIN32)
+#if !defined(SWIFT_IMPORT_STDLIB_SYMBOL)
+# define SWIFT_IMPORT_STDLIB_SYMBOL __declspec(dllimport)
+#endif
+#else
+#if !defined(SWIFT_IMPORT_STDLIB_SYMBOL)
+# define SWIFT_IMPORT_STDLIB_SYMBOL
+#endif
+#endif
+#if defined(__OBJC__)
+#if __has_feature(objc_modules)
+#if __has_warning("-Watimport-in-framework-header")
+#pragma clang diagnostic ignored "-Watimport-in-framework-header"
+#endif
+@import Dispatch;
+@import Foundation;
+@import ObjectiveC;
+#endif
+
+#import
+
+#endif
+#pragma clang diagnostic ignored "-Wproperty-attribute-mismatch"
+#pragma clang diagnostic ignored "-Wduplicate-method-arg"
+#if __has_warning("-Wpragma-clang-attribute")
+# pragma clang diagnostic ignored "-Wpragma-clang-attribute"
+#endif
+#pragma clang diagnostic ignored "-Wunknown-pragmas"
+#pragma clang diagnostic ignored "-Wnullability"
+#pragma clang diagnostic ignored "-Wdollar-in-identifier-extension"
+#pragma clang diagnostic ignored "-Wunsafe-buffer-usage"
+
+#if __has_attribute(external_source_symbol)
+# pragma push_macro("any")
+# undef any
+# pragma clang attribute push(__attribute__((external_source_symbol(language="Swift", defined_in="PlaudWiFiSDK",generated_declaration))), apply_to=any(function,enum,objc_interface,objc_category,objc_protocol))
+# pragma pop_macro("any")
+#endif
+
+#if defined(__OBJC__)
+@class BleDevice;
+
+/// 一个辅助工具类,方便判断是否连接着WiFi或蓝牙,以及获取BleDevice,调用一些共有的方法
+SWIFT_CLASS("_TtC12PlaudWiFiSDK5Agent")
+@interface Agent : NSObject
+/// 单例
+SWIFT_CLASS_PROPERTY(@property (nonatomic, class, readonly, strong) Agent * _Nonnull shared;)
++ (Agent * _Nonnull)shared SWIFT_WARN_UNUSED_RESULT;
+- (nonnull instancetype)init SWIFT_UNAVAILABLE;
++ (nonnull instancetype)new SWIFT_UNAVAILABLE_MSG("-init is unavailable");
+/// 是否连接着设备(WiFi或者蓝牙)
+- (BOOL)isDeviceConnect SWIFT_WARN_UNUSED_RESULT;
+/// 如果有一个连着,获取连着的设备信息
+- (BleDevice * _Nullable)bleDevice SWIFT_WARN_UNUSED_RESULT;
+/// 获取文件列表
+/// \param uid 命令id,建议传时间戳
+///
+/// \param sessionId 起始文件id
+///
+/// \param single 是否仅获取当前文件信息,默认是否
+///
+- (void)getFileList:(NSInteger)uid :(NSInteger)sessionId :(BOOL)single;
+/// 同步文件
+/// \param sessionId 文件id
+///
+/// \param start 起始偏移量(字节)
+///
+/// \param end 结束偏移量(字节)
+///
+/// \param decode 是否同时解码
+///
+/// \param scene 场景,WiFi才有的参数,默认值1就好
+///
+- (void)syncFile:(NSInteger)sessionId :(NSInteger)start :(NSInteger)end :(BOOL)decode :(NSInteger)scene;
+/// 停止文件同步
+/// \param sessionId 文件id,蓝牙状态下不需要
+///
+/// \param scene 场景,WiFi才有的参数,默认值就好
+///
+- (void)stopSyncFile:(NSInteger)sessionId :(NSInteger)scene;
+/// 删除文件
+/// \param sessionId 文件id
+///
+/// \param scene 场景,WiFi才有的参数,默认值就好
+///
+- (void)deleteFile:(NSInteger)sessionId :(NSInteger)scene;
+/// 正在下载的sessionId(如果有的话)或者正在录音的sessionId(如果正在录音的话)
+- (NSInteger)sessionId SWIFT_WARN_UNUSED_RESULT;
+/// 是否正在下载
+- (BOOL)isDownloading SWIFT_WARN_UNUSED_RESULT;
+/// 是否正在录音
+- (BOOL)isRecording SWIFT_WARN_UNUSED_RESULT;
+@end
+
+@protocol WiFiAgentProtocol;
+@class NSString;
+
+/// 需要打开Access WiFi Information和Hotspot Configuration
+SWIFT_CLASS("_TtC12PlaudWiFiSDK9WiFiAgent")
+@interface WiFiAgent : NSObject
+/// 单例
+SWIFT_CLASS_PROPERTY(@property (nonatomic, class, readonly, strong) WiFiAgent * _Nonnull shared;)
++ (WiFiAgent * _Nonnull)shared SWIFT_WARN_UNUSED_RESULT;
+/// 用于主动结束WiFi重连(调用connectWiFi会设置为true,主动设置为false后不会继续重连,)
+@property (nonatomic) BOOL connectLoop;
+/// 当前同步(下载)文件的sessionId
+@property (nonatomic, readonly) NSInteger sessionId;
+/// 是否正在同步(下载)文件
+@property (nonatomic, readonly) BOOL isDownloading;
+/// 代理
+@property (nonatomic, weak) id _Nullable delegate;
+/// 命令回调线程,默认是主线程
+@property (nonatomic, strong) dispatch_queue_t _Nonnull cmdDelegateQueue;
+/// 设备信息需要从蓝牙模块传递过来
+/// 在蓝牙回调bleWiFiOpen的时候赋值:WiFiAgent.shared.bleDevice = BleAgent.shared.bleDevice
+@property (nonatomic, strong) BleDevice * _Nullable bleDevice;
+- (nonnull instancetype)init SWIFT_UNAVAILABLE;
++ (nonnull instancetype)new SWIFT_UNAVAILABLE_MSG("-init is unavailable");
+/// 打开 release 下调试日志,方便追踪问题
+- (void)openReleaseLog:(BOOL)opened :(void (^ _Nullable)(NSString * _Nonnull))backBlock;
+/// 打开sdk的调试日志,或者回调日志
+- (void)openLog:(BOOL)opened :(void (^ _Nullable)(NSString * _Nonnull))backBlock;
+/// iOS 11.0以下使用该方法,会循环检查是否已连接到指定WiFi直到超时
+/// \param ssid WiFi名称
+///
+/// \param overtimeSec 超时时间,默认30秒
+///
+- (void)listenPort:(NSString * _Nonnull)ssid :(NSInteger)overtimeSec;
+/// 通过WiFi名称和密码连接到指定WiFi
+/// iOS 11.0及以上用这个方法直连WiFi,之前的版本需要弹窗引导用户到设置里面手动连接
+/// \param ssid WiFi名称
+///
+/// \param passphrase 密码
+///
+/// \param overtimeSec 超时时间,默认60秒
+///
+- (void)connectWifi:(NSString * _Nonnull)ssid :(NSString * _Nonnull)passphrase :(NSInteger)overtimeSec :(BOOL)needRetry SWIFT_AVAILABILITY(ios,introduced=11.0);
+/// 取消轮询连接 wifi
+- (void)cancelConnectWifi;
+/// 清理所有WiFi配置缓存
+- (void)clearAllWiFiConfigurations SWIFT_AVAILABILITY(ios,introduced=11.0);
+/// 清理所有WiFi配置缓存(兼容iOS 11.0以下版本)
+- (void)clearAllWiFiConfigurationsCompat;
+/// 断开连接
+- (void)disconnect;
+@end
+
+
+@interface WiFiAgent (SWIFT_EXTENSION(PlaudWiFiSDK))
+/// 获取当前连接的WiFi名称
+/// app需要添加Access WiFi Information权限(ios 12.0以后)
+- (NSString * _Nullable)getCurrentWiFiName SWIFT_WARN_UNUSED_RESULT;
+/// 方法4:带重试机制的WiFi名称获取
+- (NSString * _Nullable)getCurrentWiFiNameWithRetryWithMaxRetries:(NSInteger)maxRetries delay:(NSTimeInterval)delay SWIFT_WARN_UNUSED_RESULT;
+@end
+
+@class NSData;
+
+@interface WiFiAgent (SWIFT_EXTENSION(PlaudWiFiSDK))
+- (void)serverDidStart;
+- (void)serverDidFailWithError:(NSError * _Nonnull)error;
+- (void)serverDidStop;
+- (void)clientDidOpen;
+- (void)clientDidReceiveText:(NSString * _Nonnull)text;
+- (void)clientDidReceiveData:(NSData * _Nonnull)data;
+- (void)clientDidFailWithError:(NSError * _Nonnull)error;
+- (void)clientDidCloseWithCode:(NSInteger)code reason:(NSString * _Nonnull)reason wasClean:(BOOL)wasClean;
+@end
+
+
+@interface WiFiAgent (SWIFT_EXTENSION(PlaudWiFiSDK))
+/// 是否已成功建立WebSocket连接(app可以发送请求的前提)
+- (BOOL)isWebSocketConnected SWIFT_WARN_UNUSED_RESULT;
+/// 速率测试(cmd=100)
+/// \param onOff 开始或结束
+///
+/// \param packSize 测试包大小
+///
+- (void)appWiFiRate:(BOOL)onOff :(NSInteger)packSize;
+/// 删除文件(cmd=14)
+/// \param sessionId 录音id
+///
+/// \param scene 场景,默认1
+///
+- (void)appDeleteFile:(NSInteger)sessionId :(NSInteger)scene;
+/// 延长WiFi退出时间(cmd=16)
+- (void)appExtendWifiExitTime;
+/// 停止文件同步(cmd=15)
+/// \param sessionId 录音id
+///
+/// \param scene 场景,默认1
+///
+- (void)appStopSyncFile:(NSInteger)sessionId :(NSInteger)scene;
+/// 文件同步(cmd=12)
+/// \param sessionId 录音id
+///
+/// \param start 起始位置(是文件偏移量,不是时间)
+///
+/// \param end 结束位置(默认0,到文件结束)
+///
+/// \param scene 录音场景,默认1
+///
+- (void)appSyncFile:(NSInteger)sessionId :(NSInteger)start :(NSInteger)end :(NSInteger)scene;
+/// 获取文件列表(app发起 cmd=11)
+/// \param uid 请求的uid,新的请求会自然覆盖老的请求
+///
+/// \param sessionId 起始sessionId
+///
+/// \param single 是否仅获取当前文件信息,默认是否,
+///
+- (void)appGetFileList:(NSInteger)uid :(NSInteger)sessionId :(BOOL)single;
+- (void)startPushOTA:(NSInteger)uid :(NSInteger)fileSize crc:(NSInteger)crc :(NSInteger)toVersion;
+- (void)sendFilePackToPenWithType:(NSInteger)type start:(int32_t)start len:(int32_t)len last:(BOOL)last uid:(int32_t)uid binData:(NSData * _Nullable)binData;
+@end
+
+
+@class BleFile;
+
+SWIFT_PROTOCOL("_TtP12PlaudWiFiSDK17WiFiAgentProtocol_")
+@protocol WiFiAgentProtocol
+/// 通用错误
+/// \param cmd 错误指令
+///
+/// \param status 错误码
+///
+- (void)wifiCommonErr:(NSInteger)cmd :(NSInteger)status;
+/// 握手结果
+/// \param status 0 成功,其他失败
+///
+- (void)wifiHandshake:(NSInteger)status;
+/// 电池电量和电池电压
+/// \param power 电池电量,百分比
+///
+/// \param voltage 电池电压,mv
+///
+- (void)wifiPower:(NSInteger)power :(NSInteger)voltage;
+/// 获取录音列表失败
+/// \param status 错误码
+///
+- (void)wifiFileListFail:(NSInteger)status;
+/// 获取录音列表
+/// \param files 录音列表
+///
+- (void)wifiFileList:(NSArray * _Nonnull)files;
+/// 文件同步–文件状态
+/// \param sessionId 录音id
+///
+/// \param status 状态
+///
+- (void)wifiSyncFile:(NSInteger)sessionId :(NSInteger)status;
+/// 文件同步–文件数据
+/// \param sessionId 录音id
+///
+/// \param offset 文件偏移量(字节)
+///
+/// \param count 文件长度(字节)
+///
+/// \param binData 数据
+///
+- (void)wifiSyncFileData:(NSInteger)sessionId :(NSInteger)offset :(NSInteger)count :(NSData * _Nonnull)binData;
+/// 一个文件下载完了
+- (void)wifiDataComplete;
+/// 文件同步停止
+/// \param status 状态 0 成功
+///
+- (void)wifiSyncFileStop:(NSInteger)status;
+/// 文件删除结果
+/// \param sessionId 录音id
+///
+/// \param status 删除结果 0 成功,>0 失败原因
+///
+- (void)wifiFileDelete:(NSInteger)sessionId :(NSInteger)status;
+/// 客户端异常断开,等待重连
+/// 请设置 BleAgent.shared.setWiFiState(false)
+- (void)wifiClientFail;
+/// WiFi关闭通知
+/// \param status 状态 -1 是 didFailWithError; -2 是超时未连接; -3 NEHotspotConfigurationManager直连异常
+///
+- (void)wifiClose:(NSInteger)status;
+/// 速率测试失败
+/// \param status 错误码
+///
+- (void)wifiRateFail:(NSInteger)status;
+/// 速率测试
+/// \param instantRate 瞬时速率
+///
+/// \param averageRate 平均速率
+///
+/// \param lossRate 丢包率
+///
+- (void)wifiRate:(NSInteger)instantRate :(NSInteger)averageRate :(double)lossRate;
+/// 获取笔端日志失败
+/// \param status 错误码
+///
+- (void)wifiLogsFail:(NSInteger)status;
+/// 笔端日志
+/// \param logData 日志数据
+///
+- (void)wifiLogs:(NSData * _Nullable)logData;
+/// 笔端发送tips给app
+/// \param tips 0 无提示 1 笔端录音键按下
+///
+- (void)wifiTips:(NSInteger)tips;
+- (void)penRequestOTADataWithStart:(NSInteger)start end:(NSInteger)end payloadSize:(NSInteger)payloadSize uid:(NSInteger)uid sendRatePPS:(NSInteger)sendRatePPS;
+- (void)wifiOTAStatus:(NSInteger)status :(NSInteger)uid;
+@end
+
+#endif
+#if __has_attribute(external_source_symbol)
+# pragma clang attribute pop
+#endif
+#if defined(__cplusplus)
+#endif
+#pragma clang diagnostic pop
+#endif
+
+#else
+#error unsupported Swift architecture
+#endif
diff --git a/modules/plaud-sdk/ios/Frameworks/PlaudWiFiSDK.xcframework/ios-arm64/PlaudWiFiSDK.framework/Headers/PlaudWiFiSDK.h b/modules/plaud-sdk/ios/Frameworks/PlaudWiFiSDK.xcframework/ios-arm64/PlaudWiFiSDK.framework/Headers/PlaudWiFiSDK.h
new file mode 100644
index 0000000..6cf2bd6
--- /dev/null
+++ b/modules/plaud-sdk/ios/Frameworks/PlaudWiFiSDK.xcframework/ios-arm64/PlaudWiFiSDK.framework/Headers/PlaudWiFiSDK.h
@@ -0,0 +1,23 @@
+//
+// PlaudWiFiSDK.h
+// PlaudWiFiSDK
+//
+// Copyright © 2025 NiceBuild. All rights reserved.
+//
+
+#import
+
+//! Project version number for PlaudWiFiSDK.
+FOUNDATION_EXPORT double PlaudWiFiSDKVersionNumber;
+
+//! Project version string for PlaudWiFiSDK.
+FOUNDATION_EXPORT const unsigned char PlaudWiFiSDKVersionString[];
+
+// ObjC types from the embedded PenWiFiSDK static library
+#import
+
+// PlaudWiFiSDK-Swift.h is auto-generated by Xcode (all Swift @objc types are
+// compiled directly into this framework — no separate PenWiFiSDK module needed).
+#if __has_include()
+#import
+#endif
diff --git a/modules/plaud-sdk/ios/Frameworks/PlaudWiFiSDK.xcframework/ios-arm64/PlaudWiFiSDK.framework/Info.plist b/modules/plaud-sdk/ios/Frameworks/PlaudWiFiSDK.xcframework/ios-arm64/PlaudWiFiSDK.framework/Info.plist
new file mode 100644
index 0000000..151731a
--- /dev/null
+++ b/modules/plaud-sdk/ios/Frameworks/PlaudWiFiSDK.xcframework/ios-arm64/PlaudWiFiSDK.framework/Info.plist
@@ -0,0 +1,55 @@
+
+
+
+
+ BuildMachineOSBuild
+ 24G90
+ CFBundleDevelopmentRegion
+ en
+ CFBundleExecutable
+ PlaudWiFiSDK
+ CFBundleIdentifier
+ com.plaud.sdk.PlaudWiFiSDK
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ PlaudWiFiSDK
+ CFBundlePackageType
+ FMWK
+ CFBundleShortVersionString
+ 1.0
+ CFBundleSupportedPlatforms
+
+ iPhoneOS
+
+ CFBundleVersion
+ 1
+ DTCompiler
+ com.apple.compilers.llvm.clang.1_0
+ DTPlatformBuild
+ 22C146
+ DTPlatformName
+ iphoneos
+ DTPlatformVersion
+ 18.2
+ DTSDKBuild
+ 22C146
+ DTSDKName
+ iphoneos18.2
+ DTXcode
+ 1620
+ DTXcodeBuild
+ 16C5032a
+ MinimumOSVersion
+ 14.0
+ UIDeviceFamily
+
+ 1
+ 2
+
+ UIRequiredDeviceCapabilities
+
+ arm64
+
+
+
diff --git a/modules/plaud-sdk/ios/Frameworks/PlaudWiFiSDK.xcframework/ios-arm64/PlaudWiFiSDK.framework/Modules/PlaudWiFiSDK.swiftmodule/Project/arm64-apple-ios.swiftsourceinfo b/modules/plaud-sdk/ios/Frameworks/PlaudWiFiSDK.xcframework/ios-arm64/PlaudWiFiSDK.framework/Modules/PlaudWiFiSDK.swiftmodule/Project/arm64-apple-ios.swiftsourceinfo
new file mode 100644
index 0000000..46e9a1f
Binary files /dev/null and b/modules/plaud-sdk/ios/Frameworks/PlaudWiFiSDK.xcframework/ios-arm64/PlaudWiFiSDK.framework/Modules/PlaudWiFiSDK.swiftmodule/Project/arm64-apple-ios.swiftsourceinfo differ
diff --git a/modules/plaud-sdk/ios/Frameworks/PlaudWiFiSDK.xcframework/ios-arm64/PlaudWiFiSDK.framework/Modules/PlaudWiFiSDK.swiftmodule/arm64-apple-ios.abi.json b/modules/plaud-sdk/ios/Frameworks/PlaudWiFiSDK.xcframework/ios-arm64/PlaudWiFiSDK.framework/Modules/PlaudWiFiSDK.swiftmodule/arm64-apple-ios.abi.json
new file mode 100644
index 0000000..cde8b0b
--- /dev/null
+++ b/modules/plaud-sdk/ios/Frameworks/PlaudWiFiSDK.xcframework/ios-arm64/PlaudWiFiSDK.framework/Modules/PlaudWiFiSDK.swiftmodule/arm64-apple-ios.abi.json
@@ -0,0 +1,4684 @@
+{
+ "ABIRoot": {
+ "kind": "Root",
+ "name": "PlaudWiFiSDK",
+ "printedName": "PlaudWiFiSDK",
+ "children": [
+ {
+ "kind": "Import",
+ "name": "Foundation",
+ "printedName": "Foundation",
+ "declKind": "Import",
+ "moduleName": "PlaudWiFiSDK",
+ "declAttributes": [
+ "RawDocComment"
+ ]
+ },
+ {
+ "kind": "Import",
+ "name": "PenBleSDK",
+ "printedName": "PenBleSDK",
+ "declKind": "Import",
+ "moduleName": "PlaudWiFiSDK"
+ },
+ {
+ "kind": "TypeDecl",
+ "name": "Agent",
+ "printedName": "Agent",
+ "children": [
+ {
+ "kind": "Var",
+ "name": "shared",
+ "printedName": "shared",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Agent",
+ "printedName": "PlaudWiFiSDK.Agent",
+ "usr": "c:@M@PlaudWiFiSDK@objc(cs)Agent"
+ }
+ ],
+ "declKind": "Var",
+ "usr": "c:@M@PlaudWiFiSDK@objc(cs)Agent(cpy)shared",
+ "mangledName": "$s12PlaudWiFiSDK5AgentC6sharedACvpZ",
+ "moduleName": "PlaudWiFiSDK",
+ "static": true,
+ "declAttributes": [
+ "HasInitialValue",
+ "Final",
+ "HasStorage",
+ "AccessControl",
+ "ObjC",
+ "RawDocComment"
+ ],
+ "isLet": true,
+ "hasStorage": true,
+ "accessors": [
+ {
+ "kind": "Accessor",
+ "name": "Get",
+ "printedName": "Get()",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Agent",
+ "printedName": "PlaudWiFiSDK.Agent",
+ "usr": "c:@M@PlaudWiFiSDK@objc(cs)Agent"
+ }
+ ],
+ "declKind": "Accessor",
+ "usr": "c:@M@PlaudWiFiSDK@objc(cs)Agent(cm)shared",
+ "mangledName": "$s12PlaudWiFiSDK5AgentC6sharedACvgZ",
+ "moduleName": "PlaudWiFiSDK",
+ "static": true,
+ "implicit": true,
+ "declAttributes": [
+ "Final",
+ "ObjC"
+ ],
+ "accessorKind": "get"
+ }
+ ]
+ },
+ {
+ "kind": "Function",
+ "name": "isDeviceConnect",
+ "printedName": "isDeviceConnect()",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Bool",
+ "printedName": "Swift.Bool",
+ "usr": "s:Sb"
+ }
+ ],
+ "declKind": "Func",
+ "usr": "c:@M@PlaudWiFiSDK@objc(cs)Agent(im)isDeviceConnect",
+ "mangledName": "$s12PlaudWiFiSDK5AgentC15isDeviceConnectSbyF",
+ "moduleName": "PlaudWiFiSDK",
+ "declAttributes": [
+ "AccessControl",
+ "ObjC",
+ "RawDocComment"
+ ],
+ "funcSelfKind": "NonMutating"
+ },
+ {
+ "kind": "Function",
+ "name": "bleDevice",
+ "printedName": "bleDevice()",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Optional",
+ "printedName": "PlaudBleSDK.BleDevice?",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "BleDevice",
+ "printedName": "PlaudBleSDK.BleDevice",
+ "usr": "c:@M@PenBleSDK@objc(cs)BleDevice"
+ }
+ ],
+ "usr": "s:Sq"
+ }
+ ],
+ "declKind": "Func",
+ "usr": "c:@M@PlaudWiFiSDK@objc(cs)Agent(im)bleDevice",
+ "mangledName": "$s12PlaudWiFiSDK5AgentC9bleDevice0a3BleD00hG0CSgyF",
+ "moduleName": "PlaudWiFiSDK",
+ "declAttributes": [
+ "AccessControl",
+ "ObjC",
+ "RawDocComment"
+ ],
+ "funcSelfKind": "NonMutating"
+ },
+ {
+ "kind": "Function",
+ "name": "getFileList",
+ "printedName": "getFileList(_:_:_:)",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Void",
+ "printedName": "()"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "Int",
+ "printedName": "Swift.Int",
+ "usr": "s:Si"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "Int",
+ "printedName": "Swift.Int",
+ "usr": "s:Si"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "Bool",
+ "printedName": "Swift.Bool",
+ "hasDefaultArg": true,
+ "usr": "s:Sb"
+ }
+ ],
+ "declKind": "Func",
+ "usr": "c:@M@PlaudWiFiSDK@objc(cs)Agent(im)getFileList:::",
+ "mangledName": "$s12PlaudWiFiSDK5AgentC11getFileListyySi_SiSbtF",
+ "moduleName": "PlaudWiFiSDK",
+ "declAttributes": [
+ "AccessControl",
+ "ObjC",
+ "RawDocComment"
+ ],
+ "funcSelfKind": "NonMutating"
+ },
+ {
+ "kind": "Function",
+ "name": "syncFile",
+ "printedName": "syncFile(_:_:_:_:_:)",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Void",
+ "printedName": "()"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "Int",
+ "printedName": "Swift.Int",
+ "usr": "s:Si"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "Int",
+ "printedName": "Swift.Int",
+ "usr": "s:Si"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "Int",
+ "printedName": "Swift.Int",
+ "hasDefaultArg": true,
+ "usr": "s:Si"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "Bool",
+ "printedName": "Swift.Bool",
+ "hasDefaultArg": true,
+ "usr": "s:Sb"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "Int",
+ "printedName": "Swift.Int",
+ "hasDefaultArg": true,
+ "usr": "s:Si"
+ }
+ ],
+ "declKind": "Func",
+ "usr": "c:@M@PlaudWiFiSDK@objc(cs)Agent(im)syncFile:::::",
+ "mangledName": "$s12PlaudWiFiSDK5AgentC8syncFileyySi_S2iSbSitF",
+ "moduleName": "PlaudWiFiSDK",
+ "declAttributes": [
+ "AccessControl",
+ "ObjC",
+ "RawDocComment"
+ ],
+ "funcSelfKind": "NonMutating"
+ },
+ {
+ "kind": "Function",
+ "name": "stopSyncFile",
+ "printedName": "stopSyncFile(_:_:)",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Void",
+ "printedName": "()"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "Int",
+ "printedName": "Swift.Int",
+ "usr": "s:Si"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "Int",
+ "printedName": "Swift.Int",
+ "hasDefaultArg": true,
+ "usr": "s:Si"
+ }
+ ],
+ "declKind": "Func",
+ "usr": "c:@M@PlaudWiFiSDK@objc(cs)Agent(im)stopSyncFile::",
+ "mangledName": "$s12PlaudWiFiSDK5AgentC12stopSyncFileyySi_SitF",
+ "moduleName": "PlaudWiFiSDK",
+ "declAttributes": [
+ "AccessControl",
+ "ObjC",
+ "RawDocComment"
+ ],
+ "funcSelfKind": "NonMutating"
+ },
+ {
+ "kind": "Function",
+ "name": "deleteFile",
+ "printedName": "deleteFile(_:_:)",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Void",
+ "printedName": "()"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "Int",
+ "printedName": "Swift.Int",
+ "usr": "s:Si"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "Int",
+ "printedName": "Swift.Int",
+ "hasDefaultArg": true,
+ "usr": "s:Si"
+ }
+ ],
+ "declKind": "Func",
+ "usr": "c:@M@PlaudWiFiSDK@objc(cs)Agent(im)deleteFile::",
+ "mangledName": "$s12PlaudWiFiSDK5AgentC10deleteFileyySi_SitF",
+ "moduleName": "PlaudWiFiSDK",
+ "declAttributes": [
+ "AccessControl",
+ "ObjC",
+ "RawDocComment"
+ ],
+ "funcSelfKind": "NonMutating"
+ },
+ {
+ "kind": "Function",
+ "name": "sessionId",
+ "printedName": "sessionId()",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Int",
+ "printedName": "Swift.Int",
+ "usr": "s:Si"
+ }
+ ],
+ "declKind": "Func",
+ "usr": "c:@M@PlaudWiFiSDK@objc(cs)Agent(im)sessionId",
+ "mangledName": "$s12PlaudWiFiSDK5AgentC9sessionIdSiyF",
+ "moduleName": "PlaudWiFiSDK",
+ "declAttributes": [
+ "AccessControl",
+ "ObjC",
+ "RawDocComment"
+ ],
+ "funcSelfKind": "NonMutating"
+ },
+ {
+ "kind": "Function",
+ "name": "isDownloading",
+ "printedName": "isDownloading()",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Bool",
+ "printedName": "Swift.Bool",
+ "usr": "s:Sb"
+ }
+ ],
+ "declKind": "Func",
+ "usr": "c:@M@PlaudWiFiSDK@objc(cs)Agent(im)isDownloading",
+ "mangledName": "$s12PlaudWiFiSDK5AgentC13isDownloadingSbyF",
+ "moduleName": "PlaudWiFiSDK",
+ "declAttributes": [
+ "AccessControl",
+ "ObjC",
+ "RawDocComment"
+ ],
+ "funcSelfKind": "NonMutating"
+ },
+ {
+ "kind": "Function",
+ "name": "isRecording",
+ "printedName": "isRecording()",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Bool",
+ "printedName": "Swift.Bool",
+ "usr": "s:Sb"
+ }
+ ],
+ "declKind": "Func",
+ "usr": "c:@M@PlaudWiFiSDK@objc(cs)Agent(im)isRecording",
+ "mangledName": "$s12PlaudWiFiSDK5AgentC11isRecordingSbyF",
+ "moduleName": "PlaudWiFiSDK",
+ "declAttributes": [
+ "AccessControl",
+ "ObjC",
+ "RawDocComment"
+ ],
+ "funcSelfKind": "NonMutating"
+ }
+ ],
+ "declKind": "Class",
+ "usr": "c:@M@PlaudWiFiSDK@objc(cs)Agent",
+ "mangledName": "$s12PlaudWiFiSDK5AgentC",
+ "moduleName": "PlaudWiFiSDK",
+ "declAttributes": [
+ "AccessControl",
+ "ObjC",
+ "RawDocComment"
+ ],
+ "superclassUsr": "c:objc(cs)NSObject",
+ "hasMissingDesignatedInitializers": true,
+ "inheritsConvenienceInitializers": true,
+ "superclassNames": [
+ "ObjectiveC.NSObject"
+ ],
+ "conformances": [
+ {
+ "kind": "Conformance",
+ "name": "Copyable",
+ "printedName": "Copyable",
+ "usr": "s:s8CopyableP",
+ "mangledName": "$ss8CopyableP"
+ },
+ {
+ "kind": "Conformance",
+ "name": "Escapable",
+ "printedName": "Escapable",
+ "usr": "s:s9EscapableP",
+ "mangledName": "$ss9EscapableP"
+ },
+ {
+ "kind": "Conformance",
+ "name": "Equatable",
+ "printedName": "Equatable",
+ "usr": "s:SQ",
+ "mangledName": "$sSQ"
+ },
+ {
+ "kind": "Conformance",
+ "name": "Hashable",
+ "printedName": "Hashable",
+ "usr": "s:SH",
+ "mangledName": "$sSH"
+ },
+ {
+ "kind": "Conformance",
+ "name": "CVarArg",
+ "printedName": "CVarArg",
+ "usr": "s:s7CVarArgP",
+ "mangledName": "$ss7CVarArgP"
+ },
+ {
+ "kind": "Conformance",
+ "name": "_KeyValueCodingAndObservingPublishing",
+ "printedName": "_KeyValueCodingAndObservingPublishing",
+ "usr": "s:10Foundation37_KeyValueCodingAndObservingPublishingP",
+ "mangledName": "$s10Foundation37_KeyValueCodingAndObservingPublishingP"
+ },
+ {
+ "kind": "Conformance",
+ "name": "_KeyValueCodingAndObserving",
+ "printedName": "_KeyValueCodingAndObserving",
+ "usr": "s:10Foundation27_KeyValueCodingAndObservingP",
+ "mangledName": "$s10Foundation27_KeyValueCodingAndObservingP"
+ },
+ {
+ "kind": "Conformance",
+ "name": "CustomStringConvertible",
+ "printedName": "CustomStringConvertible",
+ "usr": "s:s23CustomStringConvertibleP",
+ "mangledName": "$ss23CustomStringConvertibleP"
+ },
+ {
+ "kind": "Conformance",
+ "name": "CustomDebugStringConvertible",
+ "printedName": "CustomDebugStringConvertible",
+ "usr": "s:s28CustomDebugStringConvertibleP",
+ "mangledName": "$ss28CustomDebugStringConvertibleP"
+ }
+ ]
+ },
+ {
+ "kind": "Import",
+ "name": "Foundation",
+ "printedName": "Foundation",
+ "declKind": "Import",
+ "moduleName": "PlaudWiFiSDK"
+ },
+ {
+ "kind": "Import",
+ "name": "SystemConfiguration",
+ "printedName": "SystemConfiguration",
+ "declKind": "Import",
+ "moduleName": "PlaudWiFiSDK"
+ },
+ {
+ "kind": "TypeDecl",
+ "name": "NetworkReachabilityManager",
+ "printedName": "NetworkReachabilityManager",
+ "children": [
+ {
+ "kind": "TypeDecl",
+ "name": "NetworkReachabilityStatus",
+ "printedName": "NetworkReachabilityStatus",
+ "children": [
+ {
+ "kind": "Var",
+ "name": "unknown",
+ "printedName": "unknown",
+ "children": [
+ {
+ "kind": "TypeFunc",
+ "name": "Function",
+ "printedName": "(PlaudWiFiSDK.NetworkReachabilityManager.NetworkReachabilityStatus.Type) -> PlaudWiFiSDK.NetworkReachabilityManager.NetworkReachabilityStatus",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "NetworkReachabilityStatus",
+ "printedName": "PlaudWiFiSDK.NetworkReachabilityManager.NetworkReachabilityStatus",
+ "usr": "s:12PlaudWiFiSDK26NetworkReachabilityManagerC0eF6StatusO"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "Metatype",
+ "printedName": "PlaudWiFiSDK.NetworkReachabilityManager.NetworkReachabilityStatus.Type",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "NetworkReachabilityStatus",
+ "printedName": "PlaudWiFiSDK.NetworkReachabilityManager.NetworkReachabilityStatus",
+ "usr": "s:12PlaudWiFiSDK26NetworkReachabilityManagerC0eF6StatusO"
+ }
+ ]
+ }
+ ]
+ }
+ ],
+ "declKind": "EnumElement",
+ "usr": "s:12PlaudWiFiSDK26NetworkReachabilityManagerC0eF6StatusO7unknownyA2EmF",
+ "mangledName": "$s12PlaudWiFiSDK26NetworkReachabilityManagerC0eF6StatusO7unknownyA2EmF",
+ "moduleName": "PlaudWiFiSDK"
+ },
+ {
+ "kind": "Var",
+ "name": "notReachable",
+ "printedName": "notReachable",
+ "children": [
+ {
+ "kind": "TypeFunc",
+ "name": "Function",
+ "printedName": "(PlaudWiFiSDK.NetworkReachabilityManager.NetworkReachabilityStatus.Type) -> PlaudWiFiSDK.NetworkReachabilityManager.NetworkReachabilityStatus",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "NetworkReachabilityStatus",
+ "printedName": "PlaudWiFiSDK.NetworkReachabilityManager.NetworkReachabilityStatus",
+ "usr": "s:12PlaudWiFiSDK26NetworkReachabilityManagerC0eF6StatusO"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "Metatype",
+ "printedName": "PlaudWiFiSDK.NetworkReachabilityManager.NetworkReachabilityStatus.Type",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "NetworkReachabilityStatus",
+ "printedName": "PlaudWiFiSDK.NetworkReachabilityManager.NetworkReachabilityStatus",
+ "usr": "s:12PlaudWiFiSDK26NetworkReachabilityManagerC0eF6StatusO"
+ }
+ ]
+ }
+ ]
+ }
+ ],
+ "declKind": "EnumElement",
+ "usr": "s:12PlaudWiFiSDK26NetworkReachabilityManagerC0eF6StatusO12notReachableyA2EmF",
+ "mangledName": "$s12PlaudWiFiSDK26NetworkReachabilityManagerC0eF6StatusO12notReachableyA2EmF",
+ "moduleName": "PlaudWiFiSDK"
+ },
+ {
+ "kind": "Var",
+ "name": "reachable",
+ "printedName": "reachable",
+ "children": [
+ {
+ "kind": "TypeFunc",
+ "name": "Function",
+ "printedName": "(PlaudWiFiSDK.NetworkReachabilityManager.NetworkReachabilityStatus.Type) -> (PlaudWiFiSDK.NetworkReachabilityManager.ConnectionType) -> PlaudWiFiSDK.NetworkReachabilityManager.NetworkReachabilityStatus",
+ "children": [
+ {
+ "kind": "TypeFunc",
+ "name": "Function",
+ "printedName": "(PlaudWiFiSDK.NetworkReachabilityManager.ConnectionType) -> PlaudWiFiSDK.NetworkReachabilityManager.NetworkReachabilityStatus",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "NetworkReachabilityStatus",
+ "printedName": "PlaudWiFiSDK.NetworkReachabilityManager.NetworkReachabilityStatus",
+ "usr": "s:12PlaudWiFiSDK26NetworkReachabilityManagerC0eF6StatusO"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "ConnectionType",
+ "printedName": "PlaudWiFiSDK.NetworkReachabilityManager.ConnectionType",
+ "usr": "s:12PlaudWiFiSDK26NetworkReachabilityManagerC14ConnectionTypeO"
+ }
+ ]
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "Metatype",
+ "printedName": "PlaudWiFiSDK.NetworkReachabilityManager.NetworkReachabilityStatus.Type",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "NetworkReachabilityStatus",
+ "printedName": "PlaudWiFiSDK.NetworkReachabilityManager.NetworkReachabilityStatus",
+ "usr": "s:12PlaudWiFiSDK26NetworkReachabilityManagerC0eF6StatusO"
+ }
+ ]
+ }
+ ]
+ }
+ ],
+ "declKind": "EnumElement",
+ "usr": "s:12PlaudWiFiSDK26NetworkReachabilityManagerC0eF6StatusO9reachableyAeC14ConnectionTypeOcAEmF",
+ "mangledName": "$s12PlaudWiFiSDK26NetworkReachabilityManagerC0eF6StatusO9reachableyAeC14ConnectionTypeOcAEmF",
+ "moduleName": "PlaudWiFiSDK"
+ }
+ ],
+ "declKind": "Enum",
+ "usr": "s:12PlaudWiFiSDK26NetworkReachabilityManagerC0eF6StatusO",
+ "mangledName": "$s12PlaudWiFiSDK26NetworkReachabilityManagerC0eF6StatusO",
+ "moduleName": "PlaudWiFiSDK",
+ "declAttributes": [
+ "AccessControl",
+ "RawDocComment"
+ ],
+ "conformances": [
+ {
+ "kind": "Conformance",
+ "name": "Copyable",
+ "printedName": "Copyable",
+ "usr": "s:s8CopyableP",
+ "mangledName": "$ss8CopyableP"
+ },
+ {
+ "kind": "Conformance",
+ "name": "Escapable",
+ "printedName": "Escapable",
+ "usr": "s:s9EscapableP",
+ "mangledName": "$ss9EscapableP"
+ },
+ {
+ "kind": "Conformance",
+ "name": "Equatable",
+ "printedName": "Equatable",
+ "usr": "s:SQ",
+ "mangledName": "$sSQ"
+ }
+ ]
+ },
+ {
+ "kind": "TypeDecl",
+ "name": "ConnectionType",
+ "printedName": "ConnectionType",
+ "children": [
+ {
+ "kind": "Var",
+ "name": "ethernetOrWiFi",
+ "printedName": "ethernetOrWiFi",
+ "children": [
+ {
+ "kind": "TypeFunc",
+ "name": "Function",
+ "printedName": "(PlaudWiFiSDK.NetworkReachabilityManager.ConnectionType.Type) -> PlaudWiFiSDK.NetworkReachabilityManager.ConnectionType",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "ConnectionType",
+ "printedName": "PlaudWiFiSDK.NetworkReachabilityManager.ConnectionType",
+ "usr": "s:12PlaudWiFiSDK26NetworkReachabilityManagerC14ConnectionTypeO"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "Metatype",
+ "printedName": "PlaudWiFiSDK.NetworkReachabilityManager.ConnectionType.Type",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "ConnectionType",
+ "printedName": "PlaudWiFiSDK.NetworkReachabilityManager.ConnectionType",
+ "usr": "s:12PlaudWiFiSDK26NetworkReachabilityManagerC14ConnectionTypeO"
+ }
+ ]
+ }
+ ]
+ }
+ ],
+ "declKind": "EnumElement",
+ "usr": "s:12PlaudWiFiSDK26NetworkReachabilityManagerC14ConnectionTypeO010ethernetOrbC0yA2EmF",
+ "mangledName": "$s12PlaudWiFiSDK26NetworkReachabilityManagerC14ConnectionTypeO010ethernetOrbC0yA2EmF",
+ "moduleName": "PlaudWiFiSDK"
+ },
+ {
+ "kind": "Var",
+ "name": "wwan",
+ "printedName": "wwan",
+ "children": [
+ {
+ "kind": "TypeFunc",
+ "name": "Function",
+ "printedName": "(PlaudWiFiSDK.NetworkReachabilityManager.ConnectionType.Type) -> PlaudWiFiSDK.NetworkReachabilityManager.ConnectionType",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "ConnectionType",
+ "printedName": "PlaudWiFiSDK.NetworkReachabilityManager.ConnectionType",
+ "usr": "s:12PlaudWiFiSDK26NetworkReachabilityManagerC14ConnectionTypeO"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "Metatype",
+ "printedName": "PlaudWiFiSDK.NetworkReachabilityManager.ConnectionType.Type",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "ConnectionType",
+ "printedName": "PlaudWiFiSDK.NetworkReachabilityManager.ConnectionType",
+ "usr": "s:12PlaudWiFiSDK26NetworkReachabilityManagerC14ConnectionTypeO"
+ }
+ ]
+ }
+ ]
+ }
+ ],
+ "declKind": "EnumElement",
+ "usr": "s:12PlaudWiFiSDK26NetworkReachabilityManagerC14ConnectionTypeO4wwanyA2EmF",
+ "mangledName": "$s12PlaudWiFiSDK26NetworkReachabilityManagerC14ConnectionTypeO4wwanyA2EmF",
+ "moduleName": "PlaudWiFiSDK"
+ },
+ {
+ "kind": "Function",
+ "name": "==",
+ "printedName": "==(_:_:)",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Bool",
+ "printedName": "Swift.Bool",
+ "usr": "s:Sb"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "ConnectionType",
+ "printedName": "PlaudWiFiSDK.NetworkReachabilityManager.ConnectionType",
+ "usr": "s:12PlaudWiFiSDK26NetworkReachabilityManagerC14ConnectionTypeO"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "ConnectionType",
+ "printedName": "PlaudWiFiSDK.NetworkReachabilityManager.ConnectionType",
+ "usr": "s:12PlaudWiFiSDK26NetworkReachabilityManagerC14ConnectionTypeO"
+ }
+ ],
+ "declKind": "Func",
+ "usr": "s:12PlaudWiFiSDK26NetworkReachabilityManagerC14ConnectionTypeO2eeoiySbAE_AEtFZ",
+ "mangledName": "$s12PlaudWiFiSDK26NetworkReachabilityManagerC14ConnectionTypeO2eeoiySbAE_AEtFZ",
+ "moduleName": "PlaudWiFiSDK",
+ "static": true,
+ "implicit": true,
+ "funcSelfKind": "NonMutating"
+ },
+ {
+ "kind": "Var",
+ "name": "hashValue",
+ "printedName": "hashValue",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Int",
+ "printedName": "Swift.Int",
+ "usr": "s:Si"
+ }
+ ],
+ "declKind": "Var",
+ "usr": "s:12PlaudWiFiSDK26NetworkReachabilityManagerC14ConnectionTypeO9hashValueSivp",
+ "mangledName": "$s12PlaudWiFiSDK26NetworkReachabilityManagerC14ConnectionTypeO9hashValueSivp",
+ "moduleName": "PlaudWiFiSDK",
+ "implicit": true,
+ "accessors": [
+ {
+ "kind": "Accessor",
+ "name": "Get",
+ "printedName": "Get()",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Int",
+ "printedName": "Swift.Int",
+ "usr": "s:Si"
+ }
+ ],
+ "declKind": "Accessor",
+ "usr": "s:12PlaudWiFiSDK26NetworkReachabilityManagerC14ConnectionTypeO9hashValueSivg",
+ "mangledName": "$s12PlaudWiFiSDK26NetworkReachabilityManagerC14ConnectionTypeO9hashValueSivg",
+ "moduleName": "PlaudWiFiSDK",
+ "implicit": true,
+ "accessorKind": "get"
+ }
+ ]
+ },
+ {
+ "kind": "Function",
+ "name": "hash",
+ "printedName": "hash(into:)",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Void",
+ "printedName": "()"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "Hasher",
+ "printedName": "Swift.Hasher",
+ "paramValueOwnership": "InOut",
+ "usr": "s:s6HasherV"
+ }
+ ],
+ "declKind": "Func",
+ "usr": "s:12PlaudWiFiSDK26NetworkReachabilityManagerC14ConnectionTypeO4hash4intoys6HasherVz_tF",
+ "mangledName": "$s12PlaudWiFiSDK26NetworkReachabilityManagerC14ConnectionTypeO4hash4intoys6HasherVz_tF",
+ "moduleName": "PlaudWiFiSDK",
+ "implicit": true,
+ "funcSelfKind": "NonMutating"
+ }
+ ],
+ "declKind": "Enum",
+ "usr": "s:12PlaudWiFiSDK26NetworkReachabilityManagerC14ConnectionTypeO",
+ "mangledName": "$s12PlaudWiFiSDK26NetworkReachabilityManagerC14ConnectionTypeO",
+ "moduleName": "PlaudWiFiSDK",
+ "declAttributes": [
+ "AccessControl",
+ "RawDocComment"
+ ],
+ "conformances": [
+ {
+ "kind": "Conformance",
+ "name": "Copyable",
+ "printedName": "Copyable",
+ "usr": "s:s8CopyableP",
+ "mangledName": "$ss8CopyableP"
+ },
+ {
+ "kind": "Conformance",
+ "name": "Escapable",
+ "printedName": "Escapable",
+ "usr": "s:s9EscapableP",
+ "mangledName": "$ss9EscapableP"
+ },
+ {
+ "kind": "Conformance",
+ "name": "Equatable",
+ "printedName": "Equatable",
+ "usr": "s:SQ",
+ "mangledName": "$sSQ"
+ },
+ {
+ "kind": "Conformance",
+ "name": "Hashable",
+ "printedName": "Hashable",
+ "usr": "s:SH",
+ "mangledName": "$sSH"
+ }
+ ]
+ },
+ {
+ "kind": "Var",
+ "name": "isReachable",
+ "printedName": "isReachable",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Bool",
+ "printedName": "Swift.Bool",
+ "usr": "s:Sb"
+ }
+ ],
+ "declKind": "Var",
+ "usr": "s:12PlaudWiFiSDK26NetworkReachabilityManagerC11isReachableSbvp",
+ "mangledName": "$s12PlaudWiFiSDK26NetworkReachabilityManagerC11isReachableSbvp",
+ "moduleName": "PlaudWiFiSDK",
+ "isOpen": true,
+ "declAttributes": [
+ "AccessControl",
+ "RawDocComment"
+ ],
+ "accessors": [
+ {
+ "kind": "Accessor",
+ "name": "Get",
+ "printedName": "Get()",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Bool",
+ "printedName": "Swift.Bool",
+ "usr": "s:Sb"
+ }
+ ],
+ "declKind": "Accessor",
+ "usr": "s:12PlaudWiFiSDK26NetworkReachabilityManagerC11isReachableSbvg",
+ "mangledName": "$s12PlaudWiFiSDK26NetworkReachabilityManagerC11isReachableSbvg",
+ "moduleName": "PlaudWiFiSDK",
+ "isOpen": true,
+ "accessorKind": "get"
+ }
+ ]
+ },
+ {
+ "kind": "Var",
+ "name": "isReachableOnWWAN",
+ "printedName": "isReachableOnWWAN",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Bool",
+ "printedName": "Swift.Bool",
+ "usr": "s:Sb"
+ }
+ ],
+ "declKind": "Var",
+ "usr": "s:12PlaudWiFiSDK26NetworkReachabilityManagerC17isReachableOnWWANSbvp",
+ "mangledName": "$s12PlaudWiFiSDK26NetworkReachabilityManagerC17isReachableOnWWANSbvp",
+ "moduleName": "PlaudWiFiSDK",
+ "isOpen": true,
+ "declAttributes": [
+ "AccessControl",
+ "RawDocComment"
+ ],
+ "accessors": [
+ {
+ "kind": "Accessor",
+ "name": "Get",
+ "printedName": "Get()",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Bool",
+ "printedName": "Swift.Bool",
+ "usr": "s:Sb"
+ }
+ ],
+ "declKind": "Accessor",
+ "usr": "s:12PlaudWiFiSDK26NetworkReachabilityManagerC17isReachableOnWWANSbvg",
+ "mangledName": "$s12PlaudWiFiSDK26NetworkReachabilityManagerC17isReachableOnWWANSbvg",
+ "moduleName": "PlaudWiFiSDK",
+ "isOpen": true,
+ "accessorKind": "get"
+ }
+ ]
+ },
+ {
+ "kind": "Var",
+ "name": "isReachableOnEthernetOrWiFi",
+ "printedName": "isReachableOnEthernetOrWiFi",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Bool",
+ "printedName": "Swift.Bool",
+ "usr": "s:Sb"
+ }
+ ],
+ "declKind": "Var",
+ "usr": "s:12PlaudWiFiSDK26NetworkReachabilityManagerC023isReachableOnEthernetOrbC0Sbvp",
+ "mangledName": "$s12PlaudWiFiSDK26NetworkReachabilityManagerC023isReachableOnEthernetOrbC0Sbvp",
+ "moduleName": "PlaudWiFiSDK",
+ "isOpen": true,
+ "declAttributes": [
+ "AccessControl",
+ "RawDocComment"
+ ],
+ "accessors": [
+ {
+ "kind": "Accessor",
+ "name": "Get",
+ "printedName": "Get()",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Bool",
+ "printedName": "Swift.Bool",
+ "usr": "s:Sb"
+ }
+ ],
+ "declKind": "Accessor",
+ "usr": "s:12PlaudWiFiSDK26NetworkReachabilityManagerC023isReachableOnEthernetOrbC0Sbvg",
+ "mangledName": "$s12PlaudWiFiSDK26NetworkReachabilityManagerC023isReachableOnEthernetOrbC0Sbvg",
+ "moduleName": "PlaudWiFiSDK",
+ "isOpen": true,
+ "accessorKind": "get"
+ }
+ ]
+ },
+ {
+ "kind": "Var",
+ "name": "networkReachabilityStatus",
+ "printedName": "networkReachabilityStatus",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "NetworkReachabilityStatus",
+ "printedName": "PlaudWiFiSDK.NetworkReachabilityManager.NetworkReachabilityStatus",
+ "usr": "s:12PlaudWiFiSDK26NetworkReachabilityManagerC0eF6StatusO"
+ }
+ ],
+ "declKind": "Var",
+ "usr": "s:12PlaudWiFiSDK26NetworkReachabilityManagerC07networkF6StatusAC0efI0Ovp",
+ "mangledName": "$s12PlaudWiFiSDK26NetworkReachabilityManagerC07networkF6StatusAC0efI0Ovp",
+ "moduleName": "PlaudWiFiSDK",
+ "isOpen": true,
+ "declAttributes": [
+ "AccessControl",
+ "RawDocComment"
+ ],
+ "accessors": [
+ {
+ "kind": "Accessor",
+ "name": "Get",
+ "printedName": "Get()",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "NetworkReachabilityStatus",
+ "printedName": "PlaudWiFiSDK.NetworkReachabilityManager.NetworkReachabilityStatus",
+ "usr": "s:12PlaudWiFiSDK26NetworkReachabilityManagerC0eF6StatusO"
+ }
+ ],
+ "declKind": "Accessor",
+ "usr": "s:12PlaudWiFiSDK26NetworkReachabilityManagerC07networkF6StatusAC0efI0Ovg",
+ "mangledName": "$s12PlaudWiFiSDK26NetworkReachabilityManagerC07networkF6StatusAC0efI0Ovg",
+ "moduleName": "PlaudWiFiSDK",
+ "isOpen": true,
+ "accessorKind": "get"
+ }
+ ]
+ },
+ {
+ "kind": "Var",
+ "name": "listenerQueue",
+ "printedName": "listenerQueue",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "DispatchQueue",
+ "printedName": "Dispatch.DispatchQueue",
+ "usr": "c:objc(cs)OS_dispatch_queue"
+ }
+ ],
+ "declKind": "Var",
+ "usr": "s:12PlaudWiFiSDK26NetworkReachabilityManagerC13listenerQueueSo17OS_dispatch_queueCvp",
+ "mangledName": "$s12PlaudWiFiSDK26NetworkReachabilityManagerC13listenerQueueSo17OS_dispatch_queueCvp",
+ "moduleName": "PlaudWiFiSDK",
+ "isOpen": true,
+ "declAttributes": [
+ "HasInitialValue",
+ "HasStorage",
+ "AccessControl",
+ "RawDocComment"
+ ],
+ "hasStorage": true,
+ "accessors": [
+ {
+ "kind": "Accessor",
+ "name": "Get",
+ "printedName": "Get()",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "DispatchQueue",
+ "printedName": "Dispatch.DispatchQueue",
+ "usr": "c:objc(cs)OS_dispatch_queue"
+ }
+ ],
+ "declKind": "Accessor",
+ "usr": "s:12PlaudWiFiSDK26NetworkReachabilityManagerC13listenerQueueSo17OS_dispatch_queueCvg",
+ "mangledName": "$s12PlaudWiFiSDK26NetworkReachabilityManagerC13listenerQueueSo17OS_dispatch_queueCvg",
+ "moduleName": "PlaudWiFiSDK",
+ "implicit": true,
+ "isOpen": true,
+ "accessorKind": "get"
+ },
+ {
+ "kind": "Accessor",
+ "name": "Set",
+ "printedName": "Set()",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Void",
+ "printedName": "()"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "DispatchQueue",
+ "printedName": "Dispatch.DispatchQueue",
+ "usr": "c:objc(cs)OS_dispatch_queue"
+ }
+ ],
+ "declKind": "Accessor",
+ "usr": "s:12PlaudWiFiSDK26NetworkReachabilityManagerC13listenerQueueSo17OS_dispatch_queueCvs",
+ "mangledName": "$s12PlaudWiFiSDK26NetworkReachabilityManagerC13listenerQueueSo17OS_dispatch_queueCvs",
+ "moduleName": "PlaudWiFiSDK",
+ "implicit": true,
+ "isOpen": true,
+ "accessorKind": "set"
+ },
+ {
+ "kind": "Accessor",
+ "name": "Modify",
+ "printedName": "Modify()",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Void",
+ "printedName": "()"
+ }
+ ],
+ "declKind": "Accessor",
+ "usr": "s:12PlaudWiFiSDK26NetworkReachabilityManagerC13listenerQueueSo17OS_dispatch_queueCvM",
+ "mangledName": "$s12PlaudWiFiSDK26NetworkReachabilityManagerC13listenerQueueSo17OS_dispatch_queueCvM",
+ "moduleName": "PlaudWiFiSDK",
+ "implicit": true,
+ "isOpen": true,
+ "accessorKind": "_modify"
+ }
+ ]
+ },
+ {
+ "kind": "Var",
+ "name": "listener",
+ "printedName": "listener",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Optional",
+ "printedName": "((PlaudWiFiSDK.NetworkReachabilityManager.NetworkReachabilityStatus) -> ())?",
+ "children": [
+ {
+ "kind": "TypeFunc",
+ "name": "Function",
+ "printedName": "(PlaudWiFiSDK.NetworkReachabilityManager.NetworkReachabilityStatus) -> ()",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Void",
+ "printedName": "()"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "NetworkReachabilityStatus",
+ "printedName": "PlaudWiFiSDK.NetworkReachabilityManager.NetworkReachabilityStatus",
+ "usr": "s:12PlaudWiFiSDK26NetworkReachabilityManagerC0eF6StatusO"
+ }
+ ]
+ }
+ ],
+ "usr": "s:Sq"
+ }
+ ],
+ "declKind": "Var",
+ "usr": "s:12PlaudWiFiSDK26NetworkReachabilityManagerC8listeneryAC0eF6StatusOcSgvp",
+ "mangledName": "$s12PlaudWiFiSDK26NetworkReachabilityManagerC8listeneryAC0eF6StatusOcSgvp",
+ "moduleName": "PlaudWiFiSDK",
+ "isOpen": true,
+ "declAttributes": [
+ "HasInitialValue",
+ "HasStorage",
+ "AccessControl",
+ "RawDocComment"
+ ],
+ "hasStorage": true,
+ "accessors": [
+ {
+ "kind": "Accessor",
+ "name": "Get",
+ "printedName": "Get()",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Optional",
+ "printedName": "((PlaudWiFiSDK.NetworkReachabilityManager.NetworkReachabilityStatus) -> ())?",
+ "children": [
+ {
+ "kind": "TypeFunc",
+ "name": "Function",
+ "printedName": "(PlaudWiFiSDK.NetworkReachabilityManager.NetworkReachabilityStatus) -> ()",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Void",
+ "printedName": "()"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "NetworkReachabilityStatus",
+ "printedName": "PlaudWiFiSDK.NetworkReachabilityManager.NetworkReachabilityStatus",
+ "usr": "s:12PlaudWiFiSDK26NetworkReachabilityManagerC0eF6StatusO"
+ }
+ ]
+ }
+ ],
+ "usr": "s:Sq"
+ }
+ ],
+ "declKind": "Accessor",
+ "usr": "s:12PlaudWiFiSDK26NetworkReachabilityManagerC8listeneryAC0eF6StatusOcSgvg",
+ "mangledName": "$s12PlaudWiFiSDK26NetworkReachabilityManagerC8listeneryAC0eF6StatusOcSgvg",
+ "moduleName": "PlaudWiFiSDK",
+ "implicit": true,
+ "isOpen": true,
+ "accessorKind": "get"
+ },
+ {
+ "kind": "Accessor",
+ "name": "Set",
+ "printedName": "Set()",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Void",
+ "printedName": "()"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "Optional",
+ "printedName": "((PlaudWiFiSDK.NetworkReachabilityManager.NetworkReachabilityStatus) -> ())?",
+ "children": [
+ {
+ "kind": "TypeFunc",
+ "name": "Function",
+ "printedName": "(PlaudWiFiSDK.NetworkReachabilityManager.NetworkReachabilityStatus) -> ()",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Void",
+ "printedName": "()"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "NetworkReachabilityStatus",
+ "printedName": "PlaudWiFiSDK.NetworkReachabilityManager.NetworkReachabilityStatus",
+ "usr": "s:12PlaudWiFiSDK26NetworkReachabilityManagerC0eF6StatusO"
+ }
+ ]
+ }
+ ],
+ "usr": "s:Sq"
+ }
+ ],
+ "declKind": "Accessor",
+ "usr": "s:12PlaudWiFiSDK26NetworkReachabilityManagerC8listeneryAC0eF6StatusOcSgvs",
+ "mangledName": "$s12PlaudWiFiSDK26NetworkReachabilityManagerC8listeneryAC0eF6StatusOcSgvs",
+ "moduleName": "PlaudWiFiSDK",
+ "implicit": true,
+ "isOpen": true,
+ "accessorKind": "set"
+ },
+ {
+ "kind": "Accessor",
+ "name": "Modify",
+ "printedName": "Modify()",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Void",
+ "printedName": "()"
+ }
+ ],
+ "declKind": "Accessor",
+ "usr": "s:12PlaudWiFiSDK26NetworkReachabilityManagerC8listeneryAC0eF6StatusOcSgvM",
+ "mangledName": "$s12PlaudWiFiSDK26NetworkReachabilityManagerC8listeneryAC0eF6StatusOcSgvM",
+ "moduleName": "PlaudWiFiSDK",
+ "implicit": true,
+ "isOpen": true,
+ "accessorKind": "_modify"
+ }
+ ]
+ },
+ {
+ "kind": "Var",
+ "name": "flags",
+ "printedName": "flags",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Optional",
+ "printedName": "SystemConfiguration.SCNetworkReachabilityFlags?",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "SCNetworkReachabilityFlags",
+ "printedName": "SystemConfiguration.SCNetworkReachabilityFlags",
+ "usr": "c:@E@SCNetworkReachabilityFlags"
+ }
+ ],
+ "usr": "s:Sq"
+ }
+ ],
+ "declKind": "Var",
+ "usr": "s:12PlaudWiFiSDK26NetworkReachabilityManagerC5flagsSo09SCNetworkF5FlagsVSgvp",
+ "mangledName": "$s12PlaudWiFiSDK26NetworkReachabilityManagerC5flagsSo09SCNetworkF5FlagsVSgvp",
+ "moduleName": "PlaudWiFiSDK",
+ "isOpen": true,
+ "declAttributes": [
+ "AccessControl"
+ ],
+ "accessors": [
+ {
+ "kind": "Accessor",
+ "name": "Get",
+ "printedName": "Get()",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Optional",
+ "printedName": "SystemConfiguration.SCNetworkReachabilityFlags?",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "SCNetworkReachabilityFlags",
+ "printedName": "SystemConfiguration.SCNetworkReachabilityFlags",
+ "usr": "c:@E@SCNetworkReachabilityFlags"
+ }
+ ],
+ "usr": "s:Sq"
+ }
+ ],
+ "declKind": "Accessor",
+ "usr": "s:12PlaudWiFiSDK26NetworkReachabilityManagerC5flagsSo09SCNetworkF5FlagsVSgvg",
+ "mangledName": "$s12PlaudWiFiSDK26NetworkReachabilityManagerC5flagsSo09SCNetworkF5FlagsVSgvg",
+ "moduleName": "PlaudWiFiSDK",
+ "isOpen": true,
+ "accessorKind": "get"
+ }
+ ]
+ },
+ {
+ "kind": "Var",
+ "name": "previousFlags",
+ "printedName": "previousFlags",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "SCNetworkReachabilityFlags",
+ "printedName": "SystemConfiguration.SCNetworkReachabilityFlags",
+ "usr": "c:@E@SCNetworkReachabilityFlags"
+ }
+ ],
+ "declKind": "Var",
+ "usr": "s:12PlaudWiFiSDK26NetworkReachabilityManagerC13previousFlagsSo09SCNetworkfI0Vvp",
+ "mangledName": "$s12PlaudWiFiSDK26NetworkReachabilityManagerC13previousFlagsSo09SCNetworkfI0Vvp",
+ "moduleName": "PlaudWiFiSDK",
+ "isOpen": true,
+ "declAttributes": [
+ "HasStorage",
+ "AccessControl"
+ ],
+ "hasStorage": true,
+ "accessors": [
+ {
+ "kind": "Accessor",
+ "name": "Get",
+ "printedName": "Get()",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "SCNetworkReachabilityFlags",
+ "printedName": "SystemConfiguration.SCNetworkReachabilityFlags",
+ "usr": "c:@E@SCNetworkReachabilityFlags"
+ }
+ ],
+ "declKind": "Accessor",
+ "usr": "s:12PlaudWiFiSDK26NetworkReachabilityManagerC13previousFlagsSo09SCNetworkfI0Vvg",
+ "mangledName": "$s12PlaudWiFiSDK26NetworkReachabilityManagerC13previousFlagsSo09SCNetworkfI0Vvg",
+ "moduleName": "PlaudWiFiSDK",
+ "implicit": true,
+ "isOpen": true,
+ "accessorKind": "get"
+ },
+ {
+ "kind": "Accessor",
+ "name": "Set",
+ "printedName": "Set()",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Void",
+ "printedName": "()"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "SCNetworkReachabilityFlags",
+ "printedName": "SystemConfiguration.SCNetworkReachabilityFlags",
+ "usr": "c:@E@SCNetworkReachabilityFlags"
+ }
+ ],
+ "declKind": "Accessor",
+ "usr": "s:12PlaudWiFiSDK26NetworkReachabilityManagerC13previousFlagsSo09SCNetworkfI0Vvs",
+ "mangledName": "$s12PlaudWiFiSDK26NetworkReachabilityManagerC13previousFlagsSo09SCNetworkfI0Vvs",
+ "moduleName": "PlaudWiFiSDK",
+ "implicit": true,
+ "isOpen": true,
+ "accessorKind": "set"
+ },
+ {
+ "kind": "Accessor",
+ "name": "Modify",
+ "printedName": "Modify()",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Void",
+ "printedName": "()"
+ }
+ ],
+ "declKind": "Accessor",
+ "usr": "s:12PlaudWiFiSDK26NetworkReachabilityManagerC13previousFlagsSo09SCNetworkfI0VvM",
+ "mangledName": "$s12PlaudWiFiSDK26NetworkReachabilityManagerC13previousFlagsSo09SCNetworkfI0VvM",
+ "moduleName": "PlaudWiFiSDK",
+ "implicit": true,
+ "isOpen": true,
+ "accessorKind": "_modify"
+ }
+ ]
+ },
+ {
+ "kind": "Constructor",
+ "name": "init",
+ "printedName": "init(host:)",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Optional",
+ "printedName": "PlaudWiFiSDK.NetworkReachabilityManager?",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "NetworkReachabilityManager",
+ "printedName": "PlaudWiFiSDK.NetworkReachabilityManager",
+ "usr": "s:12PlaudWiFiSDK26NetworkReachabilityManagerC"
+ }
+ ],
+ "usr": "s:Sq"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "String",
+ "printedName": "Swift.String",
+ "usr": "s:SS"
+ }
+ ],
+ "declKind": "Constructor",
+ "usr": "s:12PlaudWiFiSDK26NetworkReachabilityManagerC4hostACSgSS_tcfc",
+ "mangledName": "$s12PlaudWiFiSDK26NetworkReachabilityManagerC4hostACSgSS_tcfc",
+ "moduleName": "PlaudWiFiSDK",
+ "declAttributes": [
+ "Convenience",
+ "AccessControl",
+ "RawDocComment"
+ ],
+ "init_kind": "Convenience"
+ },
+ {
+ "kind": "Constructor",
+ "name": "init",
+ "printedName": "init()",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Optional",
+ "printedName": "PlaudWiFiSDK.NetworkReachabilityManager?",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "NetworkReachabilityManager",
+ "printedName": "PlaudWiFiSDK.NetworkReachabilityManager",
+ "usr": "s:12PlaudWiFiSDK26NetworkReachabilityManagerC"
+ }
+ ],
+ "usr": "s:Sq"
+ }
+ ],
+ "declKind": "Constructor",
+ "usr": "s:12PlaudWiFiSDK26NetworkReachabilityManagerCACSgycfc",
+ "mangledName": "$s12PlaudWiFiSDK26NetworkReachabilityManagerCACSgycfc",
+ "moduleName": "PlaudWiFiSDK",
+ "declAttributes": [
+ "Convenience",
+ "AccessControl",
+ "RawDocComment"
+ ],
+ "init_kind": "Convenience"
+ },
+ {
+ "kind": "Function",
+ "name": "startListening",
+ "printedName": "startListening()",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Bool",
+ "printedName": "Swift.Bool",
+ "usr": "s:Sb"
+ }
+ ],
+ "declKind": "Func",
+ "usr": "s:12PlaudWiFiSDK26NetworkReachabilityManagerC14startListeningSbyF",
+ "mangledName": "$s12PlaudWiFiSDK26NetworkReachabilityManagerC14startListeningSbyF",
+ "moduleName": "PlaudWiFiSDK",
+ "isOpen": true,
+ "declAttributes": [
+ "AccessControl",
+ "DiscardableResult",
+ "RawDocComment"
+ ],
+ "funcSelfKind": "NonMutating"
+ },
+ {
+ "kind": "Function",
+ "name": "stopListening",
+ "printedName": "stopListening()",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Void",
+ "printedName": "()"
+ }
+ ],
+ "declKind": "Func",
+ "usr": "s:12PlaudWiFiSDK26NetworkReachabilityManagerC13stopListeningyyF",
+ "mangledName": "$s12PlaudWiFiSDK26NetworkReachabilityManagerC13stopListeningyyF",
+ "moduleName": "PlaudWiFiSDK",
+ "isOpen": true,
+ "declAttributes": [
+ "AccessControl",
+ "RawDocComment"
+ ],
+ "funcSelfKind": "NonMutating"
+ }
+ ],
+ "declKind": "Class",
+ "usr": "s:12PlaudWiFiSDK26NetworkReachabilityManagerC",
+ "mangledName": "$s12PlaudWiFiSDK26NetworkReachabilityManagerC",
+ "moduleName": "PlaudWiFiSDK",
+ "isOpen": true,
+ "declAttributes": [
+ "AccessControl",
+ "RawDocComment"
+ ],
+ "hasMissingDesignatedInitializers": true,
+ "conformances": [
+ {
+ "kind": "Conformance",
+ "name": "Copyable",
+ "printedName": "Copyable",
+ "usr": "s:s8CopyableP",
+ "mangledName": "$ss8CopyableP"
+ },
+ {
+ "kind": "Conformance",
+ "name": "Escapable",
+ "printedName": "Escapable",
+ "usr": "s:s9EscapableP",
+ "mangledName": "$ss9EscapableP"
+ }
+ ]
+ },
+ {
+ "kind": "Function",
+ "name": "==",
+ "printedName": "==(_:_:)",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Bool",
+ "printedName": "Swift.Bool",
+ "usr": "s:Sb"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "NetworkReachabilityStatus",
+ "printedName": "PlaudWiFiSDK.NetworkReachabilityManager.NetworkReachabilityStatus",
+ "usr": "s:12PlaudWiFiSDK26NetworkReachabilityManagerC0eF6StatusO"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "NetworkReachabilityStatus",
+ "printedName": "PlaudWiFiSDK.NetworkReachabilityManager.NetworkReachabilityStatus",
+ "usr": "s:12PlaudWiFiSDK26NetworkReachabilityManagerC0eF6StatusO"
+ }
+ ],
+ "declKind": "Func",
+ "usr": "s:12PlaudWiFiSDK2eeoiySbAA26NetworkReachabilityManagerC0fG6StatusO_AFtF",
+ "mangledName": "$s12PlaudWiFiSDK2eeoiySbAA26NetworkReachabilityManagerC0fG6StatusO_AFtF",
+ "moduleName": "PlaudWiFiSDK",
+ "declAttributes": [
+ "AccessControl",
+ "RawDocComment"
+ ],
+ "funcSelfKind": "NonMutating"
+ },
+ {
+ "kind": "Import",
+ "name": "CommonCrypto",
+ "printedName": "CommonCrypto",
+ "declKind": "Import",
+ "moduleName": "PlaudWiFiSDK",
+ "declAttributes": [
+ "RawDocComment"
+ ]
+ },
+ {
+ "kind": "Import",
+ "name": "Foundation",
+ "printedName": "Foundation",
+ "declKind": "Import",
+ "moduleName": "PlaudWiFiSDK"
+ },
+ {
+ "kind": "Import",
+ "name": "SystemConfiguration.CaptiveNetwork",
+ "printedName": "SystemConfiguration.CaptiveNetwork",
+ "declKind": "Import",
+ "moduleName": "PlaudWiFiSDK"
+ },
+ {
+ "kind": "Import",
+ "name": "NetworkExtension",
+ "printedName": "NetworkExtension",
+ "declKind": "Import",
+ "moduleName": "PlaudWiFiSDK"
+ },
+ {
+ "kind": "Import",
+ "name": "CoreLocation",
+ "printedName": "CoreLocation",
+ "declKind": "Import",
+ "moduleName": "PlaudWiFiSDK"
+ },
+ {
+ "kind": "Import",
+ "name": "PenBleSDK",
+ "printedName": "PenBleSDK",
+ "declKind": "Import",
+ "moduleName": "PlaudWiFiSDK"
+ },
+ {
+ "kind": "TypeDecl",
+ "name": "WiFiAgentProtocol",
+ "printedName": "WiFiAgentProtocol",
+ "children": [
+ {
+ "kind": "Function",
+ "name": "wifiCommonErr",
+ "printedName": "wifiCommonErr(_:_:)",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Void",
+ "printedName": "()"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "Int",
+ "printedName": "Swift.Int",
+ "usr": "s:Si"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "Int",
+ "printedName": "Swift.Int",
+ "usr": "s:Si"
+ }
+ ],
+ "declKind": "Func",
+ "usr": "c:@M@PlaudWiFiSDK@objc(pl)WiFiAgentProtocol(im)wifiCommonErr::",
+ "mangledName": "$s12PlaudWiFiSDK0bC13AgentProtocolP13wifiCommonErryySi_SitF",
+ "moduleName": "PlaudWiFiSDK",
+ "genericSig": "<τ_0_0 where τ_0_0 : PlaudWiFiSDK.WiFiAgentProtocol>",
+ "sugared_genericSig": "",
+ "protocolReq": true,
+ "declAttributes": [
+ "RawDocComment",
+ "ObjC"
+ ],
+ "reqNewWitnessTableEntry": true,
+ "funcSelfKind": "NonMutating"
+ },
+ {
+ "kind": "Function",
+ "name": "wifiHandshake",
+ "printedName": "wifiHandshake(_:)",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Void",
+ "printedName": "()"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "Int",
+ "printedName": "Swift.Int",
+ "usr": "s:Si"
+ }
+ ],
+ "declKind": "Func",
+ "usr": "c:@M@PlaudWiFiSDK@objc(pl)WiFiAgentProtocol(im)wifiHandshake:",
+ "mangledName": "$s12PlaudWiFiSDK0bC13AgentProtocolP13wifiHandshakeyySiF",
+ "moduleName": "PlaudWiFiSDK",
+ "genericSig": "<τ_0_0 where τ_0_0 : PlaudWiFiSDK.WiFiAgentProtocol>",
+ "sugared_genericSig": "",
+ "protocolReq": true,
+ "declAttributes": [
+ "RawDocComment",
+ "ObjC"
+ ],
+ "reqNewWitnessTableEntry": true,
+ "funcSelfKind": "NonMutating"
+ },
+ {
+ "kind": "Function",
+ "name": "wifiPower",
+ "printedName": "wifiPower(_:_:)",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Void",
+ "printedName": "()"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "Int",
+ "printedName": "Swift.Int",
+ "usr": "s:Si"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "Int",
+ "printedName": "Swift.Int",
+ "usr": "s:Si"
+ }
+ ],
+ "declKind": "Func",
+ "usr": "c:@M@PlaudWiFiSDK@objc(pl)WiFiAgentProtocol(im)wifiPower::",
+ "mangledName": "$s12PlaudWiFiSDK0bC13AgentProtocolP9wifiPoweryySi_SitF",
+ "moduleName": "PlaudWiFiSDK",
+ "genericSig": "<τ_0_0 where τ_0_0 : PlaudWiFiSDK.WiFiAgentProtocol>",
+ "sugared_genericSig": "",
+ "protocolReq": true,
+ "declAttributes": [
+ "RawDocComment",
+ "ObjC"
+ ],
+ "reqNewWitnessTableEntry": true,
+ "funcSelfKind": "NonMutating"
+ },
+ {
+ "kind": "Function",
+ "name": "wifiFileListFail",
+ "printedName": "wifiFileListFail(_:)",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Void",
+ "printedName": "()"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "Int",
+ "printedName": "Swift.Int",
+ "usr": "s:Si"
+ }
+ ],
+ "declKind": "Func",
+ "usr": "c:@M@PlaudWiFiSDK@objc(pl)WiFiAgentProtocol(im)wifiFileListFail:",
+ "mangledName": "$s12PlaudWiFiSDK0bC13AgentProtocolP16wifiFileListFailyySiF",
+ "moduleName": "PlaudWiFiSDK",
+ "genericSig": "<τ_0_0 where τ_0_0 : PlaudWiFiSDK.WiFiAgentProtocol>",
+ "sugared_genericSig": "",
+ "protocolReq": true,
+ "declAttributes": [
+ "RawDocComment",
+ "ObjC"
+ ],
+ "reqNewWitnessTableEntry": true,
+ "funcSelfKind": "NonMutating"
+ },
+ {
+ "kind": "Function",
+ "name": "wifiFileList",
+ "printedName": "wifiFileList(_:)",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Void",
+ "printedName": "()"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "Array",
+ "printedName": "[PlaudBleSDK.BleFile]",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "BleFile",
+ "printedName": "PlaudBleSDK.BleFile",
+ "usr": "c:@M@PenBleSDK@objc(cs)BleFile"
+ }
+ ],
+ "usr": "s:Sa"
+ }
+ ],
+ "declKind": "Func",
+ "usr": "c:@M@PlaudWiFiSDK@objc(pl)WiFiAgentProtocol(im)wifiFileList:",
+ "mangledName": "$s12PlaudWiFiSDK0bC13AgentProtocolP12wifiFileListyySay0a3BleD00jH0CGF",
+ "moduleName": "PlaudWiFiSDK",
+ "genericSig": "<τ_0_0 where τ_0_0 : PlaudWiFiSDK.WiFiAgentProtocol>",
+ "sugared_genericSig": "",
+ "protocolReq": true,
+ "declAttributes": [
+ "RawDocComment",
+ "ObjC"
+ ],
+ "reqNewWitnessTableEntry": true,
+ "funcSelfKind": "NonMutating"
+ },
+ {
+ "kind": "Function",
+ "name": "wifiSyncFile",
+ "printedName": "wifiSyncFile(_:_:)",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Void",
+ "printedName": "()"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "Int",
+ "printedName": "Swift.Int",
+ "usr": "s:Si"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "Int",
+ "printedName": "Swift.Int",
+ "usr": "s:Si"
+ }
+ ],
+ "declKind": "Func",
+ "usr": "c:@M@PlaudWiFiSDK@objc(pl)WiFiAgentProtocol(im)wifiSyncFile::",
+ "mangledName": "$s12PlaudWiFiSDK0bC13AgentProtocolP12wifiSyncFileyySi_SitF",
+ "moduleName": "PlaudWiFiSDK",
+ "genericSig": "<τ_0_0 where τ_0_0 : PlaudWiFiSDK.WiFiAgentProtocol>",
+ "sugared_genericSig": "",
+ "protocolReq": true,
+ "declAttributes": [
+ "RawDocComment",
+ "ObjC"
+ ],
+ "reqNewWitnessTableEntry": true,
+ "funcSelfKind": "NonMutating"
+ },
+ {
+ "kind": "Function",
+ "name": "wifiSyncFileData",
+ "printedName": "wifiSyncFileData(_:_:_:_:)",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Void",
+ "printedName": "()"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "Int",
+ "printedName": "Swift.Int",
+ "usr": "s:Si"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "Int",
+ "printedName": "Swift.Int",
+ "usr": "s:Si"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "Int",
+ "printedName": "Swift.Int",
+ "usr": "s:Si"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "Data",
+ "printedName": "Foundation.Data",
+ "usr": "s:10Foundation4DataV"
+ }
+ ],
+ "declKind": "Func",
+ "usr": "c:@M@PlaudWiFiSDK@objc(pl)WiFiAgentProtocol(im)wifiSyncFileData::::",
+ "mangledName": "$s12PlaudWiFiSDK0bC13AgentProtocolP16wifiSyncFileDatayySi_S2i10Foundation0J0VtF",
+ "moduleName": "PlaudWiFiSDK",
+ "genericSig": "<τ_0_0 where τ_0_0 : PlaudWiFiSDK.WiFiAgentProtocol>",
+ "sugared_genericSig": "",
+ "protocolReq": true,
+ "declAttributes": [
+ "RawDocComment",
+ "ObjC"
+ ],
+ "reqNewWitnessTableEntry": true,
+ "funcSelfKind": "NonMutating"
+ },
+ {
+ "kind": "Function",
+ "name": "wifiDataComplete",
+ "printedName": "wifiDataComplete()",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Void",
+ "printedName": "()"
+ }
+ ],
+ "declKind": "Func",
+ "usr": "c:@M@PlaudWiFiSDK@objc(pl)WiFiAgentProtocol(im)wifiDataComplete",
+ "mangledName": "$s12PlaudWiFiSDK0bC13AgentProtocolP16wifiDataCompleteyyF",
+ "moduleName": "PlaudWiFiSDK",
+ "genericSig": "<τ_0_0 where τ_0_0 : PlaudWiFiSDK.WiFiAgentProtocol>",
+ "sugared_genericSig": "",
+ "protocolReq": true,
+ "declAttributes": [
+ "RawDocComment",
+ "ObjC"
+ ],
+ "reqNewWitnessTableEntry": true,
+ "funcSelfKind": "NonMutating"
+ },
+ {
+ "kind": "Function",
+ "name": "wifiSyncFileStop",
+ "printedName": "wifiSyncFileStop(_:)",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Void",
+ "printedName": "()"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "Int",
+ "printedName": "Swift.Int",
+ "usr": "s:Si"
+ }
+ ],
+ "declKind": "Func",
+ "usr": "c:@M@PlaudWiFiSDK@objc(pl)WiFiAgentProtocol(im)wifiSyncFileStop:",
+ "mangledName": "$s12PlaudWiFiSDK0bC13AgentProtocolP16wifiSyncFileStopyySiF",
+ "moduleName": "PlaudWiFiSDK",
+ "genericSig": "<τ_0_0 where τ_0_0 : PlaudWiFiSDK.WiFiAgentProtocol>",
+ "sugared_genericSig": "",
+ "protocolReq": true,
+ "declAttributes": [
+ "RawDocComment",
+ "ObjC"
+ ],
+ "reqNewWitnessTableEntry": true,
+ "funcSelfKind": "NonMutating"
+ },
+ {
+ "kind": "Function",
+ "name": "wifiFileDelete",
+ "printedName": "wifiFileDelete(_:_:)",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Void",
+ "printedName": "()"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "Int",
+ "printedName": "Swift.Int",
+ "usr": "s:Si"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "Int",
+ "printedName": "Swift.Int",
+ "usr": "s:Si"
+ }
+ ],
+ "declKind": "Func",
+ "usr": "c:@M@PlaudWiFiSDK@objc(pl)WiFiAgentProtocol(im)wifiFileDelete::",
+ "mangledName": "$s12PlaudWiFiSDK0bC13AgentProtocolP14wifiFileDeleteyySi_SitF",
+ "moduleName": "PlaudWiFiSDK",
+ "genericSig": "<τ_0_0 where τ_0_0 : PlaudWiFiSDK.WiFiAgentProtocol>",
+ "sugared_genericSig": "",
+ "protocolReq": true,
+ "declAttributes": [
+ "RawDocComment",
+ "ObjC"
+ ],
+ "reqNewWitnessTableEntry": true,
+ "funcSelfKind": "NonMutating"
+ },
+ {
+ "kind": "Function",
+ "name": "wifiClientFail",
+ "printedName": "wifiClientFail()",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Void",
+ "printedName": "()"
+ }
+ ],
+ "declKind": "Func",
+ "usr": "c:@M@PlaudWiFiSDK@objc(pl)WiFiAgentProtocol(im)wifiClientFail",
+ "mangledName": "$s12PlaudWiFiSDK0bC13AgentProtocolP14wifiClientFailyyF",
+ "moduleName": "PlaudWiFiSDK",
+ "genericSig": "<τ_0_0 where τ_0_0 : PlaudWiFiSDK.WiFiAgentProtocol>",
+ "sugared_genericSig": "",
+ "protocolReq": true,
+ "declAttributes": [
+ "RawDocComment",
+ "ObjC"
+ ],
+ "reqNewWitnessTableEntry": true,
+ "funcSelfKind": "NonMutating"
+ },
+ {
+ "kind": "Function",
+ "name": "wifiClose",
+ "printedName": "wifiClose(_:)",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Void",
+ "printedName": "()"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "Int",
+ "printedName": "Swift.Int",
+ "usr": "s:Si"
+ }
+ ],
+ "declKind": "Func",
+ "usr": "c:@M@PlaudWiFiSDK@objc(pl)WiFiAgentProtocol(im)wifiClose:",
+ "mangledName": "$s12PlaudWiFiSDK0bC13AgentProtocolP9wifiCloseyySiF",
+ "moduleName": "PlaudWiFiSDK",
+ "genericSig": "<τ_0_0 where τ_0_0 : PlaudWiFiSDK.WiFiAgentProtocol>",
+ "sugared_genericSig": "",
+ "protocolReq": true,
+ "declAttributes": [
+ "RawDocComment",
+ "ObjC"
+ ],
+ "reqNewWitnessTableEntry": true,
+ "funcSelfKind": "NonMutating"
+ },
+ {
+ "kind": "Function",
+ "name": "wifiRateFail",
+ "printedName": "wifiRateFail(_:)",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Void",
+ "printedName": "()"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "Int",
+ "printedName": "Swift.Int",
+ "usr": "s:Si"
+ }
+ ],
+ "declKind": "Func",
+ "usr": "c:@M@PlaudWiFiSDK@objc(pl)WiFiAgentProtocol(im)wifiRateFail:",
+ "mangledName": "$s12PlaudWiFiSDK0bC13AgentProtocolP12wifiRateFailyySiF",
+ "moduleName": "PlaudWiFiSDK",
+ "genericSig": "<τ_0_0 where τ_0_0 : PlaudWiFiSDK.WiFiAgentProtocol>",
+ "sugared_genericSig": "",
+ "protocolReq": true,
+ "declAttributes": [
+ "RawDocComment",
+ "ObjC"
+ ],
+ "reqNewWitnessTableEntry": true,
+ "funcSelfKind": "NonMutating"
+ },
+ {
+ "kind": "Function",
+ "name": "wifiRate",
+ "printedName": "wifiRate(_:_:_:)",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Void",
+ "printedName": "()"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "Int",
+ "printedName": "Swift.Int",
+ "usr": "s:Si"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "Int",
+ "printedName": "Swift.Int",
+ "usr": "s:Si"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "Double",
+ "printedName": "Swift.Double",
+ "usr": "s:Sd"
+ }
+ ],
+ "declKind": "Func",
+ "usr": "c:@M@PlaudWiFiSDK@objc(pl)WiFiAgentProtocol(im)wifiRate:::",
+ "mangledName": "$s12PlaudWiFiSDK0bC13AgentProtocolP8wifiRateyySi_SiSdtF",
+ "moduleName": "PlaudWiFiSDK",
+ "genericSig": "<τ_0_0 where τ_0_0 : PlaudWiFiSDK.WiFiAgentProtocol>",
+ "sugared_genericSig": "",
+ "protocolReq": true,
+ "declAttributes": [
+ "RawDocComment",
+ "ObjC"
+ ],
+ "reqNewWitnessTableEntry": true,
+ "funcSelfKind": "NonMutating"
+ },
+ {
+ "kind": "Function",
+ "name": "wifiLogsFail",
+ "printedName": "wifiLogsFail(_:)",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Void",
+ "printedName": "()"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "Int",
+ "printedName": "Swift.Int",
+ "usr": "s:Si"
+ }
+ ],
+ "declKind": "Func",
+ "usr": "c:@M@PlaudWiFiSDK@objc(pl)WiFiAgentProtocol(im)wifiLogsFail:",
+ "mangledName": "$s12PlaudWiFiSDK0bC13AgentProtocolP12wifiLogsFailyySiF",
+ "moduleName": "PlaudWiFiSDK",
+ "genericSig": "<τ_0_0 where τ_0_0 : PlaudWiFiSDK.WiFiAgentProtocol>",
+ "sugared_genericSig": "",
+ "protocolReq": true,
+ "declAttributes": [
+ "RawDocComment",
+ "ObjC"
+ ],
+ "reqNewWitnessTableEntry": true,
+ "funcSelfKind": "NonMutating"
+ },
+ {
+ "kind": "Function",
+ "name": "wifiLogs",
+ "printedName": "wifiLogs(_:)",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Void",
+ "printedName": "()"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "Optional",
+ "printedName": "Foundation.Data?",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Data",
+ "printedName": "Foundation.Data",
+ "usr": "s:10Foundation4DataV"
+ }
+ ],
+ "usr": "s:Sq"
+ }
+ ],
+ "declKind": "Func",
+ "usr": "c:@M@PlaudWiFiSDK@objc(pl)WiFiAgentProtocol(im)wifiLogs:",
+ "mangledName": "$s12PlaudWiFiSDK0bC13AgentProtocolP8wifiLogsyy10Foundation4DataVSgF",
+ "moduleName": "PlaudWiFiSDK",
+ "genericSig": "<τ_0_0 where τ_0_0 : PlaudWiFiSDK.WiFiAgentProtocol>",
+ "sugared_genericSig": "",
+ "protocolReq": true,
+ "declAttributes": [
+ "RawDocComment",
+ "ObjC"
+ ],
+ "reqNewWitnessTableEntry": true,
+ "funcSelfKind": "NonMutating"
+ },
+ {
+ "kind": "Function",
+ "name": "wifiTips",
+ "printedName": "wifiTips(_:)",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Void",
+ "printedName": "()"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "Int",
+ "printedName": "Swift.Int",
+ "usr": "s:Si"
+ }
+ ],
+ "declKind": "Func",
+ "usr": "c:@M@PlaudWiFiSDK@objc(pl)WiFiAgentProtocol(im)wifiTips:",
+ "mangledName": "$s12PlaudWiFiSDK0bC13AgentProtocolP8wifiTipsyySiF",
+ "moduleName": "PlaudWiFiSDK",
+ "genericSig": "<τ_0_0 where τ_0_0 : PlaudWiFiSDK.WiFiAgentProtocol>",
+ "sugared_genericSig": "",
+ "protocolReq": true,
+ "declAttributes": [
+ "RawDocComment",
+ "ObjC"
+ ],
+ "reqNewWitnessTableEntry": true,
+ "funcSelfKind": "NonMutating"
+ },
+ {
+ "kind": "Function",
+ "name": "penRequestOTAData",
+ "printedName": "penRequestOTAData(start:end:payloadSize:uid:sendRatePPS:)",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Void",
+ "printedName": "()"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "Int",
+ "printedName": "Swift.Int",
+ "usr": "s:Si"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "Int",
+ "printedName": "Swift.Int",
+ "usr": "s:Si"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "Int",
+ "printedName": "Swift.Int",
+ "usr": "s:Si"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "Int",
+ "printedName": "Swift.Int",
+ "usr": "s:Si"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "Int",
+ "printedName": "Swift.Int",
+ "usr": "s:Si"
+ }
+ ],
+ "declKind": "Func",
+ "usr": "c:@M@PlaudWiFiSDK@objc(pl)WiFiAgentProtocol(im)penRequestOTADataWithStart:end:payloadSize:uid:sendRatePPS:",
+ "mangledName": "$s12PlaudWiFiSDK0bC13AgentProtocolP17penRequestOTAData5start3end11payloadSize3uid11sendRatePPSySi_S4itF",
+ "moduleName": "PlaudWiFiSDK",
+ "genericSig": "<τ_0_0 where τ_0_0 : PlaudWiFiSDK.WiFiAgentProtocol>",
+ "sugared_genericSig": "",
+ "protocolReq": true,
+ "declAttributes": [
+ "ObjC"
+ ],
+ "reqNewWitnessTableEntry": true,
+ "funcSelfKind": "NonMutating"
+ },
+ {
+ "kind": "Function",
+ "name": "wifiOTAStatus",
+ "printedName": "wifiOTAStatus(_:_:)",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Void",
+ "printedName": "()"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "Int",
+ "printedName": "Swift.Int",
+ "usr": "s:Si"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "Int",
+ "printedName": "Swift.Int",
+ "usr": "s:Si"
+ }
+ ],
+ "declKind": "Func",
+ "usr": "c:@M@PlaudWiFiSDK@objc(pl)WiFiAgentProtocol(im)wifiOTAStatus::",
+ "mangledName": "$s12PlaudWiFiSDK0bC13AgentProtocolP13wifiOTAStatusyySi_SitF",
+ "moduleName": "PlaudWiFiSDK",
+ "genericSig": "<τ_0_0 where τ_0_0 : PlaudWiFiSDK.WiFiAgentProtocol>",
+ "sugared_genericSig": "",
+ "protocolReq": true,
+ "declAttributes": [
+ "ObjC"
+ ],
+ "reqNewWitnessTableEntry": true,
+ "funcSelfKind": "NonMutating"
+ }
+ ],
+ "declKind": "Protocol",
+ "usr": "c:@M@PlaudWiFiSDK@objc(pl)WiFiAgentProtocol",
+ "mangledName": "$s12PlaudWiFiSDK0bC13AgentProtocolP",
+ "moduleName": "PlaudWiFiSDK",
+ "genericSig": "<τ_0_0 : AnyObject>",
+ "sugared_genericSig": "",
+ "declAttributes": [
+ "AccessControl",
+ "ObjC",
+ "RawDocComment"
+ ],
+ "conformances": [
+ {
+ "kind": "Conformance",
+ "name": "Escapable",
+ "printedName": "Escapable",
+ "usr": "s:s9EscapableP",
+ "mangledName": "$ss9EscapableP"
+ },
+ {
+ "kind": "Conformance",
+ "name": "Copyable",
+ "printedName": "Copyable",
+ "usr": "s:s8CopyableP",
+ "mangledName": "$ss8CopyableP"
+ }
+ ]
+ },
+ {
+ "kind": "TypeDecl",
+ "name": "WiFiAgent",
+ "printedName": "WiFiAgent",
+ "children": [
+ {
+ "kind": "Var",
+ "name": "shared",
+ "printedName": "shared",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "WiFiAgent",
+ "printedName": "PlaudWiFiSDK.WiFiAgent",
+ "usr": "c:@M@PlaudWiFiSDK@objc(cs)WiFiAgent"
+ }
+ ],
+ "declKind": "Var",
+ "usr": "c:@M@PlaudWiFiSDK@objc(cs)WiFiAgent(cpy)shared",
+ "mangledName": "$s12PlaudWiFiSDK0bC5AgentC6sharedACvpZ",
+ "moduleName": "PlaudWiFiSDK",
+ "static": true,
+ "declAttributes": [
+ "HasInitialValue",
+ "Final",
+ "HasStorage",
+ "AccessControl",
+ "ObjC",
+ "RawDocComment"
+ ],
+ "isLet": true,
+ "hasStorage": true,
+ "accessors": [
+ {
+ "kind": "Accessor",
+ "name": "Get",
+ "printedName": "Get()",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "WiFiAgent",
+ "printedName": "PlaudWiFiSDK.WiFiAgent",
+ "usr": "c:@M@PlaudWiFiSDK@objc(cs)WiFiAgent"
+ }
+ ],
+ "declKind": "Accessor",
+ "usr": "c:@M@PlaudWiFiSDK@objc(cs)WiFiAgent(cm)shared",
+ "mangledName": "$s12PlaudWiFiSDK0bC5AgentC6sharedACvgZ",
+ "moduleName": "PlaudWiFiSDK",
+ "static": true,
+ "implicit": true,
+ "declAttributes": [
+ "Final",
+ "ObjC"
+ ],
+ "accessorKind": "get"
+ }
+ ]
+ },
+ {
+ "kind": "Var",
+ "name": "connectLoop",
+ "printedName": "connectLoop",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Bool",
+ "printedName": "Swift.Bool",
+ "usr": "s:Sb"
+ }
+ ],
+ "declKind": "Var",
+ "usr": "c:@M@PlaudWiFiSDK@objc(cs)WiFiAgent(py)connectLoop",
+ "mangledName": "$s12PlaudWiFiSDK0bC5AgentC11connectLoopSbvp",
+ "moduleName": "PlaudWiFiSDK",
+ "declAttributes": [
+ "HasInitialValue",
+ "HasStorage",
+ "AccessControl",
+ "ObjC",
+ "RawDocComment"
+ ],
+ "hasStorage": true,
+ "accessors": [
+ {
+ "kind": "Accessor",
+ "name": "Get",
+ "printedName": "Get()",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Bool",
+ "printedName": "Swift.Bool",
+ "usr": "s:Sb"
+ }
+ ],
+ "declKind": "Accessor",
+ "usr": "c:@M@PlaudWiFiSDK@objc(cs)WiFiAgent(im)connectLoop",
+ "mangledName": "$s12PlaudWiFiSDK0bC5AgentC11connectLoopSbvg",
+ "moduleName": "PlaudWiFiSDK",
+ "implicit": true,
+ "declAttributes": [
+ "ObjC"
+ ],
+ "accessorKind": "get"
+ },
+ {
+ "kind": "Accessor",
+ "name": "Set",
+ "printedName": "Set()",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Void",
+ "printedName": "()"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "Bool",
+ "printedName": "Swift.Bool",
+ "usr": "s:Sb"
+ }
+ ],
+ "declKind": "Accessor",
+ "usr": "c:@M@PlaudWiFiSDK@objc(cs)WiFiAgent(im)setConnectLoop:",
+ "mangledName": "$s12PlaudWiFiSDK0bC5AgentC11connectLoopSbvs",
+ "moduleName": "PlaudWiFiSDK",
+ "implicit": true,
+ "declAttributes": [
+ "ObjC"
+ ],
+ "accessorKind": "set"
+ },
+ {
+ "kind": "Accessor",
+ "name": "Modify",
+ "printedName": "Modify()",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Void",
+ "printedName": "()"
+ }
+ ],
+ "declKind": "Accessor",
+ "usr": "s:12PlaudWiFiSDK0bC5AgentC11connectLoopSbvM",
+ "mangledName": "$s12PlaudWiFiSDK0bC5AgentC11connectLoopSbvM",
+ "moduleName": "PlaudWiFiSDK",
+ "implicit": true,
+ "accessorKind": "_modify"
+ }
+ ]
+ },
+ {
+ "kind": "Var",
+ "name": "isServerStart",
+ "printedName": "isServerStart",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Bool",
+ "printedName": "Swift.Bool",
+ "usr": "s:Sb"
+ }
+ ],
+ "declKind": "Var",
+ "usr": "s:12PlaudWiFiSDK0bC5AgentC13isServerStartSbvp",
+ "mangledName": "$s12PlaudWiFiSDK0bC5AgentC13isServerStartSbvp",
+ "moduleName": "PlaudWiFiSDK",
+ "declAttributes": [
+ "HasInitialValue",
+ "HasStorage",
+ "SetterAccess",
+ "AccessControl",
+ "RawDocComment"
+ ],
+ "hasStorage": true,
+ "accessors": [
+ {
+ "kind": "Accessor",
+ "name": "Get",
+ "printedName": "Get()",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Bool",
+ "printedName": "Swift.Bool",
+ "usr": "s:Sb"
+ }
+ ],
+ "declKind": "Accessor",
+ "usr": "s:12PlaudWiFiSDK0bC5AgentC13isServerStartSbvg",
+ "mangledName": "$s12PlaudWiFiSDK0bC5AgentC13isServerStartSbvg",
+ "moduleName": "PlaudWiFiSDK",
+ "implicit": true,
+ "accessorKind": "get"
+ }
+ ]
+ },
+ {
+ "kind": "Var",
+ "name": "isClientOpen",
+ "printedName": "isClientOpen",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Bool",
+ "printedName": "Swift.Bool",
+ "usr": "s:Sb"
+ }
+ ],
+ "declKind": "Var",
+ "usr": "s:12PlaudWiFiSDK0bC5AgentC12isClientOpenSbvp",
+ "mangledName": "$s12PlaudWiFiSDK0bC5AgentC12isClientOpenSbvp",
+ "moduleName": "PlaudWiFiSDK",
+ "declAttributes": [
+ "HasInitialValue",
+ "HasStorage",
+ "SetterAccess",
+ "AccessControl",
+ "RawDocComment"
+ ],
+ "hasStorage": true,
+ "accessors": [
+ {
+ "kind": "Accessor",
+ "name": "Get",
+ "printedName": "Get()",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Bool",
+ "printedName": "Swift.Bool",
+ "usr": "s:Sb"
+ }
+ ],
+ "declKind": "Accessor",
+ "usr": "s:12PlaudWiFiSDK0bC5AgentC12isClientOpenSbvg",
+ "mangledName": "$s12PlaudWiFiSDK0bC5AgentC12isClientOpenSbvg",
+ "moduleName": "PlaudWiFiSDK",
+ "implicit": true,
+ "accessorKind": "get"
+ }
+ ]
+ },
+ {
+ "kind": "Var",
+ "name": "wifiVersion",
+ "printedName": "wifiVersion",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Int",
+ "printedName": "Swift.Int",
+ "usr": "s:Si"
+ }
+ ],
+ "declKind": "Var",
+ "usr": "s:12PlaudWiFiSDK0bC5AgentC11wifiVersionSivp",
+ "mangledName": "$s12PlaudWiFiSDK0bC5AgentC11wifiVersionSivp",
+ "moduleName": "PlaudWiFiSDK",
+ "declAttributes": [
+ "HasInitialValue",
+ "HasStorage",
+ "SetterAccess",
+ "AccessControl",
+ "RawDocComment"
+ ],
+ "hasStorage": true,
+ "accessors": [
+ {
+ "kind": "Accessor",
+ "name": "Get",
+ "printedName": "Get()",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Int",
+ "printedName": "Swift.Int",
+ "usr": "s:Si"
+ }
+ ],
+ "declKind": "Accessor",
+ "usr": "s:12PlaudWiFiSDK0bC5AgentC11wifiVersionSivg",
+ "mangledName": "$s12PlaudWiFiSDK0bC5AgentC11wifiVersionSivg",
+ "moduleName": "PlaudWiFiSDK",
+ "implicit": true,
+ "accessorKind": "get"
+ }
+ ]
+ },
+ {
+ "kind": "Var",
+ "name": "isHandshakeOk",
+ "printedName": "isHandshakeOk",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Bool",
+ "printedName": "Swift.Bool",
+ "usr": "s:Sb"
+ }
+ ],
+ "declKind": "Var",
+ "usr": "s:12PlaudWiFiSDK0bC5AgentC13isHandshakeOkSbvp",
+ "mangledName": "$s12PlaudWiFiSDK0bC5AgentC13isHandshakeOkSbvp",
+ "moduleName": "PlaudWiFiSDK",
+ "declAttributes": [
+ "HasInitialValue",
+ "HasStorage",
+ "SetterAccess",
+ "AccessControl",
+ "RawDocComment"
+ ],
+ "hasStorage": true,
+ "accessors": [
+ {
+ "kind": "Accessor",
+ "name": "Get",
+ "printedName": "Get()",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Bool",
+ "printedName": "Swift.Bool",
+ "usr": "s:Sb"
+ }
+ ],
+ "declKind": "Accessor",
+ "usr": "s:12PlaudWiFiSDK0bC5AgentC13isHandshakeOkSbvg",
+ "mangledName": "$s12PlaudWiFiSDK0bC5AgentC13isHandshakeOkSbvg",
+ "moduleName": "PlaudWiFiSDK",
+ "implicit": true,
+ "accessorKind": "get"
+ }
+ ]
+ },
+ {
+ "kind": "Var",
+ "name": "sessionId",
+ "printedName": "sessionId",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Int",
+ "printedName": "Swift.Int",
+ "usr": "s:Si"
+ }
+ ],
+ "declKind": "Var",
+ "usr": "c:@M@PlaudWiFiSDK@objc(cs)WiFiAgent(py)sessionId",
+ "mangledName": "$s12PlaudWiFiSDK0bC5AgentC9sessionIdSivp",
+ "moduleName": "PlaudWiFiSDK",
+ "declAttributes": [
+ "HasInitialValue",
+ "HasStorage",
+ "SetterAccess",
+ "AccessControl",
+ "ObjC",
+ "RawDocComment"
+ ],
+ "hasStorage": true,
+ "accessors": [
+ {
+ "kind": "Accessor",
+ "name": "Get",
+ "printedName": "Get()",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Int",
+ "printedName": "Swift.Int",
+ "usr": "s:Si"
+ }
+ ],
+ "declKind": "Accessor",
+ "usr": "c:@M@PlaudWiFiSDK@objc(cs)WiFiAgent(im)sessionId",
+ "mangledName": "$s12PlaudWiFiSDK0bC5AgentC9sessionIdSivg",
+ "moduleName": "PlaudWiFiSDK",
+ "implicit": true,
+ "declAttributes": [
+ "ObjC"
+ ],
+ "accessorKind": "get"
+ }
+ ]
+ },
+ {
+ "kind": "Var",
+ "name": "isDownloading",
+ "printedName": "isDownloading",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Bool",
+ "printedName": "Swift.Bool",
+ "usr": "s:Sb"
+ }
+ ],
+ "declKind": "Var",
+ "usr": "c:@M@PlaudWiFiSDK@objc(cs)WiFiAgent(py)isDownloading",
+ "mangledName": "$s12PlaudWiFiSDK0bC5AgentC13isDownloadingSbvp",
+ "moduleName": "PlaudWiFiSDK",
+ "declAttributes": [
+ "HasInitialValue",
+ "HasStorage",
+ "SetterAccess",
+ "AccessControl",
+ "ObjC",
+ "RawDocComment"
+ ],
+ "hasStorage": true,
+ "accessors": [
+ {
+ "kind": "Accessor",
+ "name": "Get",
+ "printedName": "Get()",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Bool",
+ "printedName": "Swift.Bool",
+ "usr": "s:Sb"
+ }
+ ],
+ "declKind": "Accessor",
+ "usr": "c:@M@PlaudWiFiSDK@objc(cs)WiFiAgent(im)isDownloading",
+ "mangledName": "$s12PlaudWiFiSDK0bC5AgentC13isDownloadingSbvg",
+ "moduleName": "PlaudWiFiSDK",
+ "implicit": true,
+ "declAttributes": [
+ "ObjC"
+ ],
+ "accessorKind": "get"
+ }
+ ]
+ },
+ {
+ "kind": "Var",
+ "name": "delegate",
+ "printedName": "delegate",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "WeakStorage",
+ "printedName": "(any PlaudWiFiSDK.WiFiAgentProtocol)?"
+ }
+ ],
+ "declKind": "Var",
+ "usr": "c:@M@PlaudWiFiSDK@objc(cs)WiFiAgent(py)delegate",
+ "mangledName": "$s12PlaudWiFiSDK0bC5AgentC8delegateAA0bcE8Protocol_pSgvp",
+ "moduleName": "PlaudWiFiSDK",
+ "declAttributes": [
+ "HasInitialValue",
+ "HasStorage",
+ "ReferenceOwnership",
+ "AccessControl",
+ "ObjC",
+ "RawDocComment"
+ ],
+ "ownership": 1,
+ "hasStorage": true,
+ "accessors": [
+ {
+ "kind": "Accessor",
+ "name": "Get",
+ "printedName": "Get()",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Optional",
+ "printedName": "(any PlaudWiFiSDK.WiFiAgentProtocol)?",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "WiFiAgentProtocol",
+ "printedName": "any PlaudWiFiSDK.WiFiAgentProtocol",
+ "usr": "c:@M@PlaudWiFiSDK@objc(pl)WiFiAgentProtocol"
+ }
+ ],
+ "usr": "s:Sq"
+ }
+ ],
+ "declKind": "Accessor",
+ "usr": "c:@M@PlaudWiFiSDK@objc(cs)WiFiAgent(im)delegate",
+ "mangledName": "$s12PlaudWiFiSDK0bC5AgentC8delegateAA0bcE8Protocol_pSgvg",
+ "moduleName": "PlaudWiFiSDK",
+ "implicit": true,
+ "declAttributes": [
+ "ObjC"
+ ],
+ "accessorKind": "get"
+ },
+ {
+ "kind": "Accessor",
+ "name": "Set",
+ "printedName": "Set()",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Void",
+ "printedName": "()"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "Optional",
+ "printedName": "(any PlaudWiFiSDK.WiFiAgentProtocol)?",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "WiFiAgentProtocol",
+ "printedName": "any PlaudWiFiSDK.WiFiAgentProtocol",
+ "usr": "c:@M@PlaudWiFiSDK@objc(pl)WiFiAgentProtocol"
+ }
+ ],
+ "usr": "s:Sq"
+ }
+ ],
+ "declKind": "Accessor",
+ "usr": "c:@M@PlaudWiFiSDK@objc(cs)WiFiAgent(im)setDelegate:",
+ "mangledName": "$s12PlaudWiFiSDK0bC5AgentC8delegateAA0bcE8Protocol_pSgvs",
+ "moduleName": "PlaudWiFiSDK",
+ "implicit": true,
+ "declAttributes": [
+ "ObjC"
+ ],
+ "accessorKind": "set"
+ },
+ {
+ "kind": "Accessor",
+ "name": "Modify",
+ "printedName": "Modify()",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Void",
+ "printedName": "()"
+ }
+ ],
+ "declKind": "Accessor",
+ "usr": "s:12PlaudWiFiSDK0bC5AgentC8delegateAA0bcE8Protocol_pSgvM",
+ "mangledName": "$s12PlaudWiFiSDK0bC5AgentC8delegateAA0bcE8Protocol_pSgvM",
+ "moduleName": "PlaudWiFiSDK",
+ "implicit": true,
+ "accessorKind": "_modify"
+ }
+ ]
+ },
+ {
+ "kind": "Var",
+ "name": "cmdDelegateQueue",
+ "printedName": "cmdDelegateQueue",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "DispatchQueue",
+ "printedName": "Dispatch.DispatchQueue",
+ "usr": "c:objc(cs)OS_dispatch_queue"
+ }
+ ],
+ "declKind": "Var",
+ "usr": "c:@M@PlaudWiFiSDK@objc(cs)WiFiAgent(py)cmdDelegateQueue",
+ "mangledName": "$s12PlaudWiFiSDK0bC5AgentC16cmdDelegateQueueSo17OS_dispatch_queueCvp",
+ "moduleName": "PlaudWiFiSDK",
+ "declAttributes": [
+ "HasInitialValue",
+ "HasStorage",
+ "AccessControl",
+ "ObjC",
+ "RawDocComment"
+ ],
+ "hasStorage": true,
+ "accessors": [
+ {
+ "kind": "Accessor",
+ "name": "Get",
+ "printedName": "Get()",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "DispatchQueue",
+ "printedName": "Dispatch.DispatchQueue",
+ "usr": "c:objc(cs)OS_dispatch_queue"
+ }
+ ],
+ "declKind": "Accessor",
+ "usr": "c:@M@PlaudWiFiSDK@objc(cs)WiFiAgent(im)cmdDelegateQueue",
+ "mangledName": "$s12PlaudWiFiSDK0bC5AgentC16cmdDelegateQueueSo17OS_dispatch_queueCvg",
+ "moduleName": "PlaudWiFiSDK",
+ "implicit": true,
+ "declAttributes": [
+ "ObjC"
+ ],
+ "accessorKind": "get"
+ },
+ {
+ "kind": "Accessor",
+ "name": "Set",
+ "printedName": "Set()",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Void",
+ "printedName": "()"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "DispatchQueue",
+ "printedName": "Dispatch.DispatchQueue",
+ "usr": "c:objc(cs)OS_dispatch_queue"
+ }
+ ],
+ "declKind": "Accessor",
+ "usr": "c:@M@PlaudWiFiSDK@objc(cs)WiFiAgent(im)setCmdDelegateQueue:",
+ "mangledName": "$s12PlaudWiFiSDK0bC5AgentC16cmdDelegateQueueSo17OS_dispatch_queueCvs",
+ "moduleName": "PlaudWiFiSDK",
+ "implicit": true,
+ "declAttributes": [
+ "ObjC"
+ ],
+ "accessorKind": "set"
+ },
+ {
+ "kind": "Accessor",
+ "name": "Modify",
+ "printedName": "Modify()",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Void",
+ "printedName": "()"
+ }
+ ],
+ "declKind": "Accessor",
+ "usr": "s:12PlaudWiFiSDK0bC5AgentC16cmdDelegateQueueSo17OS_dispatch_queueCvM",
+ "mangledName": "$s12PlaudWiFiSDK0bC5AgentC16cmdDelegateQueueSo17OS_dispatch_queueCvM",
+ "moduleName": "PlaudWiFiSDK",
+ "implicit": true,
+ "accessorKind": "_modify"
+ }
+ ]
+ },
+ {
+ "kind": "Var",
+ "name": "bleDevice",
+ "printedName": "bleDevice",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Optional",
+ "printedName": "PlaudBleSDK.BleDevice?",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "BleDevice",
+ "printedName": "PlaudBleSDK.BleDevice",
+ "usr": "c:@M@PenBleSDK@objc(cs)BleDevice"
+ }
+ ],
+ "usr": "s:Sq"
+ }
+ ],
+ "declKind": "Var",
+ "usr": "c:@M@PlaudWiFiSDK@objc(cs)WiFiAgent(py)bleDevice",
+ "mangledName": "$s12PlaudWiFiSDK0bC5AgentC9bleDevice0a3BleD00hG0CSgvp",
+ "moduleName": "PlaudWiFiSDK",
+ "declAttributes": [
+ "HasInitialValue",
+ "HasStorage",
+ "AccessControl",
+ "ObjC",
+ "RawDocComment"
+ ],
+ "hasStorage": true,
+ "accessors": [
+ {
+ "kind": "Accessor",
+ "name": "Get",
+ "printedName": "Get()",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Optional",
+ "printedName": "PlaudBleSDK.BleDevice?",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "BleDevice",
+ "printedName": "PlaudBleSDK.BleDevice",
+ "usr": "c:@M@PenBleSDK@objc(cs)BleDevice"
+ }
+ ],
+ "usr": "s:Sq"
+ }
+ ],
+ "declKind": "Accessor",
+ "usr": "c:@M@PlaudWiFiSDK@objc(cs)WiFiAgent(im)bleDevice",
+ "mangledName": "$s12PlaudWiFiSDK0bC5AgentC9bleDevice0a3BleD00hG0CSgvg",
+ "moduleName": "PlaudWiFiSDK",
+ "implicit": true,
+ "declAttributes": [
+ "ObjC"
+ ],
+ "accessorKind": "get"
+ },
+ {
+ "kind": "Accessor",
+ "name": "Set",
+ "printedName": "Set()",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Void",
+ "printedName": "()"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "Optional",
+ "printedName": "PlaudBleSDK.BleDevice?",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "BleDevice",
+ "printedName": "PlaudBleSDK.BleDevice",
+ "usr": "c:@M@PenBleSDK@objc(cs)BleDevice"
+ }
+ ],
+ "usr": "s:Sq"
+ }
+ ],
+ "declKind": "Accessor",
+ "usr": "c:@M@PlaudWiFiSDK@objc(cs)WiFiAgent(im)setBleDevice:",
+ "mangledName": "$s12PlaudWiFiSDK0bC5AgentC9bleDevice0a3BleD00hG0CSgvs",
+ "moduleName": "PlaudWiFiSDK",
+ "implicit": true,
+ "declAttributes": [
+ "ObjC"
+ ],
+ "accessorKind": "set"
+ },
+ {
+ "kind": "Accessor",
+ "name": "Modify",
+ "printedName": "Modify()",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Void",
+ "printedName": "()"
+ }
+ ],
+ "declKind": "Accessor",
+ "usr": "s:12PlaudWiFiSDK0bC5AgentC9bleDevice0a3BleD00hG0CSgvM",
+ "mangledName": "$s12PlaudWiFiSDK0bC5AgentC9bleDevice0a3BleD00hG0CSgvM",
+ "moduleName": "PlaudWiFiSDK",
+ "implicit": true,
+ "accessorKind": "_modify"
+ }
+ ]
+ },
+ {
+ "kind": "Function",
+ "name": "openReleaseLog",
+ "printedName": "openReleaseLog(_:_:)",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Void",
+ "printedName": "()"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "Bool",
+ "printedName": "Swift.Bool",
+ "usr": "s:Sb"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "Optional",
+ "printedName": "((Swift.String) -> ())?",
+ "children": [
+ {
+ "kind": "TypeFunc",
+ "name": "Function",
+ "printedName": "(Swift.String) -> ()",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Void",
+ "printedName": "()"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "String",
+ "printedName": "Swift.String",
+ "usr": "s:SS"
+ }
+ ]
+ }
+ ],
+ "hasDefaultArg": true,
+ "usr": "s:Sq"
+ }
+ ],
+ "declKind": "Func",
+ "usr": "c:@M@PlaudWiFiSDK@objc(cs)WiFiAgent(im)openReleaseLog::",
+ "mangledName": "$s12PlaudWiFiSDK0bC5AgentC14openReleaseLogyySb_ySScSgtF",
+ "moduleName": "PlaudWiFiSDK",
+ "declAttributes": [
+ "AccessControl",
+ "ObjC",
+ "RawDocComment"
+ ],
+ "funcSelfKind": "NonMutating"
+ },
+ {
+ "kind": "Function",
+ "name": "openLog",
+ "printedName": "openLog(_:_:)",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Void",
+ "printedName": "()"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "Bool",
+ "printedName": "Swift.Bool",
+ "usr": "s:Sb"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "Optional",
+ "printedName": "((Swift.String) -> ())?",
+ "children": [
+ {
+ "kind": "TypeFunc",
+ "name": "Function",
+ "printedName": "(Swift.String) -> ()",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Void",
+ "printedName": "()"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "String",
+ "printedName": "Swift.String",
+ "usr": "s:SS"
+ }
+ ]
+ }
+ ],
+ "hasDefaultArg": true,
+ "usr": "s:Sq"
+ }
+ ],
+ "declKind": "Func",
+ "usr": "c:@M@PlaudWiFiSDK@objc(cs)WiFiAgent(im)openLog::",
+ "mangledName": "$s12PlaudWiFiSDK0bC5AgentC7openLogyySb_ySScSgtF",
+ "moduleName": "PlaudWiFiSDK",
+ "declAttributes": [
+ "AccessControl",
+ "ObjC",
+ "RawDocComment"
+ ],
+ "funcSelfKind": "NonMutating"
+ },
+ {
+ "kind": "Function",
+ "name": "listenPort",
+ "printedName": "listenPort(_:_:)",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Void",
+ "printedName": "()"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "String",
+ "printedName": "Swift.String",
+ "usr": "s:SS"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "Int",
+ "printedName": "Swift.Int",
+ "hasDefaultArg": true,
+ "usr": "s:Si"
+ }
+ ],
+ "declKind": "Func",
+ "usr": "c:@M@PlaudWiFiSDK@objc(cs)WiFiAgent(im)listenPort::",
+ "mangledName": "$s12PlaudWiFiSDK0bC5AgentC10listenPortyySS_SitF",
+ "moduleName": "PlaudWiFiSDK",
+ "declAttributes": [
+ "AccessControl",
+ "ObjC",
+ "RawDocComment"
+ ],
+ "funcSelfKind": "NonMutating"
+ },
+ {
+ "kind": "Function",
+ "name": "connectWifi",
+ "printedName": "connectWifi(_:_:_:_:)",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Void",
+ "printedName": "()"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "String",
+ "printedName": "Swift.String",
+ "usr": "s:SS"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "String",
+ "printedName": "Swift.String",
+ "usr": "s:SS"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "Int",
+ "printedName": "Swift.Int",
+ "hasDefaultArg": true,
+ "usr": "s:Si"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "Bool",
+ "printedName": "Swift.Bool",
+ "hasDefaultArg": true,
+ "usr": "s:Sb"
+ }
+ ],
+ "declKind": "Func",
+ "usr": "c:@M@PlaudWiFiSDK@objc(cs)WiFiAgent(im)connectWifi::::",
+ "mangledName": "$s12PlaudWiFiSDK0bC5AgentC11connectWifiyySS_SSSiSbtF",
+ "moduleName": "PlaudWiFiSDK",
+ "intro_iOS": "11.0",
+ "declAttributes": [
+ "AccessControl",
+ "ObjC",
+ "Available",
+ "RawDocComment"
+ ],
+ "funcSelfKind": "NonMutating"
+ },
+ {
+ "kind": "Function",
+ "name": "cancelConnectWifi",
+ "printedName": "cancelConnectWifi()",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Void",
+ "printedName": "()"
+ }
+ ],
+ "declKind": "Func",
+ "usr": "c:@M@PlaudWiFiSDK@objc(cs)WiFiAgent(im)cancelConnectWifi",
+ "mangledName": "$s12PlaudWiFiSDK0bC5AgentC17cancelConnectWifiyyF",
+ "moduleName": "PlaudWiFiSDK",
+ "declAttributes": [
+ "AccessControl",
+ "ObjC",
+ "RawDocComment"
+ ],
+ "funcSelfKind": "NonMutating"
+ },
+ {
+ "kind": "Function",
+ "name": "clearAllWiFiConfigurations",
+ "printedName": "clearAllWiFiConfigurations()",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Void",
+ "printedName": "()"
+ }
+ ],
+ "declKind": "Func",
+ "usr": "c:@M@PlaudWiFiSDK@objc(cs)WiFiAgent(im)clearAllWiFiConfigurations",
+ "mangledName": "$s12PlaudWiFiSDK0bC5AgentC08clearAllbC14ConfigurationsyyF",
+ "moduleName": "PlaudWiFiSDK",
+ "intro_iOS": "11.0",
+ "declAttributes": [
+ "AccessControl",
+ "ObjC",
+ "Available",
+ "RawDocComment"
+ ],
+ "funcSelfKind": "NonMutating"
+ },
+ {
+ "kind": "Function",
+ "name": "clearAllWiFiConfigurationsCompat",
+ "printedName": "clearAllWiFiConfigurationsCompat()",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Void",
+ "printedName": "()"
+ }
+ ],
+ "declKind": "Func",
+ "usr": "c:@M@PlaudWiFiSDK@objc(cs)WiFiAgent(im)clearAllWiFiConfigurationsCompat",
+ "mangledName": "$s12PlaudWiFiSDK0bC5AgentC08clearAllbC20ConfigurationsCompatyyF",
+ "moduleName": "PlaudWiFiSDK",
+ "declAttributes": [
+ "AccessControl",
+ "ObjC",
+ "RawDocComment"
+ ],
+ "funcSelfKind": "NonMutating"
+ },
+ {
+ "kind": "Function",
+ "name": "disconnect",
+ "printedName": "disconnect()",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Void",
+ "printedName": "()"
+ }
+ ],
+ "declKind": "Func",
+ "usr": "c:@M@PlaudWiFiSDK@objc(cs)WiFiAgent(im)disconnect",
+ "mangledName": "$s12PlaudWiFiSDK0bC5AgentC10disconnectyyF",
+ "moduleName": "PlaudWiFiSDK",
+ "declAttributes": [
+ "AccessControl",
+ "ObjC",
+ "RawDocComment"
+ ],
+ "funcSelfKind": "NonMutating"
+ },
+ {
+ "kind": "Function",
+ "name": "serverDidStart",
+ "printedName": "serverDidStart()",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Void",
+ "printedName": "()"
+ }
+ ],
+ "declKind": "Func",
+ "usr": "c:@CM@PlaudWiFiSDK@objc(cs)WiFiAgent(im)serverDidStart",
+ "mangledName": "$s12PlaudWiFiSDK0bC5AgentC14serverDidStartyyF",
+ "moduleName": "PlaudWiFiSDK",
+ "objc_name": "serverDidStart",
+ "declAttributes": [
+ "Dynamic",
+ "ObjC",
+ "AccessControl"
+ ],
+ "isFromExtension": true,
+ "funcSelfKind": "NonMutating"
+ },
+ {
+ "kind": "Function",
+ "name": "serverDidFailWithError",
+ "printedName": "serverDidFailWithError(_:)",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Void",
+ "printedName": "()"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "Error",
+ "printedName": "any Swift.Error",
+ "usr": "s:s5ErrorP"
+ }
+ ],
+ "declKind": "Func",
+ "usr": "c:@CM@PlaudWiFiSDK@objc(cs)WiFiAgent(im)serverDidFailWithError:",
+ "mangledName": "$s12PlaudWiFiSDK0bC5AgentC22serverDidFailWithErroryys0J0_pF",
+ "moduleName": "PlaudWiFiSDK",
+ "objc_name": "serverDidFailWithError:",
+ "declAttributes": [
+ "Dynamic",
+ "ObjC",
+ "AccessControl"
+ ],
+ "isFromExtension": true,
+ "funcSelfKind": "NonMutating"
+ },
+ {
+ "kind": "Function",
+ "name": "serverDidStop",
+ "printedName": "serverDidStop()",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Void",
+ "printedName": "()"
+ }
+ ],
+ "declKind": "Func",
+ "usr": "c:@CM@PlaudWiFiSDK@objc(cs)WiFiAgent(im)serverDidStop",
+ "mangledName": "$s12PlaudWiFiSDK0bC5AgentC13serverDidStopyyF",
+ "moduleName": "PlaudWiFiSDK",
+ "objc_name": "serverDidStop",
+ "declAttributes": [
+ "Dynamic",
+ "ObjC",
+ "AccessControl"
+ ],
+ "isFromExtension": true,
+ "funcSelfKind": "NonMutating"
+ },
+ {
+ "kind": "Function",
+ "name": "clientDidOpen",
+ "printedName": "clientDidOpen()",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Void",
+ "printedName": "()"
+ }
+ ],
+ "declKind": "Func",
+ "usr": "c:@CM@PlaudWiFiSDK@objc(cs)WiFiAgent(im)clientDidOpen",
+ "mangledName": "$s12PlaudWiFiSDK0bC5AgentC13clientDidOpenyyF",
+ "moduleName": "PlaudWiFiSDK",
+ "objc_name": "clientDidOpen",
+ "declAttributes": [
+ "Dynamic",
+ "ObjC",
+ "AccessControl"
+ ],
+ "isFromExtension": true,
+ "funcSelfKind": "NonMutating"
+ },
+ {
+ "kind": "Function",
+ "name": "clientDidReceiveText",
+ "printedName": "clientDidReceiveText(_:)",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Void",
+ "printedName": "()"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "String",
+ "printedName": "Swift.String",
+ "usr": "s:SS"
+ }
+ ],
+ "declKind": "Func",
+ "usr": "c:@CM@PlaudWiFiSDK@objc(cs)WiFiAgent(im)clientDidReceiveText:",
+ "mangledName": "$s12PlaudWiFiSDK0bC5AgentC20clientDidReceiveTextyySSF",
+ "moduleName": "PlaudWiFiSDK",
+ "objc_name": "clientDidReceiveText:",
+ "declAttributes": [
+ "Dynamic",
+ "ObjC",
+ "AccessControl"
+ ],
+ "isFromExtension": true,
+ "funcSelfKind": "NonMutating"
+ },
+ {
+ "kind": "Function",
+ "name": "clientDidReceive",
+ "printedName": "clientDidReceive(_:)",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Void",
+ "printedName": "()"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "Data",
+ "printedName": "Foundation.Data",
+ "usr": "s:10Foundation4DataV"
+ }
+ ],
+ "declKind": "Func",
+ "usr": "c:@CM@PlaudWiFiSDK@objc(cs)WiFiAgent(im)clientDidReceiveData:",
+ "mangledName": "$s12PlaudWiFiSDK0bC5AgentC16clientDidReceiveyy10Foundation4DataVF",
+ "moduleName": "PlaudWiFiSDK",
+ "objc_name": "clientDidReceiveData:",
+ "declAttributes": [
+ "Dynamic",
+ "ObjC",
+ "AccessControl"
+ ],
+ "isFromExtension": true,
+ "funcSelfKind": "NonMutating"
+ },
+ {
+ "kind": "Function",
+ "name": "clientDidFailWithError",
+ "printedName": "clientDidFailWithError(_:)",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Void",
+ "printedName": "()"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "Error",
+ "printedName": "any Swift.Error",
+ "usr": "s:s5ErrorP"
+ }
+ ],
+ "declKind": "Func",
+ "usr": "c:@CM@PlaudWiFiSDK@objc(cs)WiFiAgent(im)clientDidFailWithError:",
+ "mangledName": "$s12PlaudWiFiSDK0bC5AgentC22clientDidFailWithErroryys0J0_pF",
+ "moduleName": "PlaudWiFiSDK",
+ "objc_name": "clientDidFailWithError:",
+ "declAttributes": [
+ "Dynamic",
+ "ObjC",
+ "AccessControl",
+ "RawDocComment"
+ ],
+ "isFromExtension": true,
+ "funcSelfKind": "NonMutating"
+ },
+ {
+ "kind": "Function",
+ "name": "clientDidClose",
+ "printedName": "clientDidClose(withCode:reason:wasClean:)",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Void",
+ "printedName": "()"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "Int",
+ "printedName": "Swift.Int",
+ "usr": "s:Si"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "String",
+ "printedName": "Swift.String",
+ "usr": "s:SS"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "Bool",
+ "printedName": "Swift.Bool",
+ "usr": "s:Sb"
+ }
+ ],
+ "declKind": "Func",
+ "usr": "c:@CM@PlaudWiFiSDK@objc(cs)WiFiAgent(im)clientDidCloseWithCode:reason:wasClean:",
+ "mangledName": "$s12PlaudWiFiSDK0bC5AgentC14clientDidClose8withCode6reason8wasCleanySi_SSSbtF",
+ "moduleName": "PlaudWiFiSDK",
+ "objc_name": "clientDidCloseWithCode:reason:wasClean:",
+ "declAttributes": [
+ "Dynamic",
+ "ObjC",
+ "AccessControl"
+ ],
+ "isFromExtension": true,
+ "funcSelfKind": "NonMutating"
+ },
+ {
+ "kind": "Function",
+ "name": "isWebSocketConnected",
+ "printedName": "isWebSocketConnected()",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Bool",
+ "printedName": "Swift.Bool",
+ "usr": "s:Sb"
+ }
+ ],
+ "declKind": "Func",
+ "usr": "c:@CM@PlaudWiFiSDK@objc(cs)WiFiAgent(im)isWebSocketConnected",
+ "mangledName": "$s12PlaudWiFiSDK0bC5AgentC20isWebSocketConnectedSbyF",
+ "moduleName": "PlaudWiFiSDK",
+ "declAttributes": [
+ "Dynamic",
+ "AccessControl",
+ "ObjC",
+ "RawDocComment"
+ ],
+ "isFromExtension": true,
+ "funcSelfKind": "NonMutating"
+ },
+ {
+ "kind": "Function",
+ "name": "appGetLogs",
+ "printedName": "appGetLogs(_:)",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Void",
+ "printedName": "()"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "Bool",
+ "printedName": "Swift.Bool",
+ "usr": "s:Sb"
+ }
+ ],
+ "declKind": "Func",
+ "usr": "s:12PlaudWiFiSDK0bC5AgentC10appGetLogsyySbF",
+ "mangledName": "$s12PlaudWiFiSDK0bC5AgentC10appGetLogsyySbF",
+ "moduleName": "PlaudWiFiSDK",
+ "declAttributes": [
+ "AccessControl",
+ "RawDocComment"
+ ],
+ "isFromExtension": true,
+ "funcSelfKind": "NonMutating"
+ },
+ {
+ "kind": "Function",
+ "name": "appWiFiRate",
+ "printedName": "appWiFiRate(_:_:)",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Void",
+ "printedName": "()"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "Bool",
+ "printedName": "Swift.Bool",
+ "usr": "s:Sb"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "Int",
+ "printedName": "Swift.Int",
+ "usr": "s:Si"
+ }
+ ],
+ "declKind": "Func",
+ "usr": "c:@CM@PlaudWiFiSDK@objc(cs)WiFiAgent(im)appWiFiRate::",
+ "mangledName": "$s12PlaudWiFiSDK0bC5AgentC03appbC4RateyySb_SitF",
+ "moduleName": "PlaudWiFiSDK",
+ "declAttributes": [
+ "Dynamic",
+ "AccessControl",
+ "ObjC",
+ "RawDocComment"
+ ],
+ "isFromExtension": true,
+ "funcSelfKind": "NonMutating"
+ },
+ {
+ "kind": "Function",
+ "name": "appDeleteFile",
+ "printedName": "appDeleteFile(_:_:)",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Void",
+ "printedName": "()"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "Int",
+ "printedName": "Swift.Int",
+ "usr": "s:Si"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "Int",
+ "printedName": "Swift.Int",
+ "hasDefaultArg": true,
+ "usr": "s:Si"
+ }
+ ],
+ "declKind": "Func",
+ "usr": "c:@CM@PlaudWiFiSDK@objc(cs)WiFiAgent(im)appDeleteFile::",
+ "mangledName": "$s12PlaudWiFiSDK0bC5AgentC13appDeleteFileyySi_SitF",
+ "moduleName": "PlaudWiFiSDK",
+ "declAttributes": [
+ "Dynamic",
+ "AccessControl",
+ "ObjC",
+ "RawDocComment"
+ ],
+ "isFromExtension": true,
+ "funcSelfKind": "NonMutating"
+ },
+ {
+ "kind": "Function",
+ "name": "appExtendWifiExitTime",
+ "printedName": "appExtendWifiExitTime()",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Void",
+ "printedName": "()"
+ }
+ ],
+ "declKind": "Func",
+ "usr": "c:@CM@PlaudWiFiSDK@objc(cs)WiFiAgent(im)appExtendWifiExitTime",
+ "mangledName": "$s12PlaudWiFiSDK0bC5AgentC21appExtendWifiExitTimeyyF",
+ "moduleName": "PlaudWiFiSDK",
+ "declAttributes": [
+ "Dynamic",
+ "AccessControl",
+ "ObjC",
+ "RawDocComment"
+ ],
+ "isFromExtension": true,
+ "funcSelfKind": "NonMutating"
+ },
+ {
+ "kind": "Function",
+ "name": "appStopSyncFile",
+ "printedName": "appStopSyncFile(_:_:)",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Void",
+ "printedName": "()"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "Int",
+ "printedName": "Swift.Int",
+ "usr": "s:Si"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "Int",
+ "printedName": "Swift.Int",
+ "hasDefaultArg": true,
+ "usr": "s:Si"
+ }
+ ],
+ "declKind": "Func",
+ "usr": "c:@CM@PlaudWiFiSDK@objc(cs)WiFiAgent(im)appStopSyncFile::",
+ "mangledName": "$s12PlaudWiFiSDK0bC5AgentC15appStopSyncFileyySi_SitF",
+ "moduleName": "PlaudWiFiSDK",
+ "declAttributes": [
+ "Dynamic",
+ "AccessControl",
+ "ObjC",
+ "RawDocComment"
+ ],
+ "isFromExtension": true,
+ "funcSelfKind": "NonMutating"
+ },
+ {
+ "kind": "Function",
+ "name": "appSyncFile",
+ "printedName": "appSyncFile(_:_:_:_:)",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Void",
+ "printedName": "()"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "Int",
+ "printedName": "Swift.Int",
+ "usr": "s:Si"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "Int",
+ "printedName": "Swift.Int",
+ "usr": "s:Si"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "Int",
+ "printedName": "Swift.Int",
+ "hasDefaultArg": true,
+ "usr": "s:Si"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "Int",
+ "printedName": "Swift.Int",
+ "hasDefaultArg": true,
+ "usr": "s:Si"
+ }
+ ],
+ "declKind": "Func",
+ "usr": "c:@CM@PlaudWiFiSDK@objc(cs)WiFiAgent(im)appSyncFile::::",
+ "mangledName": "$s12PlaudWiFiSDK0bC5AgentC11appSyncFileyySi_S3itF",
+ "moduleName": "PlaudWiFiSDK",
+ "declAttributes": [
+ "Dynamic",
+ "AccessControl",
+ "ObjC",
+ "RawDocComment"
+ ],
+ "isFromExtension": true,
+ "funcSelfKind": "NonMutating"
+ },
+ {
+ "kind": "Function",
+ "name": "appGetFileList",
+ "printedName": "appGetFileList(_:_:_:)",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Void",
+ "printedName": "()"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "Int",
+ "printedName": "Swift.Int",
+ "usr": "s:Si"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "Int",
+ "printedName": "Swift.Int",
+ "usr": "s:Si"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "Bool",
+ "printedName": "Swift.Bool",
+ "hasDefaultArg": true,
+ "usr": "s:Sb"
+ }
+ ],
+ "declKind": "Func",
+ "usr": "c:@CM@PlaudWiFiSDK@objc(cs)WiFiAgent(im)appGetFileList:::",
+ "mangledName": "$s12PlaudWiFiSDK0bC5AgentC14appGetFileListyySi_SiSbtF",
+ "moduleName": "PlaudWiFiSDK",
+ "declAttributes": [
+ "Dynamic",
+ "AccessControl",
+ "ObjC",
+ "RawDocComment"
+ ],
+ "isFromExtension": true,
+ "funcSelfKind": "NonMutating"
+ },
+ {
+ "kind": "Function",
+ "name": "startPushOTA",
+ "printedName": "startPushOTA(_:_:crc:_:)",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Void",
+ "printedName": "()"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "Int",
+ "printedName": "Swift.Int",
+ "usr": "s:Si"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "Int",
+ "printedName": "Swift.Int",
+ "usr": "s:Si"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "Int",
+ "printedName": "Swift.Int",
+ "usr": "s:Si"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "Int",
+ "printedName": "Swift.Int",
+ "usr": "s:Si"
+ }
+ ],
+ "declKind": "Func",
+ "usr": "c:@CM@PlaudWiFiSDK@objc(cs)WiFiAgent(im)startPushOTA::crc::",
+ "mangledName": "$s12PlaudWiFiSDK0bC5AgentC12startPushOTA__3crc_ySi_S3itF",
+ "moduleName": "PlaudWiFiSDK",
+ "declAttributes": [
+ "Dynamic",
+ "AccessControl",
+ "ObjC"
+ ],
+ "isFromExtension": true,
+ "funcSelfKind": "NonMutating"
+ },
+ {
+ "kind": "Function",
+ "name": "sendFilePackToPen",
+ "printedName": "sendFilePackToPen(type:start:len:last:uid:binData:)",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Void",
+ "printedName": "()"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "Int",
+ "printedName": "Swift.Int",
+ "usr": "s:Si"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "Int32",
+ "printedName": "Swift.Int32",
+ "usr": "s:s5Int32V"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "Int32",
+ "printedName": "Swift.Int32",
+ "usr": "s:s5Int32V"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "Bool",
+ "printedName": "Swift.Bool",
+ "usr": "s:Sb"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "Int32",
+ "printedName": "Swift.Int32",
+ "usr": "s:s5Int32V"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "Optional",
+ "printedName": "Foundation.Data?",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Data",
+ "printedName": "Foundation.Data",
+ "usr": "s:10Foundation4DataV"
+ }
+ ],
+ "usr": "s:Sq"
+ }
+ ],
+ "declKind": "Func",
+ "usr": "c:@CM@PlaudWiFiSDK@objc(cs)WiFiAgent(im)sendFilePackToPenWithType:start:len:last:uid:binData:",
+ "mangledName": "$s12PlaudWiFiSDK0bC5AgentC17sendFilePackToPen4type5start3len4last3uid7binDataySi_s5Int32VALSbAL10Foundation0Q0VSgtF",
+ "moduleName": "PlaudWiFiSDK",
+ "objc_name": "sendFilePackToPenWithType:start:len:last:uid:binData:",
+ "declAttributes": [
+ "Dynamic",
+ "AccessControl",
+ "ObjC"
+ ],
+ "isFromExtension": true,
+ "funcSelfKind": "NonMutating"
+ },
+ {
+ "kind": "Function",
+ "name": "getCurrentWiFiName",
+ "printedName": "getCurrentWiFiName()",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Optional",
+ "printedName": "Swift.String?",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "String",
+ "printedName": "Swift.String",
+ "usr": "s:SS"
+ }
+ ],
+ "usr": "s:Sq"
+ }
+ ],
+ "declKind": "Func",
+ "usr": "c:@CM@PlaudWiFiSDK@objc(cs)WiFiAgent(im)getCurrentWiFiName",
+ "mangledName": "$s12PlaudWiFiSDK0bC5AgentC010getCurrentbC4NameSSSgyF",
+ "moduleName": "PlaudWiFiSDK",
+ "declAttributes": [
+ "Dynamic",
+ "AccessControl",
+ "ObjC",
+ "RawDocComment"
+ ],
+ "isFromExtension": true,
+ "funcSelfKind": "NonMutating"
+ },
+ {
+ "kind": "Function",
+ "name": "getCurrentWiFiNameWithRetry",
+ "printedName": "getCurrentWiFiNameWithRetry(maxRetries:delay:)",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Optional",
+ "printedName": "Swift.String?",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "String",
+ "printedName": "Swift.String",
+ "usr": "s:SS"
+ }
+ ],
+ "usr": "s:Sq"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "Int",
+ "printedName": "Swift.Int",
+ "hasDefaultArg": true,
+ "usr": "s:Si"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "Double",
+ "printedName": "Swift.Double",
+ "hasDefaultArg": true,
+ "usr": "s:Sd"
+ }
+ ],
+ "declKind": "Func",
+ "usr": "c:@CM@PlaudWiFiSDK@objc(cs)WiFiAgent(im)getCurrentWiFiNameWithRetryWithMaxRetries:delay:",
+ "mangledName": "$s12PlaudWiFiSDK0bC5AgentC010getCurrentbC13NameWithRetry10maxRetries5delaySSSgSi_SdtF",
+ "moduleName": "PlaudWiFiSDK",
+ "objc_name": "getCurrentWiFiNameWithRetryWithMaxRetries:delay:",
+ "declAttributes": [
+ "Dynamic",
+ "AccessControl",
+ "ObjC",
+ "RawDocComment"
+ ],
+ "isFromExtension": true,
+ "funcSelfKind": "NonMutating"
+ }
+ ],
+ "declKind": "Class",
+ "usr": "c:@M@PlaudWiFiSDK@objc(cs)WiFiAgent",
+ "mangledName": "$s12PlaudWiFiSDK0bC5AgentC",
+ "moduleName": "PlaudWiFiSDK",
+ "declAttributes": [
+ "AccessControl",
+ "ObjC",
+ "RawDocComment"
+ ],
+ "superclassUsr": "c:objc(cs)NSObject",
+ "hasMissingDesignatedInitializers": true,
+ "inheritsConvenienceInitializers": true,
+ "superclassNames": [
+ "ObjectiveC.NSObject"
+ ],
+ "conformances": [
+ {
+ "kind": "Conformance",
+ "name": "Copyable",
+ "printedName": "Copyable",
+ "usr": "s:s8CopyableP",
+ "mangledName": "$ss8CopyableP"
+ },
+ {
+ "kind": "Conformance",
+ "name": "Escapable",
+ "printedName": "Escapable",
+ "usr": "s:s9EscapableP",
+ "mangledName": "$ss9EscapableP"
+ },
+ {
+ "kind": "Conformance",
+ "name": "Equatable",
+ "printedName": "Equatable",
+ "usr": "s:SQ",
+ "mangledName": "$sSQ"
+ },
+ {
+ "kind": "Conformance",
+ "name": "Hashable",
+ "printedName": "Hashable",
+ "usr": "s:SH",
+ "mangledName": "$sSH"
+ },
+ {
+ "kind": "Conformance",
+ "name": "CVarArg",
+ "printedName": "CVarArg",
+ "usr": "s:s7CVarArgP",
+ "mangledName": "$ss7CVarArgP"
+ },
+ {
+ "kind": "Conformance",
+ "name": "_KeyValueCodingAndObservingPublishing",
+ "printedName": "_KeyValueCodingAndObservingPublishing",
+ "usr": "s:10Foundation37_KeyValueCodingAndObservingPublishingP",
+ "mangledName": "$s10Foundation37_KeyValueCodingAndObservingPublishingP"
+ },
+ {
+ "kind": "Conformance",
+ "name": "_KeyValueCodingAndObserving",
+ "printedName": "_KeyValueCodingAndObserving",
+ "usr": "s:10Foundation27_KeyValueCodingAndObservingP",
+ "mangledName": "$s10Foundation27_KeyValueCodingAndObservingP"
+ },
+ {
+ "kind": "Conformance",
+ "name": "CustomStringConvertible",
+ "printedName": "CustomStringConvertible",
+ "usr": "s:s23CustomStringConvertibleP",
+ "mangledName": "$ss23CustomStringConvertibleP"
+ },
+ {
+ "kind": "Conformance",
+ "name": "CustomDebugStringConvertible",
+ "printedName": "CustomDebugStringConvertible",
+ "usr": "s:s28CustomDebugStringConvertibleP",
+ "mangledName": "$ss28CustomDebugStringConvertibleP"
+ }
+ ]
+ },
+ {
+ "kind": "TypeDecl",
+ "name": "GCDTool",
+ "printedName": "GCDTool",
+ "children": [
+ {
+ "kind": "Var",
+ "name": "shared",
+ "printedName": "shared",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "GCDTool",
+ "printedName": "PlaudWiFiSDK.GCDTool",
+ "usr": "s:12PlaudWiFiSDK7GCDToolC"
+ }
+ ],
+ "declKind": "Var",
+ "usr": "s:12PlaudWiFiSDK7GCDToolC6sharedACvpZ",
+ "mangledName": "$s12PlaudWiFiSDK7GCDToolC6sharedACvpZ",
+ "moduleName": "PlaudWiFiSDK",
+ "static": true,
+ "declAttributes": [
+ "HasInitialValue",
+ "Final",
+ "HasStorage",
+ "AccessControl"
+ ],
+ "isLet": true,
+ "hasStorage": true,
+ "accessors": [
+ {
+ "kind": "Accessor",
+ "name": "Get",
+ "printedName": "Get()",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "GCDTool",
+ "printedName": "PlaudWiFiSDK.GCDTool",
+ "usr": "s:12PlaudWiFiSDK7GCDToolC"
+ }
+ ],
+ "declKind": "Accessor",
+ "usr": "s:12PlaudWiFiSDK7GCDToolC6sharedACvgZ",
+ "mangledName": "$s12PlaudWiFiSDK7GCDToolC6sharedACvgZ",
+ "moduleName": "PlaudWiFiSDK",
+ "static": true,
+ "implicit": true,
+ "declAttributes": [
+ "Final"
+ ],
+ "accessorKind": "get"
+ }
+ ]
+ },
+ {
+ "kind": "Function",
+ "name": "execute",
+ "printedName": "execute(label:_:)",
+ "children": [
+ {
+ "kind": "TypeFunc",
+ "name": "Function",
+ "printedName": "() -> ()",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Void",
+ "printedName": "()"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "Void",
+ "printedName": "()"
+ }
+ ]
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "String",
+ "printedName": "Swift.String",
+ "usr": "s:SS"
+ },
+ {
+ "kind": "TypeFunc",
+ "name": "Function",
+ "printedName": "() -> ()",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Void",
+ "printedName": "()"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "Void",
+ "printedName": "()"
+ }
+ ]
+ }
+ ],
+ "declKind": "Func",
+ "usr": "s:12PlaudWiFiSDK7GCDToolC7execute5label_yycSS_yyXLtF",
+ "mangledName": "$s12PlaudWiFiSDK7GCDToolC7execute5label_yycSS_yyXLtF",
+ "moduleName": "PlaudWiFiSDK",
+ "declAttributes": [
+ "AccessControl"
+ ],
+ "funcSelfKind": "NonMutating"
+ },
+ {
+ "kind": "Function",
+ "name": "cancel",
+ "printedName": "cancel(label:)",
+ "children": [
+ {
+ "kind": "TypeNominal",
+ "name": "Void",
+ "printedName": "()"
+ },
+ {
+ "kind": "TypeNominal",
+ "name": "String",
+ "printedName": "Swift.String",
+ "usr": "s:SS"
+ }
+ ],
+ "declKind": "Func",
+ "usr": "s:12PlaudWiFiSDK7GCDToolC6cancel5labelySS_tF",
+ "mangledName": "$s12PlaudWiFiSDK7GCDToolC6cancel5labelySS_tF",
+ "moduleName": "PlaudWiFiSDK",
+ "declAttributes": [
+ "AccessControl"
+ ],
+ "funcSelfKind": "NonMutating"
+ }
+ ],
+ "declKind": "Class",
+ "usr": "s:12PlaudWiFiSDK7GCDToolC",
+ "mangledName": "$s12PlaudWiFiSDK7GCDToolC",
+ "moduleName": "PlaudWiFiSDK",
+ "declAttributes": [
+ "AccessControl",
+ "RawDocComment"
+ ],
+ "hasMissingDesignatedInitializers": true,
+ "conformances": [
+ {
+ "kind": "Conformance",
+ "name": "Copyable",
+ "printedName": "Copyable",
+ "usr": "s:s8CopyableP",
+ "mangledName": "$ss8CopyableP"
+ },
+ {
+ "kind": "Conformance",
+ "name": "Escapable",
+ "printedName": "Escapable",
+ "usr": "s:s9EscapableP",
+ "mangledName": "$ss9EscapableP"
+ }
+ ]
+ }
+ ],
+ "json_format_version": 8
+ },
+ "ConstValues": [
+ {
+ "filePath": "\/Users\/panyue\/Desktop\/project\/TOB\/private\/flutter-tob\/tb-plaud-mobile\/ios\/SDK\/SDKLibs\/PenSubmodules\/BlePen\/PenWiFiSdk\/SwiftFiles\/Agent.swift",
+ "kind": "BooleanLiteral",
+ "offset": 1244,
+ "length": 5,
+ "value": "false"
+ },
+ {
+ "filePath": "\/Users\/panyue\/Desktop\/project\/TOB\/private\/flutter-tob\/tb-plaud-mobile\/ios\/SDK\/SDKLibs\/PenSubmodules\/BlePen\/PenWiFiSdk\/SwiftFiles\/Agent.swift",
+ "kind": "IntegerLiteral",
+ "offset": 1846,
+ "length": 1,
+ "value": "0"
+ },
+ {
+ "filePath": "\/Users\/panyue\/Desktop\/project\/TOB\/private\/flutter-tob\/tb-plaud-mobile\/ios\/SDK\/SDKLibs\/PenSubmodules\/BlePen\/PenWiFiSdk\/SwiftFiles\/Agent.swift",
+ "kind": "BooleanLiteral",
+ "offset": 1866,
+ "length": 5,
+ "value": "false"
+ },
+ {
+ "filePath": "\/Users\/panyue\/Desktop\/project\/TOB\/private\/flutter-tob\/tb-plaud-mobile\/ios\/SDK\/SDKLibs\/PenSubmodules\/BlePen\/PenWiFiSdk\/SwiftFiles\/Agent.swift",
+ "kind": "IntegerLiteral",
+ "offset": 1888,
+ "length": 1,
+ "value": "1"
+ },
+ {
+ "filePath": "\/Users\/panyue\/Desktop\/project\/TOB\/private\/flutter-tob\/tb-plaud-mobile\/ios\/SDK\/SDKLibs\/PenSubmodules\/BlePen\/PenWiFiSdk\/SwiftFiles\/Agent.swift",
+ "kind": "IntegerLiteral",
+ "offset": 2392,
+ "length": 1,
+ "value": "1"
+ },
+ {
+ "filePath": "\/Users\/panyue\/Desktop\/project\/TOB\/private\/flutter-tob\/tb-plaud-mobile\/ios\/SDK\/SDKLibs\/PenSubmodules\/BlePen\/PenWiFiSdk\/SwiftFiles\/Agent.swift",
+ "kind": "IntegerLiteral",
+ "offset": 2855,
+ "length": 1,
+ "value": "1"
+ },
+ {
+ "filePath": "\/Users\/panyue\/Desktop\/project\/TOB\/private\/flutter-tob\/tb-plaud-mobile\/ios\/SDK\/SDKLibs\/PenSubmodules\/BlePen\/PenWiFiSdk\/SwiftFiles\/WiFiAgent.swift",
+ "kind": "BooleanLiteral",
+ "offset": 692,
+ "length": 5,
+ "value": "false"
+ },
+ {
+ "filePath": "\/Users\/panyue\/Desktop\/project\/TOB\/private\/flutter-tob\/tb-plaud-mobile\/ios\/SDK\/SDKLibs\/PenSubmodules\/BlePen\/PenWiFiSdk\/SwiftFiles\/WiFiAgent.swift",
+ "kind": "BooleanLiteral",
+ "offset": 4296,
+ "length": 4,
+ "value": "true"
+ },
+ {
+ "filePath": "\/Users\/panyue\/Desktop\/project\/TOB\/private\/flutter-tob\/tb-plaud-mobile\/ios\/SDK\/SDKLibs\/PenSubmodules\/BlePen\/PenWiFiSdk\/SwiftFiles\/WiFiAgent.swift",
+ "kind": "IntegerLiteral",
+ "offset": 4349,
+ "length": 2,
+ "value": "30"
+ },
+ {
+ "filePath": "\/Users\/panyue\/Desktop\/project\/TOB\/private\/flutter-tob\/tb-plaud-mobile\/ios\/SDK\/SDKLibs\/PenSubmodules\/BlePen\/PenWiFiSdk\/SwiftFiles\/WiFiAgent.swift",
+ "kind": "IntegerLiteral",
+ "offset": 4424,
+ "length": 1,
+ "value": "0"
+ },
+ {
+ "filePath": "\/Users\/panyue\/Desktop\/project\/TOB\/private\/flutter-tob\/tb-plaud-mobile\/ios\/SDK\/SDKLibs\/PenSubmodules\/BlePen\/PenWiFiSdk\/SwiftFiles\/WiFiAgent.swift",
+ "kind": "BooleanLiteral",
+ "offset": 4584,
+ "length": 4,
+ "value": "true"
+ },
+ {
+ "filePath": "\/Users\/panyue\/Desktop\/project\/TOB\/private\/flutter-tob\/tb-plaud-mobile\/ios\/SDK\/SDKLibs\/PenSubmodules\/BlePen\/PenWiFiSdk\/SwiftFiles\/WiFiAgent.swift",
+ "kind": "BooleanLiteral",
+ "offset": 4733,
+ "length": 5,
+ "value": "false"
+ },
+ {
+ "filePath": "\/Users\/panyue\/Desktop\/project\/TOB\/private\/flutter-tob\/tb-plaud-mobile\/ios\/SDK\/SDKLibs\/PenSubmodules\/BlePen\/PenWiFiSdk\/SwiftFiles\/WiFiAgent.swift",
+ "kind": "BooleanLiteral",
+ "offset": 4815,
+ "length": 5,
+ "value": "false"
+ },
+ {
+ "filePath": "\/Users\/panyue\/Desktop\/project\/TOB\/private\/flutter-tob\/tb-plaud-mobile\/ios\/SDK\/SDKLibs\/PenSubmodules\/BlePen\/PenWiFiSdk\/SwiftFiles\/WiFiAgent.swift",
+ "kind": "IntegerLiteral",
+ "offset": 4887,
+ "length": 1,
+ "value": "0"
+ },
+ {
+ "filePath": "\/Users\/panyue\/Desktop\/project\/TOB\/private\/flutter-tob\/tb-plaud-mobile\/ios\/SDK\/SDKLibs\/PenSubmodules\/BlePen\/PenWiFiSdk\/SwiftFiles\/WiFiAgent.swift",
+ "kind": "BooleanLiteral",
+ "offset": 4960,
+ "length": 5,
+ "value": "false"
+ },
+ {
+ "filePath": "\/Users\/panyue\/Desktop\/project\/TOB\/private\/flutter-tob\/tb-plaud-mobile\/ios\/SDK\/SDKLibs\/PenSubmodules\/BlePen\/PenWiFiSdk\/SwiftFiles\/WiFiAgent.swift",
+ "kind": "IntegerLiteral",
+ "offset": 5068,
+ "length": 1,
+ "value": "0"
+ },
+ {
+ "filePath": "\/Users\/panyue\/Desktop\/project\/TOB\/private\/flutter-tob\/tb-plaud-mobile\/ios\/SDK\/SDKLibs\/PenSubmodules\/BlePen\/PenWiFiSdk\/SwiftFiles\/WiFiAgent.swift",
+ "kind": "BooleanLiteral",
+ "offset": 5165,
+ "length": 5,
+ "value": "false"
+ },
+ {
+ "filePath": "\/Users\/panyue\/Desktop\/project\/TOB\/private\/flutter-tob\/tb-plaud-mobile\/ios\/SDK\/SDKLibs\/PenSubmodules\/BlePen\/PenWiFiSdk\/SwiftFiles\/WiFiAgent.swift",
+ "kind": "IntegerLiteral",
+ "offset": 5206,
+ "length": 1,
+ "value": "0"
+ },
+ {
+ "filePath": "\/Users\/panyue\/Desktop\/project\/TOB\/private\/flutter-tob\/tb-plaud-mobile\/ios\/SDK\/SDKLibs\/PenSubmodules\/BlePen\/PenWiFiSdk\/SwiftFiles\/WiFiAgent.swift",
+ "kind": "StringLiteral",
+ "offset": 5239,
+ "length": 2,
+ "value": "\"\""
+ },
+ {
+ "filePath": "\/Users\/panyue\/Desktop\/project\/TOB\/private\/flutter-tob\/tb-plaud-mobile\/ios\/SDK\/SDKLibs\/PenSubmodules\/BlePen\/PenWiFiSdk\/SwiftFiles\/WiFiAgent.swift",
+ "kind": "IntegerLiteral",
+ "offset": 5283,
+ "length": 1,
+ "value": "1"
+ },
+ {
+ "filePath": "\/Users\/panyue\/Desktop\/project\/TOB\/private\/flutter-tob\/tb-plaud-mobile\/ios\/SDK\/SDKLibs\/PenSubmodules\/BlePen\/PenWiFiSdk\/SwiftFiles\/WiFiAgent.swift",
+ "kind": "IntegerLiteral",
+ "offset": 5324,
+ "length": 2,
+ "value": "-1"
+ },
+ {
+ "filePath": "\/Users\/panyue\/Desktop\/project\/TOB\/private\/flutter-tob\/tb-plaud-mobile\/ios\/SDK\/SDKLibs\/PenSubmodules\/BlePen\/PenWiFiSdk\/SwiftFiles\/WiFiAgent.swift",
+ "kind": "StringLiteral",
+ "offset": 5872,
+ "length": 27,
+ "value": "\"com.plaud.wifi.send.queue\""
+ },
+ {
+ "filePath": "\/Users\/panyue\/Desktop\/project\/TOB\/private\/flutter-tob\/tb-plaud-mobile\/ios\/SDK\/SDKLibs\/PenSubmodules\/BlePen\/PenWiFiSdk\/SwiftFiles\/WiFiAgent.swift",
+ "kind": "StringLiteral",
+ "offset": 6215,
+ "length": 2,
+ "value": "\"\""
+ },
+ {
+ "filePath": "\/Users\/panyue\/Desktop\/project\/TOB\/private\/flutter-tob\/tb-plaud-mobile\/ios\/SDK\/SDKLibs\/PenSubmodules\/BlePen\/PenWiFiSdk\/SwiftFiles\/WiFiAgent.swift",
+ "kind": "IntegerLiteral",
+ "offset": 7594,
+ "length": 2,
+ "value": "30"
+ },
+ {
+ "filePath": "\/Users\/panyue\/Desktop\/project\/TOB\/private\/flutter-tob\/tb-plaud-mobile\/ios\/SDK\/SDKLibs\/PenSubmodules\/BlePen\/PenWiFiSdk\/SwiftFiles\/WiFiAgent.swift",
+ "kind": "IntegerLiteral",
+ "offset": 9809,
+ "length": 2,
+ "value": "60"
+ },
+ {
+ "filePath": "\/Users\/panyue\/Desktop\/project\/TOB\/private\/flutter-tob\/tb-plaud-mobile\/ios\/SDK\/SDKLibs\/PenSubmodules\/BlePen\/PenWiFiSdk\/SwiftFiles\/WiFiAgent.swift",
+ "kind": "BooleanLiteral",
+ "offset": 9833,
+ "length": 4,
+ "value": "true"
+ },
+ {
+ "filePath": "\/Users\/panyue\/Desktop\/project\/TOB\/private\/flutter-tob\/tb-plaud-mobile\/ios\/SDK\/SDKLibs\/PenSubmodules\/BlePen\/PenWiFiSdk\/SwiftFiles\/WiFiAgent.swift",
+ "kind": "BooleanLiteral",
+ "offset": 11260,
+ "length": 4,
+ "value": "true"
+ },
+ {
+ "filePath": "\/Users\/panyue\/Desktop\/project\/TOB\/private\/flutter-tob\/tb-plaud-mobile\/ios\/SDK\/SDKLibs\/PenSubmodules\/BlePen\/PenWiFiSdk\/SwiftFiles\/WiFiAgent.swift",
+ "kind": "BooleanLiteral",
+ "offset": 15932,
+ "length": 4,
+ "value": "true"
+ },
+ {
+ "filePath": "\/Users\/panyue\/Desktop\/project\/TOB\/private\/flutter-tob\/tb-plaud-mobile\/ios\/SDK\/SDKLibs\/PenSubmodules\/BlePen\/PenWiFiSdk\/SwiftFiles\/WiFiAgent.swift",
+ "kind": "BooleanLiteral",
+ "offset": 21780,
+ "length": 4,
+ "value": "true"
+ },
+ {
+ "filePath": "\/Users\/panyue\/Desktop\/project\/TOB\/private\/flutter-tob\/tb-plaud-mobile\/ios\/SDK\/SDKLibs\/PenSubmodules\/BlePen\/PenWiFiSdk\/SwiftFiles\/WiFiAgent.swift",
+ "kind": "IntegerLiteral",
+ "offset": 49785,
+ "length": 1,
+ "value": "1"
+ },
+ {
+ "filePath": "\/Users\/panyue\/Desktop\/project\/TOB\/private\/flutter-tob\/tb-plaud-mobile\/ios\/SDK\/SDKLibs\/PenSubmodules\/BlePen\/PenWiFiSdk\/SwiftFiles\/WiFiAgent.swift",
+ "kind": "IntegerLiteral",
+ "offset": 50536,
+ "length": 1,
+ "value": "1"
+ },
+ {
+ "filePath": "\/Users\/panyue\/Desktop\/project\/TOB\/private\/flutter-tob\/tb-plaud-mobile\/ios\/SDK\/SDKLibs\/PenSubmodules\/BlePen\/PenWiFiSdk\/SwiftFiles\/WiFiAgent.swift",
+ "kind": "IntegerLiteral",
+ "offset": 51143,
+ "length": 1,
+ "value": "0"
+ },
+ {
+ "filePath": "\/Users\/panyue\/Desktop\/project\/TOB\/private\/flutter-tob\/tb-plaud-mobile\/ios\/SDK\/SDKLibs\/PenSubmodules\/BlePen\/PenWiFiSdk\/SwiftFiles\/WiFiAgent.swift",
+ "kind": "IntegerLiteral",
+ "offset": 51161,
+ "length": 1,
+ "value": "1"
+ },
+ {
+ "filePath": "\/Users\/panyue\/Desktop\/project\/TOB\/private\/flutter-tob\/tb-plaud-mobile\/ios\/SDK\/SDKLibs\/PenSubmodules\/BlePen\/PenWiFiSdk\/SwiftFiles\/WiFiAgent.swift",
+ "kind": "BooleanLiteral",
+ "offset": 51824,
+ "length": 5,
+ "value": "false"
+ },
+ {
+ "filePath": "\/Users\/panyue\/Desktop\/project\/TOB\/private\/flutter-tob\/tb-plaud-mobile\/ios\/SDK\/SDKLibs\/PenSubmodules\/BlePen\/PenWiFiSdk\/SwiftFiles\/WiFiAgent.swift",
+ "kind": "IntegerLiteral",
+ "offset": 66084,
+ "length": 1,
+ "value": "3"
+ },
+ {
+ "filePath": "\/Users\/panyue\/Desktop\/project\/TOB\/private\/flutter-tob\/tb-plaud-mobile\/ios\/SDK\/SDKLibs\/PenSubmodules\/BlePen\/PenWiFiSdk\/SwiftFiles\/WiFiAgent.swift",
+ "kind": "FloatLiteral",
+ "offset": 66109,
+ "length": 3,
+ "value": "1.0"
+ },
+ {
+ "filePath": "\/Users\/panyue\/Desktop\/project\/TOB\/private\/flutter-tob\/tb-plaud-mobile\/ios\/SDK\/SDKLibs\/PenSubmodules\/BlePen\/PenWiFiSdk\/SwiftFiles\/WiFiAgent.swift",
+ "kind": "IntegerLiteral",
+ "offset": 68141,
+ "length": 1,
+ "value": "0"
+ },
+ {
+ "filePath": "\/Users\/panyue\/Desktop\/project\/TOB\/private\/flutter-tob\/tb-plaud-mobile\/ios\/SDK\/SDKLibs\/PenSubmodules\/BlePen\/PenWiFiSdk\/SwiftFiles\/WiFiAgent.swift",
+ "kind": "IntegerLiteral",
+ "offset": 69577,
+ "length": 1,
+ "value": "0"
+ },
+ {
+ "filePath": "\/Users\/panyue\/Desktop\/project\/TOB\/private\/flutter-tob\/tb-plaud-mobile\/ios\/SDK\/SDKLibs\/PenSubmodules\/BlePen\/PenWiFiSdk\/SwiftFiles\/WiFiAgent.swift",
+ "kind": "IntegerLiteral",
+ "offset": 69639,
+ "length": 1,
+ "value": "0"
+ },
+ {
+ "filePath": "\/Users\/panyue\/Desktop\/project\/TOB\/private\/flutter-tob\/tb-plaud-mobile\/ios\/SDK\/SDKLibs\/PenSubmodules\/BlePen\/PenWiFiSdk\/SwiftFiles\/WiFiAgent.swift",
+ "kind": "IntegerLiteral",
+ "offset": 69695,
+ "length": 1,
+ "value": "0"
+ },
+ {
+ "filePath": "\/Users\/panyue\/Desktop\/project\/TOB\/private\/flutter-tob\/tb-plaud-mobile\/ios\/SDK\/SDKLibs\/PenSubmodules\/BlePen\/PenWiFiSdk\/SwiftFiles\/WiFiAgent.swift",
+ "kind": "IntegerLiteral",
+ "offset": 69754,
+ "length": 1,
+ "value": "0"
+ },
+ {
+ "filePath": "\/Users\/panyue\/Desktop\/project\/TOB\/private\/flutter-tob\/tb-plaud-mobile\/ios\/SDK\/SDKLibs\/PenSubmodules\/BlePen\/PenWiFiSdk\/SwiftFiles\/WiFiAgent.swift",
+ "kind": "IntegerLiteral",
+ "offset": 69803,
+ "length": 2,
+ "value": "20"
+ },
+ {
+ "filePath": "\/Users\/panyue\/Desktop\/project\/TOB\/private\/flutter-tob\/tb-plaud-mobile\/ios\/SDK\/SDKLibs\/PenSubmodules\/BlePen\/PenWiFiSdk\/SwiftFiles\/WiFiAgent.swift",
+ "kind": "IntegerLiteral",
+ "offset": 71176,
+ "length": 1,
+ "value": "0"
+ },
+ {
+ "filePath": "\/Users\/panyue\/Desktop\/project\/TOB\/private\/flutter-tob\/tb-plaud-mobile\/ios\/SDK\/SDKLibs\/PenSubmodules\/BlePen\/PenWiFiSdk\/SwiftFiles\/WiFiAgent.swift",
+ "kind": "IntegerLiteral",
+ "offset": 71195,
+ "length": 1,
+ "value": "0"
+ },
+ {
+ "filePath": "\/Users\/panyue\/Desktop\/project\/TOB\/private\/flutter-tob\/tb-plaud-mobile\/ios\/SDK\/SDKLibs\/PenSubmodules\/BlePen\/PenWiFiSdk\/SwiftFiles\/WiFiAgent.swift",
+ "kind": "IntegerLiteral",
+ "offset": 74306,
+ "length": 1,
+ "value": "0"
+ },
+ {
+ "filePath": "\/Users\/panyue\/Desktop\/project\/TOB\/private\/flutter-tob\/tb-plaud-mobile\/ios\/SDK\/SDKLibs\/PenSubmodules\/BlePen\/PenWiFiSdk\/SwiftFiles\/WiFiAgent.swift",
+ "kind": "IntegerLiteral",
+ "offset": 74377,
+ "length": 1,
+ "value": "0"
+ },
+ {
+ "filePath": "\/Users\/panyue\/Desktop\/project\/TOB\/private\/flutter-tob\/tb-plaud-mobile\/ios\/SDK\/SDKLibs\/PenSubmodules\/BlePen\/PenWiFiSdk\/SwiftFiles\/WiFiAgent.swift",
+ "kind": "IntegerLiteral",
+ "offset": 74430,
+ "length": 1,
+ "value": "0"
+ },
+ {
+ "filePath": "\/Users\/panyue\/Desktop\/project\/TOB\/private\/flutter-tob\/tb-plaud-mobile\/ios\/SDK\/SDKLibs\/PenSubmodules\/BlePen\/PenWiFiSdk\/SwiftFiles\/WiFiAgent.swift",
+ "kind": "IntegerLiteral",
+ "offset": 74484,
+ "length": 1,
+ "value": "0"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/modules/plaud-sdk/ios/Frameworks/PlaudWiFiSDK.xcframework/ios-arm64/PlaudWiFiSDK.framework/Modules/PlaudWiFiSDK.swiftmodule/arm64-apple-ios.swiftdoc b/modules/plaud-sdk/ios/Frameworks/PlaudWiFiSDK.xcframework/ios-arm64/PlaudWiFiSDK.framework/Modules/PlaudWiFiSDK.swiftmodule/arm64-apple-ios.swiftdoc
new file mode 100644
index 0000000..4627789
Binary files /dev/null and b/modules/plaud-sdk/ios/Frameworks/PlaudWiFiSDK.xcframework/ios-arm64/PlaudWiFiSDK.framework/Modules/PlaudWiFiSDK.swiftmodule/arm64-apple-ios.swiftdoc differ
diff --git a/modules/plaud-sdk/ios/Frameworks/PlaudWiFiSDK.xcframework/ios-arm64/PlaudWiFiSDK.framework/Modules/PlaudWiFiSDK.swiftmodule/arm64-apple-ios.swiftinterface b/modules/plaud-sdk/ios/Frameworks/PlaudWiFiSDK.xcframework/ios-arm64/PlaudWiFiSDK.framework/Modules/PlaudWiFiSDK.swiftmodule/arm64-apple-ios.swiftinterface
new file mode 100644
index 0000000..01f6e74
--- /dev/null
+++ b/modules/plaud-sdk/ios/Frameworks/PlaudWiFiSDK.xcframework/ios-arm64/PlaudWiFiSDK.framework/Modules/PlaudWiFiSDK.swiftmodule/arm64-apple-ios.swiftinterface
@@ -0,0 +1,168 @@
+// swift-interface-format-version: 1.0
+// swift-compiler-version: Apple Swift version 6.0.3 effective-5.10 (swiftlang-6.0.3.1.10 clang-1600.0.30.1)
+// swift-module-flags: -target arm64-apple-ios14.0 -enable-objc-interop -enable-library-evolution -swift-version 5 -enforce-exclusivity=checked -O -enable-bare-slash-regex -module-name PlaudWiFiSDK
+// swift-module-flags-ignorable: -no-verify-emitted-module-interface
+import SystemConfiguration.CaptiveNetwork
+import CommonCrypto
+import CoreLocation
+import Foundation
+import NetworkExtension
+import PlaudBleSDK
+@_exported import PlaudWiFiSDK
+import Swift
+import SystemConfiguration
+import _Concurrency
+import _StringProcessing
+import _SwiftConcurrencyShims
+@_inheritsConvenienceInitializers @_hasMissingDesignatedInitializers @objc public class Agent : ObjectiveC.NSObject {
+ @objc public static let shared: PlaudWiFiSDK.Agent
+ @objc public func isDeviceConnect() -> Swift.Bool
+ @objc public func bleDevice() -> PlaudBleSDK.BleDevice?
+ @objc public func getFileList(_ uid: Swift.Int, _ sessionId: Swift.Int, _ single: Swift.Bool = false)
+ @objc public func syncFile(_ sessionId: Swift.Int, _ start: Swift.Int, _ end: Swift.Int = 0, _ decode: Swift.Bool = false, _ scene: Swift.Int = 1)
+ @objc public func stopSyncFile(_ sessionId: Swift.Int, _ scene: Swift.Int = 1)
+ @objc public func deleteFile(_ sessionId: Swift.Int, _ scene: Swift.Int = 1)
+ @objc public func sessionId() -> Swift.Int
+ @objc public func isDownloading() -> Swift.Bool
+ @objc public func isRecording() -> Swift.Bool
+ @objc deinit
+}
+@_hasMissingDesignatedInitializers open class NetworkReachabilityManager {
+ public enum NetworkReachabilityStatus {
+ case unknown
+ case notReachable
+ case reachable(PlaudWiFiSDK.NetworkReachabilityManager.ConnectionType)
+ }
+ public enum ConnectionType {
+ case ethernetOrWiFi
+ case wwan
+ public static func == (a: PlaudWiFiSDK.NetworkReachabilityManager.ConnectionType, b: PlaudWiFiSDK.NetworkReachabilityManager.ConnectionType) -> Swift.Bool
+ public func hash(into hasher: inout Swift.Hasher)
+ public var hashValue: Swift.Int {
+ get
+ }
+ }
+ public typealias Listener = (PlaudWiFiSDK.NetworkReachabilityManager.NetworkReachabilityStatus) -> Swift.Void
+ open var isReachable: Swift.Bool {
+ get
+ }
+ open var isReachableOnWWAN: Swift.Bool {
+ get
+ }
+ open var isReachableOnEthernetOrWiFi: Swift.Bool {
+ get
+ }
+ open var networkReachabilityStatus: PlaudWiFiSDK.NetworkReachabilityManager.NetworkReachabilityStatus {
+ get
+ }
+ open var listenerQueue: Dispatch.DispatchQueue
+ open var listener: PlaudWiFiSDK.NetworkReachabilityManager.Listener?
+ open var flags: SystemConfiguration.SCNetworkReachabilityFlags? {
+ get
+ }
+ open var previousFlags: SystemConfiguration.SCNetworkReachabilityFlags
+ convenience public init?(host: Swift.String)
+ convenience public init?()
+ @objc deinit
+ @discardableResult
+ open func startListening() -> Swift.Bool
+ open func stopListening()
+}
+extension PlaudWiFiSDK.NetworkReachabilityManager.NetworkReachabilityStatus : Swift.Equatable {
+}
+public func == (lhs: PlaudWiFiSDK.NetworkReachabilityManager.NetworkReachabilityStatus, rhs: PlaudWiFiSDK.NetworkReachabilityManager.NetworkReachabilityStatus) -> Swift.Bool
+@objc public protocol WiFiAgentProtocol {
+ @objc func wifiCommonErr(_ cmd: Swift.Int, _ status: Swift.Int)
+ @objc func wifiHandshake(_ status: Swift.Int)
+ @objc func wifiPower(_ power: Swift.Int, _ voltage: Swift.Int)
+ @objc func wifiFileListFail(_ status: Swift.Int)
+ @objc func wifiFileList(_ files: [PlaudBleSDK.BleFile])
+ @objc func wifiSyncFile(_ sessionId: Swift.Int, _ status: Swift.Int)
+ @objc func wifiSyncFileData(_ sessionId: Swift.Int, _ offset: Swift.Int, _ count: Swift.Int, _ binData: Foundation.Data)
+ @objc func wifiDataComplete()
+ @objc func wifiSyncFileStop(_ status: Swift.Int)
+ @objc func wifiFileDelete(_ sessionId: Swift.Int, _ status: Swift.Int)
+ @objc func wifiClientFail()
+ @objc func wifiClose(_ status: Swift.Int)
+ @objc func wifiRateFail(_ status: Swift.Int)
+ @objc func wifiRate(_ instantRate: Swift.Int, _ averageRate: Swift.Int, _ lossRate: Swift.Double)
+ @objc func wifiLogsFail(_ status: Swift.Int)
+ @objc func wifiLogs(_ logData: Foundation.Data?)
+ @objc func wifiTips(_ tips: Swift.Int)
+ @objc func penRequestOTAData(start: Swift.Int, end: Swift.Int, payloadSize: Swift.Int, uid: Swift.Int, sendRatePPS: Swift.Int)
+ @objc func wifiOTAStatus(_ status: Swift.Int, _ uid: Swift.Int)
+}
+@_inheritsConvenienceInitializers @_hasMissingDesignatedInitializers @objc public class WiFiAgent : ObjectiveC.NSObject {
+ @objc public static let shared: PlaudWiFiSDK.WiFiAgent
+ @objc public var connectLoop: Swift.Bool
+ public var isServerStart: Swift.Bool {
+ get
+ }
+ public var isClientOpen: Swift.Bool {
+ get
+ }
+ public var wifiVersion: Swift.Int {
+ get
+ }
+ public var isHandshakeOk: Swift.Bool {
+ get
+ }
+ @objc public var sessionId: Swift.Int {
+ get
+ }
+ @objc public var isDownloading: Swift.Bool {
+ get
+ }
+ @objc weak public var delegate: (any PlaudWiFiSDK.WiFiAgentProtocol)?
+ @objc public var cmdDelegateQueue: Dispatch.DispatchQueue
+ @objc public var bleDevice: PlaudBleSDK.BleDevice? {
+ @objc get
+ @objc set
+ }
+ @objc public func openReleaseLog(_ opened: Swift.Bool, _ backBlock: ((Swift.String) -> Swift.Void)? = nil)
+ @objc public func openLog(_ opened: Swift.Bool, _ backBlock: ((Swift.String) -> Swift.Void)? = nil)
+ @objc public func listenPort(_ ssid: Swift.String, _ overtimeSec: Swift.Int = 30)
+ @available(iOS 11.0, *)
+ @objc public func connectWifi(_ ssid: Swift.String, _ passphrase: Swift.String, _ overtimeSec: Swift.Int = 60, _ needRetry: Swift.Bool = true)
+ @objc public func cancelConnectWifi()
+ @available(iOS 11.0, *)
+ @objc public func clearAllWiFiConfigurations()
+ @objc public func clearAllWiFiConfigurationsCompat()
+ @objc public func disconnect()
+ @objc deinit
+}
+extension PlaudWiFiSDK.WiFiAgent : PlaudWiFiSDK.JXWebSocketServerDelegate {
+ @objc dynamic public func serverDidStart()
+ @objc dynamic public func serverDidFailWithError(_ error: any Swift.Error)
+ @objc dynamic public func serverDidStop()
+ @objc dynamic public func clientDidOpen()
+ @objc dynamic public func clientDidReceiveText(_ text: Swift.String)
+ @objc dynamic public func clientDidReceive(_ data: Foundation.Data)
+ @objc dynamic public func clientDidFailWithError(_ error: any Swift.Error)
+ @objc dynamic public func clientDidClose(withCode code: Swift.Int, reason: Swift.String, wasClean: Swift.Bool)
+}
+extension PlaudWiFiSDK.WiFiAgent {
+ @objc dynamic public func isWebSocketConnected() -> Swift.Bool
+ public func appGetLogs(_ begin: Swift.Bool)
+ @objc dynamic public func appWiFiRate(_ onOff: Swift.Bool, _ packSize: Swift.Int)
+ @objc dynamic public func appDeleteFile(_ sessionId: Swift.Int, _ scene: Swift.Int = 1)
+ @objc dynamic public func appExtendWifiExitTime()
+ @objc dynamic public func appStopSyncFile(_ sessionId: Swift.Int, _ scene: Swift.Int = 1)
+ @objc dynamic public func appSyncFile(_ sessionId: Swift.Int, _ start: Swift.Int, _ end: Swift.Int = 0, _ scene: Swift.Int = 1)
+ @objc dynamic public func appGetFileList(_ uid: Swift.Int, _ sessionId: Swift.Int, _ single: Swift.Bool = false)
+ @objc dynamic public func startPushOTA(_ uid: Swift.Int, _ fileSize: Swift.Int, crc: Swift.Int, _ toVersion: Swift.Int)
+ @objc dynamic public func sendFilePackToPen(type: Swift.Int, start: Swift.Int32, len: Swift.Int32, last: Swift.Bool, uid: Swift.Int32, binData: Foundation.Data?)
+}
+extension PlaudWiFiSDK.WiFiAgent {
+ @objc dynamic public func getCurrentWiFiName() -> Swift.String?
+ @objc dynamic public func getCurrentWiFiNameWithRetry(maxRetries: Swift.Int = 3, delay: Foundation.TimeInterval = 1.0) -> Swift.String?
+}
+@_hasMissingDesignatedInitializers public class GCDTool {
+ public static let shared: PlaudWiFiSDK.GCDTool
+ public typealias AnythingBlock = () -> Swift.Void
+ public func execute(label identifier: Swift.String, _ work: @escaping @convention(block) () -> Swift.Void) -> PlaudWiFiSDK.GCDTool.AnythingBlock
+ public func cancel(label identifier: Swift.String)
+ @objc deinit
+}
+extension PlaudWiFiSDK.NetworkReachabilityManager.ConnectionType : Swift.Equatable {}
+extension PlaudWiFiSDK.NetworkReachabilityManager.ConnectionType : Swift.Hashable {}
diff --git a/modules/plaud-sdk/ios/Frameworks/PlaudWiFiSDK.xcframework/ios-arm64/PlaudWiFiSDK.framework/Modules/module.modulemap b/modules/plaud-sdk/ios/Frameworks/PlaudWiFiSDK.xcframework/ios-arm64/PlaudWiFiSDK.framework/Modules/module.modulemap
new file mode 100644
index 0000000..71b8f61
--- /dev/null
+++ b/modules/plaud-sdk/ios/Frameworks/PlaudWiFiSDK.xcframework/ios-arm64/PlaudWiFiSDK.framework/Modules/module.modulemap
@@ -0,0 +1,11 @@
+framework module PlaudWiFiSDK {
+ umbrella header "PlaudWiFiSDK.h"
+ export *
+
+ module * { export * }
+}
+
+module PlaudWiFiSDK.Swift {
+ header "PlaudWiFiSDK-Swift.h"
+ requires objc
+}
diff --git a/modules/plaud-sdk/ios/Frameworks/PlaudWiFiSDK.xcframework/ios-arm64/PlaudWiFiSDK.framework/PlaudWiFiSDK b/modules/plaud-sdk/ios/Frameworks/PlaudWiFiSDK.xcframework/ios-arm64/PlaudWiFiSDK.framework/PlaudWiFiSDK
new file mode 100755
index 0000000..2b36129
Binary files /dev/null and b/modules/plaud-sdk/ios/Frameworks/PlaudWiFiSDK.xcframework/ios-arm64/PlaudWiFiSDK.framework/PlaudWiFiSDK differ
diff --git a/modules/plaud-sdk/ios/PlaudSdk.podspec b/modules/plaud-sdk/ios/PlaudSdk.podspec
new file mode 100644
index 0000000..2fc3317
--- /dev/null
+++ b/modules/plaud-sdk/ios/PlaudSdk.podspec
@@ -0,0 +1,36 @@
+require 'json'
+
+package = JSON.parse(File.read(File.join(__dir__, '..', 'package.json')))
+
+Pod::Spec.new do |s|
+ s.name = 'PlaudSdk'
+ s.version = package['version']
+ s.summary = package['description']
+ s.description = package['description']
+ s.license = package['license']
+ s.author = package['author']
+ s.homepage = 'https://plaud.ai'
+ # Plaud's frameworks are built for iOS 15+ (arm64 device only).
+ s.platforms = { :ios => '15.1' }
+ s.swift_version = '5.9'
+ s.source = { git: '' }
+ s.static_framework = true
+
+ s.dependency 'ExpoModulesCore'
+
+ # Only compile the module's own Swift here; the SDK binaries are vendored below.
+ s.source_files = '*.{h,m,swift}'
+
+ # The Plaud SDK, shipped as precompiled binary frameworks. CocoaPods embeds and
+ # code-signs these automatically (the PlaudDeviceBasicSDK.bundle is nested inside
+ # its .framework, so it comes along for free — no separate resource_bundles needed).
+ s.vendored_frameworks = [
+ 'Frameworks/PlaudBleSDK.xcframework',
+ 'Frameworks/PlaudWiFiSDK.xcframework',
+ 'Frameworks/PlaudDeviceBasicSDK.xcframework'
+ ]
+
+ s.pod_target_xcconfig = {
+ 'DEFINES_MODULE' => 'YES'
+ }
+end
diff --git a/modules/plaud-sdk/ios/PlaudSdkModule.swift b/modules/plaud-sdk/ios/PlaudSdkModule.swift
new file mode 100644
index 0000000..b0a4be3
--- /dev/null
+++ b/modules/plaud-sdk/ios/PlaudSdkModule.swift
@@ -0,0 +1,405 @@
+import ExpoModulesCore
+import PlaudDeviceBasicSDK
+import PlaudBleSDK
+
+// MARK: - Typed argument records
+
+struct InitOptions: Record {
+ @Field var userAccessToken: String = ""
+ @Field var customDomain: String = ""
+ @Field var userId: String?
+}
+
+struct ConnectOptions: Record {
+ @Field var uuid: String?
+ @Field var serialNumber: String?
+ @Field var deviceToken: String?
+}
+
+struct DepairOptions: Record {
+ @Field var clear: Bool = true
+}
+
+struct FileListOptions: Record {
+ @Field var startSessionId: Int = 0
+}
+
+struct ExportOptions: Record {
+ @Field var sessionId: Int = -1
+ @Field var format: String = "mp3"
+ @Field var channels: Int = 1
+}
+
+/// Expo module bridging Plaud's native iOS SDK. This is the RN counterpart of the
+/// Capacitor `PlaudSdk` plugin (PlaudSdkPlugin.swift). Expo's `Module` base class isn't
+/// `NSObject`-derived, so it can't itself conform to the `@objc PlaudDeviceAgentProtocol`;
+/// all SDK interaction and delegate handling lives in `PlaudSdkController` (an NSObject),
+/// which emits results back to JS through the closure the module hands it.
+///
+/// Surface (mirrors the Capacitor plugin, minus the `readFile`/`putBinary` CORS shims that
+/// only existed because Capacitor loaded a remote-origin WebView — RN has no such
+/// constraint and reads exports with expo-file-system / uploads with fetch):
+/// connection lifecycle, file listing, and on-device audio export.
+public class PlaudSdkModule: Module {
+ private lazy var controller = PlaudSdkController { [weak self] event, body in
+ // Hop to the main queue before crossing into JS, as the Capacitor plugin's `notify` did —
+ // SDK delegate callbacks can arrive on arbitrary threads.
+ DispatchQueue.main.async { self?.sendEvent(event, body) }
+ }
+
+ public func definition() -> ModuleDefinition {
+ Name("PlaudSdk")
+
+ Events(
+ "scanResult", "scanTimeout", "connectState", "penState", "bind", "fileList",
+ "exportProgress", "recordStart", "recordStop", "recordPause", "recordResume", "depair"
+ )
+
+ AsyncFunction("initSDK") { (options: InitOptions, promise: Promise) in
+ self.controller.initSDK(options, promise: promise)
+ }
+
+ AsyncFunction("startScan") { (promise: Promise) in
+ self.controller.startScan(promise: promise)
+ }
+
+ AsyncFunction("stopScan") { (promise: Promise) in
+ self.controller.stopScan(promise: promise)
+ }
+
+ AsyncFunction("connectBleDevice") { (options: ConnectOptions, promise: Promise) in
+ self.controller.connectBleDevice(options, promise: promise)
+ }
+
+ AsyncFunction("disconnect") { (promise: Promise) in
+ self.controller.disconnect(promise: promise)
+ }
+
+ AsyncFunction("depair") { (options: DepairOptions?, promise: Promise) in
+ self.controller.depair(options ?? DepairOptions(), promise: promise)
+ }
+
+ AsyncFunction("isConnected") { (promise: Promise) in
+ self.controller.isConnected(promise: promise)
+ }
+
+ AsyncFunction("getFileList") { (options: FileListOptions?, promise: Promise) in
+ self.controller.getFileList(options ?? FileListOptions(), promise: promise)
+ }
+
+ AsyncFunction("exportAudio") { (options: ExportOptions, promise: Promise) in
+ self.controller.exportAudio(options, promise: promise)
+ }
+ }
+}
+
+/// Owns every interaction with `PlaudDeviceAgent`, holds the scan cache / in-flight export
+/// bridges, and is the SDK's `PlaudDeviceAgentProtocol` delegate. Delegate callbacks are
+/// forwarded to JS via `emit`, the closure supplied by the module (which calls `sendEvent`).
+private final class PlaudSdkController: NSObject, PlaudDeviceAgentProtocol {
+ private let emit: (String, [String: Any?]) -> Void
+
+ /// `connectBleDevice` needs the actual `BleDevice` the SDK handed us during a scan — JS
+ /// only carries identifiers, so we retain scanned objects and look them up. Keyed by
+ /// `uuid` (the CoreBluetooth peripheral id). Touched only on the main queue.
+ private var scannedDevices: [String: BleDevice] = [:]
+
+ /// Retains in-flight export bridges so neither they nor their `Promise` are deallocated
+ /// before the SDK finishes. Touched only on the main queue.
+ private var exportCallbacks: Set = []
+
+ /// App-level user identifier from `initSDK`, reused as the default connect `deviceToken`
+ /// (it's what binds the device to the user during the handshake).
+ private var userId: String?
+
+ private var scanReadyAttempts = 0
+ private var isScanning = false
+
+ init(emit: @escaping (String, [String: Any?]) -> Void) {
+ self.emit = emit
+ super.init()
+ }
+
+ // MARK: - Connection lifecycle
+
+ func initSDK(_ options: InitOptions, promise: Promise) {
+ guard !options.userAccessToken.isEmpty else {
+ promise.reject("ERR_PLAUD_ARGS", "userAccessToken is required")
+ return
+ }
+ guard !options.customDomain.isEmpty else {
+ promise.reject("ERR_PLAUD_ARGS", "customDomain is required (domain only, no https://)")
+ return
+ }
+ let userId = options.userId
+ DispatchQueue.main.async {
+ self.userId = userId
+ let agent = PlaudDeviceAgent.shared
+ agent.delegate = self
+ agent.initSDK(userAccessToken: options.userAccessToken, customDomain: options.customDomain)
+ promise.resolve(nil)
+ }
+ }
+
+ func startScan(promise: Promise) {
+ DispatchQueue.main.async {
+ // CoreBluetooth silently drops scanForPeripherals until the central manager reaches
+ // .poweredOn (async after initSDK, gated on the first-launch permission prompt), so
+ // gate the real scan on the power-on state — same as the Capacitor plugin.
+ self.isScanning = true
+ self.scanReadyAttempts = 0
+ self.attemptScanWhenReady()
+ promise.resolve(nil)
+ }
+ }
+
+ /// Fires the SDK scan once Bluetooth is powered on, polling ~18s. Main queue only.
+ private func attemptScanWhenReady() {
+ guard isScanning else { return }
+ if BleAgent.shared.isPoweredOn {
+ PlaudDeviceAgent.shared.startScan()
+ return
+ }
+ scanReadyAttempts += 1
+ if scanReadyAttempts > 60 {
+ emit("scanTimeout", ["reason": "bluetoothNotPoweredOn"])
+ return
+ }
+ DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) { [weak self] in
+ self?.attemptScanWhenReady()
+ }
+ }
+
+ func stopScan(promise: Promise) {
+ DispatchQueue.main.async {
+ self.isScanning = false
+ PlaudDeviceAgent.shared.stopScan()
+ promise.resolve(nil)
+ }
+ }
+
+ func connectBleDevice(_ options: ConnectOptions, promise: Promise) {
+ // The app always connects with a device token (the app-level userId) so the handshake
+ // binds the device to the user. Prefer an explicit token, else the remembered userId.
+ let token = options.deviceToken ?? self.userId
+ DispatchQueue.main.async {
+ self.isScanning = false
+ guard let device = self.lookupDevice(uuid: options.uuid, serialNumber: options.serialNumber) else {
+ promise.reject("ERR_PLAUD_UNKNOWN_DEVICE",
+ "Unknown device — scan first, then connect by uuid or serialNumber")
+ return
+ }
+ if let token = token, !token.isEmpty {
+ PlaudDeviceAgent.shared.connectBleDevice(bleDevice: device, deviceToken: token)
+ } else {
+ PlaudDeviceAgent.shared.connectBleDevice(bleDevice: device)
+ }
+ promise.resolve(nil)
+ }
+ }
+
+ func disconnect(promise: Promise) {
+ DispatchQueue.main.async {
+ PlaudDeviceAgent.shared.disconnect()
+ promise.resolve(nil)
+ }
+ }
+
+ func depair(_ options: DepairOptions, promise: Promise) {
+ DispatchQueue.main.async {
+ PlaudDeviceAgent.shared.depair(clear: options.clear)
+ promise.resolve(nil)
+ }
+ }
+
+ func isConnected(promise: Promise) {
+ DispatchQueue.main.async {
+ promise.resolve(["connected": PlaudDeviceAgent.shared.isConnected()])
+ }
+ }
+
+ // MARK: - Files
+
+ func getFileList(_ options: FileListOptions, promise: Promise) {
+ DispatchQueue.main.async {
+ PlaudDeviceAgent.shared.getFileList(startSessionId: options.startSessionId)
+ promise.resolve(nil)
+ }
+ }
+
+ /// Decode a recording to Documents/PlaudExports. Resolves `{ sessionId, outputPath }` on
+ /// completion; emits `exportProgress` along the way. `format` defaults to mp3.
+ func exportAudio(_ options: ExportOptions, promise: Promise) {
+ guard options.sessionId >= 0 else {
+ promise.reject("ERR_PLAUD_ARGS", "sessionId is required")
+ return
+ }
+ let format = Self.exportFormat(from: options.format)
+ let channels = options.channels
+ let sessionId = options.sessionId
+ DispatchQueue.main.async {
+ let dir = FileManager.default
+ .urls(for: .documentDirectory, in: .userDomainMask)[0]
+ .appendingPathComponent("PlaudExports", isDirectory: true)
+ try? FileManager.default.createDirectory(at: dir, withIntermediateDirectories: true)
+
+ let bridge = ExportCallbackBridge(sessionId: sessionId, promise: promise, controller: self)
+ self.exportCallbacks.insert(bridge)
+ PlaudDeviceAgent.shared.exportAudio(
+ sessionId: sessionId,
+ outputDir: dir.path,
+ format: format,
+ channels: channels,
+ callback: bridge
+ )
+ }
+ }
+
+ // MARK: - PlaudDeviceAgentProtocol
+
+ func blePenState(state: Int, privacy: Int, keyState: Int, uDisk: Int,
+ findMyToken: Int, hasSndpKey: Int, deviceAccessToken: Int) {
+ emit("penState", [
+ "state": state, "privacy": privacy, "keyState": keyState, "uDisk": uDisk,
+ "findMyToken": findMyToken, "hasSndpKey": hasSndpKey, "deviceAccessToken": deviceAccessToken
+ ])
+ }
+
+ func bleScanResult(bleDevices: [BleDevice]) {
+ DispatchQueue.main.async {
+ for d in bleDevices { self.scannedDevices[d.uuid] = d }
+ }
+ let devices = bleDevices.map { d -> [String: Any] in
+ [
+ "name": d.name,
+ "uuid": d.uuid,
+ "serialNumber": d.serialNumber,
+ "rssi": d.rssi,
+ "supportWiFi": d.supportWiFi
+ ]
+ }
+ emit("scanResult", ["devices": devices])
+ }
+
+ func bleScanOverTime() {
+ emit("scanTimeout", [:])
+ }
+
+ func bleConnectState(state: Int) {
+ // 1 = connected, 0 = disconnected, {2, -1, -2} = connection/handshake failure.
+ let failed = (state == 2 || state == -1 || state == -2)
+ emit("connectState", ["connected": state == 1, "failed": failed, "state": state])
+ }
+
+ func bleBind(sn: String?, status: Int, protVersion: Int, timezone: Int) {
+ emit("bind", ["sn": sn, "status": status, "protVersion": protVersion])
+ }
+
+ // MARK: - Recording (device-initiated: physical button / VAD)
+
+ func bleRecordStart(sessionId: Int, start: Int, status: Int, scene: Int,
+ startTime: Int, reason: Int) {
+ emit("recordStart", [
+ "sessionId": sessionId, "start": start, "status": status,
+ "scene": scene, "startTime": startTime, "reason": reason
+ ])
+ }
+
+ func bleRecordStop(sessionId: Int, reason: Int, fileExist: Bool, fileSize: Int) {
+ emit("recordStop", [
+ "sessionId": sessionId, "reason": reason, "fileExist": fileExist, "fileSize": fileSize
+ ])
+ }
+
+ func bleRecordPause(sessionId: Int, reason: Int, fileExist: Bool, fileSize: Int) {
+ emit("recordPause", [
+ "sessionId": sessionId, "reason": reason, "fileExist": fileExist, "fileSize": fileSize
+ ])
+ }
+
+ func bleRecordResume(sessionId: Int, start: Int, status: Int, scene: Int, startTime: Int) {
+ emit("recordResume", [
+ "sessionId": sessionId, "start": start, "status": status,
+ "scene": scene, "startTime": startTime
+ ])
+ }
+
+ func bleDepair(_ status: Int) {
+ emit("depair", ["status": status])
+ }
+
+ func bleFileList(bleFiles: [BleFile]) {
+ let files = bleFiles.map { f -> [String: Any] in
+ [
+ "sn": f.sn,
+ "sessionId": f.sessionId,
+ "size": f.size,
+ "scenes": f.scenes,
+ "channels": f.channels,
+ "isOgg": f.isOgg,
+ "isMusic": f.isMusic,
+ "duration": f.duration()
+ ]
+ }
+ emit("fileList", ["files": files])
+ }
+
+ // MARK: - Helpers
+
+ private func lookupDevice(uuid: String?, serialNumber: String?) -> BleDevice? {
+ if let uuid = uuid, let d = scannedDevices[uuid] { return d }
+ if let serial = serialNumber {
+ return scannedDevices.values.first { $0.serialNumber == serial }
+ }
+ return nil
+ }
+
+ private static func exportFormat(from raw: String?) -> AudioExportFormat {
+ switch (raw ?? "mp3").lowercased() {
+ case "pcm": return .pcm
+ case "wav": return .wav
+ case "opus": return .opus
+ default: return .mp3
+ }
+ }
+
+ fileprivate func emitEvent(_ event: String, _ body: [String: Any?]) {
+ emit(event, body)
+ }
+
+ fileprivate func finishExport(_ bridge: ExportCallbackBridge) {
+ DispatchQueue.main.async { [weak self] in
+ self?.exportCallbacks.remove(bridge)
+ }
+ }
+}
+
+/// Adapts the SDK's per-call `AudioExportCallback` to the module: progress becomes an
+/// `exportProgress` event, completion/error resolves/rejects the originating Promise.
+private final class ExportCallbackBridge: NSObject, AudioExportCallback {
+ private let sessionId: Int
+ private let promise: Promise
+ private weak var controller: PlaudSdkController?
+
+ init(sessionId: Int, promise: Promise, controller: PlaudSdkController) {
+ self.sessionId = sessionId
+ self.promise = promise
+ self.controller = controller
+ }
+
+ func onProgress(_ progress: Int, message: String) {
+ controller?.emitEvent("exportProgress", [
+ "sessionId": sessionId, "progress": progress, "message": message
+ ])
+ }
+
+ func onComplete(outputPath: String) {
+ promise.resolve(["sessionId": sessionId, "outputPath": outputPath])
+ if let controller = controller { controller.finishExport(self) }
+ }
+
+ func onError(_ error: String) {
+ promise.reject("ERR_PLAUD_EXPORT", error)
+ if let controller = controller { controller.finishExport(self) }
+ }
+}
diff --git a/modules/plaud-sdk/package.json b/modules/plaud-sdk/package.json
new file mode 100644
index 0000000..7792fcb
--- /dev/null
+++ b/modules/plaud-sdk/package.json
@@ -0,0 +1,9 @@
+{
+ "name": "plaud-sdk",
+ "version": "1.0.0",
+ "description": "Local Expo module bridging Plaud's native iOS device SDK (BLE connect, file list, on-device audio export).",
+ "main": "index.ts",
+ "author": "Plaud",
+ "license": "UNLICENSED",
+ "private": true
+}
diff --git a/modules/plaud-sdk/src/PlaudSdk.types.ts b/modules/plaud-sdk/src/PlaudSdk.types.ts
new file mode 100644
index 0000000..cd08bd5
--- /dev/null
+++ b/modules/plaud-sdk/src/PlaudSdk.types.ts
@@ -0,0 +1,142 @@
+import type { NativeModule } from 'expo-modules-core';
+
+/** A device surfaced by the SDK's `bleScanResult` callback. */
+export interface PlaudScanDevice {
+ name: string;
+ uuid: string;
+ serialNumber: string;
+ rssi: number;
+ supportWiFi: boolean;
+}
+
+export interface PlaudScanResult {
+ devices: PlaudScanDevice[];
+}
+
+export interface PlaudConnectState {
+ connected: boolean;
+ /** True for connection/handshake failure (state 2/-1/-2), vs. a normal disconnect. */
+ failed: boolean;
+ state: number;
+}
+
+export interface PlaudPenState {
+ state: number;
+ privacy: number;
+ keyState: number;
+ uDisk: number;
+ findMyToken: number;
+ hasSndpKey: number;
+ deviceAccessToken: number;
+}
+
+/** A recording stored on the device, from the `fileList` event. */
+export interface PlaudFile {
+ sn: string;
+ sessionId: number;
+ size: number;
+ scenes: number;
+ channels: number;
+ isOgg: boolean;
+ isMusic: boolean;
+ /** Duration in seconds. */
+ duration: number;
+}
+
+export interface PlaudFileList {
+ files: PlaudFile[];
+}
+
+export interface PlaudExportProgress {
+ sessionId: number;
+ progress: number;
+ message: string;
+}
+
+/** Device-initiated recording started (physical button / VAD). */
+export interface PlaudRecordStart {
+ sessionId: number;
+ start: number;
+ status: number;
+ scene: number;
+ startTime: number;
+ reason: number;
+}
+
+/** Device-initiated recording stopped/paused, with the resulting file info. */
+export interface PlaudRecordStop {
+ sessionId: number;
+ reason: number;
+ fileExist: boolean;
+ fileSize: number;
+}
+
+/** Device-initiated recording resumed. */
+export interface PlaudRecordResume {
+ sessionId: number;
+ start: number;
+ status: number;
+ scene: number;
+ startTime: number;
+}
+
+export type PlaudAudioFormat = 'pcm' | 'mp3' | 'wav' | 'opus';
+
+/** Event name → listener signature. Consumed by `PlaudSdk.addListener(name, cb)`. */
+export type PlaudSdkEvents = {
+ scanResult: (data: PlaudScanResult) => void;
+ scanTimeout: (data: { reason?: string }) => void;
+ connectState: (data: PlaudConnectState) => void;
+ penState: (data: PlaudPenState) => void;
+ bind: (data: { sn: string | null; status: number; protVersion: number }) => void;
+ fileList: (data: PlaudFileList) => void;
+ exportProgress: (data: PlaudExportProgress) => void;
+ recordStart: (data: PlaudRecordStart) => void;
+ recordStop: (data: PlaudRecordStop) => void;
+ recordPause: (data: PlaudRecordStop) => void;
+ recordResume: (data: PlaudRecordResume) => void;
+ depair: (data: { status: number }) => void;
+};
+
+/**
+ * Typed shape of the native `PlaudSdk` module (see modules/plaud-sdk/ios/PlaudSdkModule.swift).
+ * It extends `NativeModule`, so `addListener` / `removeListener` for every event above come
+ * for free and are fully typed.
+ *
+ * iOS only: on Android / the simulator (no arm64 SDK slice) these calls reject. Guard with
+ * `PlaudSdk.isAvailable` at call sites.
+ */
+export declare class PlaudSdkModule extends NativeModule {
+ /**
+ * Initialise the SDK with a per-user JWT. `customDomain` is domain-only (no https://).
+ * `userId` is the app-level identifier reused as the default connect `deviceToken`.
+ */
+ initSDK(options: {
+ userAccessToken: string;
+ customDomain: string;
+ userId?: string;
+ }): Promise;
+ startScan(): Promise;
+ stopScan(): Promise;
+ /** Connect to a device from a prior `scanResult`, by `uuid` (preferred) or `serialNumber`. */
+ connectBleDevice(options: {
+ uuid?: string;
+ serialNumber?: string;
+ deviceToken?: string;
+ }): Promise;
+ disconnect(): Promise;
+ /** Unpair; with `clear: true` (default) also clears local pairing state. Result via `depair` event. */
+ depair(options?: { clear?: boolean }): Promise;
+ isConnected(): Promise<{ connected: boolean }>;
+ /** Request the recording list; results arrive via the `fileList` event. */
+ getFileList(options?: { startSessionId?: number }): Promise;
+ /**
+ * Decode a recording to a file in the app's Documents/PlaudExports dir. Resolves with the
+ * written path; emits `exportProgress` events. `format` defaults to "mp3".
+ */
+ exportAudio(options: {
+ sessionId: number;
+ format?: PlaudAudioFormat;
+ channels?: number;
+ }): Promise<{ sessionId: number; outputPath: string }>;
+}
diff --git a/modules/plaud-sdk/src/index.ts b/modules/plaud-sdk/src/index.ts
new file mode 100644
index 0000000..4dfabee
--- /dev/null
+++ b/modules/plaud-sdk/src/index.ts
@@ -0,0 +1,31 @@
+import { requireNativeModule } from 'expo-modules-core';
+import { Platform } from 'react-native';
+import type { PlaudSdkModule } from './PlaudSdk.types';
+export * from './PlaudSdk.types';
+
+let nativeModule: PlaudSdkModule | null = null;
+try {
+ if (Platform.OS === 'ios') {
+ nativeModule = requireNativeModule('PlaudSdk');
+ }
+} catch {
+ nativeModule = null;
+}
+
+export const isAvailable: boolean = nativeModule != null;
+
+export const PlaudSdk: PlaudSdkModule = nativeModule ??
+ (new Proxy(
+ {},
+ {
+ get(_target, prop) {
+ if (prop === 'addListener' || prop === 'removeListener' || prop === 'removeAllListeners') {
+ return () => ({ remove() {} });
+ }
+ return () =>
+ Promise.reject(new Error('PlaudSdk native module is unavailable on this platform'));
+ },
+ },
+ ) as PlaudSdkModule);
+
+export default PlaudSdk;
diff --git a/react-native-demo/.env.example b/react-native-demo/.env.example
new file mode 100644
index 0000000..29eb0de
--- /dev/null
+++ b/react-native-demo/.env.example
@@ -0,0 +1,14 @@
+# Plaud demo env vars. Copy to `.env.local` and fill in real values.
+#
+# ⚠️ EXPO_PUBLIC_* vars are inlined into the JS bundle and are extractable from the app.
+# This is acceptable for a DEMO build only. In production, the client id / api key must
+# live on a backend (see the Capacitor app) — never ship them in the client.
+
+# Per-user access token used for initSDK AND file upload (Bearer). Mint via the partner
+# OAuth flow (see backend-starter-plaud/src/plaud.ts) or paste one for local testing.
+EXPO_PUBLIC_PLAUD_ACCESS_TOKEN=
+
+# Partner credentials for the transcription API (X-Client-Id / X-Client-Api-Key).
+# Create in the Plaud Developer Portal: https://platform.plaud.ai/developer/portal
+EXPO_PUBLIC_PLAUD_CLIENT_ID=
+EXPO_PUBLIC_PLAUD_API_KEY=
diff --git a/react-native-demo/.gitignore b/react-native-demo/.gitignore
index 4b00baf..20cb496 100644
--- a/react-native-demo/.gitignore
+++ b/react-native-demo/.gitignore
@@ -1,4 +1,5 @@
# Learn more https://docs.github.com/en/get-started/getting-started-with-git/ignoring-files
+.env
# dependencies
node_modules/
diff --git a/react-native-demo/README.md b/react-native-demo/README.md
index f8ab635..8d4786f 100644
--- a/react-native-demo/README.md
+++ b/react-native-demo/README.md
@@ -67,11 +67,7 @@ open ios/reactnativedemo.xcworkspace
Once the app is installed on the device, you usually just need the JS dev server running:
```bash
-npx expo start # then press the device/simulator options in the terminal
-# or
-npm run ios # build + run on iOS
-npm run android # build + run on Android
-npm run web # run in the browser
+npm run ios
```
Edit files inside the **app** directory — this project uses
diff --git a/react-native-demo/app.json b/react-native-demo/app.json
index 859e8d0..c7135de 100644
--- a/react-native-demo/app.json
+++ b/react-native-demo/app.json
@@ -9,7 +9,11 @@
"userInterfaceStyle": "automatic",
"ios": {
"icon": "./assets/expo.icon",
- "bundleIdentifier": "ai.plaud.reactnativedemo"
+ "bundleIdentifier": "ai.plaud.reactnativedemo",
+ "infoPlist": {
+ "NSBluetoothAlwaysUsageDescription": "Plaud uses Bluetooth to connect to your recorder and sync recordings.",
+ "UIBackgroundModes": ["bluetooth-central"]
+ }
},
"android": {
"adaptiveIcon": {
diff --git a/react-native-demo/modules/plaud-sdk/README.md b/react-native-demo/modules/plaud-sdk/README.md
new file mode 100644
index 0000000..275e203
--- /dev/null
+++ b/react-native-demo/modules/plaud-sdk/README.md
@@ -0,0 +1,38 @@
+# plaud-sdk (local Expo module)
+
+Native iOS bridge to Plaud's device SDK — the React Native counterpart of the Capacitor
+`PlaudSdk` plugin. Exposes BLE connect/scan, on-device file listing, and audio export to JS,
+plus an event stream for scan results, connection state, device-initiated recording, etc.
+
+## How it's wired
+- **Autolinked** via `use_expo_modules!` — Expo scans `./modules` during prebuild, so no
+ Podfile or Xcode edits are needed. `expo-module.config.json` registers `PlaudSdkModule`.
+- The Plaud SDK ships as three precompiled `.xcframework`s in `ios/Frameworks/`
+ (`PlaudBleSDK`, `PlaudDeviceBasicSDK`, `PlaudWiFiSDK`), vendored by `PlaudSdk.podspec`
+ (`vendored_frameworks`). CocoaPods embeds and code-signs them automatically.
+- BLE permissions (`NSBluetoothAlwaysUsageDescription`, `UIBackgroundModes: bluetooth-central`)
+ live in the app's `app.json` under `ios.infoPlist`, so they survive `expo prebuild`.
+
+## ⚠️ Device only
+The frameworks are **arm64, iOS 15+, device-only** — there is no simulator slice. You must:
+- Run on a **physical iPhone** (`npx expo run:ios --device`), not the simulator.
+- Use a **dev build**, not Expo Go (this is custom native code).
+
+On Android / simulator the JS `PlaudSdk` methods reject and `isAvailable` is `false`.
+
+## Usage
+```ts
+import { PlaudSdk, isAvailable } from 'plaud-sdk';
+
+if (isAvailable) {
+ await PlaudSdk.initSDK({ userAccessToken, customDomain: 'platform-us.plaud.ai', userId });
+ const sub = PlaudSdk.addListener('scanResult', ({ devices }) => { /* ... */ });
+ await PlaudSdk.startScan();
+ // ...later: sub.remove();
+}
+```
+
+## Not ported from the Capacitor plugin
+`readFile` / `putBinary` — those existed only to work around WKWebView CORS when Capacitor
+loaded a remote origin. React Native has no WebView/CORS constraint: read exported files with
+`expo-file-system` and upload with `fetch`.
diff --git a/react-native-demo/modules/plaud-sdk/expo-module.config.json b/react-native-demo/modules/plaud-sdk/expo-module.config.json
new file mode 100644
index 0000000..4d95835
--- /dev/null
+++ b/react-native-demo/modules/plaud-sdk/expo-module.config.json
@@ -0,0 +1,6 @@
+{
+ "platforms": ["apple"],
+ "apple": {
+ "modules": ["PlaudSdkModule"]
+ }
+}
diff --git a/react-native-demo/modules/plaud-sdk/index.ts b/react-native-demo/modules/plaud-sdk/index.ts
new file mode 100644
index 0000000..9b28da1
--- /dev/null
+++ b/react-native-demo/modules/plaud-sdk/index.ts
@@ -0,0 +1,2 @@
+export * from './src';
+export { default } from './src';
diff --git a/react-native-demo/modules/plaud-sdk/ios/Frameworks/PlaudBleSDK.xcframework/Info.plist b/react-native-demo/modules/plaud-sdk/ios/Frameworks/PlaudBleSDK.xcframework/Info.plist
new file mode 100644
index 0000000..a2264c5
--- /dev/null
+++ b/react-native-demo/modules/plaud-sdk/ios/Frameworks/PlaudBleSDK.xcframework/Info.plist
@@ -0,0 +1,27 @@
+
+
+
+
+ AvailableLibraries
+
+
+ BinaryPath
+ PlaudBleSDK.framework/PlaudBleSDK
+ LibraryIdentifier
+ ios-arm64
+ LibraryPath
+ PlaudBleSDK.framework
+ SupportedArchitectures
+
+ arm64
+
+ SupportedPlatform
+ ios
+
+
+ CFBundlePackageType
+ XFWK
+ XCFrameworkFormatVersion
+ 1.0
+
+
diff --git a/react-native-demo/modules/plaud-sdk/ios/Frameworks/PlaudBleSDK.xcframework/ios-arm64/PlaudBleSDK.framework/Headers/JXAvcFilePlayer.h b/react-native-demo/modules/plaud-sdk/ios/Frameworks/PlaudBleSDK.xcframework/ios-arm64/PlaudBleSDK.framework/Headers/JXAvcFilePlayer.h
new file mode 100644
index 0000000..ea4a9e3
--- /dev/null
+++ b/react-native-demo/modules/plaud-sdk/ios/Frameworks/PlaudBleSDK.xcframework/ios-arm64/PlaudBleSDK.framework/Headers/JXAvcFilePlayer.h
@@ -0,0 +1,56 @@
+//
+// JXAvcFilePlayer.h
+// PenBleSDK
+//
+// Created by 天诺泰 on 2019/5/21.
+// Copyright © 2019 天诺泰. All rights reserved.
+//
+
+#import
+
+@protocol JXAvcFilePlayerDelegate
+/// 播放状态改变
+- (void)onStateChanged:(BOOL)isPlaying;
+/// 播放进度(秒)
+- (void)onPlayLocation:(double)seconds;
+
+@end
+
+/// avc/opus文件播放器
+/// @deprecated 废弃,请使用JXOggPlayer
+@interface JXAvcFilePlayer : NSObject
+
+@property (nonatomic, weak) id delegate;
+@property (nonatomic, assign) BOOL isPrepared;
+@property (nonatomic, strong) NSString *filePath; //文件路径
+@property (nonatomic, assign) NSInteger fileSize; //文件大小
+@property (nonatomic, assign) NSInteger curOffset; //当前播放文件偏移量
+
++ (instancetype)shared;
+/// 是否开启降噪、增益
+- (void)openNsAgc:(BOOL)open;
+
+/// 是否开启声加降噪
+- (void)openSoundPlusNs:(BOOL)open;
+
+/// 设置avc文件路径
+- (void)setAudioPath:(NSString *)avcPath numerOfChannel:(int)channels;
+
+/// 开始播放
+- (void)play;
+/// 播放速率
+- (void)setPlayRate:(Float32)rate;
+/// 跳到某个位置
+- (void)seekTo:(NSTimeInterval)seconds;
+/// 暂停播放
+- (void)pause;
+/// 结束播放
+- (void)stop;
+///是否正在播放
+- (BOOL)isPlaying;
+///播放到的毫秒值
+- (NSInteger)curMillisec;
+///总时长
+- (double)duration;
+
+@end
diff --git a/react-native-demo/modules/plaud-sdk/ios/Frameworks/PlaudBleSDK.xcframework/ios-arm64/PlaudBleSDK.framework/Headers/JXOggPlayer.h b/react-native-demo/modules/plaud-sdk/ios/Frameworks/PlaudBleSDK.xcframework/ios-arm64/PlaudBleSDK.framework/Headers/JXOggPlayer.h
new file mode 100644
index 0000000..7756259
--- /dev/null
+++ b/react-native-demo/modules/plaud-sdk/ios/Frameworks/PlaudBleSDK.xcframework/ios-arm64/PlaudBleSDK.framework/Headers/JXOggPlayer.h
@@ -0,0 +1,83 @@
+//
+// JXOggPlayer.h
+// PenBleSDK
+//
+// Created by 天诺泰 on 2021/5/31.
+// Copyright © 2021 天诺泰. All rights reserved.
+//
+
+#import
+
+NS_ASSUME_NONNULL_BEGIN
+
+@protocol JXOggPlayerDelegate
+
+/// 播放状态改变
+- (void)onStateChanged:(BOOL)isPlaying;
+/// 播放进度(秒)
+- (void)onPlayingLocation:(double)seconds;
+
+@end
+
+/// 直接播放录音笔ogg文件的类
+@interface JXOggPlayer : NSObject
+
+@property (nonatomic, weak) id delegate;
+@property (nonatomic, assign, readonly) BOOL isPrepared;
+/// 文件路径,不要直接操作
+@property (nonatomic, strong, readonly) NSString *filePath;
+/// 文件总大小
+@property (nonatomic, assign, readonly) NSInteger fileSize;
+/// 录音文件总时长(单位毫秒)
+@property (nonatomic, assign, readonly) NSInteger totalMillsec;
+/// 录音当前播放进度(单位毫秒)
+@property (nonatomic, assign, readonly) NSInteger curMillsec;
+
++ (instancetype)shared;
+
+/// 设置ogg文件路径和音频声道数
+/// @param oggPath ogg文件路径
+/// @param channel 声道数
+- (void)setOggPath:(NSString *)oggPath withChannel:(int)channel;
+
+/// 设置opus文件路径和音频声道数
+/// @param opusPath opus纯音频未解码数据文件路径
+/// @param channel 声道数
+- (void)setOpusPath:(NSString *)opusPath withChannel:(int)channel;
+
+/// 设置 pcm 文件路径和音频声道数
+/// @param pcmPath pcm 数据文件路径
+/// @param channel 声道数
+- (void)setPCMPath:(NSString *)pcmPath withChannel:(int)channel;
+
+/// 是否开启降噪、增益(仅单声道)
+- (void)openNsAgc:(BOOL)open;
+
+/// 设置是否启用 Plaud 算法降噪(基于 plaud_algo,按 256 帧处理,16k 单声道)
+- (void)setPlaudAlgo:(BOOL)enabled;
+
+/// 开始播放
+- (void)play;
+
+/// 设置倍速播放
+/// @param rate 播放倍率
+- (void)setPlayRate:(Float32)rate;
+/// 跳到某个位置;因为会清空音频队列,跳转后需要手动恢复播放
+/// @param seconds 单位秒
+- (void)seekTo:(NSTimeInterval)seconds;
+
+/// 跳到某个位置;因为会清空音频队列,跳转后需要手动恢复播放
+/// @param millSec 单位 毫秒
+- (void)seekToMillSec:(NSTimeInterval)millSec;
+
+/// 暂停播放
+- (void)pause;
+/// 结束播放
+- (void)stop;
+///是否正在播放
+- (BOOL)isPlaying;
+
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/react-native-demo/modules/plaud-sdk/ios/Frameworks/PlaudBleSDK.xcframework/ios-arm64/PlaudBleSDK.framework/Headers/JXOpusDecoder.h b/react-native-demo/modules/plaud-sdk/ios/Frameworks/PlaudBleSDK.xcframework/ios-arm64/PlaudBleSDK.framework/Headers/JXOpusDecoder.h
new file mode 100644
index 0000000..92fc180
--- /dev/null
+++ b/react-native-demo/modules/plaud-sdk/ios/Frameworks/PlaudBleSDK.xcframework/ios-arm64/PlaudBleSDK.framework/Headers/JXOpusDecoder.h
@@ -0,0 +1,25 @@
+//
+// JXOpusDecoder.h
+// PenBleSDK
+//
+// Created by 天诺泰 on 2019/8/15.
+// Copyright © 2019 天诺泰. All rights reserved.
+//
+
+#import
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface JXOpusDecoder : NSObject
+
+/// 初始化解码器
+/// @param channels 声道数,1,2,4
+- (instancetype)initWithChannels:(int)channels;
+
+/// 解码数据·
+/// @param avcData 数据,单声道包大小是80,双声道包大小是160,四声道是320
+- (nullable NSData *)decode:(NSData *)avcData;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/react-native-demo/modules/plaud-sdk/ios/Frameworks/PlaudBleSDK.xcframework/ios-arm64/PlaudBleSDK.framework/Headers/Mp3Convert.h b/react-native-demo/modules/plaud-sdk/ios/Frameworks/PlaudBleSDK.xcframework/ios-arm64/PlaudBleSDK.framework/Headers/Mp3Convert.h
new file mode 100644
index 0000000..68dd71b
--- /dev/null
+++ b/react-native-demo/modules/plaud-sdk/ios/Frameworks/PlaudBleSDK.xcframework/ios-arm64/PlaudBleSDK.framework/Headers/Mp3Convert.h
@@ -0,0 +1,152 @@
+//
+// Mp3Convert.h
+// PenBleSDK
+//
+// Created by 天诺泰 on 2019/8/16.
+// Copyright © 2019 天诺泰. All rights reserved.
+//
+
+#import
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface Mp3Convert : NSObject
+
++ (instancetype)shared;
+
+//+ (void)jx_swap:(int *)a :(int *)b;
+/// 生成声波
+/// @param avcPath 原始文件路径
+/// @param channels 声道数
+/// @param callback 回调,每秒一个分贝值
+- (void)generateSoundWave:(NSString *)avcPath
+ channels:(int)channels
+ callback:(void(^)(int second, int secVolume))callback;
+
+/// 生成音乐模式下wav的声波
+/// @param wavPath wav文件
+/// @param channels 声道数
+/// @param simpleRate 采样率
+/// @param callback 回调,每秒一个分贝值
+- (void)generateSoundWave:(NSString *)wavPath
+ channels:(int)channels
+ simpleRate:(int)simpleRate
+ callback:(void(^)(int second, int secVolume))callback;
+
+/// 取消生成声波的任务
+- (void)generateSoundWaveCancel;
+
+/// avc转pcm
+/// @param avcPath 原始文件路径
+/// @param pcmPath 目标文件路径
+/// @param channels 声道数
+/// @param ns_agc 是否降噪增益
+/// @param callback 进度回调
+- (void)convertAvc:(NSString *)avcPath
+ toPcm:(NSString *)pcmPath
+ channels:(int)channels
+ ns_agc:(BOOL)ns_agc
+ callback:(void(^)(int64_t curPos))callback;
+
+/// ogg转pcm
+/// @param oggPath ogg文件路径
+/// @param pcmPath pcm文件路径
+/// @param channels 声道数
+/// @param ns_agc 是否降噪增益
+/// @param callback 进度回调
+- (void)convertOgg:(NSString *)oggPath
+ toPcm:(NSString *)pcmPath
+ channels:(int)channels
+ ns_agc:(BOOL)ns_agc
+ callback:(void(^)(int64_t curPos))callback;
+
+/// pcm转mp3
+/// @param pcmPath pcm文件路径
+/// @param mp3Path mp3文件路径
+/// @param quality 音质质量(默认选7) 2 near-best quality, not too slow;5 good quality, fast; 7 ok quality, really fast
+/// @param channels 声道数
+/// @param callback 进度回调
+- (void)convertPcm:(NSString *)pcmPath
+ toMp3:(NSString *)mp3Path
+ quality:(int)quality
+ channels:(int)channels
+ callback:(void(^)(int64_t curPos))callback;
+
+
+/// avc转mp3
+/// @param avcPath 原始未解码文件路径
+/// @param mp3Path mp3文件路径
+/// @param quality mp3音质 2 near-best quality, not too slow;5 good quality, fast;7 ok quality, really fast 默认7
+/// @param channels 声道数
+/// @param ns_agc 是否要做降噪增益?(笔端如果做了app就不用做)
+/// @param callback 回调进度(已处理文件偏移量)
+- (void)convertAvc:(NSString *)avcPath
+ toMp3:(NSString *)mp3Path
+ quality:(int)quality
+ channels:(int)channels
+ ns_agc:(BOOL)ns_agc
+ callback:(void(^)(int64_t curPos))callback;
+
+/// ogg转mp3
+/// @param oggPath ogg文件路径
+/// @param mp3Path 待生成的mp3文件路径
+/// @param quality mp3音质 2 near-best quality, not too slow;5 good quality, fast;7 ok quality, really fast 默认7
+/// @param channels ogg声道数
+/// @param ns_agc 是否要做降噪增益?(@see BleDevice)
+/// @param callback 回调进度(已处理文件偏移量)
+- (void)convertOgg:(NSString *)oggPath
+ toMp3:(NSString *)mp3Path
+ quality:(int)quality
+ channals:(int)channels
+ ns_agc:(BOOL)ns_agc
+ callback:(void(^)(int64_t curPos))callback;
+
+
+/// avc转wave
+/// @param avcPath 原始未解码文件路径
+/// @param wavePath wave文件路径
+/// @param channels 声道数
+/// @param simpleRate 采样率,16000(16k)、48000(48k)
+/// @param ns_agc 是否要做降噪增益?(笔端如果做了app就不用做)
+/// @param callback 回调进度(已处理文件偏移量)
+- (void)convertAvc:(NSString *)avcPath
+ toWave:(NSString *)wavePath
+ channels:(int)channels
+ simpleRate:(uint32_t)simpleRate
+ ns_agc:(BOOL)ns_agc
+ callback:(void(^)(int64_t curPos))callback;
+
+/// avc 转降噪 wave
+/// @param avcPath 原始未解码文件路径
+/// @param wavePath wave文件路径
+/// @param channels 声道数
+/// @param simpleRate 采样率,16000(16k)、48000(48k)
+/// @param soundPlus 是否要做降噪增益?(笔端如果做了app就不用做)
+/// @param callback 回调进度(已处理文件偏移量)
+- (void)convertAvc:(NSString *)avcPath
+ toNoiseReductionWave:(NSString *)wavePath
+ channels:(int)channels
+ simpleRate:(uint32_t)simpleRate
+ soundPlus:(BOOL)soundPlus
+noiseReductionGain:(int)gain
+ callback:(void(^)(int64_t curPos))callback;
+
+
+/// 取消avcToPcm的任务
+- (void)convertAvcToPcmCancel;
+/// 取消压缩PcmToMp3的任务
+- (void)convertPcmToMp3Cancel;
+/// 取消压缩AvcToMp3的任务
+- (void)convertAvcToMp3Cancel;
+/// 取消ogg转mp3的任务
+- (void)convertOggToMp3Cancel;
+
+/// 取消ogg转pcm的任务
+- (void)convertOggToPcmCancel;
+/// 取消压缩AvcToWav的任务
+- (void)convertAvcToWavCancel;
+/// 取消压缩AvcToNoiseReductionWav的任务
+- (void)convertAvcToNoiseReductionWavCancel;
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/react-native-demo/modules/plaud-sdk/ios/Frameworks/PlaudBleSDK.xcframework/ios-arm64/PlaudBleSDK.framework/Headers/NSData+SHA.h b/react-native-demo/modules/plaud-sdk/ios/Frameworks/PlaudBleSDK.xcframework/ios-arm64/PlaudBleSDK.framework/Headers/NSData+SHA.h
new file mode 100644
index 0000000..263ef8f
--- /dev/null
+++ b/react-native-demo/modules/plaud-sdk/ios/Frameworks/PlaudBleSDK.xcframework/ios-arm64/PlaudBleSDK.framework/Headers/NSData+SHA.h
@@ -0,0 +1,19 @@
+//
+// NSData_SHA1.h
+// SwiftyRSA
+//
+// Created by Paul Wilkinson on 19/04/2016.
+// Copyright © 2016 Scoop. All rights reserved.
+//
+
+#import
+
+@interface NSData (NSData_SwiftyRSASHA)
+
+- (nonnull NSData*) SwiftyRSASHA1;
+- (nonnull NSData*) SwiftyRSASHA224;
+- (nonnull NSData*) SwiftyRSASHA256;
+- (nonnull NSData*) SwiftyRSASHA384;
+- (nonnull NSData*) SwiftyRSASHA512;
+
+@end
\ No newline at end of file
diff --git a/react-native-demo/modules/plaud-sdk/ios/Frameworks/PlaudBleSDK.xcframework/ios-arm64/PlaudBleSDK.framework/Headers/NsAgcUtil.h b/react-native-demo/modules/plaud-sdk/ios/Frameworks/PlaudBleSDK.xcframework/ios-arm64/PlaudBleSDK.framework/Headers/NsAgcUtil.h
new file mode 100644
index 0000000..7542f27
--- /dev/null
+++ b/react-native-demo/modules/plaud-sdk/ios/Frameworks/PlaudBleSDK.xcframework/ios-arm64/PlaudBleSDK.framework/Headers/NsAgcUtil.h
@@ -0,0 +1,21 @@
+//
+// NsAgcUtil.h
+// PenBleSDK
+//
+// Created by 天诺泰 on 2020/2/24.
+// Copyright © 2020 天诺泰. All rights reserved.
+//
+
+#import
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface NsAgcUtil : NSObject
+
+- (nullable NSData *)process:(NSData *)pcmData channesl:(int)channels;
+
+- (void)procress:(int16_t *)input channels:(int)channels;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/react-native-demo/modules/plaud-sdk/ios/Frameworks/PlaudBleSDK.xcframework/ios-arm64/PlaudBleSDK.framework/Headers/OggUtil.h b/react-native-demo/modules/plaud-sdk/ios/Frameworks/PlaudBleSDK.xcframework/ios-arm64/PlaudBleSDK.framework/Headers/OggUtil.h
new file mode 100644
index 0000000..7ccf9aa
--- /dev/null
+++ b/react-native-demo/modules/plaud-sdk/ios/Frameworks/PlaudBleSDK.xcframework/ios-arm64/PlaudBleSDK.framework/Headers/OggUtil.h
@@ -0,0 +1,76 @@
+//
+// OggUtil.h
+// PenBleSDK
+//
+// Created by 天诺泰 on 2019/10/22.
+// Copyright © 2019 天诺泰. All rights reserved.
+//
+
+#import
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface OggUtil : NSObject
+
++ (instancetype)shared;
+
+/// 生成声波
+/// @param oggPath 原始文件路径
+/// @param channels 声道数
+/// @param callback 回调,每秒一个分贝值
+- (void)generateSoundWave:(NSString *)oggPath
+ channels:(int)channels
+ callback:(void(^)(int second, int secVolume, int progress))callback;
+
+/// 取消生成声波的任务
+- (void)generateSoundWaveCancel;
+
+
+/// 封装ogg
+/// @param avcPath opus压缩文件路径
+/// @param oggPath 目标ogg文件路径
+/// @param cutOut 是否截取?(讯飞的离线识别虽然说是5个小时,但是好像只能传4小时59分50秒的样子)
+/// @param channels 声道数(源数据声道)
+/// @param targetChannels 目标声道(单声道还是双声道?双声道可以只获取单声道的,语音识别的一般只支持单声道;双声道转双声道有点问题,声音不好)
+/// @param ns_agc 做降噪、增益
+/// @param callback 回调
+- (void)convertAvc:(NSString *)avcPath
+ toOgg:(NSString *)oggPath
+ cutOut:(BOOL)cutOut
+ channels:(int32_t)channels
+ targetChannels:(int32_t)targetChannels
+ ns_agc:(BOOL)ns_agc
+ callback:(void(^)(int64_t curPos))callback;
+
+/// 取消转码任务
+- (void)convertCancel;
+
+///提取pcm纯数据
+- (void)convertOgg:(NSString *)oggPath
+ toOpus:(NSString *)opusPath
+ channels:(int32_t)channels
+ callback:(void(^)(Boolean completed))callback;
+
+/// 单、双声道ogg转单声道ogg
+/// @param originPath 双声道ogg(必须是从录音笔直接获取的,其他格式不支持)
+/// @param singlePath 目标单声道ogg
+/// @param callback 进度回调
+- (void)convertOgg:(NSString *)originPath
+ toSingle:(NSString *)singlePath
+ channels:(int32_t)channels
+ callback:(void(^)(int64_t curPos))callback;
+
+
+/// 四声道ogg转单声道ogg
+/// @param originPath 四声道ogg(必须是从录音笔直接获取的,其他格式不支持)
+/// @param singlePath 目标单声道ogg
+/// @param callback 进度回调
+- (void)convertFourChannelOgg:(NSString *)originPath
+ toSingle:(NSString *)singlePath
+ callback:(void(^)(int64_t curPos))callback;
+
+
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/react-native-demo/modules/plaud-sdk/ios/Frameworks/PlaudBleSDK.xcframework/ios-arm64/PlaudBleSDK.framework/Headers/PlaudAlgoTool.h b/react-native-demo/modules/plaud-sdk/ios/Frameworks/PlaudBleSDK.xcframework/ios-arm64/PlaudBleSDK.framework/Headers/PlaudAlgoTool.h
new file mode 100644
index 0000000..c0adcba
--- /dev/null
+++ b/react-native-demo/modules/plaud-sdk/ios/Frameworks/PlaudBleSDK.xcframework/ios-arm64/PlaudBleSDK.framework/Headers/PlaudAlgoTool.h
@@ -0,0 +1,41 @@
+//
+// PlaudAlgoTool.h
+// PenBleSDK
+//
+// Created for PlaudAlgo wrapper.
+//
+
+#import
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface PlaudAlgoTool : NSObject
+
++ (instancetype)shared;
+
+/// 是否启用 PlaudAlgo 处理
+@property (nonatomic, assign) BOOL enabled;
+
+/// 初始化算法(如有需要可重复调用保证幂等)
+- (void)setup;
+
+/// 处理 PCM int16 数据,要求 length 为采样点数(每点 2 字节),内部按 256 帧切片
+- (NSData *)processInt16:(int16_t *)input length:(int)length;
+
+/// 处理 WAV 文件,inputPath 为 16k/16bit/mono 的 WAV,输出 WAV
+- (BOOL)processWavFile:(NSString *)inputPath
+ outputPath:(NSString *)outputPath
+ progress:(void (^)(float progress))progressCallback;
+
+/// 处理裸 PCM 文件,输入/输出均为 16k/16bit/mono 的 PCM
+- (BOOL)processPcmFile:(NSString *)inputPath
+ outputPath:(NSString *)outputPath
+ progress:(void (^)(float progress))progressCallback;
+
+/// 获取底层算法版本号
+- (NSInteger)version;
+
+@end
+
+NS_ASSUME_NONNULL_END
+
diff --git a/react-native-demo/modules/plaud-sdk/ios/Frameworks/PlaudBleSDK.xcframework/ios-arm64/PlaudBleSDK.framework/Headers/PlaudBleSDK-Swift.h b/react-native-demo/modules/plaud-sdk/ios/Frameworks/PlaudBleSDK.xcframework/ios-arm64/PlaudBleSDK.framework/Headers/PlaudBleSDK-Swift.h
new file mode 100644
index 0000000..4240849
--- /dev/null
+++ b/react-native-demo/modules/plaud-sdk/ios/Frameworks/PlaudBleSDK.xcframework/ios-arm64/PlaudBleSDK.framework/Headers/PlaudBleSDK-Swift.h
@@ -0,0 +1,2538 @@
+#if 0
+#elif defined(__arm64__) && __arm64__
+// Generated by Apple Swift version 6.0.3 effective-5.10 (swiftlang-6.0.3.1.10 clang-1600.0.30.1)
+#ifndef PLAUDBLESDK_SWIFT_H
+#define PLAUDBLESDK_SWIFT_H
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wgcc-compat"
+
+#if !defined(__has_include)
+# define __has_include(x) 0
+#endif
+#if !defined(__has_attribute)
+# define __has_attribute(x) 0
+#endif
+#if !defined(__has_feature)
+# define __has_feature(x) 0
+#endif
+#if !defined(__has_warning)
+# define __has_warning(x) 0
+#endif
+
+#if __has_include()
+# include
+#endif
+
+#pragma clang diagnostic ignored "-Wauto-import"
+#if defined(__OBJC__)
+#include
+#endif
+#if defined(__cplusplus)
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#else
+#include
+#include
+#include
+#include
+#endif
+#if defined(__cplusplus)
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wnon-modular-include-in-framework-module"
+#if defined(__arm64e__) && __has_include()
+# include
+#else
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wreserved-macro-identifier"
+# ifndef __ptrauth_swift_value_witness_function_pointer
+# define __ptrauth_swift_value_witness_function_pointer(x)
+# endif
+# ifndef __ptrauth_swift_class_method_pointer
+# define __ptrauth_swift_class_method_pointer(x)
+# endif
+#pragma clang diagnostic pop
+#endif
+#pragma clang diagnostic pop
+#endif
+
+#if !defined(SWIFT_TYPEDEFS)
+# define SWIFT_TYPEDEFS 1
+# if __has_include()
+# include
+# elif !defined(__cplusplus)
+typedef uint_least16_t char16_t;
+typedef uint_least32_t char32_t;
+# endif
+typedef float swift_float2 __attribute__((__ext_vector_type__(2)));
+typedef float swift_float3 __attribute__((__ext_vector_type__(3)));
+typedef float swift_float4 __attribute__((__ext_vector_type__(4)));
+typedef double swift_double2 __attribute__((__ext_vector_type__(2)));
+typedef double swift_double3 __attribute__((__ext_vector_type__(3)));
+typedef double swift_double4 __attribute__((__ext_vector_type__(4)));
+typedef int swift_int2 __attribute__((__ext_vector_type__(2)));
+typedef int swift_int3 __attribute__((__ext_vector_type__(3)));
+typedef int swift_int4 __attribute__((__ext_vector_type__(4)));
+typedef unsigned int swift_uint2 __attribute__((__ext_vector_type__(2)));
+typedef unsigned int swift_uint3 __attribute__((__ext_vector_type__(3)));
+typedef unsigned int swift_uint4 __attribute__((__ext_vector_type__(4)));
+#endif
+
+#if !defined(SWIFT_PASTE)
+# define SWIFT_PASTE_HELPER(x, y) x##y
+# define SWIFT_PASTE(x, y) SWIFT_PASTE_HELPER(x, y)
+#endif
+#if !defined(SWIFT_METATYPE)
+# define SWIFT_METATYPE(X) Class
+#endif
+#if !defined(SWIFT_CLASS_PROPERTY)
+# if __has_feature(objc_class_property)
+# define SWIFT_CLASS_PROPERTY(...) __VA_ARGS__
+# else
+# define SWIFT_CLASS_PROPERTY(...)
+# endif
+#endif
+#if !defined(SWIFT_RUNTIME_NAME)
+# if __has_attribute(objc_runtime_name)
+# define SWIFT_RUNTIME_NAME(X) __attribute__((objc_runtime_name(X)))
+# else
+# define SWIFT_RUNTIME_NAME(X)
+# endif
+#endif
+#if !defined(SWIFT_COMPILE_NAME)
+# if __has_attribute(swift_name)
+# define SWIFT_COMPILE_NAME(X) __attribute__((swift_name(X)))
+# else
+# define SWIFT_COMPILE_NAME(X)
+# endif
+#endif
+#if !defined(SWIFT_METHOD_FAMILY)
+# if __has_attribute(objc_method_family)
+# define SWIFT_METHOD_FAMILY(X) __attribute__((objc_method_family(X)))
+# else
+# define SWIFT_METHOD_FAMILY(X)
+# endif
+#endif
+#if !defined(SWIFT_NOESCAPE)
+# if __has_attribute(noescape)
+# define SWIFT_NOESCAPE __attribute__((noescape))
+# else
+# define SWIFT_NOESCAPE
+# endif
+#endif
+#if !defined(SWIFT_RELEASES_ARGUMENT)
+# if __has_attribute(ns_consumed)
+# define SWIFT_RELEASES_ARGUMENT __attribute__((ns_consumed))
+# else
+# define SWIFT_RELEASES_ARGUMENT
+# endif
+#endif
+#if !defined(SWIFT_WARN_UNUSED_RESULT)
+# if __has_attribute(warn_unused_result)
+# define SWIFT_WARN_UNUSED_RESULT __attribute__((warn_unused_result))
+# else
+# define SWIFT_WARN_UNUSED_RESULT
+# endif
+#endif
+#if !defined(SWIFT_NORETURN)
+# if __has_attribute(noreturn)
+# define SWIFT_NORETURN __attribute__((noreturn))
+# else
+# define SWIFT_NORETURN
+# endif
+#endif
+#if !defined(SWIFT_CLASS_EXTRA)
+# define SWIFT_CLASS_EXTRA
+#endif
+#if !defined(SWIFT_PROTOCOL_EXTRA)
+# define SWIFT_PROTOCOL_EXTRA
+#endif
+#if !defined(SWIFT_ENUM_EXTRA)
+# define SWIFT_ENUM_EXTRA
+#endif
+#if !defined(SWIFT_CLASS)
+# if __has_attribute(objc_subclassing_restricted)
+# define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_CLASS_EXTRA
+# define SWIFT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA
+# else
+# define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA
+# define SWIFT_CLASS_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA
+# endif
+#endif
+#if !defined(SWIFT_RESILIENT_CLASS)
+# if __has_attribute(objc_class_stub)
+# define SWIFT_RESILIENT_CLASS(SWIFT_NAME) SWIFT_CLASS(SWIFT_NAME) __attribute__((objc_class_stub))
+# define SWIFT_RESILIENT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_class_stub)) SWIFT_CLASS_NAMED(SWIFT_NAME)
+# else
+# define SWIFT_RESILIENT_CLASS(SWIFT_NAME) SWIFT_CLASS(SWIFT_NAME)
+# define SWIFT_RESILIENT_CLASS_NAMED(SWIFT_NAME) SWIFT_CLASS_NAMED(SWIFT_NAME)
+# endif
+#endif
+#if !defined(SWIFT_PROTOCOL)
+# define SWIFT_PROTOCOL(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA
+# define SWIFT_PROTOCOL_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA
+#endif
+#if !defined(SWIFT_EXTENSION)
+# define SWIFT_EXTENSION(M) SWIFT_PASTE(M##_Swift_, __LINE__)
+#endif
+#if !defined(OBJC_DESIGNATED_INITIALIZER)
+# if __has_attribute(objc_designated_initializer)
+# define OBJC_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer))
+# else
+# define OBJC_DESIGNATED_INITIALIZER
+# endif
+#endif
+#if !defined(SWIFT_ENUM_ATTR)
+# if __has_attribute(enum_extensibility)
+# define SWIFT_ENUM_ATTR(_extensibility) __attribute__((enum_extensibility(_extensibility)))
+# else
+# define SWIFT_ENUM_ATTR(_extensibility)
+# endif
+#endif
+#if !defined(SWIFT_ENUM)
+# define SWIFT_ENUM(_type, _name, _extensibility) enum _name : _type _name; enum SWIFT_ENUM_ATTR(_extensibility) SWIFT_ENUM_EXTRA _name : _type
+# if __has_feature(generalized_swift_name)
+# define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME, _extensibility) enum _name : _type _name SWIFT_COMPILE_NAME(SWIFT_NAME); enum SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_ENUM_ATTR(_extensibility) SWIFT_ENUM_EXTRA _name : _type
+# else
+# define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME, _extensibility) SWIFT_ENUM(_type, _name, _extensibility)
+# endif
+#endif
+#if !defined(SWIFT_UNAVAILABLE)
+# define SWIFT_UNAVAILABLE __attribute__((unavailable))
+#endif
+#if !defined(SWIFT_UNAVAILABLE_MSG)
+# define SWIFT_UNAVAILABLE_MSG(msg) __attribute__((unavailable(msg)))
+#endif
+#if !defined(SWIFT_AVAILABILITY)
+# define SWIFT_AVAILABILITY(plat, ...) __attribute__((availability(plat, __VA_ARGS__)))
+#endif
+#if !defined(SWIFT_WEAK_IMPORT)
+# define SWIFT_WEAK_IMPORT __attribute__((weak_import))
+#endif
+#if !defined(SWIFT_DEPRECATED)
+# define SWIFT_DEPRECATED __attribute__((deprecated))
+#endif
+#if !defined(SWIFT_DEPRECATED_MSG)
+# define SWIFT_DEPRECATED_MSG(...) __attribute__((deprecated(__VA_ARGS__)))
+#endif
+#if !defined(SWIFT_DEPRECATED_OBJC)
+# if __has_feature(attribute_diagnose_if_objc)
+# define SWIFT_DEPRECATED_OBJC(Msg) __attribute__((diagnose_if(1, Msg, "warning")))
+# else
+# define SWIFT_DEPRECATED_OBJC(Msg) SWIFT_DEPRECATED_MSG(Msg)
+# endif
+#endif
+#if defined(__OBJC__)
+#if !defined(IBSegueAction)
+# define IBSegueAction
+#endif
+#endif
+#if !defined(SWIFT_EXTERN)
+# if defined(__cplusplus)
+# define SWIFT_EXTERN extern "C"
+# else
+# define SWIFT_EXTERN extern
+# endif
+#endif
+#if !defined(SWIFT_CALL)
+# define SWIFT_CALL __attribute__((swiftcall))
+#endif
+#if !defined(SWIFT_INDIRECT_RESULT)
+# define SWIFT_INDIRECT_RESULT __attribute__((swift_indirect_result))
+#endif
+#if !defined(SWIFT_CONTEXT)
+# define SWIFT_CONTEXT __attribute__((swift_context))
+#endif
+#if !defined(SWIFT_ERROR_RESULT)
+# define SWIFT_ERROR_RESULT __attribute__((swift_error_result))
+#endif
+#if defined(__cplusplus)
+# define SWIFT_NOEXCEPT noexcept
+#else
+# define SWIFT_NOEXCEPT
+#endif
+#if !defined(SWIFT_C_INLINE_THUNK)
+# if __has_attribute(always_inline)
+# if __has_attribute(nodebug)
+# define SWIFT_C_INLINE_THUNK inline __attribute__((always_inline)) __attribute__((nodebug))
+# else
+# define SWIFT_C_INLINE_THUNK inline __attribute__((always_inline))
+# endif
+# else
+# define SWIFT_C_INLINE_THUNK inline
+# endif
+#endif
+#if defined(_WIN32)
+#if !defined(SWIFT_IMPORT_STDLIB_SYMBOL)
+# define SWIFT_IMPORT_STDLIB_SYMBOL __declspec(dllimport)
+#endif
+#else
+#if !defined(SWIFT_IMPORT_STDLIB_SYMBOL)
+# define SWIFT_IMPORT_STDLIB_SYMBOL
+#endif
+#endif
+#if defined(__OBJC__)
+#if __has_feature(objc_modules)
+#if __has_warning("-Watimport-in-framework-header")
+#pragma clang diagnostic ignored "-Watimport-in-framework-header"
+#endif
+@import CoreBluetooth;
+@import CoreFoundation;
+@import Dispatch;
+@import Foundation;
+@import ObjectiveC;
+@import Security;
+#endif
+
+#endif
+#pragma clang diagnostic ignored "-Wproperty-attribute-mismatch"
+#pragma clang diagnostic ignored "-Wduplicate-method-arg"
+#if __has_warning("-Wpragma-clang-attribute")
+# pragma clang diagnostic ignored "-Wpragma-clang-attribute"
+#endif
+#pragma clang diagnostic ignored "-Wunknown-pragmas"
+#pragma clang diagnostic ignored "-Wnullability"
+#pragma clang diagnostic ignored "-Wdollar-in-identifier-extension"
+#pragma clang diagnostic ignored "-Wunsafe-buffer-usage"
+
+#if __has_attribute(external_source_symbol)
+# pragma push_macro("any")
+# undef any
+# pragma clang attribute push(__attribute__((external_source_symbol(language="Swift", defined_in="PlaudBleSDK",generated_declaration))), apply_to=any(function,enum,objc_interface,objc_category,objc_protocol))
+# pragma pop_macro("any")
+#endif
+
+#if defined(__OBJC__)
+@class BleDevice;
+@protocol BleAgentProtocol;
+@protocol GlassProtocol;
+@class NSString;
+@class NSData;
+@class NSNumber;
+@class UpdateInfo;
+
+/// 蓝牙传输控制类
+SWIFT_CLASS("_TtC11PlaudBleSDK8BleAgent")
+@interface BleAgent : NSObject
+/// 单例
+SWIFT_CLASS_PROPERTY(@property (nonatomic, class, readonly, strong) BleAgent * _Nonnull shared;)
++ (BleAgent * _Nonnull)shared SWIFT_WARN_UNUSED_RESULT;
+/// 封装的录音笔实体类
+@property (nonatomic, strong) BleDevice * _Nullable bleDevice;
+@property (nonatomic, weak) id _Nullable delegate;
+@property (nonatomic, weak) id _Nullable glassDelegate;
+/// 蓝牙是否可用
+@property (nonatomic, readonly) BOOL isPoweredOn;
+/// 是否已连接设备
+@property (nonatomic, readonly) BOOL isConnected;
+/// 是否已绑定设备
+@property (nonatomic, readonly) BOOL isBinded;
+/// 同步文件列表是否仅获取单个文件
+@property (nonatomic, readonly) BOOL isOnlyOne;
+/// 是否正在录音
+@property (nonatomic, readonly) BOOL isRecording;
+/// 是否需要解码数据流
+@property (nonatomic, readonly) BOOL needDecode;
+/// 实时录音的场景是不是音乐模式?
+@property (nonatomic, readonly) BOOL isMusic;
+/// 当前录音的场景
+@property (nonatomic, readonly) NSInteger scene;
+@property (nonatomic, readonly) NSInteger settingScene;
+/// 当前录音文件或同步(下载)文件的sessionId
+@property (nonatomic, readonly) NSInteger sessionId;
+/// 是否正在同步(下载)文件
+@property (nonatomic, readonly) BOOL isDownloading;
+/// 是否是切换WiFi导致的蓝牙断开
+@property (nonatomic, readonly) BOOL isWiFiOpen;
+/// 重复命令间隔,默认500ms
+/// getFileList、syncFile、deleteFile三个命令特殊处理,加入sessionId和start来判断是否是重复命令
+@property (nonatomic) NSInteger repeatCommondInterval;
+/// 命令回调线程,默认是主线程
+@property (nonatomic, strong) dispatch_queue_t _Nonnull cmdDelegateQueue;
+/// 8e0b1ef62e607u38ad8200163e02394b acb89eea1e6011e8ad8200163e02394b
+/// 是不是处于U盘模式?
+@property (nonatomic) BOOL isUsbState;
+@property (nonatomic) BOOL isCharging;
+@property (nonatomic, copy) NSDictionary