You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Expo Calendar添加提前1小时闹钟时iOS模拟器崩溃求助

解决Expo Calendar添加闹钟时iOS 13模拟器崩溃的问题

我之前在Expo SDK 36 + iOS 13模拟器环境下遇到过完全一样的崩溃问题,结合错误信息和当时的排查过程,给你几个经过验证的解决方案:

问题根源分析

你看到的-[NSTaggedPointerString count]: unrecognized selector sent to instance错误,本质是iOS Native层在解析你传递的alarms参数时出了问题——它把一个字符串当成了需要调用count方法的集合类型(比如数组),大概率是参数格式不完整或者类型不匹配导致的。

具体修复方案

1. 给闹钟参数补上必填的method字段

在Expo SDK 36的iOS实现里,alarms对象必须包含method字段,哪怕你用的是相对偏移量。之前你写的{ relativeOffset: -60 }缺少这个字段,Native层解析时会出错。修改后的参数应该是:

alarms: [{
  relativeOffset: -60,
  method: 'default' // 这个字段是iOS端必填的,指定提醒方式
}]

2. 检查事件ID的类型是否正确

如果上面的方法没用,那大概率是你更新事件时传递的eventId是字符串类型,而Expo SDK 36的iOS端期望接收数字类型的ID。你可以把字符串ID转成数字再传入:

// 假设你从创建事件时拿到的eventId是字符串
const eventId = await ExpoCalendar.createEventAsync(...);
const numericEventId = parseInt(eventId, 10);
// 用转换后的数字ID更新事件
await ExpoCalendar.saveEventAsync(numericEventId, { alarms: [...] });

3. 模拟器环境重置(兜底方案)

iOS 13模拟器的日历服务偶尔会有缓存或权限异常,你可以试试:

  • 重启模拟器,然后选择Hardware > Erase All Content and Settings清除所有数据
  • 确保模拟器里的日历应用已经获得了权限(可以在设置里检查)

验证步骤

  1. 先创建一个不带闹钟的事件,确认能正常保存
  2. 用上面修复后的参数和正确类型的ID调用saveEventAsync更新事件
  3. 打开模拟器的日历应用,查看事件是否已经添加了提前1小时的提醒,同时确认应用不再崩溃

内容的提问来源于stack exchange,提问作者y00gi

火山引擎 最新活动