ESC
科技 1 分钟阅读

Kobo现在可以运行应用了

Kobo电子阅读器现已支持运行第三方应用,涵盖论文浏览、RSS阅读、AI问答、有声书生成等功能。开发者可使用Rust SDK构建应用,通过签名Store分发,系统运行时对资源访问有权限控制。这一平台级更新为开发者打开了生态,值得关注。

来源:Hacker News

浏览某个学科的最新预印本,并在屏幕上阅读全文。

设计上仅通过Store分发:安装它证明了USB包中从未包含的应用交付能力。

在前置阅读灯上以莫尔斯电码发送输入的信息,一个字母横跨整个面板。

研究、写作、旁白并播放一本原创有声书。

读取任何OPDS图书馆:Project Gutenberg、Standard Ebooks、Open Library,或你自己的。

显示Top、New、Ask和Show故事,包含完整评论线程。

发现一个网站的订阅源,并在不包含网站布局的情况下呈现文章。

在你使用其他应用时于后台收集当天的故事。

提出一个问题,并将其答案转化为适合触摸阅读的形式。

离开键盘,批准或拒绝来自编码代理的请求。

一个原生面板终端,按键可立即发送输入。

在面板上展示UI工具包的控件、布局、排版和状态。

连接性、硬件和平台更新,与Store分开。

一个带有触摸输入和完成项状态的持久列表。

两个播放器,对单个单元格进行部分刷新。

定位挡板后的霍尔传感器,并报告其变化。

实现KoboApp,以声明方式描述屏幕,运行时负责布局、电子墨水刷新计划、Back导航和生命周期。

应用不直接打开设备资源;而是请求。网络、存储、音频、前置灯和Wi-Fi均受能力门控,拒绝会以应用可处理的值返回。

kobo new my-app
cd my-app
kobo dev

阅读SDK文档

use kobo_sdk::{
    ActionId, Context, KoboApp, ScreenBuilder,
};

#[derive(Default)]
struct Hello { taps: u32 }

impl KoboApp for Hello {
    fn on_start(&mut self, ctx: &mut Context) {
        self.show(ctx);
    }

    fn on_action(
        &mut self, ctx: &mut Context, a: ActionId,
    ) {
        if a == kobo_sdk::action_id("tap") {
            self.taps += 1;
        }
        self.show(ctx);
    }
}

impl Hello {
    fn show(&self, ctx: &mut Context) {
        let screen = ScreenBuilder::new("hello")
            .top_bar("Hello")
            .heading(format!("{} taps", self.taps))
            .button("tap", "Tap me")
            .build();
        ctx.set_screen(screen);
    }
}

fn main() {
    let app = Hello::default();
    let _ = kobo_sdk::run("hello", app);
}

Store从固定的GitHub版本中读取签名目录。每个包包含一个ARM可执行文件和一个签名的规范清单。在应用运行前,运行时验证目录、包、已安装清单和二进制文件。