Skip to content

Addon Store

HoshinoYumeka edited this page Sep 7, 2026 · 1 revision

IAppSource / AppInfo

首页附属接口文档 | 下一页:ICost 家族

自定义应用商店来源。商店中的 App 不必来自 SPI 扫描——远程仓库、数据包或实现方自造的 App 均可。

com.november.mcphone.api.client.store.IAppSource
com.november.mcphone.api.client.store.AppInfo
仅客户端
注册 SPI:META-INF/services/com.november.mcphone.api.client.store.IAppSource
起于 IAppSource 1.0.46 / AppInfo 1.2.12

注册后商店中多出一个分组。


IAppSource

方法 默认 说明
ResourceLocation getId() 必须实现 来源唯一标识,形如 mymod:official_repo
Component getDisplayName() 必须实现 商店分组标题上显示的名字
void listAvailable(Consumer<List<AppInfo>> callback) 必须实现 列出尚未安装的 App
void install(AppInfo info, Consumer<IPhoneApp> onSuccess, Consumer<Component> onError) 必须实现 让该 App 真正可用
boolean isReady() true false 时商店把该来源标记为不可用(离线、未登录、加载中)

listAvailable(callback)

列出此来源当前可安装的 App,只返回尚未安装的

install(info, onSuccess, onError)

info 来自本来源的 listAvailable。实现方负责让该 App 真正可用,随后:

  • onSuccess 交出可用的 IPhoneApp 实例;
  • onError 交出一条可直接展示给玩家的错误信息。

线程约定

listAvailableinstall 可以在后台线程工作,但回调必须切回客户端主线程——回调中会接触注册表与 GUI 状态:

Minecraft.getInstance().execute(() -> callback.accept(list));

⚠ 见坑 · 商店来源的回调必须切回主线程


AppInfo

商店列表中的一条元数据。只含可序列化字段、不引用实现类,因此远程来源可以在尚无实例时先列出 App。

它是一个 final class,构造函数私有,对外只给 builder —— 按兼容承诺第二条,将来新增字段不会打断已有附属。

字段

访问器 类型 缺省
id() ResourceLocation 必填,与 IPhoneApp.getId() 对应
displayName() Component 必填
sourceId() ResourceLocation 必填,见 IAppSource.getId()
iconTexture() ResourceLocation null(远程来源列出的 App 本地还没有贴图;商店画占位方块)
version() String ""不是 null
author() String ""不是 null
description() String ""不是 null

三个 String 字段的 setter 会把传入的 null 归一化成空串。

构造

AppInfo info = AppInfo.builder(id, displayName, sourceId)
        .icon(iconTexture)
        .version("1.0.0")
        .author("作者名")
        .description("一句话简介")
        .build();

已有 IPhoneApp 实例时(本地来源):

AppInfo info = AppInfo.of(app, sourceId);

of 会依次读取该实例的 getId / getDisplayName / getIconTexture / getVersion / getAuthor / getDescription

of 刻意不捕获第三方 App 抛出的异常:调用方已在 SPI 的兜底范围内,在此再兜会吞掉"是哪一个 App 有问题"这一信息。


首页附属接口文档 | 下一页:ICost 家族

Clone this wiki locally