宿主能力总览
「能力」在 Migo 里是内容调 migo.*、宿主实际实现的那一层。引擎不伪造宿主已有的系统能力 — 没接的 capability 就返回明确的「不支持」,而不是假装成功。三类:
1. 输入事件:宿主喂给引擎
Section titled “1. 输入事件:宿主喂给引擎”触摸、指针、滚轮、物理按键、IME 组合、手柄 — 都是单向推入:migo_session_send_* 非阻塞,MIGO_OK 只代表「事件已排进内容输入流」,不代表内容消费了它。任何线程可调用。
| 事件族 | 入口 | 典型宿主源 |
|---|---|---|
| 触摸 | migo_session_send_touch |
MotionEvent(Android)/ UIKit touch |
| 指针+滚轮 | migo_session_send_pointer_event / migo_session_send_wheel_event |
桌面鼠标 |
| 物理按键 | migo_session_send_key_event |
KeyEvent、手柄按键(hat) |
| IME 组合 | migo_session_send_composition_event |
输入法候选/组字状态 |
| 手柄状态 | migo_session_send_gamepad_state |
Gamepad 轮询或中断 |
完整结构与标志在 输入事件 页;那页是数据面参考,本页只回答「谁负责把谁的什么,发给谁」。
2. 软键盘:宿主提供、内容显隐
Section titled “2. 软键盘:宿主提供、内容显隐”小程序式软键盘不是输入事件 — 它是宿主报给引擎的能力位。合同在 MigoHostCallbacks 的三个回调里,全装或全不装(session.h):
- 装齐三个(
on_show_keyboard/on_hide_keyboard/on_update_keyboard)+ 一个 dispatcher; - 一个都不装 = 宿主没有键盘能力,内容的
migo.showKeyboard立即收到失败回包,不出现假键盘卡在屏上的状态。
内容打开键盘时拿到 MigoKeyboardShowOptions:MIGO_KEYBOARD_FLAG_MULTIPLE(多行)、MIGO_KEYBOARD_FLAG_CONFIRM_HOLD(确认后不收起)、确认键形态(DONE/NEXT/SEARCH/GO/SEND)、键盘类型(TEXT/NUMBER)、初始值与上限。
宿主回报事件走 migo_session_send_keyboard_event 四类(INPUT / CONFIRM / COMPLETE / HEIGHT_CHANGE),高度事件必须是 CSS px(跨 DPI 字面换算的错误代价参见 软键盘页)。
详见 软键盘与键事件。
3. Android 端 handler 合同:宿主在 Java 层接单
Section titled “3. Android 端 handler 合同:宿主在 Java 层接单”GameSession 上 10 个 set*Handler(...) 外加 setListener(GameSessionListener) 共 11 个注册点,都是宿主侧能力,不接就走运行时级默认降级 —— 每个接口都自带「不接时内容看到什么」的文档契约:
| Handler | 内容的 migo.* 调用 | 未注册时的答案 |
|---|---|---|
| MessageHandler | migo.sendToHost(type, payload) |
消息被丢弃不投递 |
| AuthHandler | migo.login / checkSession / getUserInfo / getPhoneNumber |
全部以 no auth handler 失败回包 |
| PermissionHandler | migo.getSetting 及请求授权类 |
每个 scope 都是 deny;能力调用带 auth deny |
| AdHandler | createAd / loadAd / showAd / hideAd |
所有调用 settle;showAd 关时带 isEnded=false |
| SettingHandler | migo.openSetting |
-2 openSetting:fail not supported(但那句代码还要 settle,否则被拒绝授权的内容进不去设置页) |
| ShareHandler | migo.shareAppMessage |
-2 shareAppMessage:fail not supported(分享等待路径绝不空转) |
| NavigationHandler | navigateToMiniProgram / openCustomerServiceConversation 等 |
-2 navigateToMiniProgram:fail not supported |
| PaymentHandler | requestMidasPayment* |
isMidasPaymentSupported=false,任何请求 -2 not supported |
| SubpackageHandler | loadSubpackage / preDownloadSubpackage |
下载失败回执;loadSubpackage() 退回本地已下载文件执行 |
| GameLogHandler | migo 上报的调试/统计日志 |
写到 Android logcat |
| GameSessionListener | 会话状态广播 | 无广播(Listener 本身不传,所有回调 no-op) |
两类「假的降级」被特意拒绝:
- 支付:
isMidasPaymentSupported默认false— 内容是拿这个值决定要不要展示充值入口的,虚报true等于挂着拒绝所有购买的商店。 - 广告:
showAd收了 silent settle,但onClose是内容发奖励的触发点,所以即使没播任何画面也要 close 一次 — 必须用isEnded=false关,否则发出去的是「在用户没看广告的情况下给了奖励」。
分级:export 不存在 vs 能力不存在
Section titled “分级:export 不存在 vs 能力不存在”- export 不存在:
migo_engine_create本身在库里没有(platform/oh.h链接错一类,平台头) — 编译/链接期失败,不进运行时。 - 能力不存在:
migo_query_capabilities报的platform_kinds位里没有那种 surface kind / 软键盘三分体没装齐 /setAdHandler没注册 — 运行时按上表 settle,内容包括降级分支全在 migo.* 协议里有文档。
运行库能力查询本身的字段与 ABI 检查协议见 运行库能力查询。