2015-05-24 117 views
0

我正在嘗試檢查用戶是否已在其iOS設備上安裝此應用程序。如何檢測用戶是否在此之前安裝過此應用程序

例如,我安裝應用程序X,然後卸載它,然後再安裝它。

我希望應用程序X能夠檢測到設備已安裝此應用程序,這是重新安裝。

更新

通過這要歸功於像共享解決方案鑰匙扣所有的朋友,供應商ID等主要議題,我應該注意(如在評論中提到)是;即使在系統恢復或系統恢復出廠設置後,是否還有解決方案?根據@安德烈的回答使用收據可能工作,但我們想要在企業帳戶中發佈應用程序的情況呢?或者如果用戶使用越獄設備並使用IPA安裝應用程序?有時候,由於安全問題,我們希望檢測這個應用程序是否安裝過。那麼我們如何檢測它?

+0

男人,如果它是如此重要的檢測應用程序的以前安裝,也許你應該考慮一個外部硬件,如藍牙適配器。 –

回答

1

也許試圖檢查應用收據,你可以推斷出原始購買日期(即使應用是免費的,它帶有收據),但這可能是difficult
如果你想這樣做,你可以添加一個標誌到鑰匙串。鑰匙串值在卸載後仍然存在,但在系統還原後仍然存在。
當然,這隻適用於將來的版本。

+0

系統恢復是否意味着出廠重置?你可以請指定更多? –

+0

什麼是應用收據以及我如何檢查它? –

+0

由於收據存儲在設備上,系統重置後似乎也會丟失。我對嗎? –

0

iOS的構建方式是爲每個安裝的應用程序保留一部分磁盤,當您卸載應用程序時,空間被刪除,因此沒有描述應用程序安裝的「cookie」。 您可以通過兩種方式實現您的目標:通過鑰匙串,例如您使用特定密鑰保存一個值,然後檢查每個安裝密鑰或通過簡單的後端調用來發送日期,無論您想要什麼。我認爲第一個解決方案更好。

+0

如果我使用鑰匙串,如果用戶重置應用程序,數據仍然存在? –

+0

鑰匙串不依賴於應用程序,但它是維護值的系統工具,通常是密碼。是的,即使用戶卸載應用程序,密鑰仍將保留 – dpizzuto

+0

我的意思是如果用戶重置出廠設備。根據安德烈的回答,它不是在系統恢復後(如果系統恢復是我的意思是工廠重置),所以它對我來說不是好主意 –

0

我會定義一個方法來唯一標識一個設備。無論何時在設備上發出安裝,我都會向服務器發送一個請求,其中存儲了設備密鑰。如果密鑰尚未存在於數據庫中,那麼我會存儲它,否則安裝已經發布。

+0

你使用的是什麼標識符?我發現openUDID,但似乎數據不會在系統重置後保留 –

+0

我對智能手機有一種厭惡,但作爲一般知識,似乎UDID將是一個很好的初步猜測。 –

+0

Apple不允許在ios 7和ios 8中使用UDID –

-3

您可以使用APNS。 Apple推送通知服務。

設備令牌永遠不會改變任何設備重置。

因此,您可以使用推送通知。

推送通知(設備令牌)對於每個設備都是唯一的,並且始終是相同的。

當應用程序將在您的服務器數據庫上安裝保存設備令牌時,每當應用程序將再次安裝在同一設備上時,您可以從服務器數據庫檢查設備令牌。

+1

所以這裏是一個挑戰: - 問題是,當用戶不允許應用程序發送推送。據我瞭解,當應用程序嘗試獲取推送ID時,設備詢問用戶是否允許推送,如果用戶不允許,那麼我們沒有任何推送Id保存在服務器端。我們如何解決它? 此外還有一些問題: - 蘋果在任何文件中都表示推送令牌對所有設備都是唯一的嗎? - 如果有人重置設備或恢復它,那麼它會保持不變? –

+2

設備令牌更改,所以您仍然有處理這個問題。請檢查Apple文檔。最重要的是,爲此使用推送通知服務是一個矯枉過正的行爲,它會強制你聲明推送通知的使用,蘋果將明確地檢查你對此有何用處,如果不使用推送,可能會拒絕你的應用在所有。 –

0

您可以將某些東西保存到鑰匙串,然後嘗試讀取它。

+0

系統還原後重置鑰匙鏈 –

1

由於OP在一條評論中提到Apple不允許訪問設備UDID,所以我們需要一種不同的方法來唯一標識用戶。

爲了獲得唯一標識用戶的標識符,您可以使用:

[[UIDevice currentDevice] identifierForVendor]

但要注意,根據蘋果的文檔:

在此屬性的值保持同時應用程序(或來自同一供應商的另一個應用程序)安裝在iOS設備上。當用戶從設備中刪除所有供應商的應用程序並隨後重新安裝其中的一個或多個應用程序時,該值會更改。使用Xcode安裝測試版本時或在使用ad-hoc分發的設備上安裝應用程序時,該值也可能會發生變化。因此,如果您的應用程序在任何位置存儲此屬性的值,則應優雅地處理標識符更改的情況。

一個可能的解決方案是將標識符存儲在NSUserDefaults中,也存儲在服務器中,並有一個邏輯,在啓動時檢查標識符是否有變化。在這種情況下,您可以在本地和服務器中更新標識符,以便爲分析提供連續性。

例如以檢查該標識符的修改:

NSString *previousUUID = [[NSUserDefaults standardUserDefaults] stringForKey:DEVICE_UUID]; 
NSString *currentUUID = [[[UIDevice currentDevice] identifierForVendor] UUIDString]; 
BOOL UUIDChanged = ![previousUUID isEqualToString:currentUUID]; 
// Handle this situation in your backend to offer continuity in your analytics 

我在使用這個,沒有問題批准通過蘋果App Store的三個應用程序。

+0

設備是否將應用程序的NSUserDefaults保留在應用程序中,即使我們將其卸載後? 在系統還原或系統恢復出廠設置後,此數據是否也不會更改或刪除? –

+0

實際上,即使在系統恢復或系統恢復出廠設置之後,我們也必須檢測到重新安裝。 –

+0

@HuseinBehbudiRad對於你想要完成的任務,你將不得不使用鑰匙串。請看看這篇文章的解決方案:http://stackoverflow.com/questions/6993325/uidevice-uniqueidentifier-deprecated-what-to-do-now。向下滾動,直到找到處理鑰匙串的答案。 –

相關問題