Bmob database ios
Use when implementing Bmob NoSQL database CRUD in an iOS native project — both Objective-C and Swift / SwiftUI / UIKit. Triggers: BmobSDK, BmobSDK.xcframework, pod 'BmobSDK', #import <BmobSDK/Bmob.h>, Bmob registerWithAppKey, [Bmob register(withAppKey:)], BmobObject objectWithClassName, BmobQuery queryWithClassName, BmobUser, BmobInstallation, BmobFile, BmobGeoPoint, BmobRelation, saveInBackgroundWithResultBlock, getObjectInBackgroundWithId, findObjectsInBackground, Bridging-Header.h. NOT for cross-platform JavaScript / WeChat Mini Program (use bmob-database-javascript), Android (use bmob-database-android), Flutter / Dart (use bmob-database-flutter), or any other language via REST (use bmob-database-restful). If Bmob MCP is configured, call get_project_tables via bmob-mcp before writing code.From its SKILL.md
npx -y skills add bmob/agent-skills --skill bmob-database-iosAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
2 things to look at
- 2 stars2 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
- runs commandsInstructs the agent to run 1 command, including `pod install`.
SKILL.md
9.6 KB, ~2.5k tokens by cl100k_base, as published. Nobody here has run it
Bmob Database — iOS Native SDK
iOS SDK 名为 BmobSDK,是 Objective-C 编写的 framework,Swift 项目通过 Bridging Header 桥接使用。SDK 数据模型以 BmobObject 为核心,不需要为每个表写子类(与 Android 不同)。
核心原则
1. 安装 SDK — 强推 CocoaPods:
# Podfile
target "你的项目名称" do
platform :ios, "15.6"
use_frameworks!
pod 'BmobSDK'
end
pod install
装完后只打开
.xcworkspace,不要再打开.xcodeproj,否则找不到 Pod 引入的库。
也可手动导入 BmobSDK.xcframework,并链接以下系统库(详见 references/install.md)。
2. Swift 必须桥接: 新建任意 .m 文件让 Xcode 弹"Create Bridging Header",然后在生成的 项目名-Bridging-Header.h 加:
#import <BmobSDK/Bmob.h>
3. 初始化(OC) — AppDelegate.m:
- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// release 上线时启用备案域名,必须在 registerWithAppKey 之前
// [Bmob resetDomain:@"https://你的备案域名"];
[Bmob registerWithAppKey:@"你的Application ID"];
return YES;
}
3. 初始化(Swift / SwiftUI) — AppApp.swift:
@main
struct MyApp: App {
init() {
Bmob.register(withAppKey: "你的Application ID")
}
var body: some Scene { WindowGroup { ContentView() } }
}
4. 域名重置(上线必做): 工信部要求正式上线必须用备案域名:
Bmob.resetDomain("https://sdk.yourapp.com") // 必须在 register 前
Bmob.register(withAppKey: "...")
OC 端用 [Bmob resetDomain:@"https://sdk.yourapp.com"];。
5. 不要硬编码 Master Key 到 App bundle。客户端只用 Application ID(必要时配 Secret Key + 加密授权)。
安全清单
- release 关闭调试输出:测试期
[Bmob setDebug:YES],上架前删掉。 - App Transport Security(ATS):如果备案域名是 HTTP(不推荐),需要在
Info.plist加NSAppTransportSecurity → NSAllowsArbitraryLoads = YES,但 App Store 审核可能拒;尽量用 HTTPS。 - 写入的表必须配 ACL:否则任意用户可改任意行。
- Bridging Header 不要 commit 真实 AppKey:用配置文件 / xcconfig / environment 注入。
- release 前替换备案域名:参见上面"4. 域名重置"。
常见问题
跨平台 Q&A:shared/faq.md。
反模式
见 shared/anti-patterns.md。本端重点:勿 commit 真实 AppKey;ATS 尽量 HTTPS。
单条 CRUD(Swift 现代写法)
添加
let gameScore = BmobObject(className: "GameScore")
gameScore.setObject("John Smith", forKey: "playerName")
gameScore.setObject(90, forKey: "score")
gameScore.setObject(false, forKey: "cheatMode")
gameScore.saveInBackground { (isSuccessful, error) in
if let error = error {
print("保存失败: \(error.localizedDescription)")
} else {
print("保存成功: \(gameScore.objectId ?? "")")
}
}
查询单条
let bquery = BmobQuery(className: "GameScore")
bquery.getObjectInBackground(withId: "0c6db13c") { (object, error) in
if let error = error { print(error); return }
guard let object = object else { return }
let playerName = object.object(forKey: "playerName") as? String
let score = object.object(forKey: "score") as? NSNumber
print(playerName ?? "", score ?? 0)
}
更新(按 objectId)
let gameScore = BmobObject(outDatatWithClassName: "GameScore", objectId: "0c6db13c")
gameScore.setObject(91, forKey: "score")
gameScore.updateInBackground { (isSuccessful, error) in
if let error = error { print(error) }
}
注意 API 名称是
outDatatWithClassName(拼写历史遗留,不要改)——用这个方法获取的BmobObject不会先发 GET 查询,直接拿来 update / delete。
删除
let gameScore = BmobObject(outDatatWithClassName: "GameScore", objectId: "0c6db13c")
gameScore.deleteInBackground { (isSuccessful, error) in /* ... */ }
查询列表(带条件 + 排序 + 分页)
let query = BmobQuery(className: "GameScore")
query.whereKey("score", greaterThan: 100)
query.orderByDescending("createdAt")
query.limit = 20
query.skip = 0
query.findObjectsInBackground { (array, error) in
guard let results = array as? [BmobObject] else { return }
for obj in results {
print(obj.objectId ?? "", obj.object(forKey: "playerName") ?? "")
}
}
单条 CRUD(Objective-C)
// 添加
BmobObject *gameScore = [BmobObject objectWithClassName:@"GameScore"];
[gameScore setObject:@"小明" forKey:@"playerName"];
[gameScore setObject:@78 forKey:@"score"];
[gameScore setObject:[NSNumber numberWithBool:YES] forKey:@"cheatMode"];
[gameScore saveInBackgroundWithResultBlock:^(BOOL isSuccessful, NSError *error) {
// ...
}];
// 查询单条
BmobQuery *bquery = [BmobQuery queryWithClassName:@"GameScore"];
[bquery getObjectInBackgroundWithId:@"0c6db13c"
block:^(BmobObject *object, NSError *error) {
if (object) {
NSString *playerName = [object objectForKey:@"playerName"];
BOOL cheat = [[object objectForKey:@"cheatMode"] boolValue];
NSLog(@"%@ %d", playerName, cheat);
}
}];
// 更新(不预先 GET,直接构造 + objectId)
BmobObject *gs = [BmobObject objectWithoutDatatWithClassName:@"GameScore" objectId:@"0c6db13c"];
[gs setObject:@91 forKey:@"score"];
[gs updateInBackground];
// 删除
BmobObject *gs = [BmobObject objectWithoutDatatWithClassName:@"GameScore" objectId:@"0c6db13c"];
[gs deleteInBackground];
与 MCP 联动
如已配置 Bmob MCP,先 get_project_tables 拿真实 schema,避免:
- 字段名拼错(
setObject:forKey:不校验 schema) - BmobObject 与 BmobUser 混用
排错速查
跨平台现象先查 shared/faq.md。
| 现象 | 排查 |
|---|---|
| 100 报错 | 请求内容(查询条件)有误 |
| 20003 none objectid | 更新 / 删除 / 查询单条没传 objectId |
| 20004 none object | 查询结果为空 |
| 20006 cloud function failed | 云函数执行报错 |
| 20017 init not finish | 在 register 完成前调用了 SDK;检查 init {} 顺序 |
| Swift "use of undeclared identifier 'BmobObject'" | Bridging Header 没建或没 #import <BmobSDK/Bmob.h> |
| Xcode 14+ 找不到 Pod 库 | 打开了 .xcodeproj 而不是 .xcworkspace |
| App Store 审核拒 ATS | 备案域名换 HTTPS,移除 NSAllowsArbitraryLoads |
| release 包请求被拒 / 403 | 没配 SDK 类型备案域名;或 resetDomain 调用顺序错(必须在 register 前) |
| 9015 | 兜底错误码,必读响应描述 |
进阶能力(按需读 references/)
| 主题 | 路径 |
|---|---|
| 端到端场景 | shared/recipes/ |
| BmobDocs 同步代码片段 | references/snippets/ |
| 完整安装 + Bridging + framework 链接 + ATS 配置 | references/install.md |
| 高级查询(or / 子查询 / 地理位置 / include) | references/query.md |
| Pointer / Relation | references/pointer-and-relation.md |
| 用户系统 / SMS / 第三方登录 | (P1: bmob-auth-ios) |
| 文件上传 / BmobFile | (P1: bmob-storage-ios) |
参考
- OC 完整 API:develop_doc.md
- Swift 完整 API:swift_develop_doc.md
- Swift Quickstart:swift_quick_start.md
- SDK 源码:https://github.com/bmob/Bmob-iOS-SDK
- Swift Demo:https://github.com/bmob/bmob-ios-demo/blob/master/SwiftDemo.zip
- 错误码:
bmob-error-codes - MCP 联动:
bmob-mcp
What ships with it: 308 files
103.0 KB alongside SKILL.md
references/
- install.md4.3 KB
- pointer-and-relation.md2.8 KB
- query.md4.0 KB
- snippets/develop-doc-objc--bql缓存策略-01.txt534 B
- snippets/develop-doc-objc--relation约束关联对象值查询-01.txt471 B
- snippets/develop-doc-objc--上传文件方法-01.txt54 B
- snippets/develop-doc-objc--上传文件方法-02.txt612 B
- snippets/develop-doc-objc--上传文件进度-01.txt105 B
- snippets/develop-doc-objc--上传文件进度-02.txt573 B
- snippets/develop-doc-objc--下载文件-01.txt310 B
- snippets/develop-doc-objc--以分片的方式上传文件-01.txt68 B
- snippets/develop-doc-objc--以分片的方式上传文件-02.txt562 B
- snippets/develop-doc-objc--使用索引和对象key修改数组中的对象-01.txt211 B
- snippets/develop-doc-objc--修改关系-01.txt535 B
- snippets/develop-doc-objc--修改关联关系-01.txt557 B
- snippets/develop-doc-objc--修改密码-01.txt478 B
- snippets/develop-doc-objc--兼容ios9-01.txt90 B
- snippets/develop-doc-objc--兼容ios9-02.txt311 B
- snippets/develop-doc-objc--内置函数-01.txt388 B
- snippets/develop-doc-objc--分组统计-01.txt454 B
- snippets/develop-doc-objc--分组统计-02.txt595 B
- snippets/develop-doc-objc--分组统计-03.txt26 B
- snippets/develop-doc-objc--分组统计-04.txt11 B
- snippets/develop-doc-objc--分页查询-01.txt53 B
- snippets/develop-doc-objc--分页查询-02.txt34 B
- snippets/develop-doc-objc--列值是否存在-01.txt176 B
- snippets/develop-doc-objc--列值是否存在-02.txt71 B
- snippets/develop-doc-objc--列值是否存在-03.txt80 B
- snippets/develop-doc-objc--创建bmobobject对象-01.txt637 B
- snippets/develop-doc-objc--删除关系-01.txt28 B
- snippets/develop-doc-objc--删除关系-02.txt344 B
- snippets/develop-doc-objc--删除关联关系-01.txt552 B
- snippets/develop-doc-objc--删除数据-01.txt332 B
- snippets/develop-doc-objc--删除数组数据-01.txt70 B
- snippets/develop-doc-objc--删除数组数据-02.txt193 B
- snippets/develop-doc-objc--删除文件-01.txt179 B
- snippets/develop-doc-objc--删除文件-02.txt413 B
- snippets/develop-doc-objc--原子计数器-01.txt748 B
- snippets/develop-doc-objc--原子计数器-02.txt235 B
- snippets/develop-doc-objc--取消监听功能-01.txt151 B
268 more files not listed here. See all 308 in the repository.