feat(ncm): 断网保持登录态 + 离线模式(可见提示/缓存可播/联网自动回在线)(M9)
用户报告:「一断网就退出到扫码登录界面,不会保持账号态切离线,缓存列表形同虚设」。 上一条已把失败分成 NETWORK/AUTH;本条把结论落到 App 状态与 UI。 - 会话状态机(appstate.c):只有 NCM_ERR_AUTH(401/403/301/302)清 cookie;网络类失败 (不可达/超时/TLS/5xx/-460)只置 g_st.offline,账号态与 session.enc 一律保留; appstate_ensure_uid 同语义(原先任何 AUTH 都清 cookie,网络故障不得进入该分支)。 - 启动(app.c):根页改由 ncm_session_boot_decide 决定——有本地会话就进 home(无网也是), 只有无本地会话才进扫码;打印 boot 决策日志。 - 离线 UX:首页个人卡「离线模式」红标 + 页脚提示 + 空态「离线模式/可播放已缓存」; 歌单页/搜索页/播放页/缓存页分别给出离线文案(缓存页点播照旧走 NCM_QUEUE_CACHE,本地可播)。 - 恢复:home 可见时每 30s 静默重试一次(强制绕过接口缓存,成功即回在线并重绘); 任何真实网络成功(home/playlist worker)也会清离线态。 - 防误判:接口缓存命中(120s 旧响应)不算「回在线」——home_worker 用 ncm_apicache_hits() 差分识别,避免离线提示被缓存命中闪掉。
This commit is contained in:
1 parent
8557da6fca
commit
707bbd8a02
8 files changed
+111
-10
No files matched your search
@@ -205,6 +205,10 @@ typedef struct ncm_app_state {
|
||||
int qr_size;
|
||||
int login_state; /* NCM_LOGIN_* */
|
||||
int logged_in;
|
||||
/* 离线模式(M9):网络类失败(不可达/超时/DNS/连接失败/服务端 5xx)时为 1——账号态与
|
||||
* cookie 一律保留,UI 显示可见提示、已缓存列表照常可开可播;任何一次请求成功即回 0。
|
||||
* 鉴权失败(NCM_ERR_AUTH)不走这里:沿用原退出登录→扫码逻辑。 */
|
||||
int offline;
|
||||
|
||||
/* 账号 */
|
||||
char uid[32];
|
||||
@@ -433,6 +437,15 @@ void appstate_save_settings(void);
|
||||
void appstate_set_logged_in(const char *uid, const char *nickname);
|
||||
void appstate_logout(void);
|
||||
int appstate_ensure_uid(void); /* 若 uid 缺失则 login_status_check 取回;0=成功 */
|
||||
|
||||
/* ---- 会话保持 / 离线模式(M9)----
|
||||
* 一次网络动作的返回码 → 会话状态机(core ncm_session.h 的纯判定在上,这里落到 App 状态):
|
||||
* 成功 → 在线(解除离线);网络类失败 → 离线(保留登录态/cookie);
|
||||
* 鉴权失败 → 由调用方沿用原退出登录逻辑(本函数不改登录态);其它 → 保持现状。
|
||||
* 返回 ncm_gate_t。可在 worker 线程调用(只写 g_st.offline,值域 0/1 幂等)。 */
|
||||
int appstate_session_gate(int rc);
|
||||
int appstate_is_offline(void); /* 1=离线模式(UI 画「离线模式」提示) */
|
||||
void appstate_offline_set(int on); /* 直接置离线态(登出/初始化清零) */
|
||||
int appstate_load_playlists(void); /* 拉我的歌单 */
|
||||
int appstate_load_playlist_songs(int idx); /* 兼容:载索引 + 首个窗口(内部走 ensure) */
|
||||
int appstate_load_playlist_songs_page(int idx, int offset, int limit);
|
||||
|
||||
Reference in new issue
Block a user