【问题标题】:How to determine that an EKCalendar is a Facebook calendar?如何确定 EKCalendar 是 Facebook 日历?
【发布时间】:2013-02-02 10:50:08
【问题描述】:

给定任何EKCalendar,我如何检查此日历是否为 Facebook 日历? Facebook 日历可以是 Facebook 活动日历或 Facebook 生日日历。

【问题讨论】:

    标签: ios eventkit


    【解决方案1】:

    很遗憾,如果不使用私有 API,则无法判断特定日历是否为 facebook 日历。
    我在 iOS 6 测试期间提交了一份错误报告,一位 Apple 工程师告诉我他们会在最终版本中修复它,但事实证明他们没有......

    但是,您可以测试特定事件是否是 facebook 事件:

    BOOL isFacebookEvent = [[event.URL host] hasSuffix:@"facebook.com"];
    

    不过,这适用于 Facebook 生日活动!

    【讨论】:

    • 谢谢!!您是否知道如何知道生日日历是否来自 Facebook?还是没有办法知道……?例如,我已经看到应用程序“周历”正确地做到了这一点。
    • 不,我不知道这样做的合法方式。在我们的应用程序中,无论生日来自哪里,我们都会以相同的方式显示生日,因此我们不必处理这个问题。 “周历”显然使用了一些私有 API 来为活动和许多其他东西创建参与者,我假设他们只是使用私有 API 来确定它是否也是 facebook 日历。
    • 您能告诉我确定日历是否为 Facebook 日历的私有 API 方法吗?有时,如果确实没有其他方法,Apple 确实会批准调用私有 API。例如,当我在 iOS 4 上调用日历的“源”属性时,我的应用程序获得了批准(源直到 iOS 5 才公开)。
    • 有两种有趣的方法:1) EKSource.h 中的 -isFacebookSource:github.com/nst/iOS-Runtime-Headers/blob/master/Frameworks/… 和 2) EKCalendar.h 中的 -isFacebookBirthdayCalendar:github.com/nst/iOS-Runtime-Headers/blob/master/Frameworks/…
    • 请注意,这两个“有趣”的方法是私有 api 调用,您的应用可能会因为使用它们而被拒绝。这很奇怪,但现在似乎没有合法的方式来获取这些信息......(只是指出来)
    【解决方案2】:

    EventKit 中仍然没有用于此的公共 API,但有一种仅使用公共方法的解决方法。

    每个日历都有一个颜色属性:ekCalendar.CGColor

    Facebook 活动日历的颜色是 Facebook 蓝色,因此通过比较日历颜色的 rbg 组件,可以确定日历最有可能来自 Facebook。

    我写了一个 UIColor 的 swift 扩展来检查给定的颜色是否是 Facebook 蓝色(完成了帮助函数,使 UIColor rgb 函数更快速)

    extension UIColor {
    
        struct rgbComponents {
            var red : CGFloat
            var green : CGFloat
            var blue : CGFloat
            var alpha : CGFloat
        }
    
        func toComponents()->rgbComponents {
            var r:CGFloat = 0
            var g:CGFloat = 0
            var b:CGFloat = 0
            var a:CGFloat = 0
    
            var components : rgbComponents
    
            if self.getRed(&r, green: &g, blue: &b, alpha: &a) {
                components = rgbComponents(red: r, green: g, blue: b,  alpha: a)
            } else {
                components = rgbComponents(red: 0, green: 0, blue: 0, alpha: 0)
            }
    
            return components
        }
    
        func isFBBlue()->Bool {
            let c = self.toComponents()
            let result = c.red == 0.18823529779911041
                            &&  c.green == 0.39215686917304993
                            &&  c.blue == 0.7137255072593689
                            &&  c.alpha == 1.0
            return result
        }
    

    【讨论】:

    • 我的经验是日历的颜色完全不一致。我现在尝试订阅 Facebook 提要,我得到的颜色是默认的日历蓝色,而不是 Facebook 蓝色。我想说检查日历标题是否包含Facebook 可能更安全一些。
    • @StefanFisk - 如果日历是通过标准的 iOS Facebook 集成添加的(它存在于我的应用程序商店中的应用程序中,并且对我的用户始终有效),则此方法有效。如果您将其添加为第 3 方日历,那么您的结果可能会有所不同。
    猜你喜欢
    • 2021-01-17
    • 1970-01-01
    • 2012-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多