现在的位置: 首页 > 综合 > 正文

去除 UIDevice uniqueIdentifier 方法调用时的警告

2013年08月18日 ⁄ 综合 ⁄ 共 1933字 ⁄ 字号 评论关闭

原文:http://blog.goosoftware.co.uk/2012/04/18/unique-identifier-no-warnings/

Postedby Simon Whitaker

 

Apr 18th, 2012

如果你在用 TestFlight SDK,你可能会发现几个星期前发布的1.0 版本有一点细微但却重要的改变。如这篇文章中所说,TestFlightSDK 返回的报告中不再包含设备的 UDID。也就是说,在 TestFlight SDK 控制台中,会话数据、断点不再和某个指定的测试设备相关。这种改变是由于TestFlight SDK 会在测试和生产环境中使用,而苹果现在拒绝试图获取设备 UDID 的应用

因此,TestFlight SDK 现在增加了新的类方法+setDeviceIdentifier:,你可以把设备UDID 添加到 TestFlight 生成的Ad-Hoc 发布包中,如以下代码所示(我在 +take: 方法调用后加入此行):

1

[TestFlight setDeviceIdentifier:[[UIDevice currentDevice] uniqueIdentifier]];

 

注意:你需要用类似 #ifdef 宏之类的手段确保它能通过 test 编译而不仅仅是production 编译。

这个方法很好,但 [UIDeviceuniqueIdentifier ]  方法现在已经被抛弃,同时会产生一个编译警告:

/Users/simon/dev/personal-projects/apps/zippity/Zippity/ZPAppDelegate.m:70:38:      warning:'uniqueIdentifier' is deprecated [-Wdeprecated-declarations]     [TestFlightsetDeviceIdentifier:[[UIDevice currentDevice] uniqueIdentifier]];

 

啊哈!

我很讨厌编译警告,如果可能我会想方设法地消灭它们。原因很简单,如果我忽略编译警告,我就有可能在我的 build 日志中错过一些重要的东西。如果我的 build 日志不停地显示 20 个警告,这些警告的内容我都已经熟知,因此我一般会忽略过去,那么当偶尔有一个新的警告出现时,我能及时捕捉到它么?这显然不可能。只有在每个警告一出现的时候就消灭它们,我的代码会始终保持“干净”,同时新的警告会立即就被捕捉到。

这里,我可以通过删除 -uniqueIdentifier 方法调用来清除警告,但显然这不是我的目的。最好的选择是忽略该警告;导致这个问题的原因我们已经知道了,我们并不需要理会这个警告,正如前面所提到的,它会弄乱我的 build 日志。

 应该忽略的是 deprecated-declarations 警告,你可以看到前面的 clang 错误输出。

 ( [-Wdeprecated-declarations]表明了错误的类型,因为我打开了 deprecated-delcarations 选项)。而且从中你可以知道是哪个类产生了警告——这正是我更加偏爱 clang 的原因。如果是gcc,你不会得到任何有用的消息。

通过设置会导致错误的文件的 -Wno-deprecated-declarations编译选项,你可以让 Xcode 忽略该错误(选择 Xcode 中的某个 target,点击 Build Phases,展开 Compile source,双击你想添加标志的文件)。但在这里,我只想在某行代码中忽略这个警告。如果是其他代码出现 deprecated declaration 错误,我仍然需要知道。

这个方法是使用 clang 的 pargmas 宏。请看:

 

#ifdef TESTING    

/*    关闭 deprecated-declarations 警告. 参考

      http://clang.llvm.org/docs/UsersManual.html#diagnostics_pragmas

      基本流程:

         1. push 当前警告入栈

         2. 忽略我们要消除的警告

         3. 执行会产生警告的代码

         4. pop 警告出栈——恢复之前的状态

*/

#pragma clang diagnostic push

#pragma clang diagnostic ignored "-Wdeprecated-declarations"     [TestFlight setDeviceIdentifier:[[UIDevice currentDevice] uniqueIdentifier]];

#pragma clang diagnostic pop

 

#endif

 

抱歉!评论已关闭.