From 7b02207537d35bfa1714bf8beafc921f717d100a Mon Sep 17 00:00:00 2001
From: 单军华
Date: Wed, 11 Jul 2018 10:47:42 +0800
Subject: [PATCH] 首次上传

---
 screendisplay/Pods/FCUUID/FCUUID/FCUUID.m |  469 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 469 insertions(+), 0 deletions(-)

diff --git a/screendisplay/Pods/FCUUID/FCUUID/FCUUID.m b/screendisplay/Pods/FCUUID/FCUUID/FCUUID.m
new file mode 100755
index 0000000..b6b56fa
--- /dev/null
+++ b/screendisplay/Pods/FCUUID/FCUUID/FCUUID.m
@@ -0,0 +1,469 @@
+//
+//  FCUUID.m
+//
+//  Created by Fabio Caccamo on 26/06/14.
+//  Copyright �� 2016 Fabio Caccamo. All rights reserved.
+//
+
+#import "FCUUID.h"
+#import "UICKeyChainStore.h"
+
+
+@implementation FCUUID
+
+
+NSString *const FCUUIDsOfUserDevicesDidChangeNotification = @"FCUUIDsOfUserDevicesDidChangeNotification";
+
+
+NSString *const _uuidForInstallationKey = @"fc_uuidForInstallation";
+NSString *const _uuidForDeviceKey = @"fc_uuidForDevice";
+NSString *const _uuidsOfUserDevicesKey = @"fc_uuidsOfUserDevices";
+NSString *const _uuidsOfUserDevicesToggleKey = @"fc_uuidsOfUserDevicesToggle";
+
+
++(FCUUID *)sharedInstance
+{
+    static FCUUID *instance = nil;
+    static dispatch_once_t token;
+
+    dispatch_once(&token, ^{
+        instance = [[self alloc] init];
+    });
+
+    return instance;
+}
+
+
+-(instancetype)init
+{
+    self = [super init];
+
+    if(self)
+    {
+        [self uuidsOfUserDevices_iCloudInit];
+    }
+
+    return self;
+}
+
+
+-(NSString *)_getOrCreateValueForKey:(NSString *)key defaultValue:(NSString *)defaultValue userDefaults:(BOOL)userDefaults keychain:(BOOL)keychain service:(NSString *)service accessGroup:(NSString *)accessGroup synchronizable:(BOOL)synchronizable
+{
+    NSString *value = [self _getValueForKey:key userDefaults:userDefaults keychain:keychain service:service accessGroup:accessGroup];
+
+    if(!value){
+        value = defaultValue;
+    }
+
+    if(!value){
+        value = [self uuid];
+    }
+
+    [self _setValue:value forKey:key userDefaults:userDefaults keychain:keychain service:service accessGroup:accessGroup synchronizable:synchronizable];
+
+    return value;
+}
+
+
+-(NSString *)_getValueForKey:(NSString *)key userDefaults:(BOOL)userDefaults keychain:(BOOL)keychain service:(NSString *)service accessGroup:(NSString *)accessGroup
+{
+    NSString *value = nil;
+
+    if(!value && keychain ){
+        value = [UICKeyChainStore stringForKey:key service:service accessGroup:accessGroup];
+    }
+
+    if(!value && userDefaults ){
+        value = [[NSUserDefaults standardUserDefaults] stringForKey:key];
+    }
+
+    return value;
+}
+
+
+-(void)_setValue:(NSString *)value forKey:(NSString *)key userDefaults:(BOOL)userDefaults keychain:(BOOL)keychain service:(NSString *)service accessGroup:(NSString *)accessGroup synchronizable:(BOOL)synchronizable
+{
+    if( value && userDefaults ){
+        [[NSUserDefaults standardUserDefaults] setObject:value forKey:key];
+        [[NSUserDefaults standardUserDefaults] synchronize];
+    }
+
+    if( value && keychain ){
+        UICKeyChainStore *keychain = [UICKeyChainStore keyChainStoreWithService:service accessGroup:accessGroup];
+        [keychain setSynchronizable:synchronizable];
+        [keychain setString:value forKey:key];
+    }
+}
+
+
+-(NSString *)uuid
+{
+    //also known as uuid/universallyUniqueIdentifier
+
+    CFUUIDRef uuidRef = CFUUIDCreate(NULL);
+    CFStringRef uuidStringRef = CFUUIDCreateString(NULL, uuidRef);
+    CFRelease(uuidRef);
+
+    NSString *uuidValue = (__bridge_transfer NSString *)uuidStringRef;
+    uuidValue = [uuidValue lowercaseString];
+    uuidValue = [uuidValue stringByReplacingOccurrencesOfString:@"-" withString:@""];
+    return uuidValue;
+}
+
+
+-(NSString *)uuidForKey:(id<NSCopying>)key
+{
+    if( _uuidForKey == nil ){
+        _uuidForKey = [[NSMutableDictionary alloc] init];
+    }
+
+    NSString *uuidValue = [_uuidForKey objectForKey:key];
+
+    if( uuidValue == nil ){
+        uuidValue = [self uuid];
+
+        [_uuidForKey setObject:uuidValue forKey:key];
+    }
+
+    return uuidValue;
+}
+
+
+-(NSString *)uuidForSession
+{
+    if( _uuidForSession == nil ){
+        _uuidForSession = [self uuid];
+    }
+
+    return _uuidForSession;
+}
+
+
+-(NSString *)uuidForInstallation
+{
+    if( _uuidForInstallation == nil ){
+        _uuidForInstallation = [self _getOrCreateValueForKey:_uuidForInstallationKey defaultValue:nil userDefaults:YES keychain:NO service:nil accessGroup:nil synchronizable:NO];
+    }
+
+    return _uuidForInstallation;
+}
+
+
+-(NSString *)uuidForVendor
+{
+    if( _uuidForVendor == nil ){
+        _uuidForVendor = [[[[[UIDevice currentDevice] identifierForVendor] UUIDString] lowercaseString] stringByReplacingOccurrencesOfString:@"-" withString:@""];
+    }
+
+    return _uuidForVendor;
+}
+
+
+-(void)uuidForDevice_updateWithValue:(NSString *)value
+{
+    _uuidForDevice = [NSString stringWithString:value];
+    [self _setValue:_uuidForDevice forKey:_uuidForDeviceKey userDefaults:YES keychain:YES service:nil accessGroup:nil synchronizable:NO];
+}
+
+
+-(NSString *)uuidForDevice
+{
+    //also known as udid/uniqueDeviceIdentifier but this doesn't persists to system reset
+
+    if( _uuidForDevice == nil ){
+        _uuidForDevice = [self _getOrCreateValueForKey:_uuidForDeviceKey defaultValue:nil userDefaults:YES keychain:YES service:nil accessGroup:nil synchronizable:NO];
+    }
+
+    return _uuidForDevice;
+}
+
+
+-(NSString *)uuidForDeviceMigratingValue:(NSString *)value commitMigration:(BOOL)commitMigration
+{
+    if([self uuidValueIsValid:value])
+    {
+        NSString *oldValue = [self uuidForDevice];
+        NSString *newValue = [NSString stringWithString:value];
+
+        if([oldValue isEqualToString:newValue])
+        {
+            return oldValue;
+        }
+
+        if(commitMigration)
+        {
+            [self uuidForDevice_updateWithValue:newValue];
+
+            NSMutableOrderedSet *uuidsOfUserDevicesSet = [[NSMutableOrderedSet alloc] initWithArray:[self uuidsOfUserDevices]];
+            [uuidsOfUserDevicesSet addObject:newValue];
+            [uuidsOfUserDevicesSet removeObject:oldValue];
+
+            [self uuidsOfUserDevices_updateWithValue:[uuidsOfUserDevicesSet array]];
+            [self uuidsOfUserDevices_iCloudSync];
+
+            return [self uuidForDevice];
+        }
+        else {
+            return oldValue;
+        }
+    }
+    else {
+        [NSException raise:@"Invalid uuid to migrate" format:@"uuid value should be a string of 32 or 36 characters."];
+
+        return nil;
+    }
+}
+
+
+-(NSString *)uuidForDeviceMigratingValueForKey:(NSString *)key commitMigration:(BOOL)commitMigration
+{
+    return [self uuidForDeviceMigratingValueForKey:key service:nil accessGroup:nil commitMigration:commitMigration];
+}
+
+
+-(NSString *)uuidForDeviceMigratingValueForKey:(NSString *)key service:(NSString *)service commitMigration:(BOOL)commitMigration
+{
+    return [self uuidForDeviceMigratingValueForKey:key service:service accessGroup:nil commitMigration:commitMigration];
+}
+
+
+-(NSString *)uuidForDeviceMigratingValueForKey:(NSString *)key service:(NSString *)service accessGroup:(NSString *)accessGroup commitMigration:(BOOL)commitMigration
+{
+    NSString *uuidToMigrate = [self _getValueForKey:key userDefaults:YES keychain:YES service:service accessGroup:accessGroup];
+
+    return [self uuidForDeviceMigratingValue:uuidToMigrate commitMigration:commitMigration];
+}
+
+
+-(void)uuidsOfUserDevices_iCloudInit
+{
+    _uuidsOfUserDevices_iCloudAvailable = NO;
+
+    if(NSClassFromString(@"NSUbiquitousKeyValueStore"))
+    {
+        NSUbiquitousKeyValueStore *iCloud = [NSUbiquitousKeyValueStore defaultStore];
+
+        if(iCloud)
+        {
+            _uuidsOfUserDevices_iCloudAvailable = YES;
+
+            [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(uuidsOfUserDevices_iCloudChange:) name:NSUbiquitousKeyValueStoreDidChangeExternallyNotification object:nil];
+
+            [self uuidsOfUserDevices_iCloudSync];
+        }
+        else {
+            //NSLog(@"iCloud not available");
+        }
+    }
+    else {
+        //NSLog(@"iOS < 5");
+    }
+}
+
+
+-(void)uuidsOfUserDevices_iCloudSync
+{
+    if( _uuidsOfUserDevices_iCloudAvailable )
+    {
+        NSUbiquitousKeyValueStore *iCloud = [NSUbiquitousKeyValueStore defaultStore];
+
+        //if keychain contains more device identifiers than icloud, maybe that icloud has been empty, so re-write these identifiers to iCloud
+        for ( NSString *uuidOfUserDevice in [self uuidsOfUserDevices] )
+        {
+            NSString *uuidOfUserDeviceAsKey = [NSString stringWithFormat:@"%@_%@", _uuidForDeviceKey, uuidOfUserDevice];
+
+            if(![[iCloud stringForKey:uuidOfUserDeviceAsKey] isEqualToString:uuidOfUserDevice]){
+                [iCloud setString:uuidOfUserDevice forKey:uuidOfUserDeviceAsKey];
+            }
+        }
+
+        //toggle a boolean value to force notification on other devices, useful for debug
+        [iCloud setBool:![iCloud boolForKey:_uuidsOfUserDevicesToggleKey] forKey:_uuidsOfUserDevicesToggleKey];
+        [iCloud synchronize];
+    }
+}
+
+
+-(void)uuidsOfUserDevices_iCloudChange:(NSNotification *)notification
+{
+    if( _uuidsOfUserDevices_iCloudAvailable )
+    {
+        NSMutableOrderedSet *uuidsSet = [[NSMutableOrderedSet alloc] initWithArray:[self uuidsOfUserDevices]];
+        NSInteger uuidsCount = [uuidsSet count];
+
+        NSUbiquitousKeyValueStore *iCloud = [NSUbiquitousKeyValueStore defaultStore];
+        NSDictionary *iCloudDict = [iCloud dictionaryRepresentation];
+
+        //NSLog(@"uuidsOfUserDevicesSync: %@", iCloudDict);
+
+        [iCloudDict enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
+
+            NSString *uuidKey = (NSString *)key;
+
+            if([uuidKey rangeOfString:_uuidForDeviceKey].location == 0)
+            {
+                if([obj isKindOfClass:[NSString class]])
+                {
+                    NSString *uuidValue = (NSString *)obj;
+
+                    if([uuidKey rangeOfString:uuidValue].location != NSNotFound && [self uuidValueIsValid:uuidValue])
+                    {
+                        //NSLog(@"uuid: %@", uuidValue);
+
+                        [uuidsSet addObject:uuidValue];
+                    }
+                    else {
+                        //NSLog(@"invalid uuid");
+                    }
+                }
+            }
+        }];
+
+        if([uuidsSet count] > uuidsCount)
+        {
+            [self uuidsOfUserDevices_updateWithValue:[uuidsSet array]];
+
+            NSDictionary *userInfo = [NSDictionary dictionaryWithObject:[self uuidsOfUserDevices] forKey:@"uuidsOfUserDevices"];
+            [[NSNotificationCenter defaultCenter] postNotificationName:FCUUIDsOfUserDevicesDidChangeNotification object:self userInfo:userInfo];
+        }
+    }
+}
+
+
+-(void)uuidsOfUserDevices_updateWithValue:(NSArray *)value
+{
+    _uuidsOfUserDevices = [value componentsJoinedByString:@"|"];
+    [self _setValue:_uuidsOfUserDevices forKey:_uuidsOfUserDevicesKey userDefaults:YES keychain:YES service:nil accessGroup:nil synchronizable:YES];
+}
+
+
+-(NSArray *)uuidsOfUserDevices
+{
+    if( _uuidsOfUserDevices == nil ){
+        _uuidsOfUserDevices = [self _getOrCreateValueForKey:_uuidsOfUserDevicesKey defaultValue:[self uuidForDevice] userDefaults:YES keychain:YES service:nil accessGroup:nil synchronizable:YES];
+    }
+
+    return [_uuidsOfUserDevices componentsSeparatedByString:@"|"];
+}
+
+
+-(NSArray *)uuidsOfUserDevicesExcludingCurrentDevice
+{
+    NSMutableArray *uuids = [NSMutableArray arrayWithArray:[self uuidsOfUserDevices]];
+    [uuids removeObject:[self uuidForDevice]];
+    return [NSArray arrayWithArray:uuids];
+}
+
+
+-(BOOL)uuidValueIsValid:(NSString *)uuidValue
+{
+    if(uuidValue != nil)
+    {
+        NSString *uuidPattern = @"^[0-9a-f]{32}|[0-9a-f]{8}-([0-9a-f]{4}-){3}[0-9a-f]{12}$";
+        NSRegularExpression *uuidRegExp = [NSRegularExpression regularExpressionWithPattern:uuidPattern options:NSRegularExpressionCaseInsensitive error:nil];
+
+        NSRange uuidValueRange = NSMakeRange(0, [uuidValue length]);
+        NSRange uuidMatchRange = [uuidRegExp rangeOfFirstMatchInString:uuidValue options:0 range:uuidValueRange];
+        NSString *uuidMatchValue;
+
+        if(!NSEqualRanges(uuidMatchRange, NSMakeRange(NSNotFound, 0)))
+        {
+            uuidMatchValue = [uuidValue substringWithRange:uuidMatchRange];
+
+            if([uuidMatchValue isEqualToString:uuidValue])
+            {
+                return YES;
+            }
+            else {
+                return NO;
+            }
+        }
+        else {
+            return NO;
+        }
+    }
+    else {
+        return NO;
+    }
+}
+
+
++(NSString *)uuid
+{
+    return [[self sharedInstance] uuid];
+}
+
+
++(NSString *)uuidForKey:(id<NSCopying>)key
+{
+    return [[self sharedInstance] uuidForKey:key];
+}
+
+
++(NSString *)uuidForSession
+{
+    return [[self sharedInstance] uuidForSession];
+}
+
+
++(NSString *)uuidForInstallation
+{
+    return [[self sharedInstance] uuidForInstallation];
+}
+
+
++(NSString *)uuidForVendor
+{
+    return [[self sharedInstance] uuidForVendor];
+}
+
+
++(NSString *)uuidForDevice
+{
+    return [[self sharedInstance] uuidForDevice];
+}
+
+
++(NSString *)uuidForDeviceMigratingValue:(NSString *)value commitMigration:(BOOL)commitMigration
+{
+    return [[self sharedInstance] uuidForDeviceMigratingValue:value commitMigration:commitMigration];
+}
+
+
++(NSString *)uuidForDeviceMigratingValueForKey:(NSString *)key commitMigration:(BOOL)commitMigration
+{
+    return [[self sharedInstance] uuidForDeviceMigratingValueForKey:key service:nil accessGroup:nil commitMigration:commitMigration];
+}
+
+
++(NSString *)uuidForDeviceMigratingValueForKey:(NSString *)key service:(NSString *)service commitMigration:(BOOL)commitMigration
+{
+    return [[self sharedInstance] uuidForDeviceMigratingValueForKey:key service:service accessGroup:nil commitMigration:commitMigration];
+}
+
+
++(NSString *)uuidForDeviceMigratingValueForKey:(NSString *)key service:(NSString *)service accessGroup:(NSString *)accessGroup commitMigration:(BOOL)commitMigration
+{
+    return [[self sharedInstance] uuidForDeviceMigratingValueForKey:key service:service accessGroup:accessGroup commitMigration:commitMigration];
+}
+
+
++(NSArray *)uuidsOfUserDevices
+{
+    return [[self sharedInstance] uuidsOfUserDevices];
+}
+
+
++(NSArray *)uuidsOfUserDevicesExcludingCurrentDevice
+{
+    return [[self sharedInstance] uuidsOfUserDevicesExcludingCurrentDevice];
+}
+
+
++(BOOL)uuidValueIsValid:(NSString *)uuidValue
+{
+    return [[self sharedInstance] uuidValueIsValid:uuidValue];
+}
+
+
+@end
\ No newline at end of file

--
Gitblit v1.8.0