我正在为移动设备开发基于位置的Q& A SDK。
当询问有关特定位置的问题时,服务器端会针对最相关的用户并将问题发送给该用户。如果用户未能回答,则问题将发送给第二个最佳用户,依此类推。
问题是我的SDK可能安装在设备上的多个应用程序中,这意味着用户可以多次提出问题。
有没有办法检测我的SDK是否安装在多个应用中?我认为将UDID发送到服务器可能会有效,但iOS UDIDs differ between applications。
答案 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];
可以在任何地方使用,例如AppDelegate
。 register
方法将为设备生成应用的令牌,我们将使用我们在SDK中定义的唯一键(例如com.mysdk.key
)将其保存在钥匙串中。保存在keychain
时,SDK实际上可以进行注册。
我们认为上述方法是在多个应用中实现的。
现在我们有了方案。
用户安装使用App-A
的{{1}},SDK
方法将调用并创建令牌,并将首次保存在钥匙串中。
现在,用户安装了另一个register
,它也使用App-B
,同一个SDK
方法会调用,但现在它将检查密钥register
in钥匙串,如果存在,它只会更新令牌的计数,这对于设备而言。
注意强>
Keychain并不意味着只保存com.mysdk.key
,您也可以保存其他信息。
<强>更新强>
检查演示项目https://db.tt/7xpKrgMp
我在项目中使用的unique identifier
与您的案例中的SDK相同,在两个项目中都相同。
干杯。
答案 3 :(得分:0)
我认为您可以通过IP地址将应用分组到同一台设备上,因为它们将使用相同的地址连接到您的服务器。 因此,IP地址将代表设备,API密钥将代表使用SDK的应用程序。
答案 4 :(得分:0)