2016-12-07 19 views
4

Я хотел бы знать, что Как создать уникальный идентификатор устройства для iPhone/IPad с помощью Objective-CКак создать уникальный идентификатор устройства для iPhone/IPad с помощью Objective-C

так, что после установки приложения на устройстве, так что мы должны отслеживать, что DeviceId

  • Я искал, чтобы получить IMEI на iPhone/IPad, но это не допускается в Objective-C.

  • Затем я искал, чтобы генерировать UDID iPhone/iPad, но он генерирует разные идентификаторы каждый раз, когда я запускал его на симуляторе.

+0

http://stackoverflow.com/a/39992564/6656894 передать этот ответ –

+0

Возможный дубликат [UIDevice UniqueIdentifier Устаревшие - Что теперь делать] (http://stackoverflow.com/questions/6993325/uidevice -uniqueidentifier-deprecated-what-to-do-now) – Venkat

ответ

5

Да, UDID устарела; мы не можем получить UDID из-за конфиденциальности пользователей. Apple, не позволяет получить любые идентификаторы, которые однозначно идентифицирует устройство, например, как IMEI, MAC-адрес, UDID т.д.

UUID это лучший способ идти как сейчас. Но это будет уникально для каждого поставщика. Вы не уверены, что он будет уникальным каждый раз, когда вы получите строку UUID. Лучше всего хранить UUID на телефон Брелок для ключей и извлекать его при необходимости с уловом. Когда вы сбрасываете заводские настройки своего телефона, элементы брелка будут удалены. Это ограничение следует учитывать.


ОБНОВЛЕНИЕ - В IOS 10.3 BETA'S:

Похоже, что компания Apple сделала некоторые изменения в том, как брелок работ в IOS 10.3+. Элементы связки ключей, хранящиеся в Keychain, будут удалены, когда все приложения от конкретного поставщика будут удалены. По словам Apple, размещение конфиденциальной информации о приложении даже после того, как приложение ушло с устройства, может привести к угрозам безопасности, поэтому они решили запретить такое поведение.

Разработчики, полагающиеся на хранилище брелок, даже после удаления для своих приложений, могут использовать этот WORKAROUND, чтобы продолжить работу с предполагаемыми функциями. В соответствии с этим решением любое приложение может получить доступ к информации, хранящейся в этой группе Keychain Access Group, поэтому рекомендуется добавить дополнительный уровень шифрования к вашим данным, чтобы защитить его еще большей безопасностью, хотя keychain шифрует элементы по умолчанию.


ОБНОВЛЕНИЕ - IOS 10.3.3 (STABLE): кажется, что удаление брелка пунктов была ошибка в начале бета-версий IOS 10.3.3 и была установлена ​​позже в стабильной версии. Это могло быть вызвано во время бета, так как на этом этапе могут произойти странные вещи. Теперь не должно быть проблем с использованием Keychain.

+1

Это была ошибка в бета-версии 10.3 при удалении приложения, которое удаляло данные о брелках ключей, но теперь это не так. [См. Здесь] (https://stackoverflow.com/a/43063683/3411787) –

+0

@ ZaidKhan Да, я видел этот пост. Есть ли официальное подтверждение или документация о том, что это снова работает? Однако я уточню свой ответ. Но 100% поручительство не может быть принято из него или форума разработчиков. –

+0

@BadhanGanesh Я не думаю, что есть какой-либо официальный документ, чтобы показать, что 10.3 удалит данные Keychain, поэтому не будет документа, о котором вы просите. нет? –

6

Вы можете использовать UUID (универсальная идентификация пользователя). После ссылка содержит яблочный документацию

https://developer.apple.com/reference/uikit/uidevice/1620059-identifierforvendor

https://developer.apple.com/library/content/releasenotes/General/WhatsNewIniOS/Articles/iOS7.html#//apple_ref/doc/uid/TP40013162-SW1

вы можете использовать этот код для UUID:

// Objective-C

NSString * string = [[[UIDevice currentDevice] identifierForVendor] UUIDString]; 

// Swift

let deviceID = UIDevice.currentDevice().identifierForVendor?.UUIDString 

// Swift 3

let deviceID = UIDevice.current.identifierForVendor?.uuidString 
+1

Уникально ли это для устройства? Если я удалю приложение, а затем повторно его установлю, будет ли он таким же? – Xeieshan

+0

нет, он не будет таким же. когда вы удаляете и переустанавливаете, он восстанавливает новый. –

4

Используйте следующий код, чтобы получить UDID для IOS устройств использования KeychainItemWrapper класса скачать с URL KeychainItemWrap

NSString *uuid; 
KeychainItemWrapper *keychain = [[KeychainItemWrapper alloc] initWithIdentifier:@"AC_APP_UUID" accessGroup:nil]; 
NSString *keychainUUID = [keychain objectForKey:(__bridge id)(kSecAttrAccount)]; 
NSString *appVersion = [NSString stringWithFormat:@"%@",@"1.0"]; 
[keychain setObject:appVersion forKey:(__bridge id)(kSecAttrDescription)]; 
if (keychainUUID==nil||[keychainUUID isKindOfClass:[NSNull class]]||keychainUUID.length==0) { 
    uuid = [[NSUUID UUID] UUIDString]; 
    [keychain setObject:uuid forKey:(__bridge id)(kSecAttrAccount)]; 
}else{ 
    uuid = [keychain objectForKey:(__bridge id)(kSecAttrAccount)]; 
} 
+0

Принято командой Apple App Review? –

+1

Да, это мое приложение на AppStore. – SM18

+0

Большое спасибо Friend @Sumit –

-3

Решение:

Вы можете сделать это с DeviceToken. DeviceToken - uniq для всех мобильных устройств.

код здесь:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 

    if ([[UIApplication sharedApplication] respondsToSelector:@selector(registerUserNotificationSettings:)]) 
    { 
     [[UIApplication sharedApplication] registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge) categories:nil]]; 

     [[UIApplication sharedApplication] registerForRemoteNotifications]; 
    } 
    else 
    { 
     [[UIApplication sharedApplication] registerForRemoteNotificationTypes: 
     (UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert)]; 
    } 
    return yes; 

} 


- (void)application:(UIApplication*)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken 
{ 

    NSString *AppDeviceToken=[[NSString alloc] initWithFormat:@"%@",deviceToken]; 
    //NSLog(@"My token is: %@", self.AppDeviceToken); 

    AppDeviceToken = [self.AppDeviceToken stringByReplacingOccurrencesOfString:@" " withString:@""]; 
    AppDeviceToken = [self.AppDeviceToken stringByReplacingOccurrencesOfString:@"<" withString:@""]; 
    AppDeviceToken = [self.AppDeviceToken stringByReplacingOccurrencesOfString:@">" withString:@""]; 

    NSLog(@"%@'s Device Token is : %@",[[UIDevice currentDevice] name],AppDeviceToken); 
} 
- (void)application:(UIApplication*)application didFailToRegisterForRemoteNotificationsWithError:(NSError*)error 
{ 
    NSLog(@"Failed to get token, error: %@", error); 
} 

маркер устройства являются Uniq для всех устройств.

+1

Идентификатор устройства может измениться, если вы удалите приложение и снова установите его на том же устройстве. – Wolverine

+1

Да, @ Росомаха, вы правы. – sohil

-1

Вы не можете принимать IMEI и номер телефона мобильного телефона, Apple имеет право на получение этих уникальных идентификаторов.

Вы должны хранить UDID в брелках. для этого вы должны загрузить keychainwrapper класс и хранить UDID сгенерированный выше код:

UIDevice *device = [[UIDevice alloc]init]; 
    NSString *idForVend = [NSString stringWithFormat:@"%@", [device identifierForVendor]]; 
    NSLog(@"Identifier For Vendor : %@",idForVend); 

следовать этой ссылке будет решить вашу проблему наверняка: https://stackoverflow.com/questions/16459879/how-to-store-a-string-in-keychain-ios, IOS? Если вы используете это Если вы удалите приложение и установите его снова, он останется таким же DeviceID.

-1
#import <AdSupport/AdSupport.h> 

NSString* sClientID = [[[ASIdentifierManager sharedManager]advertisingIdentifier] UUIDString]; 

Лучшие UUID, потому что:

  1. это никогда не изменится (* даже если приложение будет удалено)
  2. Apple, имейте это в виду.
+0

Неправильно. Док говорит, что 'advertisingIdentifier' [" может измениться, например, если пользователь стирает устройство "] (https://developer.apple.com/documentation/adsupport/asidentifiermanager/1614151-advertisingidentifier?language=objc). Я считаю, что его также можно изменить, выбрав «Настройки»> «Конфиденциальность»> «Реклама»> «Сбросить идентификатор рекламы». Кроме того, [«В iOS 10.0 и более поздних версиях значение рекламного идентификатора все равно нулю, когда пользователь имеет ограниченное отслеживание объявлений»] (https://developer.apple.com/documentation/adsupport/asidentifiermanager/1614151-advertisingidentifier?language=objc), поэтому он не уникален. – Pang

+0

@ У вас есть решение для этого? –