iOS10.3之后,关于设备uniqueIdentifier的一点想法

1.关于uniqueIdentifier

在平常的开发中,很多时候,我们需要获得设备的唯一标识。获取设备unique identifier 的方法有很多。此类的资料也十分丰富。如:NSUUID,Advertiser Identifier,Identifier for Vendor等等。我想大家可以尽情百度,Google,去搜索相关的资料。

2.问题出现了

此时有一个需求出现了,我们需要追踪某台设备上的某个APP,假如小明手上的iPhone7装上了我们刚写的APP,那我们会很想知道这是否是小明的这台iPhone第一次安装,或者假如小明在我们的APP上胡作非为后,我们一定想直接根据他的设备信息,干掉他,而不是简单的封掉他的账号,因为这样他违规的成本更大。

回过头来我们看看,这样的需求需要我们APP能获取到一个unique identifier,来标识我们当前的设备。
再详细一些,我想我们需要。

  • 同一个APP在不同设备获取到的unique identifier是不同的
  • 不同的APP在同一个设备获取到的unique identifier是不同的
  • unique identifier是一直不变的,不会因为设备的重启,APP重装而改变

遗憾的是上述提到的获取设备unique identifier 的方法,没有一个能满足上述的条件。当然我想我们不会屈服,我们一定回想到一个东西,Keychain,把unique identifier存这吧。这样即使用户卸载了APP,再次安装时,我们仍然可以获取原有的unique identifier。我想很多人都是这么做的。然而噩耗传来。

有人在Apple Developer Forums提出了一个问题

iOS 10.3 Beta 2 autodeletes keychain items after application uninstall?

疑似苹果的员工回复了他:

This is an intentional change in iOS 10.3 to protect user privacy. Information that can identify a user should not be left on the device after the app that created it has been removed.
It has never been a part of the API contract that keychain items created by an app would survive when the app is removed. This has always been an implementation detail.
If a keychain item is shared with other apps, it won't be deleted until those other apps have been deleted as well.
There is documentation in the works about this change that should address questions raised in this thread.

这是链接 原贴传送门请点我

我想这可不是一个好消息,但难道我们就束手无策了?直到我看到这篇文章,启发了我,神奇的Cookie互通魔法,我想我们可以借鉴下思路。使用SFSafariViewController。它与外部Safari共享Cookie等信息。

首先我们在某个视图上把SFSafariViewController给放上去,我们把它保持1个pt的大小显示,来确保他能顺利加载我们给定的url。这个url会带上我们想要的参数。

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    self.sf = [[SFSafariViewController alloc] initWithURL:[NSURL URLWithString:@"http://xxxxx/cookieBridge.html?deviceId=123123444&isReset=0"]];
    self.sf.delegate = self;
    self.sf.modalPresentationStyle = UIModalPresentationOverCurrentContext;
    [self addChildViewController:self.sf];
    [self.sf didMoveToParentViewController:self];
    
    
    CGRect newFrame = CGRectMake(0, 0, 1, 1);
    self.sf.view.frame = newFrame;
    [self.view addSubview:self.sf.view];
    
}

加载完我们制定的web页面时,我想我们的js便开始工作,它首先去检查是否有我们已存的unique identifier,如果没有,就把url带过来的参数存入Safari的Cookie中,如果有,那么便唤起APP,把unique identifier传回去。
下面是我加载的web页面的内容:

  
     
    

      
        测试
      
         
     
    
测试

如何唤起?我想你一定没忘记设置URL Schemes。


iOS10.3之后,关于设备uniqueIdentifier的一点想法_第1张图片
图1

当然,别忘了到AppDelegate里来处理回传回来的参数

- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary *)options{
    
    if ([url.scheme isEqualToString:@"testcookie"]) {
    
        NSString *queryString = url.query;
        NSArray *masterParamArray = [queryString componentsSeparatedByString:@"="];
        NSString *key = masterParamArray[0];
        NSString *deviceValue = masterParamArray[1];
        
        if ([key isEqualToString:@"deviceId"] && (deviceValue != nil) && ![deviceValue isEqualToString:@""]) {
            //拿到了unique identifier
            NSLog(@"%@",deviceValue);
        }
    }
    
    return YES;
}

这里有一点有趣的是,由于APP一直是处于前台状态,所以唤起APP用户不会有任何感知。

写在最后

我想这并不是一种特别好的方式,但似乎实属无奈。苹果似乎给开发者不断的建立高墙,但开发者却以突破高墙为乐。Enjoy :)

2017.3.28更新

10.3 release 的版本已放出,在正式版本中,在删除了APP之后,keychain中的数据依然保留,所以大家依然可以愉快的使用了,但在beta 2中的改动,会不会在之后的版本中成为现实,谁也不得而知。希望这篇文章依然可以作为一种的新的思路存在吧。:)

你可能感兴趣的:(iOS10.3之后,关于设备uniqueIdentifier的一点想法)