在iOS 8+中获取UDID

7
我需要获取我的iPhone的UDID以在我的iOS应用程序中使用。
关于我的应用程序的一些信息:
1. 我的应用程序不针对公众,永远不会发布到商店,因此我可以使用任何第三方库。它只会被公司的一些员工使用。
2. 在我的应用程序运行时,我的设备将始终插入Mac中。
我认为,只有两种方法可以实现这一点。
1. 在我的iOS应用程序中使用第三方库获取UDID。
2. 由于iPhone在我的应用程序运行时始终连接到Mac,所以如何通过Mac获取UDID,并以某种方式将其传输到我的iPhone应用程序中。
如果您有任何想法,请告诉我。谢谢。
编辑:我的问题是,您是否知道任何第三方库或更好的方法可以使我的应用程序在运行时自动获取iPhone的UDID?
编辑2:我知道这可以通过仅使用我的手机来完成,因为有一个网络应用程序:http://get.udid.io/,它是如何工作的?

你的问题是什么?...是...? - holex
@holex的问题是,你知道有哪些第三方库可以做到这一点吗?我在Github上尝试过的所有东西都让我失望了。 - donga
这与osx有什么关系? - Popeye
@Popeye,我希望有一种通过终端命令将数据发送到已连接的iPhone的方法。我如此迫切地需要获取UDID的主要原因是因为OSX Instruments只能通过设备的UDID来识别设备。这方面有没有解决办法? - donga
能否使用私有API获取这个?如果可以,是哪一个?我也对此很感兴趣。 - Legoless
6个回答

2

如果您想在Mac上自动化某些操作并尝试读取UDID,则可以使用类似system_profiler SPUSBDataType的命令来获取UDID。对于我的手机,输入如下:

          Product ID: 0x12a8
          Vendor ID: 0x05ac  (Apple Inc.)
          Version: 7.01
          Serial Number: 7bed*********************************33
          Speed: Up to 480 Mb/sec
          Manufacturer: Apple Inc.
          Location ID: 0x1d110000 / 6
          Current Available (mA): 500
          Current Required (mA): 500
          Extra Operating Current (mA): 1600

序列号这一行是UDID(我因为过度担心把它打了星号)。

需要注意的是,如果没有UDID,你就无法将应用程序安装到手机上。

你可以在Mac上运行一个小型守护进程,读取这些信息并创建一个Bonjour服务,向请求者提供信息 - 这是一个SMOP。


谢谢,这正是我想的。我的情况变得有点复杂:如果连接了多个设备怎么办?例如两个iPhone?我该如何区分应用程序正在哪个iPhone上运行? - donga
这有点棘手,但如果你知道如何使用http://get.udid.io/,那么你可以[设置自己的服务器](https://dev59.com/i2Mk5IYBdhLWcg3wtgIR),一旦你拥有了自己的服务器,如果手机请求,你应该能够返回这个UDID(我没有测试过实现这个)。 - Anya Shenanigans

2

1

从网上快速查看,似乎可以使用一个名为libMobileGestalt.dylib的私有框架。

链接库并导入头文件后,您应该能够像这样做(reference):

CFStringRef value = MGCopyAnswer(kMGUniqueDeviceID);
NSLog(@"Value: %@", value);
CFRelease(value);

在我的Mac上,我可以找到特定的dylib文件在这里:
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/lib/libMobileGestalt.dylib

libMobileGestalt MobileGestalt.c:534: 无法访问UniqueDeviceID(请参见rdar://problem/11744455) - Anya Shenanigans
@Petesh,您还需要授予您的应用程序权限才能成功使用它。请参见此答案 - Nate

0

在iOS 9中使用此代码

NSUUID *tempUUID = [[UIDevice currentDevice] identifierForVendor];
NSString *stringForUDID =  [tempUUID UUIDString];
NSCharacterSet *notAllowedChars = [[NSCharacterSet characterSetWithCharactersInString:@"1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"] invertedSet];
NSString *resultString = [[stringForUDID componentsSeparatedByCharactersInSet:notAllowedChars] componentsJoinedByString:@""];
NSLog(@"Final string %@", resultString);

这对企业应用程序无效:标识符在应用程序重新安装后更改。 - artem

0

这里是看起来符合你需求的github项目

这里是可用的代码

#import <Foundation/Foundation.h>
#import <CoreFoundation/CoreFoundation.h>
#import <liblockdown.h>
#include <stdio.h>

...
    LockdownConnectionRef connection = lockdown_connect();

    CFStringRef udid = (CFStringRef)lockdown_copy_value(connection, NULL, kLockdownUniqueDeviceIDKey);
    CFShow(udid);

    lockdown_disconnect(connection);

-2
使用以下代码获取设备唯一标识符:[[[UIDevice currentDevice] identifierForVendor] UUIDString];

9
UUID不等于UDID。它们不是同一回事。 - gnasher729
1
UUID在重新安装后将不会保持不变。我特别想要UDID,因为以后我希望我的Web服务能够通过UDID识别设备。 - donga

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接