我正在開發基於位置的Q &用於移動設備的SDK。iOS:檢測我的SDK是否安裝在設備上的其他應用程序上
當問一個關於某個特定位置的問題時,服務器端定位最相關的用戶並將該問題發送給該用戶。如果用戶未能回答,則將問題發送給次優用戶,依此類推。
問題是我的SDK可能安裝在設備上的多個應用程序上,這意味着用戶可以多次提出問題。
有沒有辦法檢測我的SDK是否安裝在多個應用程序上?我認爲發送UDID到服務器可能會工作,但iOS UDIDs differ between applications。
我正在開發基於位置的Q &用於移動設備的SDK。iOS:檢測我的SDK是否安裝在設備上的其他應用程序上
當問一個關於某個特定位置的問題時,服務器端定位最相關的用戶並將該問題發送給該用戶。如果用戶未能回答,則將問題發送給次優用戶,依此類推。
問題是我的SDK可能安裝在設備上的多個應用程序上,這意味着用戶可以多次提出問題。
有沒有辦法檢測我的SDK是否安裝在多個應用程序上?我認爲發送UDID到服務器可能會工作,但iOS UDIDs differ between applications。
您可以使用UIPasteboard在設備上的應用程序之間共享數據。
UIPasteboard類使應用程序可以在應用程序中與另一個應用程序共享數據。要與任何其他應用程序共享數據,您可以使用系統範圍的粘貼板;與另一個具有與您的應用相同的團隊ID的應用共享數據,您可以使用應用特定的粘貼板。
在你的SDK,做這樣的事情:
@interface SDKDetector : NSObject
@end
@implementation SDKDetector
+ (void)load
{
int numberOfApps = (int)[self numberOfAppsInDeviceUsingSDK];
NSLog(@"Number of apps using sdk:%d", numberOfApps);
}
+ (NSInteger)numberOfAppsInDeviceUsingSDK
{
static NSString *pasteboardType = @"mySDKPasteboardUniqueKey";
NSData *value = [[UIPasteboard generalPasteboard] valueForPasteboardType:pasteboardType];
NSMutableArray *storedData = [[NSKeyedUnarchiver unarchiveObjectWithData:value] mutableCopy];
if (!storedData) {
storedData = [NSMutableArray new];
}
NSString *bundleId = [[NSBundle mainBundle] bundleIdentifier];
if (![storedData containsObject:bundleId]) {
[storedData addObject:[[NSBundle mainBundle] bundleIdentifier]];
}
value = [NSKeyedArchiver archivedDataWithRootObject:storedData];
[[UIPasteboard generalPasteboard] setData:value forPasteboardType:pasteboardType];
return [storedData count];
}
@end
我認爲它可能使用keychain
,你可以有一個唯一的keychain key,你可以在其中保存任何你想要的東西,並且可以被其他應用程序訪問(如果有的話)。因此,對於您的SDK
,讓我們說如果有一個應用程序,它將在鑰匙串中註冊一些唯一的鑰匙,這個鑰匙對於您的SDK來說是私有的,除非鑰匙不存在,並且如果它存在,您就會知道,因爲您可以保存鑰匙串中的任何值,您可以嘗試多種適合您的選項和組合。
您可以使用KeychainItemWrapper作爲實現。
精
假設我們有一個方法。
[MySDK register];
哪個可以在任何地方使用,如在AppDelegate
中說。 register
方法將爲應用程序生成一個令牌,該設備將使用我們在SDK中定義的唯一密鑰保存在鑰匙串中,如com.mysdk.key
中所述。在保存keychain
時,SDK實際上可以進行註冊。
我們認爲上述方法在多個應用程序中實現。
現在我們有場景。
用戶安裝使用所述SDK
一個App-A
,所述register
方法將調用和創建令牌,並且將在鑰匙串保存首次。
現在,用戶安裝另一App-B
也使用了SDK
,同樣register
方法調用,但現在它會檢查在鑰匙串鑰匙com.mysdk.key
,如果存在,它只是更新令牌計數,這意味着裝置。
注意
鑰匙扣並不意味着只保存unique identifier
,可以節省其他信息了。
更新
檢查示範項目https://db.tt/7xpKrgMp
我已經在項目中使用的wrapper
你的情況是在兩個項目同一樣的SDK。
乾杯。
如果你只想提供一個SDK,那是不可能的。蘋果已經增加了安全措施來防止用戶隱私。鑰匙串共享不起作用,因爲應用必須共享相同的捆綁種子ID(有關更多信息,請參閱here)。
如果你想提供一個應用程序以及你的SDK,那麼你可以做一些像Facebook一樣的應用程序發送「helo」消息,Facebook詢問用戶,最後Facebook發送「ehlo」消息。您的應用程序 - >「我想使用SDK;請給我代幣」 - > SDK控制器應用程序 - >(請記住哪些應用程序請求使用) - >「確定,您可以使用SDK;這裏是令牌:#123「 - >您的應用程序
SDK控制器應用程序現在可以向服務器發送應用程序列表。
如何嵌入SDK而不是應用程序中嵌入'Unique Key'?我想這可能。對於每個設備,可以安裝第一個應用程序的標記,並且可以由其他應用程序在同一設備中使用,因爲它使用相同的密鑰。每個設備都會有所不同。看到我更新的答案。 – iphonic
@iphonic SDK中嵌入的內容並不重要。 iOS中的SDK是一個靜態庫,在構建期間,符號鏈接到靜態庫中相應的對象。一個應用程序有一個捆綁標識符種子,這對於鑰匙串共享非常重要。它與OS X不同。 –
是的,正確的是,每個應用程序只有一個標識符,但我要求爲'device'創建一個唯一的ID,並使用一個公用密鑰保存鑰匙串, SDK知道',這絕對有可能嗎? – iphonic
我認爲您可以將應用程序按照IP地址分組在同一臺設備上,因爲它們將使用相同的地址連接到您的服務器。 因此,IP地址將代表設備,API密鑰將代表使用SDK的應用程序。
是來自同一個開發商或不同開發商的兩個應用程序? – rmaddy
這些應用程序可能屬於單獨的開發人員。 –
這使得現代版本的iOS幾乎不可能。任何兩個應用程序都會爲Apple通過API提供的每個ID獲取不同的ID。來自同一開發人員的兩個應用程序可以使用共享的命名粘貼板在設備上檢測彼此。但是來自不同開發者的兩個應用程序不能共享一個通用的命名粘貼板。 – rmaddy