ios上取得裝置唯一標誌的解決方案,ios解決方案
iOS 7中蘋果再一次無情的封殺mac地址,現在已經不能擷取ios7裝置的物理地址。那麼在開發中如何才能標識裝置的唯一性呢?apple公司提供的方法是通過keychain來存一些標誌資訊,然後通過存的標誌資訊來讓應用程式來識別該裝置的唯一性。
apple公司寫了一個簡單的操作keychain的工具類:https://developer.apple.com/library/ios/samplecode/GenericKeychain/Listings/Classes_KeychainItemWrapper_m.html可以下載,把KeychainItemWrapper.h,.m檔案引用xcode中,keychainItemWrapper.m檔案可能出錯,這裡是由於arc編譯造成的,我們可以根據提示進行解決,也可以用如的方式解決:
接著設定keychain共用:
此我們可以在項目中看到xxxxx.entitlements結尾的檔案。<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<string>$(AppIdentifierPrefix)h.HelloWorld</string>
</plist>
其中的${AppldentifierPrefix}是開發人員賬戶的的首碼,是apple的公司提供的,https://developer.apple.com/membercenter/index.action,可以用自已的賬戶進行查看。
存取:key chain:
Java代碼
- -(void) setKeyChainValue
- {
- KeychainItemWrapper *keyChainItem=[[KeychainItemWrapper alloc]initWithIdentifier:@"TestUUID" accessGroup:@"XXXXXX.h.HelloWorld"];
- NSString *strUUID = [keyChainItem objectForKey:(id)kSecValueData];
- if (strUUID==nil||[strUUID isEqualToString:@""])
- {
- [keyChainItem setObject:[self gen_uuid] forKey:(id)kSecValueData];
- }
- [keyChainItem release];
-
- }
-
- -(NSString *) gen_uuid
- {
- CFUUIDRef uuid_ref=CFUUIDCreate(nil);
- CFStringRef uuid_string_ref=CFUUIDCreateString(nil, uuid_ref);
- CFRelease(uuid_ref);
- NSString *uuid=[NSString stringWithString:uuid_string_ref];
- CFRelease(uuid_string_ref);
- return uuid;
- }
應用程式第一次在某台裝置上運行時,我們的應用程式儲存一個uuid,來標識該裝置。等裝置把程式刪除時,該uuid依然存在於裝置中。
新手協助:ios中用什唯一標識一個程式?
不知你何處使用
在檔案層面上,每個應用是以沙箱目錄的形式存在,會是隨機產生的類似以下的檔案夾名
D103006C-6807-4A40-AA9A-8564C7CEBB09
在應用程式中,通過Bundle identifier來標識程式的唯一,用於Provisioning profiles的APP ID匹配
怎判斷ios裝置中是否安裝了某款應用
主要思路就是 ,在要被識別的應用程式B的XCode的info.plist中 如果是Xcode 4.2 ,那麼 1. 在info.plist 中 增加 一個 URL Schemes: XXX 添加的具體細節是: 1.1 開啟 info.plist ,在 Information Property List的下面增加一項:URL types 1.2 然後在 URL Types 下面增加一項 Item 0 ,這是個Dictionary 1.3 在 Item0 下面增加一個 URL Schemes 類型的 Array 1.4 然後在URL Schemes 的下面增加一個 URL identifier ,String值可以不填 在Item0 的下面增加一個 Item0, String值就是 XXX 就可以了。 開始在網上 看到說添加 URL Schemes ,以為直接添加到 Information Property List 下面的一項,key為 URL Schemes ,值為 XXX就ok了,後面發現不起作用。這個裡面只能添加指定的類型,會自動提示相關的類型,正確的方法是上面的過程。 如果是Xcode 4.6 ,那麼按照下面的方法添加: 解決方案:從91SDK3.2.5開始要求接入方需要設定一個URL Scheme,設定方法如下:選中工程中的Target,選中Info標籤頁,找到底下的URL Types,展開,點擊加號,建立一個新的URL Scheme。 點擊後,Identifier欄位填入你的軟體標識符,URL Schemes欄位填入格式為:91-xxxxx,其中xxxx為你的軟體標識符。Role欄位可以設定為None,Icon欄位可以不填。樣本如下: 2. 然後 在主動裝置的應用程式A中,通過 這個方法判斷手機中是否存在這個應用B [[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"XXX://"]]; 如果返回YES則表示此應用在手機中安裝過,反之則沒有安裝過. 具體代碼如下: -(BOOL) APCheckIfAppInstalled2:(NSString *)urlSchemes { if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:urlSchemes]]) { NSLog(@" installed"); return YES; } else { return NO; } } 調用APCheckIfAppInstalled2:XXX 就可以判斷 是否安裝了應用程式B 了。 這個方法不管對越獄過的iOS裝置還是沒有越獄過的裝置都生效。 還有另外一個 查看 com.apple.mobile.installation.plist 系統檔案的方法,通過 bundle identifier 來判斷,但是只能判斷越獄機,因為越獄機才能訪問到這個檔案,在非越獄的機器中,因為不允許應用程式訪問沙箱環境以外的目錄,所以不能讀取這個檔案,甚至判斷這個檔案是否存在都會失敗。 代碼如下: -(BOOL) APCheckIfAppInstalled:(NSString *)bundleIdentifier { static NSString *const cacheFileName = @"com.apple.mobile.ins......餘下全文>>