如何识别一个字符串是否为iOS设备的UDID?

3
我正在开发一款iOS Cocoa应用程序,该应用程序具有回退功能 - 如果用户未输入某个数据,则默认使用设备的UDID。 我需要在我们的服务器代码(使用Ruby编写)中添加一个检查,以识别发送上来的值是UDID(用户的默认值)还是他们设置的自定义字符串。
看起来解决我的问题的正确方案是使用正则表达式。 我习惯于编写正则表达式,但我需要确信此正则表达式可以100%地识别UDID。
我使用以下代码检索UDID:
[[UIDevice currentDevice] uniqueIdentifier]

在模拟器中,我得到了这个值:

6938CA7D-ECE2-53A4-B293-961A8D07AFB1

从这里我可以推断出,我可以搜索符合8-4-4-4-12模式的十六进制字符串。但我想确定这适用于每个UDID。
我在Apple的文档中找不到任何相关内容,想知道是否有人能给我一个明确的答案......谢谢!

小细节提醒:如果有多个用户提供相同的字符串怎么办? - Joost
这是一个与 Ruby 相关的问题,与 iPhone、cocoa 或 IOS 无关,对吧? - VdesmedT
1
真正的问题在于软件行为设计。UDID只能识别设备,而不能识别人。使用UDID无法可靠地识别个人,并且使用UDID可能会导致许多问题,因为用户无法更改UDID。 - eonil
@VdesmedT,我没有看到任何与Ruby有关的内容,所以编辑了标签,将Ruby替换为Objective-C和Cocoa。实际上,这与Ruby毫无关系,但与Cocoa和Objective-C有着千丝万缕的联系。由于它是一个iOS应用程序,因此也与iOS有着密切的关系。不确定问题是否已更改,但我不知道你是如何错过这一点的。 - Mike Bethany
实际上,我指定了我正在寻找一种在我的服务器代码中检测此问题的方法,该代码是基于Ruby的;我更期望答案中出现正则表达式的Ruby语法。 - IQpierce
3个回答

2
为什么不发送另一个数据位来指示它是UDID呢?或者使用不同的参数名称(UDID=6938...)。
然后,在您的服务器上,如果您确实想要这样做,可以像这样进行测试:
# somewhere outside the controller action, maybe the top of the file
UDID_PATTERN = /\A[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}\Z/

# inside the controller action you're sending info to
udid = params[:UDID]
if udid && (udid =~ UDID_PATTERN)
  # do something with the UDID in place of the other
  # bit of info they could have provided
end

将其标记为答案;确实除了明确标记之外,没有真正可靠的方法,正如另一位帖子指出的那样,似乎设备产生的 UDID 与模拟器不同,这是另一个怪癖,似乎证明这些 UDID 不是非常可预测的。但是提供的正则表达式是用于识别与我在 Ruby 代码中发布的模式匹配的字符串的有效表达式。 - IQpierce
给定的模式对于许多有效的UDID都无法匹配。现在有些UDID甚至没有连字符。 - Durai Amuthan.H

2
你无法确定。苹果的文档中写道:
“设备的唯一标识符(有时缩写为 UDID,即 Unique Device Identifier)是由设备序列号等各种硬件标识符组成的哈希值。”
iPhone 模拟器返回的uniqueIdentifier值与真实的 iOS 设备不同。我用过的所有真正的 iPhone 设备都有 40 个十六进制字符的 UDID。但最好不要做出任何假设。
即使存在 UDID 模式,如果用户输入与该模式匹配的内容会怎样呢?

2

显然,唯一能保证的方法是添加一个额外的字段,标记您的用户是否输入了预期的数据。

UDID表单和算法未公开,并且未设计用于再次检测。因此,确定可能是可能的,但永远不会达到100%。


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