热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

androidios如何获取设备唯一id

title:androidios如何获取设备唯一idtags:android,ios,unique_id,flutter,uniappkey

title: android ios 如何获取设备唯一id
tags: android,ios,unique_id, flutter, uniapp
keywords: unique_id,iOS, uniapp插件, android,设备id,设备唯一标识,unique_device_id,flutter插件
description: 设备唯一id如何获取,安卓获取设备唯一标识;iOS设备唯一标识


前言

设备id,也就是和设备可以一一对应,并且每次获取都是相同的这么一个字符串,在早些年,系统api是开放的,可以直接获取到唯一的设备标识,这些设备标识往往是和设备硬件绑定的,这样一来,设备id就是永远固定的,除非更换了硬件,但是随着现在对于个人隐私保护的重视,系统api已经不能获取到唯一标识,那么我们就只能另外想办法了。获取设备id的目的无非也就以下几点:

  • 统计,统计DAU等
  • 业务需要,这类APP一般都是根据个人喜好来推送内容,恰恰是有违隐私保护政策
  • 风险控制,防止薅羊毛等刷注册行为

随着工信部或应用市场合规整改通知的发布,对于个人隐私保护已经非常严格,相信不少的人都收到以下警告:

  • 违规收集个人信息
  • 强制、频繁、过度索取权限

分析

对于iOS,虽然官方api也去掉了,但是还是有identifierForVendor可以将就使用,实在不行那就自己生产一个uuid保存在keychain里,这样就自己生成uuid来实现设备标识;这里要说的是安卓可以用相同的思路来实现,但是由于安卓没有keychain类似的实现,所以只能自己生成后保存到SDK卡,这样才能保证APP卸载之后数据不丢失,但是这样又涉及到获取SDK权限,用户:你TM又想瞎存啥东西?所以我们应该尽量避免需要权限的做法。

安卓唯一id的文章网上已经泛滥了,但是大致也就那么几种方式,在经过筛选之后,我个人觉得如果我们要在不需要权限的情况下获取,那么我们只能尽量保证准确性,很难做到百分百,另外有种思路就是说把能获取到的能标识的数据都获取,然后自己服务器保存起来,每次获取之后对比,有几个数据相同则表示是同一设备,这种方式需要服务器来保存,还需要一个策略来判断,除了繁琐点,其实还是不错的。

借鉴于[is-there-a-unique-android-device-id](https://stackoverflow.com/questions/2785485/is-there-a-unique-android-device-id),乐观一点话会发现其实通过 Build.BOARD Build.BRAND Build.CPU_ABI 等等参数来生成的序列还是很大程度能标识设备,如果Build. SERIAL能获取成功,那么将会很大可能能区分,如果Build. SERIAL不能获取成功,那么我们可以暂时使用Android ID来代替Build. SERIAL,虽然Android ID会在用户刷机或者恢复出厂设置时变更,但是毕竟这样做的人不会太多。

基于以上思路,于是安卓代码就长这样:

    private String getUniquePsuedoID() {
        // If all else fails, if the user does have lower than API 9 (lower
        // than Gingerbread), has reset their device or 'Secure.ANDROID_ID'
        // returns 'null', then simply the ID returned will be solely based
        // off their Android device information. This is where the collisions
        // can happen.
        // Thanks http://www.pocketmagic.net/?p=1662!
        // Try not to use DISPLAY, HOST or ID - these items could change.
        // If there are collisions, there will be overlapping data
        String m_szDevIDShort = "35" + (Build.BOARD.length() % 10) + (Build.BRAND.length() % 10) + (Build.CPU_ABI.length() % 10) + (Build.DEVICE.length() % 10) + (Build.MANUFACTURER.length() % 10) + (Build.MODEL.length() % 10) + (Build.PRODUCT.length() % 10);

        // Thanks to @Roman SL!
        // https://stackoverflow.com/a/4789483/950427
        // Only devices with API >= 9 have android.os.Build.SERIAL
        // http://developer.android.com/reference/android/os/Build.html#SERIAL
        // If a user upgrades software or roots their device, there will be a duplicate entry
        String serial = null;
        try {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                serial = android.os.Build.getSerial();
            } else {
                serial = Build.SERIAL;
            }
            // Go ahead and return the serial for api => 9
            return new UUID(m_szDevIDShort.hashCode(), serial.hashCode()).toString();
        } catch (Exception exception) {
            // String needs to be initialized
            final String androidId = "" + android.provider.Settings.Secure.getString(_flutterPluginBinding.getApplicationContext().getContentResolver(), android.provider.Settings.Secure.ANDROID_ID);
            serial = androidId;
        }

        // if Build.SERIAL get successfuly, the 'id' is unique very likely, if not, we use androidId to guarante 'id' to be unique as possible
        // without any permissions


        // Thanks @Joe!
        // https://stackoverflow.com/a/2853253/950427
        // Finally, combine the values we have found by using the UUID class to create a unique identifier
        return new UUID(m_szDevIDShort.hashCode(), serial.hashCode()).toString();
    }

源码

考虑到现在跨平台的流行,笔者将实现封装成了uniapp和flutter插件,可以在uniapp开发跨平台APP和flutter开发中使用

  • uniapp插件 https://ext.dcloud.net.cn/plugin?id=2916
  • flutter插件 https://pub.dev/packages/flutter_unique_device_id
  • 项目源码 https://github.com/sharequeue/unique_device_id

推荐阅读
  • flutter图片缓存Flutter的图片缓存机制有问题(可能是我使用的版本1.12.13有问题)网络图片会默认缓存到本地,但是不管图片是不是完整的或者损坏的,导致页面在下次进入的 ... [详细]
  • macOS命令行创建Android模拟器
    macOS下不安装AndroidStudio使用VSCode来开发Flutter应用使用命令行创建和管理Android模拟器设备avdmanageravdmanager 是一种命令 ... [详细]
  • 使用platformchannels,Flutter可以与本机平台互操作(即读取电池电量).在Android上,这需要调用Java方法.我想使用第三方JavaSDK(适用于AW ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • Google Play推出全新的应用内评价API,帮助开发者获取更多优质用户反馈。用户每天在Google Play上发表数百万条评论,这有助于开发者了解用户喜好和改进需求。开发者可以选择在适当的时间请求用户撰写评论,以获得全面而有用的反馈。全新应用内评价功能让用户无需返回应用详情页面即可发表评论,提升用户体验。 ... [详细]
  • Flutter第六章(BottomNavigationBar ,AppBar,TabBar ,TabController 以及案例)
    版权声明:本文为作者原创书籍。转载请注明作者和出处,未经授权,严禁私自转载,侵权必究!!!情感语录:如果你想得到从未拥有过的东西,那么你必须去做从未做过的事 ... [详细]
  • Monkey《大话移动——Android与iOS应用测试指南》的预购信息发布啦!
    Monkey《大话移动——Android与iOS应用测试指南》的预购信息已经发布,可以在京东和当当网进行预购。感谢几位大牛给出的书评,并呼吁大家的支持。明天京东的链接也将发布。 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • Flutter App 中创建模块并且依赖 Flutter
    在FlutterApp中打开对应的Android工程;并且向Android原生工程添加一个AndroidModule模块,并且在工程根settings. ... [详细]
  • 腾讯T3大牛亲自教你!2021大厂Android面试经验,经典好文
    本篇将由环境搭建、实现原理、编程开发、插件开发、编译运行、性能稳定、发展未来等七个方面,对当前的ReactNative和Flutter进行全面的分析对比, ... [详细]
  • 唱唱反调:风口上的技术不要盲目追
      对于前端领域的开发者来说,“学不动了”虽然更多是一种调侃,但也真实地反映出了他们面对频繁出新的前端技术时又爱又恨的心情。在经历了移动互联网的大爆发后,前端领域的边界不 ... [详细]
  • 出色的对话框未在Flutter应用中关闭
    我在flutter应用程序中使用了Awesom ... [详细]
author-avatar
o0風無痕0o
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有