如何使用KeyChain儲存和獲取UDID

2021-09-30 10:49:14 字數 3452 閱讀 3061

一、ios不用版本獲取udid的方法比較

1)ios 5.0

ios 2.0版本以後uidevice提供乙個獲取裝置唯一識別符號的方法uniqueidentifier,通過該方法我們可以獲取裝置的序列號,這個也是目前為止唯一可以確認唯一的標示符。好景不長,因為該唯一識別符號與手機一一對應,蘋果覺得可能會洩露使用者隱私,所以在 ios 5.0之後該方法就被廢棄掉了。

2)ios 6.0

ios 6.0系統新增了兩個用於替換uniqueidentifier的介面,分別是:identifierforvendor,advertisingidentifier。

identifierforvendor介面的官方文件介紹如下:

3)ios 7.0

二、keychain介紹

我們搞ios開發,一定都知道os x裡面的keychain(鑰匙串),通常要鄉鎮及除錯的話,都得安裝證書之類的,這些證書就是儲存在keychain中,還有我們平時瀏覽網頁記錄的賬號密碼也都是記錄在keychain中。ios中的keychain相比os x比較簡單,整個系統只有乙個keychain,每個程式都可以往keychain中記錄資料,而且只能讀取到自己程式記錄在keychain中的資料。ios中security.framework框架提供了四個主要的方法來操作keychain:

// 查詢

osstatus secitemcopymatching(cfdictionaryref query, cftyperef *result);

// 新增

osstatus secitemadd(cfdictionaryref attributes, cftyperef *result);

// 更新keychain中的item

osstatus secitemupdate(cfdictionaryref query, cfdictionaryref attributestoupdate);

// 刪除keychain中的item

c、在**中往keychain中add資料的時候,設定ksecattraccessgroup,**如下:

if (accessgroup != nil)

這段**是從官方的demo中直接拷貝過來的,根據注釋我們可以看到,模擬器是不支援accessgroup的,所以才行了預編譯巨集來選擇性新增。

三、使用keychain儲存和獲取udid

說了這麼多終於進入正題了,如何在ios 7上面獲取到不變的udid。我們將第二部分所講的知識直接應用進來就可以了輕鬆達到我們要的效果了,下面我們先看看往如何將獲取到的identifierforvendor新增到keychain中的**。

+ (bool)settudidtokeychain:(nsstring*)udid

const

char *udidstr = [udid utf8string];

nsdata *keychainitemvalue = [nsdata datawithbytes:udidstr length:strlen(udidstr)];

[dictforadd setvalue:keychainitemvalue forkey:(id)ksecvaluedata];

osstatus writeerr = noerr;

if ([svudidtools getudidfromkeychain])

else

else

}[dictforadd release];

return no;

}

上面**中,首先構建乙個要新增到keychain中資料的dictionary,包含一些基本的keychain item的資料型別,描述,訪問分組以及最重要的資料等資訊,最後通過呼叫secitemadd方法將我們需要儲存的uuid儲存到keychain中。

獲取keychain中相應資料的**如下:

+ (nsstring*)getudidfromkeychain

[dictforquery setvalue:(id)kcfbooleantrue forkey:(id)ksecmatchcaseinsensitive];

[dictforquery setvalue:(id)ksecmatchlimitone forkey:(id)ksecmatchlimit];

[dictforquery setvalue:(id)kcfbooleantrue forkey:(id)ksecreturndata];

osstatus queryerr = noerr;

nsdata *udidvalue = nil;

nsstring *udid = nil;

queryerr = secitemcopymatching((cfdictionaryref)dictforquery, (cftyperef*)&udidvalue);

nsmutabledictionary *dict = nil;

[dictforquery setvalue:(id)kcfbooleantrue forkey:(id)ksecreturnattributes];

queryerr = secitemcopymatching((cfdictionaryref)dictforquery, (cftyperef*)&dict);

if (queryerr == errsecitemnotfound)

else

if (queryerr != errsecsuccess)

if (queryerr == errsecsuccess)

}[dictforquery release];

return udid;

}

上面**的流程也差不多一樣,首先建立乙個dictionary,其中設定一下查詢條件,然後通過secitemcopymatching方法獲取到我們之前儲存到keychain中的資料。

四、總結

你可能有疑問,如果系統公升級以後,是否仍然可以獲取到之前記錄的udid資料?

答案是肯定的,這一點我專門做了測試。就算我們程式刪除掉,系統經過公升級以後再安裝回來,依舊可以獲取到與之前一致的udid。但是當我們把整個系統還原以後是否還能獲取到之前記錄的udid,這一點我覺得應該不行,不過手機裡面資料太多,沒有測試,如果大家有興趣可以測試一下,驗證一下我的猜想。

大家如果要在真機執行時,需要替換兩個地方:

文章和**中如果有什麼不對的地方,歡迎指正,在這兒先謝過了。

分享到:

如何使用KeyChain儲存和獲取UDID

一 ios不用版本獲取udid的方法比較 1 ios 5.0 ios 2.0版本以後uidevice提供乙個獲取裝置唯一識別符號的方法uniqueidentifier,通過該方法我們可以獲取裝置的序列號,這個也是目前為止唯一可以確認唯一的標示符。好景不長,因為該唯一識別符號與手機一一對應,蘋果覺得可...

如何使用KeyChain儲存和獲取UDID

一 ios不用版本獲取udid的方法比較 1 ios 5.0 ios 2.0版本以後uidevice提供乙個獲取裝置唯一識別符號的方法uniqueidentifier,通過該方法我們可以獲取裝置的序列號,這個也是目前為止唯一可以確認唯一的標示符。好景不長,因為該唯一識別符號與手機一一對應,蘋果覺得可...

如何使用KeyChain儲存和獲取UDID

本文屬於裝載 還沒經過實踐 一 ios不用版本獲取udid的方法比較 1 ios 5.0 ios 2.0版本以後uidevice提供乙個獲取裝置唯一識別符號的方法uniqueidentifier,通過該方法我們可以獲取裝置的序列號,這個也是目前為止唯一可以確認唯一的標示符。好景不長,因為該唯一識別符...