1. 程式人生 > >75.iOS使用KeyChain儲存資料與不同App間共享資料

75.iOS使用KeyChain儲存資料與不同App間共享資料

//研究了一天發現網路上大部分關於keychain的講解都不詳細......自己更是踩雷踩了一天才把KeyChain使用與共享資料研究成功分享到這裡希望大家不用再勞累這麼一次

Apple文件上說iOSkeyChain是一個相對獨立的空間,當程式替換,刪除時並不會刪除keyChain的內容,這個要比Library/Cache好。刷機,恢復出廠應該就沒有了。自己的程式只能訪問自己的keychain,同意開發者下的程式通過設定group可以互相共享同組的keychain(即同一開發者帳號下面的App可以通過這種方式共享資料,不同開發者帳號的App--大叔也無能為力,蘋果還是不允許訪問(當然傳值的話,可以通過

[[UIApplication sharedApplication] openURL:url]來實現)),從而實現程式間可以共同訪問一些資料。

//keyChain 中一些引數的解釋

1.設定Class值,每個Class對應的都有不同的引數型別

2.使用者確定的引數,一般是程式中使用的類別,比如說是"Password""Account Info",作為search的主力條件

3.設定Group,如果不同程式都擁有這個組,那麼不同程式間可以共享這個組的資料

4.只返回第一個匹配資料,查詢方法使用,還有值kSecMatchLimitAll

5.返回資料為CFDicitionaryRef,查詢方法使用

6.執行查詢方法,判斷返回值

eg:這個是none-ARC的程式碼哦!ARC情況下會有bridge提示。

首先我們建立一個Plist檔案名字隨便定義我這裡是KeychainAccessGroups.plist


//需要特別注意的是keyChain共享資料只能在正式環境中使用,測試環境與企業帳號都不能使用accessGroup達到共享資料目的

所以為了方便平時除錯  Target--->Build Settings--->Code Signing Entitlements我們只在Release中加入 O2O手邊/KeychainAccessGroups.plist(這是你配置的KeychainPlist

檔案所在路徑)


1.如果你在 addkey時,沒有指定group,則會預設新增你keychain-access-groups裡第一個group,如果你沒有設定Entitlements,則預設使用對應的程式的bundle name,比如com.jv.key1,表示只能給自己程式使用。

2.如果你程式新增的group並不存在你的配置檔案中,程式會奔潰,表示無法新增。因此你只能新增你配置檔案中支援的keychain

3. keychain-access-groups 中的accessGroup可以直接用$(AppIdentifierPrefix)*  表示AppID.*  (類似於Bundle ID  *表示任意字元)如果你的AppIDGGB3GZ5GNJ  則上面為GGB3GZ5GNJ.*表示該開發者帳號下面的所有App都共享資料

4.  accessGroup格式為“yourAppID.com.yourCompany.whatever”就是你要起的公共區名稱,除了whatever欄位可以隨便定之外,其他的都必須如實填寫。這個檔案的路徑要配置在 Project->build setting->Code Signing Entitlements裡,否則公共區無效,配置好後,須用你正式的證書籤名編譯才可通過,否則xcode會彈框告訴你code signing有問題。所以,蘋果限制了你只能同公司的產品共享KeyChain資料,別的公司訪問不了你公司產品的KeyChain


下面是程式碼實現

程式碼實現首先請下載Apple官方Demo  取出KeychainItemWrapper.h    KeychainItemWrapper.m  檔案(注意由於這個Demo04年就有了用的是MRC  所以ARC環境下新增-fno-objc-arc


+(NSString *)getIdentifierForVendor{
    KeychainItemWrapper *keyChainItem=[[KeychainItemWrapper alloc] initWithIdentifier:@"O2OUserAppHankUUID" accessGroup:@"GGB3GZ5GNJ.*"];
    NSString *strUUID = [keyChainItem objectForKey:(__bridge id)kSecAttrAccount];
    return strUUID;
}
//儲存字串到KeyChain
+(void)saveUUID:(NSString *)uid{
    KeychainItemWrapper *keyChainItem=[[KeychainItemWrapper alloc] initWithIdentifier:@"O2OUserAppHankUUID" accessGroup:@"GGB3GZ5GNJ.*"];
    [keyChainItem setObject:uid forKey:(__bridge id)kSecAttrAccount];<span style="color:#3333ff;">注意方法“- (void)setObject:(id)inObject forKey:(id)key;”裡引數“forKey”的值應該是Security.framework 裡標頭檔案“SecItem.h”裡定義好的key,用其他字串做key程式會崩潰!</span>
}
注意accessGroup  是為了同一個開發者下不同App資料共享  如果只是為了使用KeyChain儲存資料  則這個引數可以傳nil;如果你沒有設定Entitlements,則預設使用對應的程式的bundle name  ,也就是nil表示只有該App才能訪問該資料,這個上面已經說過 )

GGB3GZ5GNJ.*    中的GGB3GZ5GNJ 是App ID Prefix  ---(注意不是Apple ID)


GGB3GZ5GNJ.*  表示 以GGB3GZ5GNJ開頭的所有App都能共享該資料  如果想限制特定App  則為GGB3GZ5GNJ.com.yourCompany.whatever

好了  現在自己建立工程去試一下吧

相關推薦

75.iOS使用KeyChain儲存資料不同App共享資料

//研究了一天發現網路上大部分關於keychain的講解都不詳細......自己更是踩雷踩了一天才把KeyChain使用與共享資料研究成功分享到這裡希望大家不用再勞累這麼一次 Apple文件上說

linux基礎篇(五):檔案歸檔不同系統的檔案傳輸

檔案歸檔 檔案歸檔,就是把多個檔案變成一個歸檔檔案,即將多個檔案打包起來 tar命令 Unix和類Unix系統上的壓縮打包工具,可以將多個檔案合併為一個檔案,打包後的檔名亦為“tar”。tar檔案格式已經成為POSIX標準,最初是POSIX.1-1988,當前是POSIX.1-2

java和python之間資料互動,不同語言傳輸資料:使用RabbitMQ

java和python之間資料互動,不同語言間傳輸資料:使用RabbitMQ 問題描述 方法 方法一:java直接執行python指令碼.py檔案,把資料放到引數裡傳遞 方法二:通過第三方檔案作為中間站 方法三:使用訊息佇列的方式,

iOS 不同App通訊的方式

 iOS系統是相對封閉的系統,App各自在各自的沙盒(sandbox)中執行,每個App都只能讀取系統為該應用程式程式建立的資料夾AppData下的內容,不能隨意跨越自己的沙盒去訪問別的App沙盒中的內

通過URL實現在不同頁面傳輸資料

這樣的URL可以實現網頁間的資料傳遞,就是切換到新的網頁時,舊網頁資料傳給了新網頁。以上面的URL說明:     URL中問號後面跟隨的就是所要傳遞的引數及資料。輸入資料:按鈕的事件如下: Private Sub Button1_Click(ByVal sender As S

iOS的Keychain可以實現App資料共享

百度的移動端產品,有一點體驗做的非常好。比如你手機裡面新裝了百度雲和百度貼吧,現在登入百度雲,再開啟百度貼吧,會發現雖然之前你從沒登入過貼吧,但這時候竟然用你登入百度雲的賬號自動登入了,省去了你再去登入的步驟。這裡有兩個關鍵點,一是,百度的賬號是全平臺打通的,你

在Ubuntu主機下實現Windows虛擬機器共享資料

一.概述 由於要實現Ubuntu主機中的一些檔案與Windows虛擬機器共享,因此要建立一個共享資料夾對映到虛擬機器中. 網上許多都是Windows主機+Linux虛擬機器的配置,在此分享主機是Linux的. 主機:Ubuntu 桌面版18.04 虛擬機器:Virtual Box,Windows7

利用samba實現macubuntu虛擬機器共享資料

使用VirtualBox建立一個Ubuntu虛擬機器 步驟: 1.安裝VirtualBox 2.在Ubuntu官網下載iso映象。 3.建立虛擬機器。 ----------------------------------------------------------------

UNBUNTU下VirtualBox的WINDOWS共享資料

這個做法會導致版本問題。 sudo apt-get install virtualbox-guest-additions-iso 啟動VirtualBox。 啟動虛擬機器: 點選裝置,安裝增強功能。稍等一下虛擬機器中應該彈出一個安裝提示,安裝即可。如果沒有呢?吾解決辦法是

【Linux 程序】fork父子程序共享資料分析

之前我們通過fork()函式,得知了父子程序之間的存在著程式碼的拷貝,且父子程序都相互獨立執行,那麼父子程序是否共享同一段資料,即是否存在著資料共享。接下來我們就來分析分析父子程序是否存在著資料共享。 我們都知道,在linux下,記憶體儲存的位置是 全域性變數,棧區,堆區,以及檔案 。字元常量

C++基礎知識總結回顧--5.5共享資料的保護

5.5.1 常物件 func1(const Point & p1)和func2(Point & p1)這兩種函式引數寫法的區別在哪裡? 答 : fun1保證實參在函式呼叫後不會被改變, 如果函式體內試圖改變p1,編譯器會報錯. 對func1(const Point &

vue 父元件非同步獲取資料子元件通訊props資料不通;

父元件非同步獲取資料時,通過props向子元件傳遞資料時資料不通。 原因可能是父元件在非同步獲取資料時使用了箭頭函式, 例: //父元件 export default{ data(){ return {

執行緒共享資料無需競爭

原文 地址  作者  Trisha   譯者:李同傑 LMAX Disruptor 是一個開源的併發框架,並獲得2011 Duke’s 程式框架創新獎。本文將用圖表的方式為大家介紹Disruptor是什麼,用來做什麼,以及簡單介紹背後的實現原理。 Disruptor是什麼? Disruptor

centos7win7通過samba共享資料

第一步:安裝samba服務 》yum install samba 第二步:啟動samba服務 》systemctl start smb 檢視samba的狀態 》systemctl status smb

python unittest TestCase共享資料(全域性變數的使用)

使用unittest模組進行單元測試,涉及到以下場景 例如對某個實體,測試方法有建立,更新,實體查詢,刪除 使用unittest進行單元測試,可以在建立時候記錄下返回的ID,在更新、刪除等操作的時候就根據這個新建立的ID進行操作,這就涉及到不同的TestCase之間共享資料

執行緒共享資料例子--售票/退票

例子程式: package edu.review; import java.util.Random; /** * 題目要求: * 兩個售票視窗,對某一趟列車票進行操作,一個為售票視窗,一個為退票視窗,每個視窗售/退票100張 **/ public c

combineReducers 進階之不同 reducers 之間共享資料

如果 sliceReducerA 為了處理特殊的 action 正好需要來自 sliceReducerB 的部分 state 資料,或者 sliceReducerB 正好需要全部的 state 作為引數,單單就 combine

【java併發】多個執行緒共享資料

先看一個多執行緒間共享資料的問題: 設計四個執行緒,其中兩個執行緒每次對data增加1,另外兩個執行緒每次對data減少1。   從問題來看,很明顯涉及到了執行緒間通資料的共享,四個執行

VMWareCentos7.0無法共享資料夾的問題總結

我使用的是win10系統,由於需要使用linux來執行神經網路的程式碼,遂在自己的pc上安裝了vmware 12,並添加了centos 7.0。當我想使用vm-tools提供的共享資料夾功能來在centos中訪問host中的檔案時,發現在centos中根本找不到共享資料夾。

連結伺服器 OLE DB 訪問介面 'SQLNCLI10' 返回的資料列所需的資料長度不匹配

異構資料庫中對應的同一物件的資料型別與定義的長度是否一致,如果是基本的結構不一致的話,請先調整一致,再試; 反之若是其它資料庫物件的話:我建議你重新整理一下資料庫物件: 使用如下的指令碼,EXEC SP_REFRESHVIEW '物件名' 這樣問題就可以解決 EXECUTE sp_refreshview