一、布局渲染差异
1.1 时间格式解析不一致
具体表现 :
iOS 系统的 JavaScript 引擎只能解析YYYY/MM/DD
格式的日期字符串,而安卓可以解析YYYY-MM-DD
。若直接使用连字符格式,iOS 会返回Invalid Date
。
解决方案:
javascript
javascript
// 安全的日期解析函数
function parseDate(dateStr) {
if (!dateStr) return null;
// 替换连字符为斜杠
const formattedStr = dateStr.replace(/-/g, '/');
const date = new Date(formattedStr);
// 验证日期有效性
return isNaN(date.getTime()) ? null : date;
}
// 使用示例
const iosSafeDate = parseDate('2024-01-31'); // iOS和安卓均能正确解析
1.2 安全区域适配
具体表现 :
iOS 全面屏设备(如 iPhone X 系列)底部存在安全区域,而安卓设备刘海屏 / 挖孔屏位置不一。
解决方案:
css
css
/* 通用安全区域适配方案 */
.page-container {
padding-bottom: env(safe-area-inset-bottom);
padding-top: env(safe-area-inset-top);
}
/* 动态计算状态栏高度 */
.status-bar {
height: var(--status-bar-height);
}
javascript
javascript
// 在app.js中全局设置状态栏高度
App({
onLaunch() {
wx.getSystemInfo({
success: ({ statusBarHeight }) => {
wx.setStorageSync('statusBarHeight', statusBarHeight);
}
});
}
});
1.3 字体渲染差异
具体表现 :
iOS 默认使用 San Francisco 字体,安卓默认使用 Roboto 字体,导致相同文本显示高度不同。
解决方案:
css
css
/* 统一字体族 */
.page-content {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif;
line-height: 1.5; /* 强制统一行高 */
}
二、事件处理差异
2.1 触摸事件传递机制
具体表现 :
iOS 的catchtouchmove
会完全阻止滚动,安卓则允许部分滚动穿透。
解决方案:
html
预览
xml
<!-- 滚动遮罩层 -->
<view class="mask" catchtouchmove="preventDefault">
<!-- 内容 -->
</view>
javascript
javascript
// 阻止默认滚动行为
Page({
preventDefault(e) {
// iOS需要返回false,安卓返回true或false均可
return false;
}
});
2.2 长按事件差异
具体表现 :
iOS 的长按触发时间约为 800ms,安卓约为 500ms。
解决方案:
javascript
javascript
// 自定义长按事件
Page({
data: {
longPressTimer: null
},
touchStart(e) {
this.data.longPressTimer = setTimeout(() => {
this.handleLongPress();
}, 600); // 取中间值
},
touchEnd() {
clearTimeout(this.data.longPressTimer);
},
handleLongPress() {
// 长按处理逻辑
}
});
三、API 接口差异
3.1 文件路径处理
具体表现 :
iOS 的文件路径区分大小写,安卓不区分。
解决方案:
javascript
javascript
// 规范化文件路径
function normalizePath(path) {
return path.toLowerCase(); // 统一转换为小写
}
// 使用示例
const filePath = normalizePath('/User/Images/IMG_001.JPG'); // iOS和安卓均能正确识别
3.2 录音格式兼容性
具体表现 :
iOS 默认支持 AAC 格式,安卓默认支持 AMR 格式。
解决方案:
javascript
javascript
// 自适应录音格式
wx.getSystemInfo({
success: ({ platform }) => {
const format = platform === 'ios' ? 'aac' : 'amr';
wx.startRecord({
format,
success: (res) => {
// 处理录音文件
}
});
}
});
四、系统特性差异
4.1 键盘弹起行为
具体表现 :
iOS 键盘弹起时页面整体上移,安卓键盘可能覆盖输入框。
解决方案:
javascript
ini
// 监听键盘事件调整布局
Page({
onLoad() {
wx.onKeyboardHeightChange(res => {
this.setData({
keyboardHeight: res.height
});
});
}
});
css
css
/* 动态调整输入框位置 */
.input-container {
bottom: {{keyboardHeight}}px;
position: fixed;
}
4.2 后台运行限制
具体表现 :
iOS 小程序进入后台 5 分钟后会被终止,安卓可运行更长时间。
解决方案:
javascript
javascript
// 缓存关键数据
App({
onShow() {
// 恢复数据
const cacheData = wx.getStorageSync('backgroundData');
if (cacheData) this.restoreState(cacheData);
},
onHide() {
// 保存关键数据
const state = this.collectAppState();
wx.setStorage({
key: 'backgroundData',
data: state
});
}
});
五、缓存与存储差异
5.1 本地存储限制
具体表现 :
iOS 本地存储上限约 10MB,安卓约 20MB。
解决方案:
javascript
kotlin
// 智能存储管理
class StorageManager {
constructor(limit = 8 * 1024 * 1024) { // 预留2MB空间
this.limit = limit;
}
async set(key, value) {
const data = JSON.stringify(value);
const size = this.calculateSize(data);
if (size > this.limit) {
await this.clearOldestData(size);
}
wx.setStorageSync(key, data);
}
// 其他方法...
}
5.2 数据持久化差异
具体表现 :
iOS 会自动清理长时间未使用的小程序数据,安卓则不会。
解决方案:
javascript
javascript
// 定期同步重要数据到服务器
function syncDataToServer() {
const localData = wx.getStorageSync('importantData');
wx.request({
url: 'https://api.example.com/sync',
method: 'POST',
data: localData
});
}
// 启动时检查数据完整性
App({
onLaunch() {
this.checkDataIntegrity();
setInterval(syncDataToServer, 86400000); // 每天同步一次
}
});
六、性能优化差异
6.1 列表渲染性能
具体表现 :
iOS 对长列表渲染更流畅,安卓在数据量大时易卡顿。
解决方案:
javascript
javascript
// 使用虚拟列表组件
import VirtualList from '@vant/weapp/virtual-list';
Page({
data: {
list: [],
itemHeight: 80, // 单项高度固定
visibleRange: { start: 0, end: 20 }
},
onLoad() {
this.initVirtualList();
},
initVirtualList() {
// 初始化大数据列表
const list = Array(1000).fill(0).map((_, i) => ({ id: i, text: `Item ${i}` }));
this.setData({ list });
}
});
6.2 图片加载策略
具体表现 :
iOS 支持渐进式图片加载,安卓默认不支持。
解决方案:
html
预览
xml
<!-- 使用占位图+懒加载 -->
<image
class="lazy-image"
src="{{item.placeholderUrl}}"
data-src="{{item.realUrl}}"
bindload="onImageLoad"
/>
javascript
javascript
Page({
onImageLoad(e) {
const { src, dataset } = e.currentTarget;
if (src !== dataset.src) {
this.setData({
[`list[${dataset.index}].src`]: dataset.src
});
}
}
});