{"id":5286,"date":"2014-03-03T19:00:35","date_gmt":"2014-03-03T18:00:35","guid":{"rendered":"http:\/\/blogs.wittwer.fr\/whiler\/?p=5286"},"modified":"2023-03-12T14:43:56","modified_gmt":"2023-03-12T13:43:56","slug":"identifiant-unique","status":"publish","type":"post","link":"https:\/\/blogs.wittwer.fr\/whiler\/2014\/03\/03\/identifiant-unique\/","title":{"rendered":"Identifiant unique"},"content":{"rendered":"<p>Pendant le dernier \u00e9pisode du <a href=\"\/whiler\/2013\/11\/14\/le-dev-du-jeudi-saison-3\/\" title=\"Le Dev du jeudi - Saison 3\">D\u00e9v du Jeudi<\/a>, un participant a demand\u00e9 comment avoir un identifiant unique depuis une application install\u00e9e sur un p\u00e9riph\u00e9rique mobile.<\/p>\n<p>Google &#038; Apple ne proposant pas les m\u00eames fonctionnalit\u00e9s dans leurs <a href=\"http:\/\/fr.wikipedia.org\/wiki\/SDK\" rel=\"glossary\" target=\"_blank\" title=\"Wikipedia, D&eacute;finition de&nbsp;: SDKs\" style=\"\" >SDKs<\/a><sup style=\"font-family: Georgia, Times New Roman, Serif; font-weight: bold; color: #AAAAAA\" ><em>W<\/em><\/sup> respectifs, pour l&rsquo;exemple fourni dans cet article, je vais me baser sur&nbsp;:<\/p>\n<ul>\n<li>le num\u00e9ro <a href=\"http:\/\/fr.wikipedia.org\/wiki\/IMEI\" rel=\"glossary\" target=\"_blank\" title=\"Wikipedia, D&eacute;finition de&nbsp;: IMEI\" style=\"\" >IMEI<\/a><sup style=\"font-family: Georgia, Times New Roman, Serif; font-weight: bold; color: #AAAAAA\" ><em>W<\/em><\/sup> sous Android<\/li>\n<li>le code <a href=\"https:\/\/developer.apple.com\/library\/ios\/documentation\/uikit\/reference\/UIDevice_Class\/Reference\/UIDevice.html#\/\/apple_ref\/occ\/instp\/UIDevice\/identifierForVendor\" title=\"Documentation SDK iOS\" target=\"_blank\" rel=\"noopener\">IDFV<\/a> sous iOS<\/li>\n<\/ul>\n<p><div id=\"attachment_5300\" style=\"width: 256px\" class=\"wp-caption aligncenter\"><a title=\"Identifiant unique\" href=\"\/whiler\/wp-content\/uploads\/2014\/03\/uid.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-5300\" src=\"\/whiler\/wp-content\/uploads\/2014\/03\/uid.png\" alt=\"Identifiant unique\" width=\"246\" height=\"246\" class=\"size-full wp-image-5300\" srcset=\"https:\/\/blogs.wittwer.fr\/whiler\/wp-content\/uploads\/2014\/03\/uid.png 246w, https:\/\/blogs.wittwer.fr\/whiler\/wp-content\/uploads\/2014\/03\/uid-150x150.png 150w\" sizes=\"auto, (max-width: 246px) 100vw, 246px\" \/><\/a><p id=\"caption-attachment-5300\" class=\"wp-caption-text\">Identifiant unique<\/p><\/div><br \/>\n<!--more--><br \/>\nPour la partie iOS, j&rsquo;ai utilis\u00e9 une unit\u00e9 t\u00e9l\u00e9charg\u00e9e depuis internet, <a href=\"https:\/\/www.monien.net\/dx-library-utility-functions-for-ios-and-other-platforms-available-for-free-via-subversion\/\" title=\"Site Web proposant l'unit\u00e9 DX.Apple.Utils\" target=\"_blank\" rel=\"noopener\">DX.Apple.Utils<\/a>.<br \/>\nCette unit\u00e9 permet entre autres, de r\u00e9cup\u00e9rer l&rsquo;identifiant li\u00e9 \u00e0 un vendeur. Il sera unique au vendeur et par p\u00e9riph\u00e9rique&nbsp;: un m\u00eame vendeur aura le m\u00eame code sur les diff\u00e9rentes applications install\u00e9es sur un m\u00eame t\u00e9l\u00e9phone et un autre code sur un autre p\u00e9riph\u00e9rique.<\/p>\n<p>Concernant Android, on peut facilement r\u00e9cup\u00e9rer le num\u00e9ro IMEI. J&rsquo;ai rapidement cr\u00e9\u00e9 une unit\u00e9 qui permet d&rsquo;avoir cet identifiant bas\u00e9e sur le <a href=\"https:\/\/forums.embarcadero.com\/message.jspa?messageID=604553#604553\" title=\"IMEI\" target=\"_blank\" rel=\"noopener\">code de cette r\u00e9ponse<\/a>.<\/p>\n<div class=\"codecolorer-container delphi dawn\" style=\"overflow:auto;white-space:nowrap;width:480px;height:300px;\"><table cellspacing=\"0\" cellpadding=\"0\"><tbody><tr><td class=\"line-numbers\"><div>1<br \/>2<br \/>3<br \/>4<br \/>5<br \/>6<br \/>7<br \/>8<br \/>9<br \/>10<br \/>11<br \/>12<br \/>13<br \/>14<br \/>15<br \/>16<br \/>17<br \/>18<br \/>19<br \/>20<br \/>21<br \/>22<br \/>23<br \/>24<br \/>25<br \/>26<br \/>27<br \/>28<br \/>29<br \/>30<br \/>31<br \/>32<br \/>33<br \/>34<br \/>35<br \/>36<br \/>37<br \/>38<br \/>39<br \/><\/div><\/td><td><div class=\"delphi codecolorer\"><span class=\"kw1\">unit<\/span> Android<span class=\"sy1\">.<\/span><span class=\"me1\">IMEI<\/span><span class=\"sy1\">;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">interface<\/span><br \/>\n<br \/>\n<span class=\"co2\">{$IFDEF ANDROID}<\/span><br \/>\n<span class=\"kw1\">uses<\/span><br \/>\n&nbsp; Androidapi<span class=\"sy1\">.<\/span><span class=\"me1\">JNI<\/span><span class=\"sy1\">.<\/span><span class=\"me1\">Telephony<\/span><span class=\"sy1\">,<\/span> Androidapi<span class=\"sy1\">.<\/span><span class=\"me1\">JNI<\/span><span class=\"sy1\">.<\/span><span class=\"me1\">Provider<\/span><span class=\"sy1\">,<\/span> Androidapi<span class=\"sy1\">.<\/span><span class=\"me1\">JNI<\/span><span class=\"sy1\">.<\/span><span class=\"me1\">GraphicsContentViewText<\/span><span class=\"sy1\">,<\/span> Androidapi<span class=\"sy1\">.<\/span><span class=\"me1\">JNIBridge<\/span><span class=\"sy1\">,<\/span> FMX<span class=\"sy1\">.<\/span><span class=\"me1\">Helpers<\/span><span class=\"sy1\">.<\/span><span class=\"me1\">Android<\/span><span class=\"sy1\">,<\/span> androidapi<span class=\"sy1\">.<\/span><span class=\"me1\">JNI<\/span><span class=\"sy1\">.<\/span><span class=\"me1\">JavaTypes<\/span><span class=\"sy1\">,<\/span> androidapi<span class=\"sy1\">.<\/span><span class=\"me1\">JNI<\/span><span class=\"sy1\">.<\/span><span class=\"me1\">Os<\/span><span class=\"sy1\">;<\/span><br \/>\n<span class=\"co2\">{$ENDIF}<\/span><br \/>\n<br \/>\n<span class=\"kw1\">function<\/span> ToString<span class=\"sy1\">:<\/span> <span class=\"kw4\">string<\/span><span class=\"sy1\">;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">implementation<\/span><br \/>\n<br \/>\n<span class=\"kw1\">function<\/span> ToString<span class=\"sy1\">:<\/span> <span class=\"kw4\">string<\/span><span class=\"sy1\">;<\/span><br \/>\n<span class=\"co2\">{$IFDEF ANDROID}<\/span><br \/>\n<span class=\"kw1\">var<\/span><br \/>\n&nbsp; obj<span class=\"sy1\">:<\/span> JObject<span class=\"sy1\">;<\/span><br \/>\n&nbsp; tm <span class=\"sy1\">:<\/span> JTelephonyManager<span class=\"sy1\">;<\/span><br \/>\n<span class=\"co2\">{$ENDIF}<\/span><br \/>\n<span class=\"kw1\">begin<\/span><br \/>\n&nbsp; Result <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> <span class=\"st0\">'111111111111'<\/span><span class=\"sy1\">;<\/span><br \/>\n<span class=\"co2\">{$IFDEF ANDROID}<\/span><br \/>\n&nbsp; obj <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> SharedActivityContext<span class=\"sy1\">.<\/span><span class=\"me1\">getSystemService<\/span><span class=\"br0\">&#40;<\/span>TJContext<span class=\"sy1\">.<\/span><span class=\"me1\">JavaClass<\/span><span class=\"sy1\">.<\/span><span class=\"me1\">TELEPHONY_SERVICE<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; <span class=\"kw1\">if<\/span> obj &lt;&gt; <span class=\"kw1\">nil<\/span> <span class=\"kw1\">then<\/span><br \/>\n&nbsp; <span class=\"kw1\">begin<\/span><br \/>\n&nbsp; &nbsp; tm <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> TJTelephonyManager<span class=\"sy1\">.<\/span><span class=\"me1\">Wrap<\/span><span class=\"br0\">&#40;<\/span> <span class=\"br0\">&#40;<\/span>obj <span class=\"kw1\">as<\/span> ILocalObject<span class=\"br0\">&#41;<\/span><span class=\"sy1\">.<\/span><span class=\"me1\">GetObjectID<\/span> <span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">if<\/span> tm &lt;&gt; <span class=\"kw1\">nil<\/span> <span class=\"kw1\">then<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">begin<\/span><br \/>\n&nbsp; &nbsp; &nbsp; Result <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> JStringToString<span class=\"br0\">&#40;<\/span>tm<span class=\"sy1\">.<\/span><span class=\"me1\">getDeviceId<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; <span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; <span class=\"kw1\">if<\/span> Result <span class=\"sy3\">=<\/span> <span class=\"st0\">''<\/span> <span class=\"kw1\">then<\/span><br \/>\n&nbsp; <span class=\"kw1\">begin<\/span><br \/>\n&nbsp; &nbsp; Result <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> JStringToString<span class=\"br0\">&#40;<\/span>TJSettings_Secure<span class=\"sy1\">.<\/span><span class=\"me1\">JavaClass<\/span><span class=\"sy1\">.<\/span><span class=\"me1\">getString<\/span><span class=\"br0\">&#40;<\/span>SharedActivity<span class=\"sy1\">.<\/span><span class=\"me1\">getContentResolver<\/span><span class=\"sy1\">,<\/span> TJSettings_Secure<span class=\"sy1\">.<\/span><span class=\"me1\">JavaClass<\/span><span class=\"sy1\">.<\/span><span class=\"me1\">ANDROID_ID<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; <span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n<span class=\"co2\">{$ENDIF}<\/span><br \/>\n<span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">end<\/span><span class=\"sy1\">.<\/span><\/div><\/td><\/tr><\/tbody><\/table><\/div>\n<p>&nbsp;<br \/>\nPuis, j&rsquo;ai cod\u00e9 une autre unit\u00e9 qui utilise l&rsquo;unit\u00e9 et le code qui sont n\u00e9cessaires en fonction de la plateforme cible.<\/p>\n<div class=\"codecolorer-container delphi dawn\" style=\"overflow:auto;white-space:nowrap;width:480px;height:300px;\"><table cellspacing=\"0\" cellpadding=\"0\"><tbody><tr><td class=\"line-numbers\"><div>1<br \/>2<br \/>3<br \/>4<br \/>5<br \/>6<br \/>7<br \/>8<br \/>9<br \/>10<br \/>11<br \/>12<br \/>13<br \/>14<br \/>15<br \/>16<br \/>17<br \/>18<br \/>19<br \/>20<br \/>21<br \/>22<br \/>23<br \/>24<br \/>25<br \/>26<br \/>27<br \/>28<br \/>29<br \/><\/div><\/td><td><div class=\"delphi codecolorer\"><span class=\"kw1\">unit<\/span> Mobile<span class=\"sy1\">.<\/span><span class=\"me1\">Identifier<\/span><span class=\"sy1\">;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">interface<\/span><br \/>\n<br \/>\n<span class=\"co2\">{$IFDEF ANDROID}<\/span><br \/>\n<span class=\"kw1\">uses<\/span><br \/>\n&nbsp; Android<span class=\"sy1\">.<\/span><span class=\"me1\">IMEI<\/span><span class=\"sy1\">;<\/span><br \/>\n<span class=\"co2\">{$ENDIF}<\/span><br \/>\n<span class=\"co2\">{$IFDEF IOS}<\/span><br \/>\n<span class=\"kw1\">uses<\/span><br \/>\n&nbsp; DX<span class=\"sy1\">.<\/span><span class=\"me1\">Apple<\/span><span class=\"sy1\">.<\/span><span class=\"me1\">Utils<\/span><span class=\"sy1\">;<\/span><br \/>\n<span class=\"co2\">{$ENDIF}<\/span><br \/>\n<br \/>\n<span class=\"kw1\">function<\/span> ToString<span class=\"sy1\">:<\/span> <span class=\"kw4\">string<\/span><span class=\"sy1\">;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">implementation<\/span><br \/>\n<br \/>\n<span class=\"kw1\">function<\/span> ToString<span class=\"sy1\">:<\/span> <span class=\"kw4\">string<\/span><span class=\"sy1\">;<\/span><br \/>\n<span class=\"kw1\">begin<\/span><br \/>\n&nbsp; Result <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> <span class=\"st0\">'000000000000'<\/span><span class=\"sy1\">;<\/span> <span class=\"co1\">\/\/ Sous Windows<\/span><br \/>\n<span class=\"co2\">{$IFDEF ANDROID}<\/span><br \/>\n&nbsp; Result <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> Android<span class=\"sy1\">.<\/span><span class=\"me1\">IMEI<\/span><span class=\"sy1\">.<\/span><span class=\"me1\">ToString<\/span><span class=\"sy1\">;<\/span><br \/>\n<span class=\"co2\">{$ENDIF}<\/span><br \/>\n<span class=\"co2\">{$IFDEF IOS}<\/span><br \/>\n&nbsp; Result <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> DX<span class=\"sy1\">.<\/span><span class=\"me1\">Apple<\/span><span class=\"sy1\">.<\/span><span class=\"me1\">Utils<\/span><span class=\"sy1\">.<\/span><span class=\"me1\">VendorIdentifier<\/span><span class=\"sy1\">;<\/span><br \/>\n<span class=\"co2\">{$ENDIF}<\/span><br \/>\n<span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">end<\/span><span class=\"sy1\">.<\/span><\/div><\/td><\/tr><\/tbody><\/table><\/div>\n<p>L&rsquo;int\u00e9gralit\u00e9 du projet (code source) est disponible depuis <a href=\"https:\/\/www.whiler.com\/freewares\/download?unique_id.zip\" title=\"T\u00e9l\u00e9charger le code source\">ce lien<\/a>.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"\/whiler\/wp-content\/uploads\/2010\/08\/stat_sys_warning_red.png\" alt=\"Attention !!!\" width=\"32\" height=\"32\" class=\"size-full wp-image-1503\" \/> Sous Android, la permission <em>Lire l&rsquo;\u00e9tat du t\u00e9l\u00e9phone<\/em> (<em>Read Phone State<\/em>) est n\u00e9cessaire sinon une erreur est d\u00e9clench\u00e9e.<\/p>\n<p>&nbsp;<\/p>\n<blockquote><p>Code d\u00e9velopp\u00e9 avec <a target=\"_blank\" href=\"https:\/\/www.embarcadero.com\/fr\/products\/delphi\" rel=\"noopener\">Embarcadero Delphi XE5<\/a>.<\/p><\/blockquote>\n<p><center><a href=\"\/whiler\/category\/computer\/delphi\/\" title=\"Articles concernant Delphi\"><img loading=\"lazy\" decoding=\"async\" src=\"\/whiler\/wp-content\/uploads\/2009\/10\/built_with_delphi.png\" alt=\"D\u00e9velopp\u00e9 en Delphi\" title=\"D\u00e9velopp\u00e9 en Delphi\" width=\"125\" height=\"51\" class=\"size-full wp-image-2721\" \/><\/a><\/center><\/p>\n<div class=\"thanks_button_div\" \n                  style=\"float: right; margin-right: 10px; margin-top:10px;\"><div id=\"thanksButtonDiv_5286_1\" style=\"background-image:url(https:\/\/blogs.wittwer.fr\/whiler\/wp-content\/plugins\/thanks-you-counter-button\/images\/thanks_compact_brown1.png); background-repeat:no-repeat; float: left; display: inline;\"\n                onmouseover=\"javascript:thankYouChangeButtonImage('thanksButtonDiv_5286_1', true);\" \n                onmouseout=\"javascript:thankYouChangeButtonImage('thanksButtonDiv_5286_1', false);\"\n                onclick=\"javascript:thankYouChangeButtonImage('thanksButtonDiv_5286_1', false);\" >\n                <input type=\"button\" onclick=\"thankYouButtonClick(5286, 'You left &ldquo;Thanks&rdquo; already for this post')\" value=\"Merci\u00a0 2\"\n                  class=\"thanks_button thanks_compact thanks_brown1\"\n                  style=\"  font-family: Verdana, Arial, Sans-Serif; font-size: 14px; font-weight: normal;; color:#00f;\"\n                  id=\"thanksButton_5286_1\" title=\"Click to leave &ldquo;Thanks&rdquo; for this post\"\/>\n             <\/div><div id=\"ajax_loader_5286_1\" style=\"display:inline;visibility: hidden;\"><img decoding=\"async\" alt=\"ajax loader\" src=\"https:\/\/blogs.wittwer.fr\/whiler\/wp-content\/plugins\/thanks-you-counter-button\/images\/ajax-loader.gif\" \/><\/div><\/div>","protected":false},"excerpt":{"rendered":"<p>Pendant le dernier \u00e9pisode du D\u00e9v du Jeudi, un participant a demand\u00e9 comment avoir un identifiant unique depuis une application install\u00e9e sur un p\u00e9riph\u00e9rique mobile.<\/p>\n<p>Google &#038; Apple ne proposant pas les m\u00eames fonctionnalit\u00e9s dans leurs SDKs respectifs, pour l\u2019exemple fourni dans cet article, je vais me baser sur :<\/p>\n<p>&#8211;    le num\u00e9ro IMEI sous Android<br \/>\n&#8211;    le code IDFV sous iOS<br \/>\n&#8230;<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_links_to":"","_links_to_target":""},"categories":[132,7,6],"tags":[158,27,154,146],"class_list":["post-5286","post","type-post","status-publish","format-standard","hentry","category-android","category-delphi","category-dev","tag-android","tag-coloration-syntaxique","tag-delphi","tag-firemonkey"],"_links":{"self":[{"href":"https:\/\/blogs.wittwer.fr\/whiler\/wp-json\/wp\/v2\/posts\/5286","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blogs.wittwer.fr\/whiler\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blogs.wittwer.fr\/whiler\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blogs.wittwer.fr\/whiler\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/blogs.wittwer.fr\/whiler\/wp-json\/wp\/v2\/comments?post=5286"}],"version-history":[{"count":1,"href":"https:\/\/blogs.wittwer.fr\/whiler\/wp-json\/wp\/v2\/posts\/5286\/revisions"}],"predecessor-version":[{"id":6327,"href":"https:\/\/blogs.wittwer.fr\/whiler\/wp-json\/wp\/v2\/posts\/5286\/revisions\/6327"}],"wp:attachment":[{"href":"https:\/\/blogs.wittwer.fr\/whiler\/wp-json\/wp\/v2\/media?parent=5286"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogs.wittwer.fr\/whiler\/wp-json\/wp\/v2\/categories?post=5286"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogs.wittwer.fr\/whiler\/wp-json\/wp\/v2\/tags?post=5286"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}