浏览某个学科的最新预印本,并在屏幕上阅读全文。
设计上仅通过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
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可执行文件和一个签名的规范清单。在应用运行前,运行时验证目录、包、已安装清单和二进制文件。