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

时间:2014-06-16 22:03:21

标签: ios sdk udid

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

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

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

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

5 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:1)

如果您只想提供SDK,则无法使用。 Apple已添加安全措施以防止用户隐私。密钥链共享无效,因为应用必须共享相同的捆绑种子ID(有关详细信息,请参阅here)。

如果你想提供一个应用程序和你的SDK,那么你可以做像Facebook这样的事情,其中​​app发送“helo”消息,Facebook询问用户,最后Facebook发送“ehlo”消息。

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

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

答案 2 :(得分:0)

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

您可以使用KeychainItemWrapper进行实施。

<强>精化

让我们说我们有一种方法。

[MySDK register];

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

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

现在我们有了方案。

  1. 用户安装使用App-A的{​​{1}},SDK方法将调用并创建令牌,并将首次保存在钥匙串中。

  2. 现在,用户安装了另一个register,它也使用App-B,同一个SDK方法会调用,但现在它将检查密钥register in钥匙串,如果存在,它只会更新令牌的计数,这对于设备而言。

  3. 注意

    Keychain并不意味着只保存com.mysdk.key,您也可以保存其他信息。

    <强>更新

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

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

    干杯。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

您可以尝试使用

  

advertisingIdentifier

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