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

Posted

技术标签:

【中文标题】iOS:检测我的 SDK 是不是安装在设备上的其他应用程序上【英文标题】:iOS: Detect whether my SDK is installed on another apps on the deviceiOS:检测我的 SDK 是否安装在设备上的其他应用程序上 【发布时间】:2014-06-16 22:03:20 【问题描述】:

我正在为移动设备开发基于位置的问答 SDK。

当询问有关特定位置的问题时,服务器端会定位最相关的用户并将问题发送给该用户。如果用户没有回答,问题将发送给第二好的用户,依此类推。

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

有没有办法检测我的 SDK 是否安装在多个应用上?我认为将 UDID 发送到服务器可能可行,但 ios UDIDs differ between applications。

【问题讨论】:

这两个应用是来自同一个开发者还是不同的开发者? 这些应用可能属于不同的开发者。 这使得现代版本的 iOS 几乎不可能。对于 Apple 通过其 API 提供的每个 id,任何两个应用程序都会获得不同的 id。来自同一开发人员的两个应用程序可以使用共享的命名粘贴板在设备上相互检测到。但是来自不同开发者的两个应用程序不能共享一个通用的命名粘贴板。 您的 SDK 似乎需要支持应用程序 ID 概念 - 当应用程序开发人员使用您的 SDK 并注册设备时,他们还应该提供某种应用程序 ID(这可以是一个简单的 UUID 字符串- 编码到他们的应用程序中)然后当需要发送问题时,可以针对特定的应用程序 ID,该应用程序 ID 存储在您的数据库中的设备注册中 我认为它可以使用钥匙串,您可以拥有一个独特的钥匙串钥匙,您可以在其中保存您想要的任何内容,并且可以通过其他应用程序访问(如果可用)。因此,对于您的 SDK,假设如果有一个应用程序,它将使用唯一密钥在钥匙串中注册一些值,该唯一密钥仅在该密钥不存在且您知道的情况下才对您的 SDK 私有,因为您可以在钥匙串中保存任何值,您可以尝试多种适合您的选项和组合。 【参考方案1】:

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

【讨论】:

【参考方案2】:

如果你只想提供一个SDK,那是不可能的。 Apple 已添加安全步骤以防止用户隐私发生这种情况。钥匙串共享将不起作用,因为应用程序必须共享相同的捆绑种子 ID(请参阅here 了解更多信息)。

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

Your App -> “我想使用 SDK;请给我令牌”-> SDK Controller App ->(记住哪些应用程序请求使用)-> “好的,您可以使用 SDK;这里是一个令牌:#123" -> 你的应用

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

【讨论】:

Unique Key 嵌入在 SDK 中而不是应用程序中怎么样?那是可能的,我猜。对于每个设备,可以有一个用于安装第一个应用程序的令牌,并且可以由同一设备中的其他应用程序使用,因为它使用相同的密钥。每个设备都会有所不同。请参阅我的更新答案。 @iphonic SDK 中嵌入了什么并不重要。 iOS 中的 SDK 是一个静态库,在构建期间,符号链接到静态库中的相应对象。一个应用程序有一个包标识符种子,这对钥匙串共享很重要。它与 OS X 不同。 是的,没错,每个应用程序只能看到一个标识符,但我要求为 devicekeep in keychain using a common key 创建一个唯一 ID,其中只有 SDK knows,这绝对是可能吗? 这是不可能的,你将无法在应用程序之间访问它(因此每个 SDK 都认为它是单独的)并且很难为每个设备生成唯一的 id,Apple 做得很好非常困难。 我刚刚创建了两个测试应用程序,在我的情况下wrapper classesmy SDK,我使用UUID 作为唯一键,一个一个地运行两个项目,看看会发生什么。下载这个db.tt/7xpKrgMp。我想知道你的看法。【参考方案3】:

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

【讨论】:

【参考方案4】:

你可以试试

广告标识符

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

【讨论】:

当用户选择限制广告跟踪时,每个供应商都有自己的广告标识符。 此外,如果您使用 adsIdentifier 来识别用户设备,您的应用将被拒绝。【参考方案5】:

我认为使用keychain 是可能的,您可以拥有一个唯一的钥匙串钥匙,您可以在其中保存您想要的任何东西,并且可以通过其他应用程序访问(如果有)。因此,对于您的SDK,假设如果有一个应用程序,它会在钥匙串中注册一些值,其中包含一个唯一的密钥,只有当密钥不存在并且如果它存在时,您的 SDK 才是私有的,如果它存在,您会知道,由于您可以在钥匙串中保存任何值,因此您可以尝试多种适合您的选项和组合。

您可以使用KeychainItemWrapper 来实现。

阐述

假设我们有一个方法。

[MySDK register];

可以在任何地方使用,比如AppDelegateregister 方法将为应用程序和设备生成一个令牌,我们将使用我们在 SDK 中定义的唯一密钥(例如 com.mysdk.key)将其保存在钥匙串中。在保存在keychain 的同时,SDK 实际上可以进行注册。

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

现在我们有了场景。

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

    1234563令牌的计数,这意味着设备。

注意

钥匙串不是只保存unique identifier,你也可以保存其他信息。

更新

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

我在项目中使用的 wrapper 与您的情况下的 SDK 相同,这在两个项目中都是相同的。

干杯。

【讨论】:

钥匙串中的键和值是否可以被其他应用读取? 我没有尝试过,但我认为应该是因为它使用了我们在 Mac 系统中使用的通用钥匙串,所以如果我们使用唯一密钥保存并尝试使用相同的密钥在其他应用程序中获取,它应该可以工作。 @AdamMatan 是的,它有效,我刚刚测试过,其中一个应用程序生成了一个值 = 64112F7D-2AC6-4F27-ACBA-A64BB7026CEA,我保存在一个公共密钥中,我能够在其他应用程序中使用相同的键。 这是因为两个应用程序具有相同的公司标识符。如果您有来自两家不同公司的两个应用,则它们无法访问彼此的钥匙串商店。 @ZevEisenberg 是的,但在这种情况下,它是同一个 SDK,可以轻松拥有唯一标识符。

以上是关于iOS:检测我的 SDK 是不是安装在设备上的其他应用程序上的主要内容,如果未能解决你的问题,请参考以下文章

此 iOS SDK 安装不支持“my_ipad”上的 iOS 版本

检测应用程序是不是安装在 iPad 或 iPhone 上(iOS 6 到 iOS 7)

适用于 iOS 的 PayPal SDK:恢复购买的商品

如何检测音频是不是无法静音?

使用 iOS6 SDK 在 iOS7 上的默认 UIProgressView 渲染

在 lync sdk 2013 中检测音频设备并控制其音量