Bili-helper 折腾记

Bili-helper 折腾记

前言

看不惯B站的夜间模式很久了,明明标榜深色跟随系统,结果居然需要手动杀掉后重启才会跟随

恰好学了一下Widget Kit,于是准备来一波demo,做一个iOS辅助客户端

准备

首先从这个 repo 了解了B站的基本API

开始

然后从认证开始入手

  • 一是让用户输入账户信息后,App模拟代为发送后收集保存返回的Cookie(主要是SESSDATA),但这样安全性不高,而且还要加入打标的前端js代码,遂放弃
  • 二是直接用类Safari原生网页组件,使用B站浏览器登录接口,然后拦截保存Cookie。
    • UIWebView已经被弃用,所以使用推荐的WKWebView,貌似最开始这玩意不太好获取Cookie,并且Cookie写入跨进程共享是异步的。不过最后发现后来加了一个webView.configuration.websiteDataStore.httpCookieStore.getAllCookies 可以用于获取
    • 然后在相应的生命周期中传递出去即可
    • 接下来是获取信息

      使用 URLSession.shared.dataTask 获取 data,最后用 JSONDecoder().decode 成相应的数据即可

decode时有时候有多余的父级数据,想了n多方法还是没解决(用SwiftyJSON库等),最后只能强行套一层BiliResult解决

设计UI

设计App UI和Widget UI

Widget信息同步

因为Widget同样要获得UserInfo等信息,需要使用保存的SESSDATA,故二者间需要同步信息
最后采用App Groups + UserDefaults(suiteName:)解决

Note: ⚠️suiteName需要和group id一致

Widget无法使用URLImage

因为Widget中EntryView一旦发送就不能再改变(如动画、图片切换),所以在Widget中不能使用URLImage

解决方案: 重新撸了一个getImageData(for url:URL),在Widget的View中直接使用Data加载图片

alternative: 使用 URLSession.shared.downloadTask 得到一个本地图片文件(url),使用contentOfUrl加载图片

源代码

https://github.com/Kyle-Ye/Bili-helper