Xcode: "uniqueIdentifier устарел" - PullRequest
       6

Xcode: "uniqueIdentifier устарел"

0 голосов
/ 11 января 2012

Мне часто говорят игнорировать это предупреждение компилятора, так как оно не будет проблемой, пока не будет выпущена следующая основная версия iOS.Ну ... было бы неплохо, если бы мое приложение для iPhone не вдруг перестало работать однажды!

Странно, у меня не было этой проблемы при использовании cocos2d для OpenGL 2.0, это был только OpenGL 1.1версия, в которой она была.

Означает ли это, что в более новой версии была предоставлена ​​альтернатива?

Ответы [ 2 ]

5 голосов
/ 11 января 2012

В разделе «Особые замечания» в документации рассказывается, каков рекомендуемый способ получения уникального идентификатора:

Не используйте свойство uniqueIdentifier.Чтобы создать уникальный идентификатор, специфичный для вашего приложения, вы можете вызвать функцию CFUUIDCreate для создания UUID и записать его в базу данных по умолчанию, используя класс NSUserDefaults.

1 голос
/ 11 января 2012

Я бы предложил перейти с uniqueIdentifier на эту библиотеку с открытым исходным кодом (на самом деле 2 простые категории).Он использует MAC-адрес устройства вместе с идентификатором пакета приложения для создания уникального идентификатора в ваших приложениях, который можно использовать в качестве замены UDID.

Имейте в виду, что в отличие от UDID это число будет различным для каждого приложения.

Вам просто нужно импортировать включенные категории NSString и UIDevice и позвонить:

#import "UIDevice+IdentifierAddition.h"
#import "NSString+MD5Addition.h"
NSString *iosFiveUDID = [[UIDevice currentDevice] uniqueDeviceIdentifier]

, чтобы получить сгенерированный идентификатор устройства.

Вынайти его можно на Github здесь:

https://github.com/gekitz/UIDevice-with-UniqueIdentifier-for-iOS-5


Вот код (только файлы .m - проверьте проект github на наличие заголовков):

UIDevice + IdentifierAddition.m

#import "UIDevice+IdentifierAddition.h"
#import "NSString+MD5Addition.h"

#include <sys/socket.h> // Per msqr
#include <sys/sysctl.h>
#include <net/if.h>
#include <net/if_dl.h>

@interface UIDevice(Private)

- (NSString *) macaddress;

@end

@implementation UIDevice (IdentifierAddition)

////////////////////////////////////////////////////////////////////////////////
#pragma mark -
#pragma mark Private Methods

// Return the local MAC addy
// Courtesy of FreeBSD hackers email list
// Accidentally munged during previous update. Fixed thanks to erica sadun & mlamb.
- (NSString *) macaddress{
    
    int                 mib[6];
    size_t              len;
    char                *buf;
    unsigned char       *ptr;
    struct if_msghdr    *ifm;
    struct sockaddr_dl  *sdl;
    
    mib[0] = CTL_NET;
    mib[1] = AF_ROUTE;
    mib[2] = 0;
    mib[3] = AF_LINK;
    mib[4] = NET_RT_IFLIST;
    
    if ((mib[5] = if_nametoindex("en0")) == 0) {
        printf("Error: if_nametoindex error\n");
        return NULL;
    }
    
    if (sysctl(mib, 6, NULL, &len, NULL, 0) < 0) {
        printf("Error: sysctl, take 1\n");
        return NULL;
    }
    
    if ((buf = malloc(len)) == NULL) {
        printf("Could not allocate memory. error!\n");
        return NULL;
    }
    
    if (sysctl(mib, 6, buf, &len, NULL, 0) < 0) {
        printf("Error: sysctl, take 2");
        return NULL;
    }
    
    ifm = (struct if_msghdr *)buf;
    sdl = (struct sockaddr_dl *)(ifm + 1);
    ptr = (unsigned char *)LLADDR(sdl);
    NSString *outstring = [NSString stringWithFormat:@"%02X:%02X:%02X:%02X:%02X:%02X", 
                           *ptr, *(ptr+1), *(ptr+2), *(ptr+3), *(ptr+4), *(ptr+5)];
    free(buf);
    
    return outstring;
}

////////////////////////////////////////////////////////////////////////////////
#pragma mark -
#pragma mark Public Methods

- (NSString *) uniqueDeviceIdentifier{
    NSString *macaddress = [[UIDevice currentDevice] macaddress];
    NSString *bundleIdentifier = [[NSBundle mainBundle] bundleIdentifier];  
    NSString *stringToHash = [NSString stringWithFormat:@"%@%@",macaddress,bundleIdentifier];
    NSString *uniqueIdentifier = [stringToHash stringFromMD5];  
    return uniqueIdentifier;
}

- (NSString *) uniqueGlobalDeviceIdentifier{
    NSString *macaddress = [[UIDevice currentDevice] macaddress];
    NSString *uniqueIdentifier = [macaddress stringFromMD5];    
    return uniqueIdentifier;
}

@end

NSString + MD5Addition.m:

#import "NSString+MD5Addition.h"
#import <CommonCrypto/CommonDigest.h>

@implementation NSString(MD5Addition)

- (NSString *) stringFromMD5{
    
    if(self == nil || [self length] == 0)
        return nil;
    
    const char *value = [self UTF8String];
    
    unsigned char outputBuffer[CC_MD5_DIGEST_LENGTH];
    CC_MD5(value, strlen(value), outputBuffer);
    
    NSMutableString *outputString = [[NSMutableString alloc] initWithCapacity:CC_MD5_DIGEST_LENGTH * 2];
    for(NSInteger count = 0; count < CC_MD5_DIGEST_LENGTH; count++){
        [outputString appendFormat:@"%02x",outputBuffer[count]];
    }
    return [outputString autorelease];
}

@end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...