Напоминание: Это применимо только к не-App магазин приложений (например, те, которые предназначены для распространения в доме, или для взломанных устройств). Если вы отправите этот код в Apple, он будет отклонен.
Ниже приведен подход, основанный на IOKit, который извлекает серийный номер аккумулятора, который является хорошим статическим уникальным идентификатором для устройства, которое будет одинаковым для всех приложений на данном устройстве. Следующий код работает для iOS 8 и 9, но не работает для более старых версий.
- (NSString *) deviceUniqueID
{
mach_port_t iokitPort = 0;
CFMutableDictionaryRef properties;
IOMasterPort(0, &iokitPort);
CFDictionaryRef serviceName = IOServiceNameMatching("charger");
io_service_t service = IOServiceGetMatchingService(iokitPort, serviceName);
if (service == 0)
return nil;
kern_return_t status = IORegistryEntryCreateCFProperties(service,
&properties,
kCFAllocatorDefault,
kNilOptions);
IOObjectRelease(service);
if (status == KERN_SUCCESS)
{
NSDictionary *dict = (__bridge NSDictionary *)(properties);
NSData *batteryIDData = dict[@"battery-id"];
CFRelease(properties);
if ([batteryIDData isKindOfClass: [NSData class]])
return [NSString stringWithUTF8String:[batteryIDData bytes]];
}
return nil;
}
Этот код требует кучу символов IOKit. Вы можете включить необходимые заголовки IOKit, но это может быть немного больно.Предполагая, что вы не используете IOKit в другом месте, просто добавьте следующие объявления и она должна компилироваться:
typedef mach_port_t io_object_t;
typedef io_object_t io_registry_entry_t;
typedef io_object_t io_iterator_t;
typedef io_object_t io_connect_t;
typedef io_object_t io_service_t;
typedef UInt32 IOOptionBits;
kern_return_t IOMasterPort(mach_port_t bootstrapPort, mach_port_t *masterPort);
CFMutableDictionaryRef IOServiceNameMatching(const char *name);
io_service_t IOServiceGetMatchingService (mach_port_t masterPort, CFDictionaryRef matching);
kern_return_t IORegistryEntryCreateCFProperties(io_registry_entry_t entry,
CFMutableDictionaryRef *properties,
CFAllocatorRef allocator,
IOOptionBits options);
kern_return_t IOObjectRelease (io_object_t object);
Теперь, как и для получения его связать, вам нужно будет добавить IOKit.framework в приложение. В большинстве систем он должен быть доступен по адресу /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/IOKit.framework
Я добавил тэг джейлбрейка, так как это вопрос не для магазина приложений, не уверен, что это правильный тег, он может распространяться через учетную запись Enterprise. –