【问题标题】:EventKit in iOS 11 Causing ProblemsiOS 11 中的 EventKit 导致问题
【发布时间】:2017-09-29 23:47:12
【问题描述】:

自从我将我的应用程序升级到 Xcode 9 和 iOS 11 后,我一直在使用 EventKit 时遇到一些不一致的问题。

  • 例如,当创建一个新事件时,当属性声明为 String! 时,event.eventIdentifier 将返回 nil!在iOS11之前,它返回一个空字符串
  • 另一个问题是,当属性也定义为 String! 时,我的一个用户在事件上也获得了 nil 标题!。
  • 我收到另一份报告,在编辑特定任务时使用标准 EventKitUI 编辑器时我的应用程序操作系统崩溃。

我在问是否有其他人遇到类似的问题。不久前我已经提交了一份错误报告,当时它仍处于测试阶段。

更新: Apple 已将我的错误报告标记为以下副本:34134523

【问题讨论】:

  • 只看到设备 iOS 11 自己的错误。刚刚在 10 sim、11 sim 和 10 设备上进行了验证。错误仅在 11 台设备上重现。活动,耶

标签: ios ios11 eventkit


【解决方案1】:

我正在经历类似的事情。似乎是因为它无法检索默认日历。我在单元测试中看到了这一点。我还没有弄清楚默认日历失败的原因。

[EventKit] 获取新事件的默认日历时出错:Error Domain=EKCADErrorDomain Code=1019 "(null)"

【讨论】:

  • 我在 iOS 12 中遇到了类似的问题,即最近的升级
  • 遇到同样的问题,有解决办法吗?
【解决方案2】:

好吧,如果它是String!(一个隐式展开的可选)它可以返回nil。 (要明确一点:如果nil 不是一个可能的返回值,它就只是String,它提供了这个保证。)

这可能就是您现在在第 3 点崩溃的原因。如果 API 返回一个可选项,您需要检查 nil(尽管他们应该将其设为常规选项 [也许他们在 Swift 4 中编译时这样做了?])。 它可以像event.title ?? 'no title' 这样简单。

前两个更改对我来说似乎也很合理。

第一个是 API 中的修复,为 eventIdentifier 返回一个空字符串是完全错误的。它必须返回 nil(意味着没有分配标识符)。

第二个也是有道理的。标题不是 iCalendar(SUMMARY 属性)中的必填字段,因此 API 现在可以正确反映缺少的标题(相对于空标题)。

假设他们没有更改 API(我认为 3.2 并非如此),这一切似乎都很好。您的代码未正确检查 nil 值。

【讨论】:

  • 如果它是一个隐式展开的可选值,我为什么要检查它的 nil 值?这不是重点吗?我认为你是对的,最好为新事件获得 nil 值,但他们需要在他们的事件工具包 api 中反映这种新行为。
  • “如果它是一个隐式展开的可选值,我为什么要检查它的 nil 值?这不是重点吗?”不,那将是 non-Optional 类型的重点。对于可选项通常非零的情况,隐式展开的可选项主要是一种便利。但这不是保证,在这种情况下,一开始就不会使用任何一种 Optional 类型。 “他们需要在他们的事件工具包 API 中反映这种新行为” API 没有改变。之前允许返回 nil 值。
  • 我同意它应该是一个常规的 Optional。也许它在 Swift 4 中(值得检查)。 Swift 3.2 的重点在于 API(接口)没有改变,源代码按原样编译。
  • 这不是我的测试显示的,以前的 SDK 确实在 eventIdentifier 中返回了一个空字符串。这不是一个快速的问题。同样来自关于隐式展开的选项的快速文档:“有时从程序的结构中可以清楚地看出,选项总是有一个值”和“可以安全地假定它一直都有一个值。”它通常不用于非零。
  • 都不行,应该声明为“字符串?”由于 EventKit 不是用 swift 编写的,String!当他们没有向他们的 api 添加非空或可为空的类型注释时,是一种自动的快速解释。这是当前定义的方式:@property(null_unspecified, nonatomic, readonly) NSString *eventIdentifier;这显然是错误的,因为在他们的 cmets 中说“对于尚未保存的事件,这可能为零”。这显然是一个可为空的类型“字符串?”有很大的不同,因为如果你不检查一个String,编译器会警告你?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-07
  • 2023-03-09
  • 1970-01-01
  • 2017-01-21
  • 2020-12-10
  • 2020-02-26
相关资源
最近更新 更多