Статьи об Android****
1 IMEI и МЭИД
(1) IMEI
(Международный идентификационный код мобильного оборудования) — это аббревиатура Международного идентификационного кода мобильного оборудования. Международный идентификационный код мобильного оборудования можно получить только на мобильных телефонах Android. Это «электронный серийный номер», состоящий из 15 цифр, например 359881030314356. относится к каждому Каждый мобильный телефон имеет однозначное соответствие, а код уникален в мире.
Он возвращается устройством GSM и записан на материнской плате. Переустановка приложения не изменит IMEI.
(2) MEID
(Идентификатор мобильного оборудования) Идентификатор мобильного оборудования — это идентификационный код мобильного телефона CDMA, а также уникальный идентификационный код каждого мобильного телефона или планшета CDMA.
краткое содержание
IMEI — это идентификация мобильных телефонов China Unicom и China Mobile, а MEID — это идентификация мобильных телефонов Telecom.
(3) Как получить IMEI и MEID
Добавить разрешения
`
1
2
Java-код
//Реализуем объект TelephonyManager
TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
Method method = telephonyManager.getClass().getMethod("getDeviceId", int.class);
//Получаем номер IMEI
String imei1 = manager.getDeviceId();
String imei2 = (String) method.invoke(manager, 1);
//Получить номер MEID
String meid = (String) method.invoke(telephonyManager, 2);`
Некоторые планшеты без функций телефона не могут получить номера IMEI и IMSI. А на некоторых устройствах getDeviceId() вернет мусорные данные.
Использование запрещено после версии Android Q(10).
2 DeviceId
Также называется идентификатором устройства. Его можно получить с помощью предоставляемого системой сервиса TelephonyManager, и он является уникальным. Сюда входят IMEI и MEID/ESN.
Обычно мы получаем DeviceId мобильного телефона, который представляет собой код IMEI мобильного телефона.
private String getDeviceId() {
TelephonyManager tm = (TelephonyManager) getContext().getSystemService(Service.TELEPHONY_SERVICE);
return tm.getDeviceId();
}
Мобильный телефон с двумя SIM-картами имеет более одного значения IMEI. Все мобильные телефоны Netcom с двумя SIM-картами имеют два IMEI и один MEID.
Использование запрещено после версии Android Q(10).
В Интернете есть способ составить 15-значное число, используя информацию об оборудовании.
`public static String getDeviceId()
{`
String serial = null;
String m_szDevIDShort = "35" +
Build.BOARD.length() % 10 + Build.BRAND.length() % 10 +
Build.CPU_ABI.length() % 10 + Build.DEVICE.length() % 10 +
Build.DISPLAY.length() % 10 + Build.HOST.length() % 10 +
Build.ID.length() % 10 + Build.MANUFACTURER.length() % 10 +
Build.MODEL.length() % 10 + Build.PRODUCT.length() % 10 +
Build.TAGS.length() % 10 + Build.TYPE.length() % 10 +
Build.USER.length() % 10; //13 Кусочек
try
{
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
{
serial = android.os.Build.getSerial();
}
else
{
serial = Build.SERIAL;
}
//API>=9 Использовать серийный номер
return new UUID(m_szDevIDShort.hashCode(), serial.hashCode()).toString();
}
catch (Exception exception)
{
//последовательный порт требует инициализации
serial = "serial"; // Любая инициализация
}
//Число 15Кусочек, собранное с использованием аппаратной информации
return new UUID(m_szDevIDShort.hashCode(), serial.hashCode()).toString();
}
3 мак-адреса
Идентификатор оборудования, включая MAC-адрес WiFi и Mac-адрес Bluetooth.
WifiManager wifiManager=(WifiManager)getSystemService(Context.WIFI_SERVICE);
WifiInfowifiInfo=wifiManager.getConnectionInfo();
String mac=wifiInfo.getMacAddress();
В системе Android 6.0 этот метод не работает, возвращает константу «02:00:00:00:00:00» и определяется как вредоносное приложение.
Кроме того, вы можете легко изменить Mac-адрес с помощью эмулятора Android:
4 ANDROID_ID
ANDROID_ID — это строка из 64-значных шестнадцатеричных чисел, случайно генерируемая системой при первом запуске устройства.
String ANDROID_ID = Settings.System.getString(getContentResolver(), Settings.System.ANDROID_ID);
1
ANDROID_ID Недостатки:
①.Значение ANDROID_ID будет сброшено при очистке устройства или восстановлении заводских настроек.
② Теперь в Интернете есть приложения, которые могут изменять значение ANDROID_ID устройства.
③ Системы, настроенные некоторыми производителями, могут привести к тому, что разные устройства будут генерировать один и тот же ANDROID_ID.
④ Системы, настроенные некоторыми производителями, могут привести к тому, что устройство вернет пустое значение ANDROID_ID.
⑤.CDMA-устройство, значения, возвращаемые ANDROID_ID и DeviceId, одинаковы.
5 UUID
(Универсальный уникальный идентификатор) Универсальный уникальный идентификационный код, который изменится после переустановки приложения.
6 OpenUDID
(Открытый уникальный идентификатор устройства) Уникальный идентификатор устройства. Даже если приложение будет переустановлено, значение останется неизменным, если только телефон не будет рутирован (чего обычные пользователи сделать не могут).
Добавьте в AndroidManifest.xml
`Метод получения OpenUDID
public class UDID
{`
public static UDID getInstance()
{
return new UDID();
}
public String getUDID(Context context)
{
String UDID = "";
OpenUDID_manager.sync(context);
boolean isInitialized = OpenUDID_manager.isInitialized();
if (isInitialized)
{
UDID = "Android"+ OpenUDID_manager.getOpenUDID();
}
return UDID;
}
}
Другой способ создать UDID из DeviceId, ANDROID_ID и uuid.
protected static String uuid;
/**
* Получите уникальный идентификационный код
* 1. В обычных обстоятельствах его можно получить через ((TelephonyManager) s_instance.getSystemService( Context.TELEPHONY_SERVICE )).getDeviceId(). Однако на некоторых планшетах эта функция возвращает значение null;
* 2. Вы также можете получить идентификатор через Secure.getString(s_instance.getContentResolver(), Secure.ANDROID_ID); Однако есть проблемы с использованием этого на телефонах Android 2.2 или некоторых подражателях. Он будет возвращать фиксированное значение.
* 3. Если udid не получен в первых двух, то создайте случайный uuid при запуске программы и сохраните его. Это считается совместимым решением, и таких устройств, конечно, не так много.
` */
public synchronized static String getUDID(Context mContext)
{ if( uuid ==null )`
{
if( uuid == null)
{
final SharedPreferences prefs = mContext.getApplicationContext().getSharedPreferences( PREFS_FILE, Context.MODE_PRIVATE);
final String id = prefs.getString(PREFS_DEVICE_ID, null );
if (id != null)
{
// Use the ids previously computed and stored in the prefs file
uuid = id;
}
else
{
final String androidId = Settings.Secure.getString(mContext.getContentResolver(), Settings.Secure.ANDROID_ID);
// Use the Android ID unless it's broken, in which case fallback on deviceId,
// unless it's not available, then fallback on a random number which we store
// to a prefs file
try
{
if (!"9774d56d682e549c".equals(androidId))
{
uuid = UUID.nameUUIDFromBytes(androidId.getBytes("utf8")).toString();
}
else
{
final String deviceId = ((TelephonyManager) mContext.getSystemService( Context.TELEPHONY_SERVICE )).getDeviceId();
uuid = deviceId!=null ? UUID.nameUUIDFromBytes(deviceId.getBytes("utf8")).toString() : UUID.randomUUID().toString();
}
}
catch (UnsupportedEncodingException e)
{
throw new RuntimeException(e);
}
// Write the value out to the prefs file
prefs.edit().putString(PREFS_DEVICE_ID, uuid).commit();
}
}
}
return uuid;
}
7 Serial Number
Серийный номер устройства.
Как получить:
String serialNum = android.os.Build.SERIAL;
Устройство с установленной SIM-картой
getSystemService(Context.TELEPHONY_SERVIEC).getSimSerialNumber();
Обратите внимание, что для устройств CDMA возвращается нулевое значение.
В Android 2.3 его можно получить через android.os.Build.SERIAL, а на немобильных устройствах — через этот интерфейс.
На некоторых устройствах возвращаются мусорные данные. Для устройств без возможности вызова оно может возвращать фиксированное значение.
8 IDFA
В 2014 году в Android 2.3 был запущен IDFA на основе Google Play. Его функция аналогична функции IOS: пользователи могут сбрасывать или отключать идентификатор, и пользователь сам решает, хотят ли они, чтобы его отслеживали.
Однако по некоторым причинам основные приложения, такие как Google Maps и Play, были удалены с мобильных телефонов национального банка, выпущенных в Китае. В результате IDFA невозможно получить на мобильных телефонах национального банка. (Если только пользователь не получит root права и не установит Google Play самостоятельно)
9 GAID
GAID можно получить только на телефоне Android с установленной службой Google Play.
Рекламные идентификаторы — это уникальные сбрасываемые рекламные идентификаторы для конкретных пользователей, предоставляемые Сервисом Google Play. Они дают пользователям лучший контроль, а разработчикам — простую стандартную систему для продолжения использования вашего приложения. Он используется для анонимного идентификатора в рекламных целях и для сброса идентификатора. или отказаться от участия в медицинских программах Google Play на основе интересов.
Рекламный идентификатор можно реализовать в вашем приложении через простой API.
(1) Получите SDK службы Google Play.
Найдите google-play-service.jar в библиотеке в каталоге Extras загруженного Android SDK.
(2) Интерфейс
API рекламного идентификатора доступен в библиотеке com.google.android.gms.ads.identifier в пакете сервисов Google Play. Чтобы получить рекламный идентификатор пользователя и настройки отслеживания, вызовите метод getadvertisingidinfo(), который возвращает пакет информации рекламного клиента. Текущий рекламный идентификатор пользователя и настройки отслеживания.
пример
`import com.google.android.gms.ads.identifier.AdvertisingIdClient;
import com.google.android.gms.ads.identifier.AdvertisingIdClient.Info;
import com.google.android.gms.common.GooglePlayServicesAvailabilityException;
import com.google.android.gms.common.GooglePlayServicesNotAvailableException;
import java.io.IOException;
// Do not call this function from the main thread. Otherwise,
// an IllegalStateException will be thrown.
public void getIdThread()
{
Info adInfo = null;
try
{
adInfo = AdvertisingIdClient.getAdvertisingIdInfo(mContext);
}
catch(IOException e)
{
// Unrecoverable error connecting to Google Play services (e.g.,
// the old version of the service doesn't support getting AdvertisingId).
}
catch(GooglePlayServicesAvailabilityException e)
{
// Encountered a recoverable error connecting to Google Play services.
}
catch(GooglePlayServicesNotAvailableException e)
{
// Google Play services is not available entirely.
}
final String id = adInfo.getId();
final boolean isLAT = adInfo.isLimitAdTrackingEnabled();
}`
статьи об iOS
1 IMEI
Запрещен после iOS 5. Оно написано на материнской плате и не изменится, если вы переустановите приложение.
Показыватьпример:351710058880864
2 IDFA
Рекламный идентификатор был запущен в iOS 6. Все приложения на одном устройстве будут иметь одинаковое значение. Он специально разработан Apple для каждого поставщика рекламы для отслеживания пользователей, при этом гарантируя, что устройство пользователя не отслеживается приложением. . Могут произойти изменения, такие как сброс системы или восстановление рекламного идентификатора в настройках. Пользователи могут включить «Ограничить отслеживание рекламы» в настройках.
` #import <AdSupport/AdSupport.h>
NSString *adId = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];`
Идентификаторы объявлений перегенерируются в нескольких ситуациях:
(1) Если пользователь полностью перезагружает систему (Настройка -> Универсальный -> снижение -> снижение Кусочек Местоположение и конфиденциальность) , идентификатор объявления будет создан заново.
(2) Также если пользователь явно снижаетрекламировать (Программа установки-> Универсальный -> Об этой машине -> рекламировать -> снижениерекламироватьотметка Показыватьсимвол) , то рекламный идентификатор также будет сгенерирован заново.
Показыватьпример:1E2DFA89-496A-47FD-9941-DF1FC4E6484A
3 мак-адреса
Идентификатор оборудования, включая MAC-адрес WiFi и Mac-адрес Bluetooth.iOS 7 Позже он был запрещен (вместе с OpenUDID).
4 UDID
Используется для обозначения уникальности устройства. После iOS 6 запрещено получать собственный UDID системы, но вы можете записать его в связку ключей через uuid, чтобы получить индивидуальный UDID (несистемный собственный). Даже если пользователь переустанавливает приложение, при условии, что связка ключей есть. возвращается каждый раз , без изменений.
`
//UUID, устарел
NSString *udid = [[UIDevice currentDevice] uniqueIdentifier];`
Почему Apple возражает против использования разработчиками UDID
Многие разработчики связывают UDID с настоящим именем, паролем, адресом и другими данными пользователя; сетевые шпионы собирают эти данные из нескольких приложений, а затем следуют подсказкам, чтобы получить большую часть личных данных этого человека. В то же время большинство приложений часто передают UDID и личную информацию. Чтобы избежать коллективных исков, Apple, наконец, решила 5 когда,Избавьтесь от этой привычки,Разработчикам предписано сгенерировать уникальный идентификатор,Обнаруживаются только приложения,Никакой другой информации не предоставляется. Приложения, пытающиеся получить UDID, теперь запрещены и не допускаются к включению в список.
Apple рекомендует использовать UUID для создания уникальных идентификационных строк для приложений.
Полученное значение UUID не сохраняется системой, и каждый раз при вызове UUID система будет возвращать новый уникальный идентификатор. Если вы хотите сохранить этот идентификатор, вам необходимо сохранить его самостоятельно в NSUserDefaults, Keychain, Pasteboard или где-либо еще.
5 UUID
Оно изменится после переустановки приложения.
6 Как правильно получить уникальный идентификатор устройства
Постоянно сохраняйте полученный UUID в цепочке ключей устройства. Этот метод сохраняет полученный UUID в цепочке ключей при первом запуске приложения. Каждый раз при его получении проверяйте, есть ли он в локальной цепочке ключей. Если нет, вам необходимо это сделать. В нем сохраняется полученный UUID. Когда вы перезагрузите устройство, удалите приложение и установите его снова, это не повлияет на него. Однако при перепрошивке устройства связка ключей будет очищена, исчезнет и станет недействительной.
7 Что такое брелок
Используйте KeyChain для обмена данными между приложениями.
Мы можем понимать KeyChain как словарь. Все данные хранятся в форме ключ-значение. В этом словаре можно выполнить четыре операции добавления, обновления, получения и удаления. Для каждого приложения KeyChain имеет две зоны доступа: частную и общедоступную. Частная область представляет собой песочницу, и любые данные, хранящиеся в этой программе, не видны другим программам. Если вы хотите разместить сохраненный контент в общедоступной области, вам необходимо сначала объявить имя общедоступной области. В официальном документе это имя называется «группой доступа к связке ключей». Способ объявления — создать новый файл plist. случайное имя. Содержание следующее.
«yourAppID.com.yourCompany.whatever» — это имя общедоступной области, которую вы хотите назвать. За исключением поля «Как угодно», которое можно свободно задавать, остальные должны быть заполнены правдиво. Путь к этому файлу должен быть настроен в Project->build setting->Code Signing Права, в противном случае общедоступная область будет недействительной. После настройки вы должны использовать официальную подпись сертификата для ее компиляции. В противном случае появится всплывающее окно xcode, чтобы сообщить вам код. Есть проблема с подписанием. Таким образом, Apple ограничивает вас возможностью делиться данными KeyChain только с продуктами компании, а другие компании не могут получить доступ к KeyChain продуктов вашей компании.