uni.createShortcut在App端(iOS/Android)默认不生效,需通过原生插件实现:Android需用ShortcutManager动态添加并处理权限与图标路径;iOS仅支持静态配置Home Screen Quick Actions,无法运行时创建桌面图标。
App端创建桌面快捷方式需要原生插件支持
uni-app
的
在 App 端(iOS/Android)默认不生效,因为该 API 仅在微信小程序、快应用等平台有基础实现,而原生 App 环境下需调用系统级接口(如 Android 的
、iOS 的
),uni-app 框架本身未封装这部分能力。
你看到的「调用成功但无反应」或「控制台报错
」,基本都源于此 —— 不是写法错,而是能力缺失。
Android 端必须用自定义原生插件实现
要让 Android App 支持桌面快捷方式(即长按图标出现的「+」菜单项,或通过代码动态添加到桌面),必须在
中集成原生插件,并手动处理以下环节:
Android 8.0+ 要求使用
创建静态/动态快捷方式,且需在
中声明
动态快捷方式需调用
,并确保 App 已获取必要权限(无需额外运行时权限,但 targetSdkVersion ≥ 26 时行为更严格)
uni-app 无法直接访问
或
,所以插件里必须通过
拿到当前 Activity 实例再操作
图标资源必须为
下的
,不能用网络地址或
目录路径
示例关键调用(插件内部 Java 代码片段):
iOS 端受限严重,仅支持 3D Touch / Haptic Touch 快捷菜单
iOS 不允许 App 自动创建桌面图标(即不能像 Android 那样把新图标扔到主屏),仅能配置「主屏幕快捷操作」(Home Screen Quick Actions),也就是长按 App 图标弹出的菜单项。这个能力由
中的
控制,属于静态配置,无法运行时动态增删。
uni-app电商系统实战精讲课程课件
uni-app电商系统实战精讲课程
下载
你在 uni-app 中无法通过 JS 代码触发新增桌面图标,哪怕调用
也会静默失败或返回 false。唯一可行路径是:
在
中硬编码写入
数组
每个 item 必须包含
、
、
(图标文件需放在
下,且已添加进 Xcode 的 bundle)
点击后触发的事件需在
的
或
中检查
或
(实际是通过
带参拉起,uni-app 会解析为
)
别踩坑:uni.createShortcut 的真实兼容表和替代思路
在 App 端本质是空实现,文档未明确标注限制,导致很多人卡在「为什么没反应」。目前真实可用场景只有:
微信小程序:支持,但需用户主动授权(首次调用弹窗)
支付宝小程序:支持,行为类似微信
H5 / App 端:返回
但无任何副作用
如果你真需要 App 端「一键加桌面图标」体验,现实方案只有两个:
Android:找现成原生插件(如 DCloud 插件市场里的「Android 快捷方式」),或自己基于
规范开发,重点处理
权限回调和图标资源路径
全平台统一降级:改用「引导用户手动添加」——跳转系统设置页(Android 可用
打开「应用信息」页;iOS 无法跳转,只能提示「请长按图标选择『编辑主屏幕』」)
最常被忽略的一点:Android 动态快捷方式在 App 被用户「强行停止」或「清除后台」后会自动失效,且不同厂商 ROM(如华为 EMUI、小米 MIUI)对
的拦截策略差异极大,测试务必覆盖主流机型。
uni.createShortcutShortcutManagerUIApplication.shortcutItemsnot supportednativePluginsShortcutManagerAndroidManifest.xmlshortcutManager.addDynamicShortcuts(...)ActivityContextuni.requireNativePluginres/mipmap-*.pngstaticShortcutManager shortcutManager = context.getSystemService(ShortcutManager.class);
if (shortcutManager != null && shortcutManager.isRequestPinShortcutSupported()) {
ShortcutInfo shortcut = new ShortcutInfo.Builder(context, "home_launch")
.setShortLabel("启动页")
.setLongLabel("快速打开主界面")
.setIcon(Icon.createWithResource(context, R.mipmap.ic_shortcut_home))
.setIntent(new Intent(context, MainActivity.class)
.setAction(Intent.ACTION_VIEW)
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK))
.build();
shortcutManager.requestPinShortcut(shortcut, null);
}Info.plistUIApplicationShortcutItemsuni.createShortcutmanifest.json → app-plus → ios → plistcmdsUIApplicationShortcutItemsUIApplicationShortcutItemTypeUIApplicationShortcutItemTitleUIApplicationShortcutItemIconFileunpackage/res/iOS/App.vueonLaunchonShowoptions?.shareTicketoptions?.pathUIApplication.shared.openURLlaunchOptionsuni.createShortcut{ errMsg: 'createShortcut:ok' }uni-app native pluginrequestPinShortcutplus.android.runtimeIntentrequestPinShortcut