From 83b9d5c682b21d88133f24da0f94dd56bd79e687 Mon Sep 17 00:00:00 2001 From: 单军华 Date: Thu, 19 Jul 2018 13:38:55 +0800 Subject: [PATCH] change --- screendisplay/Pods/YYCategories/YYCategories/UIKit/UIApplication+YYAdd.m | 239 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 239 insertions(+), 0 deletions(-) diff --git a/screendisplay/Pods/YYCategories/YYCategories/UIKit/UIApplication+YYAdd.m b/screendisplay/Pods/YYCategories/YYCategories/UIKit/UIApplication+YYAdd.m new file mode 100755 index 0000000..4ea2647 --- /dev/null +++ b/screendisplay/Pods/YYCategories/YYCategories/UIKit/UIApplication+YYAdd.m @@ -0,0 +1,239 @@ +// +// UIApplication+YYAdd.m +// YYCategories <https://github.com/ibireme/YYCategories> +// +// Created by ibireme on 13/4/4. +// Copyright (c) 2015 ibireme. +// +// This source code is licensed under the MIT-style license found in the +// LICENSE file in the root directory of this source tree. +// + +#import "UIApplication+YYAdd.h" +#import "NSArray+YYAdd.h" +#import "NSObject+YYAdd.h" +#import "YYCategoriesMacro.h" +#import "UIDevice+YYAdd.h" +#import <sys/sysctl.h> +#import <mach/mach.h> +#import <objc/runtime.h> + +YYSYNTH_DUMMY_CLASS(UIApplication_YYAdd) + +#define kNetworkIndicatorDelay (1/30.0) +@interface _YYUIApplicationNetworkIndicatorInfo : NSObject +@property (nonatomic, assign) NSInteger count; +@property (nonatomic, strong) NSTimer *timer; +@end + +@implementation _YYUIApplicationNetworkIndicatorInfo +@end + + +@implementation UIApplication (YYAdd) + +- (NSURL *)documentsURL { + return [[[NSFileManager defaultManager] + URLsForDirectory:NSDocumentDirectory + inDomains:NSUserDomainMask] lastObject]; +} + +- (NSString *)documentsPath { + return [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject]; +} + +- (NSURL *)cachesURL { + return [[[NSFileManager defaultManager] + URLsForDirectory:NSCachesDirectory + inDomains:NSUserDomainMask] lastObject]; +} + +- (NSString *)cachesPath { + return [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject]; +} + +- (NSURL *)libraryURL { + return [[[NSFileManager defaultManager] + URLsForDirectory:NSLibraryDirectory + inDomains:NSUserDomainMask] lastObject]; +} + +- (NSString *)libraryPath { + return [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) firstObject]; +} + +- (BOOL)isPirated { + if ([[UIDevice currentDevice] isSimulator]) return YES; // Simulator is not from appstore + + if (getgid() <= 10) return YES; // process ID shouldn't be root + + if ([[[NSBundle mainBundle] infoDictionary] objectForKey:@"SignerIdentity"]) { + return YES; + } + + if (![self _yy_fileExistInMainBundle:@"_CodeSignature"]) { + return YES; + } + + if (![self _yy_fileExistInMainBundle:@"SC_Info"]) { + return YES; + } + + //if someone really want to crack your app, this method is useless.. + //you may change this method's name, encrypt the code and do more check.. + return NO; +} + +- (BOOL)_yy_fileExistInMainBundle:(NSString *)name { + NSString *bundlePath = [[NSBundle mainBundle] bundlePath]; + NSString *path = [NSString stringWithFormat:@"%@/%@", bundlePath, name]; + return [[NSFileManager defaultManager] fileExistsAtPath:path]; +} + +- (NSString *)appBundleName { + return [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleName"]; +} + +- (NSString *)appBundleID { + return [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleIdentifier"]; +} + +- (NSString *)appVersion { + return [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleShortVersionString"]; +} + +- (NSString *)appBuildVersion { + return [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleVersion"]; +} + +- (BOOL)isBeingDebugged { + size_t size = sizeof(struct kinfo_proc); + struct kinfo_proc info; + int ret = 0, name[4]; + memset(&info, 0, sizeof(struct kinfo_proc)); + + name[0] = CTL_KERN; + name[1] = KERN_PROC; + name[2] = KERN_PROC_PID; name[3] = getpid(); + + if (ret == (sysctl(name, 4, &info, &size, NULL, 0))) { + return ret != 0; + } + return (info.kp_proc.p_flag & P_TRACED) ? YES : NO; +} + +- (int64_t)memoryUsage { + struct task_basic_info info; + mach_msg_type_number_t size = sizeof(info); + kern_return_t kern = task_info(mach_task_self(), TASK_BASIC_INFO, (task_info_t)&info, &size); + if (kern != KERN_SUCCESS) return -1; + return info.resident_size; +} + +- (float)cpuUsage { + kern_return_t kr; + task_info_data_t tinfo; + mach_msg_type_number_t task_info_count; + + task_info_count = TASK_INFO_MAX; + kr = task_info(mach_task_self(), TASK_BASIC_INFO, (task_info_t)tinfo, &task_info_count); + if (kr != KERN_SUCCESS) { + return -1; + } + + thread_array_t thread_list; + mach_msg_type_number_t thread_count; + + thread_info_data_t thinfo; + mach_msg_type_number_t thread_info_count; + + thread_basic_info_t basic_info_th; + + kr = task_threads(mach_task_self(), &thread_list, &thread_count); + if (kr != KERN_SUCCESS) { + return -1; + } + + long tot_sec = 0; + long tot_usec = 0; + float tot_cpu = 0; + int j; + + for (j = 0; j < thread_count; j++) { + thread_info_count = THREAD_INFO_MAX; + kr = thread_info(thread_list[j], THREAD_BASIC_INFO, + (thread_info_t)thinfo, &thread_info_count); + if (kr != KERN_SUCCESS) { + return -1; + } + + basic_info_th = (thread_basic_info_t)thinfo; + + if (!(basic_info_th->flags & TH_FLAGS_IDLE)) { + tot_sec = tot_sec + basic_info_th->user_time.seconds + basic_info_th->system_time.seconds; + tot_usec = tot_usec + basic_info_th->system_time.microseconds + basic_info_th->system_time.microseconds; + tot_cpu = tot_cpu + basic_info_th->cpu_usage / (float)TH_USAGE_SCALE; + } + } + + kr = vm_deallocate(mach_task_self(), (vm_offset_t)thread_list, thread_count * sizeof(thread_t)); + assert(kr == KERN_SUCCESS); + + return tot_cpu; +} + +YYSYNTH_DYNAMIC_PROPERTY_OBJECT(networkActivityInfo, setNetworkActivityInfo, RETAIN_NONATOMIC, _YYUIApplicationNetworkIndicatorInfo *); + +- (void)_delaySetActivity:(NSTimer *)timer { + NSNumber *visiable = timer.userInfo; + if (self.networkActivityIndicatorVisible != visiable.boolValue) { + [self setNetworkActivityIndicatorVisible:visiable.boolValue]; + } + [timer invalidate]; +} + +- (void)_changeNetworkActivityCount:(NSInteger)delta { + @synchronized(self){ + dispatch_async_on_main_queue(^{ + _YYUIApplicationNetworkIndicatorInfo *info = [self networkActivityInfo]; + if (!info) { + info = [_YYUIApplicationNetworkIndicatorInfo new]; + [self setNetworkActivityInfo:info]; + } + NSInteger count = info.count; + count += delta; + info.count = count; + [info.timer invalidate]; + info.timer = [NSTimer timerWithTimeInterval:kNetworkIndicatorDelay target:self selector:@selector(_delaySetActivity:) userInfo:@(info.count > 0) repeats:NO]; + [[NSRunLoop mainRunLoop] addTimer:info.timer forMode:NSRunLoopCommonModes]; + }); + } +} + +- (void)incrementNetworkActivityCount { + [self _changeNetworkActivityCount:1]; +} + +- (void)decrementNetworkActivityCount { + [self _changeNetworkActivityCount:-1]; +} + ++ (BOOL)isAppExtension { + static BOOL isAppExtension = NO; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + Class cls = NSClassFromString(@"UIApplication"); + if(!cls || ![cls respondsToSelector:@selector(sharedApplication)]) isAppExtension = YES; + if ([[[NSBundle mainBundle] bundlePath] hasSuffix:@".appex"]) isAppExtension = YES; + }); + return isAppExtension; +} + ++ (UIApplication *)sharedExtensionApplication { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wundeclared-selector" + return [self isAppExtension] ? nil : [UIApplication performSelector:@selector(sharedApplication)]; +#pragma clang diagnostic pop +} + +@end -- Gitblit v1.8.0