BmobSwiftSDK 是 Bmob 后端云的全新纯 Swift SDK,专为 Swift 现代并发模型设计,提供简洁、高效的云端数据管理能力。
- 纯 Swift 实现 - 无 Objective-C 桥接,完全适配 Swift 生态
- async/await - 原生支持 Swift Concurrency,告别回调地狱
- 模块化设计 - SPM/CocoaPods 按需集成(Core/Data/User/File/Cloud)
- 加密传输 - 端到端 AES-128-CBC 加密,安全可靠
- 类型安全 - BmobError 枚举 + throws 错误处理
- 完整查询 - 条件/模糊/地理/统计/BQL 等查询能力
- 实时数据 - WebSocket 连接 + AsyncStream 事件流
| 平台 | 最低版本 |
|---|---|
| iOS | 15.0+ |
| macOS | 12.0+ |
在 Xcode 中,选择 File > Add Package Dependencies,输入:
https://github.com/bmob/BmobSwiftSDK
或直接在 Package.swift 中添加:
dependencies: [
.package(url: "https://github.com/bmob/BmobSwiftSDK", from: "1.0.8")
]在 Podfile 中添加:
pod 'BmobSwiftSDK', '~> 1.0.8'然后执行:
pod installimport BmobSDK
Bmob.initialize(appKey: "your-app-key")// 创建对象
let gameScore = BmobObject(className: "GameScore")
gameScore["playerName"] = "Player1"
gameScore["score"] = 100
try await gameScore.save()
// 查询数据
let query = BmobQuery(className: "GameScore")
query.whereKey("playerName", equalTo: "Player1")
let results = try await query.find()
// 条件查询
let query = BmobQuery(className: "GameScore")
query.whereKey("score", greaterThan: 50)
query.order(byDescending: "score")
let topScores = try await query.find()// 注册
let user = BmobUser()
user.username = "username"
user.password = "password"
try await user.signUp()
// 登录
let user = try await BmobUser.login(account: "username", password: "password")
// 退出登录
BmobUser.logout()let file = BmobFile(filePath: "/path/to/image.jpg")
try await file?.upload()
print("File URL: \(file?.url ?? "")")
print("CDN: \(file?.cdn ?? "")")// 调用云函数
let result = try await BmobCloud.run(function: "helloWorld", params: ["name": "Bmob"])
// 类型安全调用
struct HelloResponse: Decodable {
let message: String
}
let response: HelloResponse = try await BmobCloud.run(function: "helloWorld")连接分两步:先通过 HTTP/HTTPS 请求 /socket.io/1/?t=... 获取 SID,
再连接 ws:// / wss:// 的 /socket.io/1/websocket/<sid>。
协议自动对应 HTTP → WS、HTTPS → WSS;SDK 在 WebSocket 握手中附带同源 Origin,兼容旧版实时服务。
监听地址优先级:用户自定义地址 → 初始化响应的 io → http://io.codenow.cn:3010。
可在初始化前后设置;请用 await 保证设置完成后再连接:
try await Bmob.resetIODomain("https://realtime.example.com:443")
// try await Bmob.resetIODomain(nil) // 恢复使用服务端配置或默认地址支持 http://、https://、ws://、wss:// 及 host:port(默认 HTTP)。
地址只包含协议、主机和可选端口,SDK 自动拼接握手及 WebSocket 路径。
已经建立连接时,新地址在下次连接或自动重连时生效;需立即切换可先 disconnect() 再 connect()。
disconnect() 会结束现有事件流,切换后需重新获取 eventStream()。
API 请求域名仍通过 Bmob.resetDomain 独立设置。
初始化完成后,保留 BmobEvent 实例,登记订阅并连接:
let event = BmobEvent() // 存为属性,保持生命周期
try await Bmob.initialize(appKey: "YOUR_APP_KEY")
let messages = event.eventStream()
event.listenTableChange(className: "Note") // 表更新,包含表内数据变化
event.listenRowChange(.deleteRow, tableName: "Note", objectId: "row-id")
event.connect()
for await message in messages {
print(message.action ?? "", message.className ?? "", message.data ?? [:])
}支持 .updateTable、.deleteTable、.updateRow、.deleteRow,分别使用
listenTableChange(_:tableName:) 或 listenRowChange(_:tableName:objectId:)。
取消订阅使用对应的 cancelListenTableChange / cancelListenRowChange 方法。
也可设置 BmobEventDelegate;回调在主队列执行。bmobEventDidConnect 表示连接建立,
bmobEventCanStartListen 表示服务端允许订阅。连接前登记的订阅会在此时自动发送。
默认断线后每 5 秒重连并恢复有效订阅;可设置 autoReconnect = false。
event.disconnect() 停止连接和重连并结束所有事件流,保留订阅供下次连接使用。
重连期间事件流保持开启,但不会补发断线期间的变更;需要完整数据时请重新查询。
Tests/BmobCoreTests/BmobEventChatIntegrationTests.swift 可验证初始化 → 订阅 Chat.updateTable → REST 新增记录 → 接收并核对事件的完整流程。
测试只创建一条带唯一标记的记录,并在结束时删除该记录。默认跳过,显式开启后运行:
export BMOB_EVENT_CHAT_LIVE_TEST=1
export BMOB_EVENT_APP_KEY="YOUR_APP_KEY"
export BMOB_EVENT_REST_KEY="YOUR_REST_API_KEY"
swift test --filter BmobEventChatIntegrationTests测试断言操作类型、表名、objectId 和新增记录字段;清理失败也会报告测试失败。请勿将真实密钥写入源码或提交到 Git。
完整文档请访问:Bmob Swift SDK 文档
coming soon...
详见 CHANGELOG
本项目基于 MIT 协议开源,详见 LICENSE
Made with ❤️ by Bmob