iOS:检测我的SDK是否安装在设备上的其他应用程序上

我正在为移动设备开发基于位置的Q&A SDK。

当询问有关特定位置的问题时,服务器端定位最相关的用户并将该问题发送给该用户。 如果用户未能回答,则将问题发送给次优用户,依此类推。

问题是我的SDK可能安装在设备上的多个应用程序上,这意味着用户可以多次提出问题。

有没有办法来检测我的SDK是否安装在多个应用程序? 我认为将UDID发送到服务器可能会有效,但是iOS应用程序之间的UDID不同 。

您可以使用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 

如果你只想提供一个SDK,这是不可能的。 苹果已经增加了安全措施,以防止用户隐私。 钥匙串共享将无法工作,因为应用程序必须共享相同的捆绑种子ID(请参阅此处了解更多信息)。

如果你想提供一个应用程序以及你的SDK,那么你可以做一些像Facebook一样的应用程序发送“helo”消息,Facebook询问用户,最后Facebook发送“ehlo”消息。

您的应用程序 – >“我想使用SDK;请给我代币” – > SDK控制器应用程序 – >(记住哪些应用程序有请求使用) – >“好的,您可以使用SDK;这里是一个令牌:# 123“ – >您的应用程序

SDK控制器应用程序现在可以向服务器发送应用程序列表。

我认为您可以将应用程序按照IP地址分组到相同的设备上,因为它们将使用相同的地址连接到您的服务器。 所以IP地址将代表设备,API密钥将代表使用SDK的应用程序。

你可以尝试使用

advertisingIdentifier

不确定它是否符合您的目的。 这里解释ASIdentifierManager类的参考: Apple doc

我认为它可能使用keychain ,你可以有一个唯一的钥匙串钥匙,你可以保存任何你想要的,并可以被其他应用程序访问(如果可用)。 因此,对于您的SDK ,可以说,如果有一个应用程序,它将注册钥匙链中的一些值,只有当钥匙不存在时,您的SDK才是私有的,如果存在,您就会知道可以保存任何价值的钥匙串,你可以尝试多个选项和组合,适合你。

您可以使用KeychainItemWrapper作为实现。

可以说我们有一个方法。

 [MySDK register]; 

AppDelegate可以在任何地方使用。 register方法将为应用程序生成一个令牌,该设备将使用我们在SDK中定义的唯一密钥保存在密钥链中,比如com.mysdk.key 。 在保存keychain ,SDK实际上可以进行注册。

我们认为上述方法是在多个应用程序中实现的。

现在我们有情景。

  1. 用户安装一个使用SDKApp-Aregister方法将调用并创build一个令牌,并首次保存在钥匙串中。

  2. 现在用户安装另一个也使用SDK App-B ,同样的register方法会调用,但是现在它会检查keychain中的com.mysdk.key关键字,如果存在,它只会更新token的数量,这意味着为设备。

注意

钥匙串并不意味着只保存unique identifier ,您也可以保存其他信息。

更新

检查演示项目https://db.tt/7xpKrgMp

我在项目中使用的wrapper与您的案例中的SDK相同,在两个项目中都是相同的。

干杯。