當前位置:首頁 » 編程語言 » c語言uuid
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言uuid

發布時間: 2022-01-15 15:53:25

『壹』 c語言創建快捷方式

1、將C語言編輯器裝在哪個文件夾下,找到那兒,應該有個比較鮮艷的圖標,選中它後點右鍵,創建快捷方式,應該就可以了,如果找不到,那就到控制面板裡面去將它卸載後重新安裝的時候將它的安裝路徑記下來,就可以找到那兒創建快捷方式了
2、常式:

#defineSTRICT
#include<windows.h>
/*Cruntimelibraryheaders*/
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
/*COMheaders(requiresshell32.lib,ole32.lib,uuid.lib)*/
#include<objbase.h>
#include<shlobj.h>
staticHRESULTCreateShortCut(LPSTRpszTargetfile,LPSTRpszTargetargs,
LPSTRpszLinkfile,LPSTRpszDescription,
intiShowmode,LPSTRpszCurdir,
LPSTRpszIconfile,intiIconindex)
{
HRESULThRes;/*ReturnedCOMresultcode*/
IShellLink*pShellLink;/*IShellLinkobjectpointer*/
IPersistFile*pPersistFile;/*IPersistFileobjectpointer*/
WORDwszLinkfile[MAX_PATH];/*pszLinkfileasUnicodestring*/
intiWideCharsWritten;/*Numberofwidecharacterswritten*/
hRes=E_INVALIDARG;
if(
(pszTargetfile!=NULL)&&(strlen(pszTargetfile)>0)&&
(pszTargetargs!=NULL)&&
(pszLinkfile!=NULL)&&(strlen(pszLinkfile)>0)&&
(pszDescription!=NULL)&&
(iShowmode>=0)&&
(pszCurdir!=NULL)&&
(pszIconfile!=NULL)&&
(iIconindex>=0)
)
{
hRes=CoCreateInstance(&CLSID_ShellLink,/*pre-*/
NULL,/**/
CLSCTX_INPROC_SERVER,/**/
&IID_IShellLink,/*pre-*/
&pShellLink);/**/
if(SUCCEEDED(hRes))
{
/**/
hRes=pShellLink->lpVtbl->SetPath(pShellLink,pszTargetfile);
hRes=pShellLink->lpVtbl->SetArguments(pShellLink,pszTargetargs);
if(strlen(pszDescription)>0)
{
hRes=pShellLink->lpVtbl->SetDescription(pShellLink,pszDescription);
}
if(iShowmode>0)
{
hRes=pShellLink->lpVtbl->SetShowCmd(pShellLink,iShowmode);
}
if(strlen(pszCurdir)>0)
{
hRes=pShellLink->lpVtbl->SetWorkingDirectory(pShellLink,pszCurdir);
}
if(strlen(pszIconfile)>0&&iIconindex>=0)
{
hRes=pShellLink->lpVtbl->SetIconLocation(pShellLink,pszIconfile,iIconindex);
}
/**/
hRes=pShellLink->lpVtbl->QueryInterface(pShellLink,/*existingIShellLinkobject*/
&IID_IPersistFile,/*pre-*/
&pPersistFile);/**/
if(SUCCEEDED(hRes))
{
iWideCharsWritten=MultiByteToWideChar(CP_ACP,0,pszLinkfile,-1,wszLinkfile,MAX_PATH);
hRes=pPersistFile->lpVtbl->Save(pPersistFile,wszLinkfile,TRUE);
pPersistFile->lpVtbl->Release(pPersistFile);
}
pShellLink->lpVtbl->Release(pShellLink);
}
}
return(hRes);
}
intmain(intn,char**argv)
{
HRESULThRes;/*resultofcallingCOMfunctions*/
hRes=CoInitialize(NULL);
if(SUCCEEDED(hRes))
{
hRes=CreateShortCut(argv[0],
"",/*Targetarguments*/
"E:\sam.lnk",/*Short-cutfilename*/
"Samurai2",/*Short-cutdescription*/
SW_SHOW,/*Showmodeconstant*/
"",/*Workingdirectoryforlinkedfile*/
"",/*Iconfileshownforthelink*/
0);/*Indexoficoninthefile*/
}
/*callCoUninitialize()andexittheprogram.*/
CoUninitialize();
return0;
}

『貳』 怎麼用C語言創建桌面快捷方式(windows環境)

1,設為信任。2。上傳360。

『叄』 c語言問題

這是你用void形式定義了一個函數而又要求它帶回返回值造成的。把void改成整型,實型等有返回值的就可以了

『肆』 linux下C語言的庫函數的頭文件放在哪個目錄下啊

一般來說是放在/usr/include目錄下的;

但是這個並不局限也是可控的,如果我們進行開發過程中, 就會在內核的庫函數文件目錄:

例如在:/XXX/XXX/linux-X.X/include

所以根據不同的情況,頭文件存放的目錄也是不同的,具體需要可以根據locate和grep命令進行查詢。

『伍』 C語言編寫的winnt.h代碼

/*++ BUILD Version: 0087 Increment this if a change has global effects

Copyright (c) 1990-1999 Microsoft Corporation

Mole Name:

winnt.h

Abstract:

This mole defines the 32-Bit Windows types and constants that are
defined by NT, but exposed through the Win32 API.

Revision History:

--*/

#ifndef _WINNT_
#define _WINNT_

#ifdef __cplusplus
extern "C" {
#endif

#include <ctype.h>
#define ANYSIZE_ARRAY 1

#if defined(_M_MRX000) && !(defined(MIDL_PASS) || defined(RC_INVOKED)) && defined(ENABLE_RESTRICTED)
#define RESTRICTED_POINTER __restrict
#else
#define RESTRICTED_POINTER
#endif

#if defined(_M_MRX000) || defined(_M_ALPHA) || defined(_M_PPC) || defined(_M_IA64)
#define UNALIGNED __unaligned
#if defined(_WIN64)
#define UNALIGNED64 __unaligned
#else
#define UNALIGNED64
#endif
#else
#define UNALIGNED
#define UNALIGNED64
#endif

#if defined(_WIN64) || defined(_M_ALPHA)
#define MAX_NATURAL_ALIGNMENT sizeof(ULONGLONG)
#else
#define MAX_NATURAL_ALIGNMENT sizeof(DWORD)
#endif

//
// TYPE_ALIGNMENT will return the alignment requirements of a given type for
// the current platform.
//

#ifndef __cplusplus
#define TYPE_ALIGNMENT( t ) \
FIELD_OFFSET( struct { char x; t test; }, test )
#endif

#if defined(_WIN64)

#define PROBE_ALIGNMENT( _s ) (TYPE_ALIGNMENT( _s ) > TYPE_ALIGNMENT( DWORD ) ? \
TYPE_ALIGNMENT( _s ) : TYPE_ALIGNMENT( DWORD ))

#else

#define PROBE_ALIGNMENT( _s ) TYPE_ALIGNMENT( DWORD )

#endif

//
// C_ASSERT() can be used to perform many compile-time assertions:
// type sizes, field offsets, etc.
//
// An assertion failure results in error C2118: negative subscript.
//

#define C_ASSERT(e) typedef char __C_ASSERT__[(e)?1:-1]

#if !defined(_MAC) && (defined(_M_MRX000) || defined(_M_ALPHA) || defined(_M_IA64)) && (_MSC_VER >= 1100) && !(defined(MIDL_PASS) || defined(RC_INVOKED))
#define POINTER_64 __ptr64
typedef unsigned __int64 POINTER_64_INT;
#if defined(_WIN64)
#define POINTER_32 __ptr32
#else
#define POINTER_32
#endif
#else
#if defined(_MAC) && defined(_MAC_INT_64)
#define POINTER_64 __ptr64
typedef unsigned __int64 POINTER_64_INT;
#else
#define POINTER_64
typedef unsigned long POINTER_64_INT;
#endif
#define POINTER_32
#endif

#if defined(_IA64_)
#define FIRMWARE_PTR
#else
#define FIRMWARE_PTR POINTER_32
#endif

#include <basetsd.h>

#if (defined(_M_IX86) || defined(_M_ALPHA) || defined(_M_IA64)) && !defined(MIDL_PASS)
#define DECLSPEC_IMPORT __declspec(dllimport)
#else
#define DECLSPEC_IMPORT
#endif

#ifndef DECLSPEC_NORETURN
#if (_MSC_VER >= 1200) && !defined(MIDL_PASS)
#define DECLSPEC_NORETURN __declspec(noreturn)
#else
#define DECLSPEC_NORETURN
#endif
#endif

#ifndef DECLSPEC_ALIGN
#if (_MSC_VER >= 1300) && !defined(MIDL_PASS)
#define DECLSPEC_ALIGN(x) __declspec(align(x))
#else
#define DECLSPEC_ALIGN(x)
#endif
#endif

#ifndef DECLSPEC_UUID
#if (_MSC_VER >= 1100) && defined (__cplusplus)
#define DECLSPEC_UUID(x) __declspec(uuid(x))
#else
#define DECLSPEC_UUID(x)
#endif
#endif

#ifndef DECLSPEC_NOVTABLE
#if (_MSC_VER >= 1100) && defined(__cplusplus)
#define DECLSPEC_NOVTABLE __declspec(novtable)
#else
#define DECLSPEC_NOVTABLE
#endif
#endif

#ifndef DECLSPEC_SELECTANY
#if (_MSC_VER >= 1100)
#define DECLSPEC_SELECTANY __declspec(selectany)
#else
#define DECLSPEC_SELECTANY
#endif
#endif

#ifndef NOP_FUNCTION
#if (_MSC_VER >= 1210)
#define NOP_FUNCTION __noop
#else
#define NOP_FUNCTION (void)0
#endif
#endif

#ifndef DECLSPEC_ADDRSAFE
#if (_MSC_VER >= 1200) && (defined(_M_ALPHA) || defined(_M_AXP64))
#define DECLSPEC_ADDRSAFE __declspec(address_safe)
#else
#define DECLSPEC_ADDRSAFE
#endif
#endif

typedef void *PVOID;
typedef void * POINTER_64 PVOID64;

#if (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED)
#define NTAPI __stdcall
#else
#define _cdecl
#define NTAPI
#endif

//
// Define API decoration for direct importing system DLL references.
//

#if !defined(_NTSYSTEM_)
#define NTSYSAPI DECLSPEC_IMPORT
#define NTSYSCALLAPI DECLSPEC_IMPORT
#else
#define NTSYSAPI
#if defined(_NTDLLBUILD_)
#define NTSYSCALLAPI
#else
#define NTSYSCALLAPI DECLSPEC_ADDRSAFE
#endif

#endif

//
// Basics
//

#ifndef VOID
#define VOID void
typedef char CHAR;
typedef short SHORT;
typedef long LONG;
#endif

//
// UNICODE (Wide Character) types
//

#ifndef _MAC
typedef wchar_t WCHAR; // wc, 16-bit UNICODE character
#else
// some Macintosh compilers don't define wchar_t in a convenient location, or define it as a char
typedef unsigned short WCHAR; // wc, 16-bit UNICODE character
#endif

typedef WCHAR *PWCHAR;
typedef WCHAR *LPWCH, *PWCH;
typedef CONST WCHAR *LPCWCH, *PCWCH;
typedef WCHAR *NWPSTR;
typedef WCHAR *LPWSTR, *PWSTR;

typedef CONST WCHAR *LPCWSTR, *PCWSTR;

//
// ANSI (Multi-byte Character) types
//
typedef CHAR *PCHAR;
typedef CHAR *LPCH, *PCH;

typedef CONST CHAR *LPCCH, *PCCH;
typedef CHAR *NPSTR;
typedef CHAR *LPSTR, *PSTR;
typedef CONST CHAR *LPCSTR, *PCSTR;

//
// Neutral ANSI/UNICODE types and macros
//
#ifdef UNICODE // r_winnt

#ifndef _TCHAR_DEFINED
typedef WCHAR TCHAR, *PTCHAR;
typedef WCHAR TBYTE , *PTBYTE ;
#define _TCHAR_DEFINED
#endif /* !_TCHAR_DEFINED */

typedef LPWSTR LPTCH, PTCH;
typedef LPWSTR PTSTR, LPTSTR;
typedef LPCWSTR PCTSTR, LPCTSTR;
typedef LPWSTR LP;
#define __TEXT(quote) L##quote // r_winnt

#else /* UNICODE */ // r_winnt

#ifndef _TCHAR_DEFINED
typedef char TCHAR, *PTCHAR;
typedef unsigned char TBYTE , *PTBYTE ;
#define _TCHAR_DEFINED
#endif /* !_TCHAR_DEFINED */

typedef LPSTR LPTCH, PTCH;
typedef LPSTR PTSTR, LPTSTR;
typedef LPCSTR PCTSTR, LPCTSTR;
#define __TEXT(quote) quote // r_winnt

#endif /* UNICODE */ // r_winnt
#define TEXT(quote) __TEXT(quote) // r_winnt

typedef SHORT *PSHORT;
typedef LONG *PLONG;

#ifdef STRICT
typedef void *HANDLE;
#define DECLARE_HANDLE(name) struct name##__ { int unused; }; typedef struct name##__ *name
#else
typedef PVOID HANDLE;
#define DECLARE_HANDLE(name) typedef HANDLE name
#endif
typedef HANDLE *PHANDLE;

//
// Flag (bit) fields
//

typedef BYTE FCHAR;
typedef WORD FSHORT;
typedef DWORD FLONG;

// Component Object Model defines, and macros

#ifndef _HRESULT_DEFINED
#define _HRESULT_DEFINED
typedef LONG HRESULT;

#endif // !_HRESULT_DEFINED

#ifdef __cplusplus
#define EXTERN_C extern "C"
#else
#define EXTERN_C extern
#endif

#if defined(_WIN32) || defined(_MPPC_)

// Win32 doesn't support __export

#ifdef _68K_
#define STDMETHODCALLTYPE __cdecl
#else
#define STDMETHODCALLTYPE __stdcall
#endif
#define STDMETHODVCALLTYPE __cdecl

#define STDAPICALLTYPE __stdcall
#define STDAPIVCALLTYPE __cdecl

#else

#define STDMETHODCALLTYPE __export __stdcall
#define STDMETHODVCALLTYPE __export __cdecl

#define STDAPICALLTYPE __export __stdcall
#define STDAPIVCALLTYPE __export __cdecl

#endif

#define STDAPI EXTERN_C HRESULT STDAPICALLTYPE
#define STDAPI_(type) EXTERN_C type STDAPICALLTYPE

#define STDMETHODIMP HRESULT STDMETHODCALLTYPE
#define STDMETHODIMP_(type) type STDMETHODCALLTYPE

// The 'V' versions allow Variable Argument lists.

#define STDAPIV EXTERN_C HRESULT STDAPIVCALLTYPE
#define STDAPIV_(type) EXTERN_C type STDAPIVCALLTYPE

#define STDMETHODIMPV HRESULT STDMETHODVCALLTYPE
#define STDMETHODIMPV_(type) type STDMETHODVCALLTYPE

typedef char CCHAR;
typedef DWORD LCID;
typedef PDWORD PLCID;
typedef WORD LANGID;
#define APPLICATION_ERROR_MASK 0x20000000
#define ERROR_SEVERITY_SUCCESS 0x00000000
#define ERROR_SEVERITY_INFORMATIONAL 0x40000000
#define ERROR_SEVERITY_WARNING 0x80000000
#define ERROR_SEVERITY_ERROR 0xC0000000

//
// _M_IX86 included so that EM CONTEXT structure compiles with
// x86 programs. *** TBD should this be for all architectures?
//

//
// 16 byte aligned type for 128 bit floats
//

//
// For we define a 128 bit structure and use __declspec(align(16)) pragma to
// align to 128 bits.
//

#if defined(_M_IA64) && !defined(MIDL_PASS)
__declspec(align(16))
#endif
typedef struct _FLOAT128 {
__int64 LowPart;
__int64 HighPart;
} FLOAT128;

typedef FLOAT128 *PFLOAT128;

//
// __int64 is only supported by 2.0 and later midl.
// __midl is set by the 2.0 midl and not by 1.0 midl.
//

#define _ULONGLONG_
#if (!defined (_MAC) && (!defined(MIDL_PASS) || defined(__midl)) && (!defined(_M_IX86) || (defined(_INTEGRAL_MAX_BITS) && _INTEGRAL_MAX_BITS >= 64)))
typedef __int64 LONGLONG;
typedef unsigned __int64 ULONGLONG;

#define MAXLONGLONG (0x7fffffffffffffff)
#else

#if defined(_MAC) && defined(_MAC_INT_64)
typedef __int64 LONGLONG;
typedef unsigned __int64 ULONGLONG;

#define MAXLONGLONG (0x7fffffffffffffff)
#else
typedef double LONGLONG;
typedef double ULONGLONG;
#endif //_MAC and int64

#endif

typedef LONGLONG *PLONGLONG;
typedef ULONGLONG *PULONGLONG;

// Update Sequence Number

typedef LONGLONG USN;

#if defined(MIDL_PASS)
typedef struct _LARGE_INTEGER {
#else // MIDL_PASS
typedef union _LARGE_INTEGER {
struct {
DWORD LowPart;
LONG HighPart;
};
struct {
DWORD LowPart;
LONG HighPart;
} u;
#endif //MIDL_PASS
LONGLONG QuadPart;
} LARGE_INTEGER;

typedef LARGE_INTEGER *PLARGE_INTEGER;

下略

太多,貼不完。

請去下載Windows DDK

『陸』 怎麼用codeblocks編寫c語言的圖形程序

在codeblocks中,可以通過集成EGE庫,來實現C語言圖形程序的編寫,具體方式如下:

一、安裝:

1、下載ege安裝包;

2、將安裝包解壓;

3、把壓縮包里include目錄下所有文件,復制到編譯器安裝目錄下的include目錄內,例如D:MinGWinclude;

4、把lib目錄下對應編譯器名目錄下的文件,復制到編譯器安裝目錄下的lib目錄內,例如D:MinGWlib。

二、建立工程:

只要第1步做好以後,其實已經安裝好ege了,剩下的只是配置build option.
點擊file-new-projects,選擇Console application:

『柒』 用nmake編譯C語言,寫一個makefile代碼

make : huffman.exe
echo "make finish"

huffman.exe:huffman.c
cl huffman.c

『捌』 聽說iOS 14新規會限制設備讀取IDFA,完了,我們以後是不是不能投放程序化廣告了

CFUUID從iOS2.0開始,CFUUID就已經出現了。它是CoreFoundatio包的一部分,因此API屬於C語言風格。CFUUIDCreate 方法用來創建CFUUIDRef,並且可以獲得一個相應的NSString,如下代碼: CFUUIDRef cfuuid =CFUUIDCreate(kCFAllocatorDefault); NSString *cfuuidString =(NSString*)CFBridgingRelease(CFUUIDCreateString(kCFAllocatorDefault, cfuuid)); 復制代碼 獲得的這個CFUUID值系統並沒有存儲。每次調用CFUUIDCreate,系統都會返回一個新的唯一標示符。如果你希望存儲這個標示符,那麼需要自己將其存儲到NSUserDefaults, Keychain, Pasteboard或其它地方。 示例: 68753A44-4D6F-1226-9C60-0050E4C00067 NSUUIDNSUUID在iOS 6中才出現,這跟CFUUID幾乎完全一樣,只不過它是Objective-C介面。+ (id)UUID 是一個類方法,調用該方法可以獲得一個UUID。通過下面的代碼可以獲得一個UUID字元串: NSString *uuid =[[NSUUID UUID] UUIDString]; 復制代碼 跟CFUUID一樣,這個值系統也不會存儲,每次調用的時候都會獲得一個新的唯一標示符。如果要存儲的話,你需要自己存儲。在我讀取NSUUID時,注意到獲取到的這個值跟CFUUID完全一樣(不過也可能不一樣): 示例: 68753A44-4D6F-1226-9C60-0050E4C00067 廣告標示符(IDFA-identifierForIdentifier)這是iOS 6中另外一個新的方法,advertisingIdentifier 是新框架AdSupport.framework的一部分。ASIdentifierManager單例提供了一個方法advertisingIdentifier,通過調用該方法會返回一個上面提到的NSUUID實例。 NSString *adId =[[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString]; 復制代碼 跟CFUUID和NSUUID不一樣,廣告標示符是由系統存儲著的。不過即使這是由系統存儲的,但是有幾種情況下,會重新生成廣告標示符。如果用戶完全重置系統((設置程序 -> 通用 -> 還原 -> 還原位置與隱私) ,這個廣告標示符會重新生成。另外如果用戶明確的還原廣告(設置程序-> 通用 -> 關於本機 -> 廣告 -> 還原廣告標示符) ,那麼廣告標示符也會重新生成。關於廣告標示符的還原,有一點需要注意:如果程序在後台運行,此時用戶「還原廣告標示符」,然後再回到程序中,此時獲取廣告標示符並不會立即獲得還原後的標示符。必須要終止程序,然後再重新啟動程序,才能獲得還原後的廣告標示符。之所以會這樣,我猜測是由於 ASIdentifierManager是一個單例

『玖』 ios cfuuidcreate 會重復嗎

CFUUID從iOS2.0開始,CFUUID就已經出現了。它是CoreFoundatio包的一部分,因此API屬於C語言風格。CFUUIDCreate 方法用來創建CFUUIDRef,並且可以獲得一個相應的NSString,如下代碼:

CFUUIDRef cfuuid =CFUUIDCreate(kCFAllocatorDefault);

NSString *cfuuidString =(NSString*)CFBridgingRelease(CFUUIDCreateString(kCFAllocatorDefault, cfuuid));
復制代碼

獲得的這個CFUUID值系統並沒有存儲。每次調用CFUUIDCreate,系統都會返回一個新的唯一標示符。如果你希望存儲這個標示符,那麼需要自己將其存儲到NSUserDefaults, Keychain, Pasteboard或其它地方。

示例: 68753A44-4D6F-1226-9C60-0050E4C00067

NSUUIDNSUUID在iOS 6中才出現,這跟CFUUID幾乎完全一樣,只不過它是Objective-C介面。+ (id)UUID 是一個類方法,調用該方法可以獲得一個UUID。通過下面的代碼可以獲得一個UUID字元串:

NSString *uuid =[[NSUUID UUID] UUIDString];
復制代碼

跟CFUUID一樣,這個值系統也不會存儲,每次調用的時候都會獲得一個新的唯一標示符。如果要存儲的話,你需要自己存儲。在我讀取NSUUID時,注意到獲取到的這個值跟CFUUID完全一樣(不過也可能不一樣):

示例: 68753A44-4D6F-1226-9C60-0050E4C00067

廣告標示符(IDFA-identifierForIdentifier)這是iOS 6中另外一個新的方法,advertisingIdentifier 是新框架AdSupport.framework的一部分。ASIdentifierManager單例提供了一個方法advertisingIdentifier,通過調用該方法會返回一個上面提到的NSUUID實例。

NSString *adId =[[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];
復制代碼

跟CFUUID和NSUUID不一樣,廣告標示符是由系統存儲著的。不過即使這是由系統
存儲的,但是有幾種情況下,會重新生成廣告標示符。如果用戶完全重置系統((設置程序 -> 通用 -> 還原 ->
還原位置與隱私) ,這個廣告標示符會重新生成。另外如果用戶明確的還原廣告(設置程序-> 通用 -> 關於本機 -> 廣告
-> 還原廣告標示符)
,那麼廣告標示符也會重新生成。關於廣告標示符的還原,有一點需要注意:如果程序在後台運行,此時用戶「還原廣告標示符」,然後再回到程序中,此時獲取廣
告標示符並不會立即獲得還原後的標示符。必須要終止程序,然後再重新啟動程序,才能獲得還原後的廣告標示符。之所以會這樣,我猜測是由於
ASIdentifierManager是一個單例

『拾』 電腦出現「不支持通用唯一標志符(uuid)類型」什麼意思

英文原文:In iOS 7 and later, if you ask for the MAC address of an iOS device, the system returns the value 02:00:00:00:00:00. If you need to identify the device, use the identifierForVendor property of UIDevice instead. (Apps that need an identifier for their own advertising purposes should consider using the advertisingIdentifier property of ASIdentifierManager instead.)
翻譯:從iOS7及更高版本往後,如果你向ios設備請求獲取mac地址,系統將返回一個固定值「02:00:00:00:00:00」,如果你需要識別設備的 唯一性,請使用UIDevice的identifierForVendor屬性。(因廣告目的而需要識別設備的應用,請考慮使用 ASIdentifierManager的advertisingIdentifier屬性作為替代)
這個MAC地址是指什麼?有什麼用?
MAC(Medium/Media Access Control)地址,用來表示互聯網上每一個站點的標識符,採用十六進制數表示,共六個位元組(48位)。其中,前三個位元組是由IEEE的注冊管理機構 RA負責給不同廠家分配的代碼(高位24位),也稱為「編制上唯一的標識符」 (Organizationally Unique Identifier),後三個位元組(低位24位)由各廠家自行指派給生產的適配器介面,稱為擴展標識符(唯一性)。
MAC地址在網路上用來區分設備的唯一性,接入網路的設備都有一個MAC地址,他們肯定都是不同的,是唯一的。一部iPhone上可能有多個MAC地址,包括WIFI的、SIM的等,但是iTouch和iPad上就有一個WIFI的,因此只需獲取WIFI的MAC地址就好了,也就是en0的地址。
形象的說,MAC地址就如同我們身份證上的身份證號碼,具有全球唯一性。這樣就可以非常好的標識設備唯一性,類似與蘋果設備的UDID號,通常的用途有:1)用於一些統計與分析目的,利用用戶的操作習慣和數據更好的規劃產品;2)作為用戶ID來唯一識別用戶,可以用遊客身份使用app又能在伺服器端保存相應的信息,省去用戶名、密碼等注冊過程。
那麼,如何使用Mac地址生成設備的唯一標識呢?主要分三種:
直接使用「MAC Address」
使用「MD5(MAC Address)」
使用「MD5(Mac Address+bundle_id)」獲得「機器+應用」的唯一標識(bundle_id 是應用的唯一標識)
iOS7之前,因為Mac地址是唯一的, 一般app開發者會採取第3種方式來識別安裝對應app的設備。為什麼會使用它?在iOS5之前,都是使用UDID的,後來被禁用。蘋果推薦使用UUID 但是也有諸多問題,從而使用MAC地址。而MAC地址跟UDID一樣,存在隱私問題,現在蘋果新發布的iOS7上,如果請求Mac地址都會返回一個固定 值,那麼Mac Address+bundle_id這個值大家的設備都變成一致的啦,跟UDID一樣相當於被禁用。那麼,要怎麼標識設備唯一呢?
在iOS系統中,獲取設備唯一標識的方法有很多:
一.UDID(Unique Device Identifier)
二.UUID(Universally Unique Identifier)
三.MAC Address
四.OPEN UDID
五.廣告標示符(IDFA-identifierForIdentifier)
六.Vendor標示符 (IDFV-identifierForVendor)
七.推送token+bundle_id
UDID的全稱是Unique Device Identifier,它就是蘋果IOS設備的唯一識別碼,它由40個字元的字母和數字組成(越獄的設備通過某些工具可以改變設備的UDID)。移動網路可利用UDID來識別移動設備,但是,從IOS5.0(2011年8月份)開始,蘋果宣布將不再支持用uniqueIdentifier方法獲取設備的UDID,iOS5以下是可以用的。在2013年3月21日蘋果已經通知開發者:從2013年5月1日起,訪問UIDIDs的程序將不再被審核通過,替代的方案是開發者應該使用「在iOS 6中介紹的Vendor或Advertising標示符」。所以UDID是絕對不能用啦。
OPEN UDID,沒有用到MAC地址,同時能保證同一台設備上的不同應用使用同一個OpenUDID,只要用戶設備上有一個使用了OpenUDID的應用存在時,其他後續安裝的應用如果獲取OpenUDID,都將會獲得第一個應用生成的那個。但是根據貢獻者的代碼和方法,和一些開發者的經驗,如果把使用了OpenUDID方案的應用全部都刪除,再重新獲取OpenUDID,此時的OpenUDID就跟以前的不一樣。可見,這種方法還是不保險。
廣告標示符,是iOS 6中另外一個新的方法,提供了一個方法advertisingIdentifier,通過調用該方法會返回一個NSUUID實例,最後可以獲得一個UUID,由系統存儲著的。不過即使這是由系統存儲的,但是有幾種情況下,會重新生成廣告標示符。如果用戶完全重置系統((設置程序 -> 通用 -> 還原 -> 還原位置與隱私) ,這個廣告標示符會重新生成。另外如果用戶明確的還原廣告(設置程序-> 通用 -> 關於本機 -> 廣告 -> 還原廣告標示符) ,那麼廣告標示符也會重新生成。關於廣告標示符的還原,有一點需要注意:如果程序在後台運行,此時用戶「還原廣告標示符」,然後再回到程序中,此時獲取廣 告標示符並不會立即獲得還原後的標示符。必須要終止程序,然後再重新啟動程序,才能獲得還原後的廣告標示符。
Vendor標示符,也是在iOS 6中新增的,跟advertisingIdentifier一樣,該方法返回的是一個 NSUUID對象,可以獲得一個UUID。如果滿足條件「相同的一個程序裡面-相同的vendor-相同的設備」,那麼獲取到的這個屬性值就不會變。如果是「相同的程序-相同的設備-不同的vendor,或者是相同的程序-不同的設備-無論是否相同的vendor」這樣的情況,那麼這個值是不會相同的。
推送token+bundle_id的方法:
應用中增加推送用來獲取token
獲取應用bundle_id
根據token+bundle_id進行散列運算
apple push token保證設備唯一,但必須有網路情況下才能工作,該方法不依賴於設備本身,但依賴於apple push,而蘋果push有時候會抽風的。
UUID是Universally Unique Identifier的縮寫,中文意思是通用唯一識別碼。它是讓分布式系統中的所有元素,都能有唯一的辨識資訊,而不需要透過中央控制端來做辨識資訊的指定。這樣,每個人都可以建立不與其它人沖突的 UUID。在此情況下,就不需考慮資料庫建立時的名稱重復問題。蘋果公司建議使用UUID為應用生成唯一標識字元串。
iOS中獲取UUID的代碼如下:
-(NSString*) uuid {
CFUUIDRef puuid = CFUUIDCreate( nil );
CFStringRef uuidString = CFUUIDCreateString( nil, puuid );
NSString * result = (NSString *)CFStringCreateCopy( NULL, uuidString);
CFRelease(puuid);
CFRelease(uuidString);
return [result autorelease];
}

開發者可以在應用第一次啟動時調用一 次,然後將該串存儲起來,以便以後替代UDID來使用。但是,如果用戶刪除該應用再次安裝時,又會生成新的字元串,所以不能保證唯一識別該設備。這就需要各路高手想出各種解決方案。所以,之前很多應用就採用MAC Address。但是現在如果用戶升級到iOS7(及其以後的蘋果系統)後,他們機子的MAC Address就是一樣的,沒辦法做區分,只能棄用此方法,重新使用UUID來標識。如果使用UUID,就要考慮應用被刪除後再重新安裝時的處理。
一個解決的辦法是:UUID一般只生成一次,保存在iOS系統裡面,如果應用刪除了,重裝應用之後它的UUID還是一樣的,除非系統重置 。但是不能保證在以後的系統升級後還能用(如果系統保存了該信息就能用)。