ios7에서 지원하지 않는 uniqueIdentifier 대체 방법
8927 단어 unique
그러나 일부 코드를 바꿨다(아래에 코드가 붙을 것이다).또한 실제 컴파일링에 문제가 발생할 수 있습니다. 해결 기록은 다음과 같습니다.내가 수정한 UIDevice-uniqueID.h/m(아래 코드 참조)를 프로젝트에 추가합니다.IOKit 추가framework:IOKit.프레임워크(/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.0.0.sdk/System/Library/Frameworks/IOKit.framework)에서 컴파일 옵션-Build Phases-Link Binary With Libraries로 드래그합니다.(이 프레임워크에 헤더 파일이 없다는 것을 알아차렸다.)3. IOKit 추가 헤더 파일: 프로젝트 디렉터리에 있는 원본 파일 디렉터리에 IOKit 폴더를 새로 만들고/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator6.0.sdk/System/Library/Frameworks/IOKit.framework/Headers의 파일은 모두 이 디렉터리로 복사됩니다.헤더 파일 검색 경로도 추가: 컴파일 옵션 - Build Settings-Header Search Paths에 $SRCROOT을 추가하고 반복: recursive.4. done.주의: 이 방법은 장치와 관련된 유일한 식별자를 산출했지만 그 결과는 원래의 uniqueIdentifier 함수와 결과가 다르고 만약에 앱스토어에 올라가면 애플에 의해 통과되지 못할 가능성이 높다. ----------------------------------------------------------------------------부착 코드: --------------------------------------UIDevice-uniqueID.h
/**
* @brief .
* @note https://github.com/Itayber/UIDevice-uniqueID,
.by xiaoU.
**/
#import <UIKit/UIDevice.h>
@interface UIDevice (uniqueID)
- (NSString *) uniqueID;
- (NSString *) wifiMAC;
- (NSString *) bluetoothMAC;
- (NSString *) serialNumber;
- (NSString *) deviceIMEI;
- (NSString *)deviceECID;
@end
UIDevice-uniqueID.m
#import "UIDevice-uniqueID.h"
#include <arpa/inet.h>
#include <net/if.h>
#include <net/if_dl.h>
#include <arpa/inet.h>
#include <ifaddrs.h>
#import <mach/mach_port.h>
#import <CommonCrypto/CommonDigest.h>
#import <IOKit/IOKitLib.h> // add by U.
NSArray *getValue(NSString *iosearch);
// thanks Erica Sadun!
// (spent time on this without realizing you had already wrote what I was looking for!)
NSArray *getValue(NSString *iosearch)
{
mach_port_t masterPort;
CFTypeID propID = (CFTypeID) NULL;
unsigned int bufSize;
kern_return_t kr = IOMasterPort(MACH_PORT_NULL, &masterPort);
if (kr != noErr) return nil;
io_registry_entry_t entry = IORegistryGetRootEntry(masterPort);
if (entry == MACH_PORT_NULL) return nil;
CFTypeRef prop = IORegistryEntrySearchCFProperty(entry, kIODeviceTreePlane, (CFStringRef) iosearch, nil, kIORegistryIterateRecursively);
if (!prop) return nil;
propID = CFGetTypeID(prop);
if (!(propID == CFDataGetTypeID()))
{
mach_port_deallocate(mach_task_self(), masterPort);
return nil;
}
CFDataRef propData = (CFDataRef) prop;
if (!propData) return nil;
bufSize = CFDataGetLength(propData);
if (!bufSize) return nil;
NSString *p1 = [[[NSString alloc] initWithBytes:CFDataGetBytePtr(propData) length:bufSize encoding:1] autorelease];
mach_port_deallocate(mach_task_self(), masterPort);
return [p1 componentsSeparatedByString:@"\0"];
}
@implementation UIDevice (uniqueID)
// UDID = SHA1(SerialNumber + IMEI + WiFiAddress + BluetoothAddress)
// http://iphonedevwiki.net/index.php/Lockdownd
/** add by U: , iphone4 , :SHA1(SerialNumber + ECID + WiFiAddress + BluetoothAddress).
- deviceIMEI IMEI.
. */
- (NSString *) uniqueID
{
// Returns a random hash if run in the simulator
#if TARGET_IPHONE_SIMULATOR
return [[[[[NSProcessInfo processInfo] globallyUniqueString] stringByReplacingOccurrencesOfString:@"-" withString:@""] substringToIndex:40] lowercaseString];
#endif
NSString *concat = [NSString stringWithFormat:@"%@%@%@%@",
[self serialNumber],
[self deviceECID],//[self deviceIMEI],
[self wifiMAC],
[self bluetoothMAC]];
const char *cconcat = [concat UTF8String];
unsigned char result[20];
CC_SHA1(cconcat,strlen(cconcat),result);
NSMutableString *hash = [NSMutableString string];
int i;
for (i=0; i < 20; i++)
{
[hash appendFormat:@"%02x",result[i]];
}
return [hash lowercaseString];
}
- (NSString *) wifiMAC
{
struct ifaddrs *interfaces;
const struct ifaddrs *tmpaddr;
if (getifaddrs(&interfaces)==0)
{
tmpaddr = interfaces;
while (tmpaddr != NULL)
{
if (strcmp(tmpaddr->ifa_name,"en0")==0)
{
struct sockaddr_dl *dl_addr = ((struct sockaddr_dl *)tmpaddr->ifa_addr);
uint8_t *base = (uint8_t *)&dl_addr->sdl_data[dl_addr->sdl_nlen];
NSMutableString *s = [NSMutableString string];
int i;
for (i=0; i < dl_addr->sdl_alen; i++)
{
[s appendFormat:(i!=0)?@":%02x":@"%02x",base[i]];
}
return s;
}
tmpaddr = tmpaddr->ifa_next;
}
freeifaddrs(interfaces);
}
return @"00:00:00:00:00:00";
}
// I hope someone will find a better way to do this
- (NSString *) bluetoothMAC
{
mach_port_t port;
IOMasterPort(MACH_PORT_NULL,&port);
CFMutableDictionaryRef bt_dict = IOServiceNameMatching("bluetooth");
mach_port_t btservice = IOServiceGetMatchingService(port, bt_dict);
CFDataRef bt_data = (CFDataRef)IORegistryEntrySearchCFProperty(btservice,"IODevicTree",(CFStringRef)@"local-mac-address", kCFAllocatorDefault, 1);
NSString *string = [((NSData *)bt_data) description];
string = [string stringByReplacingOccurrencesOfString:@"<" withString:@""];
string = [string stringByReplacingOccurrencesOfString:@">" withString:@""];
string = [string stringByReplacingOccurrencesOfString:@" " withString:@""];
NSMutableString *btAddr = [NSMutableString string];
int x=0;
while (x<12)
{
x++;
[btAddr appendFormat:((x!=12&&x%2==0)?@"%C:":@"%C"),[string characterAtIndex:(x-1)]];
}
return btAddr;
}
- (NSString *) serialNumber
{
return [getValue(@"serial-number") objectAtIndex:0];
}
- (NSString *) deviceIMEI
{
return [getValue(@"device-imei") objectAtIndex:0];
}
/// add by U:
//
- (NSString *)deviceECID
{
NSString * res = nil;
if (CFMutableDictionaryRef dict = IOServiceMatching("IOPlatformExpertDevice")) {
if (io_service_t service = IOServiceGetMatchingService(kIOMasterPortDefault, dict)) {
if (CFTypeRef ecid = IORegistryEntrySearchCFProperty(service, kIODeviceTreePlane, CFSTR("unique-chip-id"), kCFAllocatorDefault, kIORegistryIterateRecursively)) {
NSData *data((NSData *) ecid);
size_t length([data length]);
uint8_t bytes[length];
[data getBytes:bytes];
char string[length * 2 + 1];
for (size_t i(0); i != length; ++i)
sprintf(string + i * 2, "%.2X", bytes[length - i - 1]);
printf("%s", string);
res = [[[NSString alloc] initWithCString:string encoding:NSASCIIStringEncoding] autorelease];
CFRelease(ecid);
}
IOObjectRelease(service);
}
}
return res;
}
@end
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
ios7에서 지원하지 않는 uniqueIdentifier 대체 방법UIDevice의 uniqueIdentifier 방법은 ios7에서 지원되지 않습니다. 장치와 관련된 유일한 식별자를 얻기 위해 여기를 참고하였습니다.https://github.com/Itayber/UIDevice-...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.