Ios 如何检测是否有任何外部库正在调用[UIDevice currentDevice]uniqueIdentifier]?

Ios 如何检测是否有任何外部库正在调用[UIDevice currentDevice]uniqueIdentifier]?,ios,uniqueidentifier,udid,uidevice,Ios,Uniqueidentifier,Udid,Uidevice,因此,在我们公司当前的项目中,我们需要消除所有调用此属性的API: [[UIDevice currentDevice] uniqueIdentifier] 我们已经消除了自己代码中的所有调用,但需要确保我们正在使用的许多外部库没有调用此属性 确定库是否调用此属性的最可靠方法是什么 提前谢谢你 除了使用otx(看起来有些古怪)之外,还有一个选择是在该方法上设置一个符号断点,然后运行应用程序一段时间,看看你是否点击了它 为该方法配置符号断点如下所示: 如果遇到该断点,您可以通过打开调试器控制台并

因此,在我们公司当前的项目中,我们需要消除所有调用此属性的API:

[[UIDevice currentDevice] uniqueIdentifier]
我们已经消除了自己代码中的所有调用,但需要确保我们正在使用的许多外部库没有调用此属性

确定库是否调用此属性的最可靠方法是什么


提前谢谢你

除了使用otx(看起来有些古怪)之外,还有一个选择是在该方法上设置一个符号断点,然后运行应用程序一段时间,看看你是否点击了它

为该方法配置符号断点如下所示:

如果遇到该断点,您可以通过打开调试器控制台并键入
bt
找到调用它的人。在本例中,调用来自我的
应用程序:didFinishLaunchingWithOptions:
,但无论是谁调用它,它都会工作:

(lldb) bt
* thread #1: tid = 0x1c03, 0x001f4690 UIKit`-[UIDevice uniqueIdentifier], stop reason = breakpoint 1.1
frame #0: 0x001f4690 UIKit`-[UIDevice uniqueIdentifier]
frame #1: 0x0000212e MyApp`-[AppDelegate application:didFinishLaunchingWithOptions:](self=0x0747fcb0, _cmd=0x005aec21, application=0x08366300, launchOptions=0x00000000) + 702 at AppDelegate.m:37
frame #2: 0x00015157 UIKit`-[UIApplication _handleDelegateCallbacksWithOptions:isSuspended:restoreState:] + 266
frame #3: 0x00015747 UIKit`-[UIApplication _callInitializationDelegatesForURL:payload:suspended:] + 1248
frame #4: 0x0001694b UIKit`-[UIApplication _runWithURL:payload:launchOrientation:statusBarStyle:statusBarHidden:] + 805
frame #5: 0x00027cb5 UIKit`-[UIApplication handleEvent:withNewEvent:] + 1022
frame #6: 0x00028beb UIKit`-[UIApplication sendEvent:] + 85
frame #7: 0x0001a698 UIKit`_UIApplicationHandleEvent + 9874
frame #8: 0x01f01df9 GraphicsServices`_PurpleEventCallback + 339
frame #9: 0x01f01ad0 GraphicsServices`PurpleEventCallback + 46
frame #10: 0x01f1bbf5 CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 53
frame #11: 0x01f1b962 CoreFoundation`__CFRunLoopDoSource1 + 146
frame #12: 0x01f4cbb6 CoreFoundation`__CFRunLoopRun + 2118
frame #13: 0x01f4bf44 CoreFoundation`CFRunLoopRunSpecific + 276
frame #14: 0x01f4be1b CoreFoundation`CFRunLoopRunInMode + 123
frame #15: 0x0001617a UIKit`-[UIApplication _run] + 774
frame #16: 0x00017ffc UIKit`UIApplicationMain + 1211
frame #17: 0x00001d42 MyApp`main(argc=1, argv=0xbffff3f8) + 130 at main.m:16

很难可靠地确定封闭源代码库是否确实在调用某个方法,但您可以通过一些方法来确定它们是否可能是:

  • 用于查看“uniqueIdentifier”是否显示在库中,无论其使用方式如何:

    $strings libFoo.a | grep uniqueIdentifier

  • 使用或(请参阅)

  • 使用(参见)


这些方法有助于打开设置断点可能会错过的潜在调用。

要详细介绍Quinn的答案:

  • strings
    按每个类首次出现的顺序列出已编译对象或库中的所有符号。如果您在输出中看到
    uniqueIdentifier
    ,则可能他们正在使用该名称调用其他方法。但是如果您在输出中看到
    currentDevice
    ,紧接着是
    uniqueIdentifier
    ,那么几乎可以肯定他们正在调用
    [[UIDevice currentDevice]uniqueIdentifier]
    。如果库在文件前面调用
    currentDevice
    ,则这两行可能不连续
  • otool-ov
    列出库中的所有类、方法和导入。如果它列出了
    uniqueIdentifier
    ,这可能意味着库正在使用该名称定义自己的方法。在上下文中查看引用。在每个类的底部,您将看到一个类似于(_数据的内容,_objc_classrefs)部分的
    部分,该部分列出了导入。如果在引用
    uniqueIdentifier
    的类的导入中列出了
    \u OBJC\u CLASS\u$\ u UIDevice
    ,则该类很可能正在调用
    -[UIDevice uniqueIdentifier]
  • 为此,
    nm
    的输出类似于
    otool
    。具体来说,它不会显示对
    uniqueIdentifier
    的调用,但会显示导入
    UIDevice
    的类

外部库是开源的吗?大多数库都不是开源的。检查这个答案:检查这个答案,我从苹果那里得到的提示谢谢,效果很好!我想,唯一的问题是,它只能在实际调用函数时捕获它,而不是在它有潜力调用它时捕获它。+1对此非常感谢!!它帮助我们抓住了一个我们错过的图书馆,为我们节省了一周的时间!