Files

56 lines
2.4 KiB
PHP
Raw Permalink Normal View History

<?php
/**
* 简航 SimpleNav —— 动态输出 PWA manifest(site.webmanifest)
*
* 为什么不再用静态 site.webmanifest:
* 用户的「添加到手机主屏」读的是这里的 icons。图标一旦可自定义,静态文件就会
* 一直指向内置的那几张 → 出现半生效(标签页 favicon 换了、主屏图标还是旧的)。
* 顺带把 name / theme_color 也接上后台设置,不再与页面上显示的值打架。
*
* 静态 site.webmanifest 保留作回退(未被 Web 服务器路由到这里时仍可用)。
*/
declare(strict_types=1);
require_once __DIR__ . '/functions.php';
header('Content-Type: application/manifest+json; charset=utf-8');
// manifest 只随设置变化,短缓存即可(与图标文件的长缓存策略不同)
header('Cache-Control: no-cache, must-revalidate');
$name = site_name();
$short = mb_substr($name, 0, 12);
// 图标地址全部走 site_icon_url() 这个单一来源:有自定义就用自定义,没有就用内置。
// 内置那几张保持原样(相对路径),保证「没上传」时的行为与改造前完全一致。
$custom = site_icon_key() !== '';
$icon = static function (string $n, int $size, string $fallback) use ($custom): ?array {
if ($custom) {
$u = site_icon_url($n, $size);
if ($u !== '') {
return ['src' => $u, 'sizes' => $size . 'x' . $size, 'type' => 'image/png'];
}
}
return ['src' => $fallback, 'sizes' => $size . 'x' . $size, 'type' => 'image/png'];
};
$icons = [];
$i192 = $icon('icon-192', 192, 'assets/icons/icon-192.png');
$i512 = $icon('icon-512', 512, 'assets/icons/icon-512.png');
$m192 = $icon('icon-192-maskable', 192, 'assets/icons/icon-192-maskable.png');
$m512 = $icon('icon-512-maskable', 512, 'assets/icons/icon-512-maskable.png');
if ($i192) { $icons[] = $i192; }
if ($i512) { $icons[] = $i512; }
if ($m192) { $m192['purpose'] = 'maskable'; $icons[] = $m192; }
if ($m512) { $m512['purpose'] = 'maskable'; $icons[] = $m512; }
$out = [
'name' => $name,
'short_name' => $short,
'start_url' => './',
'scope' => './',
'display' => 'standalone',
'background_color' => '#d8d9da',
'theme_color' => setting('primary_color', '#2F6BF7'),
'icons' => $icons,
];
echo json_encode($out, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT);