本文转载至 http://blog.csdn.net/macmini/article/details/16341669

当我们辛辛苦苦把应用或者游戏做好的时候,满怀激动地把应用提交上去给苹果大大,谁知道的事,苹果大大不吃我们这一套,直接上传失败,而且还会发一封邮件过来,大致意思就是UIDevice、udid、uniqueIdentifier,心里那个桑心哪,真想拿吧竹刀去剁了他们。。。

好吧,言归正传,其实为什么会这样子呢,主要是2013-5-1起,苹果审核将使用udid的应用不可提交。这由此我们需要把我们应用使用udid的实行删除并修改の。可是,有时候呢,是吧,人呢,比较健忘或者其他的,忘记了在哪里引用了这些东西。所以我们要一一把他们解决。那就先从解决了通过验证这块先把,然后再说说替换方法;

一:先从最简单的开始起:试着在自己的工程里搜索一下uniqueIdentifier,如果有的话进行修改;最后将udid这个参数也改掉,改成什么UUID啥的,可以通过验证,保险点,这里属于个人愚见;

二:上述改完之后进行发布,如果还不行就说明不是自己代码中的问题了,那既然代码中没问题,还有哪些地方会引用呢,这里其实应用也有人会想到了,就是我们经常会引用的第三方库,如果你用的以前版本的第三方库的话有可能他之前有过这行获取代码,这样子也是通过不了的,所以我们要查找出来并更新该库,但因为我们可能会引用许多库,所以不可能进行一一替换,这样子费时费力。因此:

1、打开终端,进入到自己的工程文件夹当中

例子:

*给完全没用过终端命令的新手恶补一下

ls

列出文件 参数 目录名

eg:查看当前目录下有什么

cd

转换目录

eg:进入文稿目录

cd Documents

2、 输入 find . | grep -v .svn | grep "\.a" | grep -v "\.app" | xargs grep uniqueIdentifier

find . | grep -v .svn | grep "\.a" | grep -v "\.app" | xargs grep uniqueIdentifier 这行命令将为我们找到第三方库当中所引用了 uniqueIdentifier的类库,找到后一一替换或删除即可,然后打包上传

3、如果以上方法还不行的话可以再用一下方法,这也是我找到了好几天,逛了好久的国外网站看到的,可能不是最先发现的,但也写出来给大家借鉴一下:

Xcode-->Debug-->Breakpoints--->Create Symbolic Breakpoint然后在Symbolic breakpoint中的symbol栏输入-[UIDevice uniqueIdentifier],然后在虚拟机上运行程序,当我们的应用调用到这个方法的时候将会断点至那里,将那里修改就可以了,一一排除后打包应用上传,一般来说经过三种方法排除和修改后,应用能够通过验证并上传的了。如果不行的话就要看一下其他同行是怎么做的。

替换udid方法:

这里提供两种思路,

1、使用device_token替代udid,具体方法可Google

2、使用设备的物理地址并用MD5转换成32位数,以替代udid,具体算法如下

***.h文件

  1. #import <Foundation/Foundation.h>
  2. #import <UIKit/UIKit.h>
  3. @interface UIDevice(Add)
  4. - (NSString *)uniqueDeviceIdentifier;
  5. @end

***.m文件

  1. #import "***.h"
  2. #import "NSString+md5.h"
  3. #include <sys/socket.h> // Per msqr
  4. #include <sys/sysctl.h>
  5. #include <net/if.h>
  6. #include <net/if_dl.h>
  7. @interface UIDevice(Private)
  8. /*私有:获取设备mac地址*/
  9. - (NSString *)macaddress;
  10. @end
  11. @implementation UIDevice (Add)
  12. #pragma mark -
  13. #pragma mark Private Methods
  14. // Return the local MAC addy
  15. // Courtesy of FreeBSD hackers email list
  16. // Accidentally munged during previous update. Fixed thanks to erica sadun & mlamb.
  17. - (NSString *)macaddress
  18. {
  19. int                 mib[6];
  20. size_t              len;
  21. char                *buf;
  22. unsigned char       *ptr;
  23. struct if_msghdr    *ifm;
  24. struct sockaddr_dl  *sdl;
  25. mib[0] = CTL_NET;
  26. mib[1] = AF_ROUTE;
  27. mib[2] = 0;
  28. mib[3] = AF_LINK;
  29. mib[4] = NET_RT_IFLIST;
  30. if ((mib[5] = if_nametoindex("en0")) == 0) {
  31. printf("Error: if_nametoindex error\n");
  32. return NULL;
  33. }
  34. if (sysctl(mib, 6, NULL, &len, NULL, 0) < 0) {
  35. printf("Error: sysctl, take 1\n");
  36. return NULL;
  37. }
  38. if ((buf = malloc(len)) == NULL) {
  39. printf("Could not allocate memory. error!\n");
  40. return NULL;
  41. }
  42. if (sysctl(mib, 6, buf, &len, NULL, 0) < 0) {
  43. printf("Error: sysctl, take 2");
  44. free(buf);
  45. return NULL;
  46. }
  47. ifm = (struct if_msghdr *)buf;
  48. sdl = (struct sockaddr_dl *)(ifm + 1);
  49. ptr = (unsigned charchar *)LLADDR(sdl);
  50. NSString *outstring = [NSString stringWithFormat:@"%02X:%02X:%02X:%02X:%02X:%02X",
  51. *ptr, *(ptr+1), *(ptr+2), *(ptr+3), *(ptr+4), *(ptr+5)];
  52. free(buf);
  53. return outstring;
  54. }
  55. - (NSString *)uniqueDeviceIdentifier
  56. {
  57. NSString *macaddress = [self macaddress];
  58. return [macaddress md5];
  59. }
  60. @end

调用方法

  1. NSString *uuid = nil;
  2. uuid = [[UIDevice currentDevice] uniqueDeviceIdentifier];

最新文章

  1. 常用网络工具 ipconfig arp traceroute
  2. 用户行为数据采集核心思维(APP、web数据采集/埋点)
  3. openstack新建虚机、网络、路由时候对应的ovs网桥的变化
  4. Dnsmasq安装与配置-搭建本地DNS服务器 更干净更快无广告DNS解析
  5. 一秒钟生成自己的iOS客户端
  6. 在WCF中不使用svc文件直接使用cs文件
  7. Conversion to Dalvik format failed:Unable toexecute dex: method ID not in [0, 0xffff]: 65536
  8. 转:php的memcache和memcached扩展区别
  9. window环境下安装 pip 工具 【pip为Python的扩展管理工具】
  10. pyqt lineedit右边显示按钮效果
  11. 2.4 statistical decision theory
  12. Android Resource介绍和使用
  13. Java并发编程总结3——AQS、ReentrantLock、ReentrantReadWriteLock(转)
  14. svn介绍和安装
  15. python的学习之路(一)
  16. allegro17.2 gerber 步骤
  17. 「POJ - 2318」TOYS (叉乘)
  18. JS--理解参数,argument,重载
  19. Unreal Engine 4 动态切割模型实现
  20. SQL错误

热门文章

  1. JavaScript编码转换之gb2312转unicode -- &amp;#X形式
  2. C#解析XML文件
  3. mark v1 SecurityConfig
  4. Spring Cloud 模块简介2
  5. PhotoView
  6. Atitit.获取验证码图片通过web
  7. 以byte方式讀取SPD的數據(SMBus Controller在PCH中)
  8. 动态修改 dom 元素的伪类样式
  9. CSS3多背景应用
  10. C Pointer-to-Function 与 C++ Pointer-to-MemberFunction 的区别