This commit is contained in:
DDIsFriend
2023-08-23 09:24:40 +08:00
parent 6bd037c5dd
commit 63ca919ed5
494 changed files with 35308 additions and 6623 deletions

View File

@@ -0,0 +1,393 @@
//
// Example
// man
//
// Created by man 11/11/2018.
// Copyright © 2020 man. All rights reserved.
//
import Foundation
extension Dictionary {
///JSON/Form format conversion
func dictionaryToFormString() -> String? {
var array = [String]()
for (key, value) in self {
array.append(String(describing: key) + "=" + String(describing: value))
}
if array.count > 0 {
return array.joined(separator: "&")
}
return nil
}
}
extension String {
///JSON/Form format conversion
func formStringToDictionary() -> [String: Any]? {
var dictionary = [String: Any]()
let array = self.components(separatedBy: "&")
for str in array {
let arr = str.components(separatedBy: "=")
if arr.count == 2 {
dictionary.updateValue(arr[1], forKey: arr[0])
} else {
return nil
}
}
if dictionary.count > 0 {
return dictionary
}
return nil
}
}
//MARK: - *********************************************************************
extension Data {
func dataToDictionary() -> [String: Any]? {
do {
return try JSONSerialization.jsonObject(with: self, options: []) as? [String : Any]
} catch {
}
return nil
}
}
extension Dictionary {
func dictionaryToData() -> Data? {
do {
return try JSONSerialization.data(withJSONObject: self, options: .prettyPrinted)
} catch {
}
return nil
}
}
extension Data {
func dataToString() -> String? {
return String(bytes: self, encoding: .utf8)
}
}
extension String {
func stringToData() -> Data? {
return self.data(using: .utf8)
}
}
//MARK: - *********************************************************************
extension String {
func stringToDictionary() -> [String: Any]? {
return self.stringToData()?.dataToDictionary()
}
}
extension Dictionary {
func dictionaryToString() -> String? {
return self.dictionaryToData()?.dataToString()
}
}
extension String {
func jsonStringToPrettyJsonString() -> String? {
return self.stringToDictionary()?.dictionaryToString()
}
}
extension String {
func isValidURL() -> Bool {
if let url = URL(string: self) {
return UIApplication.shared.canOpenURL(url)
}
return false
}
}
extension String {
func isValidJsonString() -> Bool {
if let _ = self.stringToDictionary() {
return true
}
return false
}
}
extension String {
func isValidFormString() -> Bool {
if let _ = self.formStringToDictionary() {
return true
}
return false
}
}
extension String {
func jsonStringToFormString() -> String? {
return self.stringToDictionary()?.dictionaryToFormString()
}
}
extension String {
func formStringToJsonString() -> String? {
return self.formStringToDictionary()?.dictionaryToString()
}
}
extension String {
func formStringToData() -> Data? {
return self.formStringToDictionary()?.dictionaryToData()
}
}
extension Data {
func formDataToDictionary() -> [String: Any]? {
return self.dataToString()?.formStringToDictionary()
}
}
extension Data {
func dataToPrettyPrintString() -> String? {
//1.pretty json
if let str = self.dataToDictionary()?.dictionaryToString() {
return str
} else {
//2.protobuf
// if let message = try? GPBMessage.parse(from: self) {
// if message.serializedSize() > 0 {
// return message.description
// } else {
// //3.utf-8 string
// return String(data: self, encoding: .utf8)
// }
// } else {
//3.utf-8 string
return String(data: self, encoding: .utf8)
// }
}
}
}
//MARK: - *********************************************************************
//https://gist.github.com/arshad/de147c42d7b3063ef7bc
///Color
extension String {
var hexColor: UIColor {
let hex = trimmingCharacters(in: CharacterSet.alphanumerics.inverted)
var int = UInt32()
Scanner(string: hex).scanHexInt32(&int)
var a, r, g, b: UInt32
switch hex.count {
case 3: // RGB (12-bit)
(a, r, g, b) = (255, (int >> 8) * 17, (int >> 4 & 0xF) * 17, (int & 0xF) * 17)
case 6: // RGB (24-bit)
(a, r, g, b) = (255, int >> 16, int >> 8 & 0xFF, int & 0xFF)
case 8: // ARGB (32-bit)
(a, r, g, b) = (int >> 24, int >> 16 & 0xFF, int >> 8 & 0xFF, int & 0xFF)
default:
return .clear
}
return UIColor(red: CGFloat(r) / 255, green: CGFloat(g) / 255, blue: CGFloat(b) / 255, alpha: CGFloat(a) / 255)
}
}
extension UIView {
func addCorner(roundingCorners: UIRectCorner, cornerSize: CGSize) {
let path = UIBezierPath(roundedRect: self.bounds, byRoundingCorners: roundingCorners, cornerRadii: cornerSize)
let cornerLayer = CAShapeLayer()
cornerLayer.frame = bounds
cornerLayer.path = path.cgPath
self.layer.mask = cornerLayer
}
}
//extension NSObject {
// func dispatch_main_async_safe(callback: @escaping ()->Void ) {
// if Thread.isMainThread {
// callback()
// } else {
// DispatchQueue.main.async( execute: {
// callback()
// })
// }
// }
//}
//https://stackoverflow.com/questions/26244293/scrolltorowatindexpath-with-uitableview-does-not-work
///tableView
extension UITableView {
func tableViewScrollToBottom(animated: Bool) {
DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(1)) {
let numberOfSections = self.numberOfSections
let numberOfRows = self.numberOfRows(inSection: numberOfSections-1)
if numberOfRows > 0 {
let indexPath = IndexPath(row: numberOfRows-1, section: (numberOfSections-1))
self.scrollToRow(at: indexPath, at: .bottom, animated: animated)
}
}
}
func tableViewScrollToIndex(index: Int, animated: Bool) {
DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(1)) {
self.scrollToRow(at: IndexPath(row: index, section: 0), at: .middle, animated: animated)
}
}
func tableViewScrollToHeader(animated: Bool) {
self.scrollRectToVisible(CGRect(x: 0, y: 0, width: 1, height: 1), animated: animated)
}
func reloadData(completion: @escaping () -> ()) {
UIView.animate(withDuration: 0, animations: { self.reloadData()})
{_ in completion() }
}
}
///shake
extension UIWindow {
private static var _cocoadebugShakeProperty = [String:Bool]()
var cocoadebugShakeProperty:Bool {
get {
let tmpAddress = String(format: "%p", unsafeBitCast(self, to: Int.self))
return UIWindow._cocoadebugShakeProperty[tmpAddress] ?? false
}
set(newValue) {
let tmpAddress = String(format: "%p", unsafeBitCast(self, to: Int.self))
UIWindow._cocoadebugShakeProperty[tmpAddress] = newValue
}
}
open override var canBecomeFirstResponder: Bool {
return true
}
open override func motionBegan(_ motion: UIEvent.EventSubtype, with event: UIEvent?) {
super.motionBegan(motion, with: event)
self.cocoadebugShakeProperty = true
if CocoaDebugSettings.shared.responseShake == false {return}
if motion == .motionShake {
if CocoaDebugSettings.shared.visible == true { return }
CocoaDebugSettings.shared.showBubbleAndWindow = !CocoaDebugSettings.shared.showBubbleAndWindow
}
}
open override func motionEnded(_ motion: UIEvent.EventSubtype, with event: UIEvent?) {
super.motionEnded(motion, with: event)
if self.cocoadebugShakeProperty == true {
self.cocoadebugShakeProperty = false
return
}
if CocoaDebugSettings.shared.responseShake == false {return}
if motion == .motionShake {
if CocoaDebugSettings.shared.visible == true { return }
CocoaDebugSettings.shared.showBubbleAndWindow = !CocoaDebugSettings.shared.showBubbleAndWindow
}
}
}
///CocoaDebug
extension CocoaDebug {
///init
static func initializationMethod(serverURL: String? = nil, ignoredURLs: [String]? = nil, onlyURLs: [String]? = nil, ignoredPrefixLogs: [String]? = nil, onlyPrefixLogs: [String]? = nil, additionalViewController: UIViewController? = nil, emailToRecipients: [String]? = nil, emailCcRecipients: [String]? = nil, mainColor: String? = nil, protobufTransferMap: [String: [String]]? = nil)
{
if serverURL == nil {
CocoaDebugSettings.shared.serverURL = ""
} else {
CocoaDebugSettings.shared.serverURL = serverURL
}
if ignoredURLs == nil {
CocoaDebugSettings.shared.ignoredURLs = []
} else {
CocoaDebugSettings.shared.ignoredURLs = ignoredURLs
}
if onlyURLs == nil {
CocoaDebugSettings.shared.onlyURLs = []
} else {
CocoaDebugSettings.shared.onlyURLs = onlyURLs
}
if ignoredPrefixLogs == nil {
CocoaDebugSettings.shared.ignoredPrefixLogs = []
} else {
CocoaDebugSettings.shared.ignoredPrefixLogs = ignoredPrefixLogs
}
if onlyPrefixLogs == nil {
CocoaDebugSettings.shared.onlyPrefixLogs = []
} else {
CocoaDebugSettings.shared.onlyPrefixLogs = onlyPrefixLogs
}
if CocoaDebugSettings.shared.firstIn == nil {//first launch
CocoaDebugSettings.shared.firstIn = ""
CocoaDebugSettings.shared.showBubbleAndWindow = true
} else {//not first launch
CocoaDebugSettings.shared.showBubbleAndWindow = CocoaDebugSettings.shared.showBubbleAndWindow
}
CocoaDebugSettings.shared.visible = false
CocoaDebugSettings.shared.logSearchWordNormal = nil
CocoaDebugSettings.shared.logSearchWordRN = nil
CocoaDebugSettings.shared.logSearchWordWeb = nil
CocoaDebugSettings.shared.networkSearchWord = nil
CocoaDebugSettings.shared.protobufTransferMap = protobufTransferMap
CocoaDebugSettings.shared.additionalViewController = additionalViewController
var _ = _OCLogStoreManager.shared()
CocoaDebugSettings.shared.responseShake = true
//share via email
CocoaDebugSettings.shared.emailToRecipients = emailToRecipients
CocoaDebugSettings.shared.emailCcRecipients = emailCcRecipients
//color
CocoaDebugSettings.shared.mainColor = mainColor ?? "#42d459"
//slow animations
CocoaDebugSettings.shared.slowAnimations = false
//log
let enableLogMonitoring = UserDefaults.standard.bool(forKey: "enableLogMonitoring_CocoaDebug")
if enableLogMonitoring == false {
_SwiftLogHelper.shared.enable = false
// _OCLogHelper.shared()?.enable = false
} else {
_SwiftLogHelper.shared.enable = true
// _OCLogHelper.shared()?.enable = true
}
//network
let disableNetworkMonitoring = UserDefaults.standard.bool(forKey: "disableNetworkMonitoring_CocoaDebug")
if disableNetworkMonitoring == true {
_NetworkHelper.shared().disable()
} else {
_NetworkHelper.shared().enable()
}
}
///deinit
static func deinitializationMethod() {
WindowHelper.shared.disable()
_NetworkHelper.shared().disable()
_SwiftLogHelper.shared.enable = false
// _OCLogHelper.shared()?.enable = false
CrashLogger.shared.enable = false
CocoaDebugSettings.shared.responseShake = false
}
}

View File

@@ -0,0 +1,40 @@
//
// Example
// man
//
// Created by man 11/11/2018.
// Copyright © 2020 man. All rights reserved.
//
#import "CocoaDebug.h"
#import "CocoaDebugTool.h"
#import "CocoaDebugDeviceInfo.h"
#import "NSObject+CocoaDebug.h"
#import "_fishhook.h"
#import "_FileInfo.h"
#import "_Swizzling.h"
#import "_ObjcLog.h"
#import "_Sandboxer.h"
#import "_HttpModel.h"
#import "_OCLogModel.h"
#import "_OCLogHelper.h"
#import "_NetworkHelper.h"
#import "_HttpDatasource.h"
#import "_ImageResources.h"
#import "_OCLoggerFormat.h"
#import "_RunloopMonitor.h"
#import "_BacktraceLogger.h"
#import "_ImageController.h"
#import "_SandboxerHelper.h"
#import "_CanonicalRequest.h"
#import "_Sandboxer-Header.h"
#import "_FileTableViewCell.h"
#import "_OCLogStoreManager.h"
#import "_DebugConsoleLabel.h"
#import "_CustomHTTPProtocol.h"
#import "_CacheStoragePolicy.h"
#import "_QNSURLSessionDemux.h"
#import "GPBMessage+CocoaDebug.h"
#import "_FilePreviewController.h"
#import "_DirectoryContentsTableViewController.h"

View File

@@ -0,0 +1,65 @@
//
// Example
// man
//
// Created by man 11/11/2018.
// Copyright © 2020 man. All rights reserved.
//
import Foundation
import UIKit
@objc public class CocoaDebug : NSObject {
///if the captured URLs contain server URL, CocoaDebug set server URL bold font to be marked. Not mark when this value is nil. Default value is `nil`.
@objc public static var serverURL: String? = nil
///set the URLs which should not been captured, CocoaDebug capture all URLs when the value is nil. Default value is `nil`.
@objc public static var ignoredURLs: [String]? = nil
///set the URLs which are only been captured, CocoaDebug capture all URLs when the value is nil. Default value is `nil`.
@objc public static var onlyURLs: [String]? = nil
///set the prefix Logs which should not been captured, CocoaDebug capture all Logs when the value is nil. Default value is `nil`.
@objc public static var ignoredPrefixLogs: [String]? = nil
///set the prefix Logs which are only been captured, CocoaDebug capture all Logs when the value is nil. Default value is `nil`.
@objc public static var onlyPrefixLogs: [String]? = nil
///add an additional UIViewController as child controller of CocoaDebug's main UITabBarController. Default value is `nil`.
@objc public static var additionalViewController: UIViewController? = nil
///set the initial recipients to include in the emails To field when share via email. Default value is `nil`.
@objc public static var emailToRecipients: [String]? = nil
///set the initial recipients to include in the emails Cc field when share via email. Default value is `nil`.
@objc public static var emailCcRecipients: [String]? = nil
///set CocoaDebug's main color with hexadecimal format. Default value is `#42d459`.
@objc public static var mainColor: String = "#42d459"
///protobuf url and response class transfer map. Default value is `nil`.
@objc public static var protobufTransferMap: [String: [String]]? = nil
//MARK: - CocoaDebug enable
@objc public static func enable() {
initializationMethod(serverURL: serverURL, ignoredURLs: ignoredURLs, onlyURLs: onlyURLs, ignoredPrefixLogs: ignoredPrefixLogs, onlyPrefixLogs: onlyPrefixLogs, additionalViewController: additionalViewController, emailToRecipients: emailToRecipients, emailCcRecipients: emailCcRecipients, mainColor: mainColor, protobufTransferMap: protobufTransferMap)
}
//MARK: - CocoaDebug disable
@objc public static func disable() {
deinitializationMethod()
}
//MARK: - hide Bubble
@objc public static func hideBubble() {
CocoaDebugSettings.shared.showBubbleAndWindow = false
}
//MARK: - show Bubble
@objc public static func showBubble() {
CocoaDebugSettings.shared.showBubbleAndWindow = true
}
}
//MARK: - override Swift `print` method
public func print<T>(file: String = #file, function: String = #function, line: Int = #line, _ message: T, color: UIColor = .white) {
Swift.print(message)
_SwiftLogHelper.shared.handleLog(file: file, function: function, line: line, message: message, color: color)
}

View File

@@ -0,0 +1,37 @@
//
// Example
// man
//
// Created by man 11/11/2018.
// Copyright © 2020 man. All rights reserved.
//
// https://github.com/maybeliu/MBDeviceTool_OC
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
@interface CocoaDebugDeviceInfo : NSObject
@property (nonatomic, assign, readonly) CGSize resolution;
@property (nonatomic, copy, readonly) NSString *systemType;
@property (nonatomic, copy, readonly) NSString *userName;
@property (nonatomic, copy, readonly) NSString *systemVersion;
@property (nonatomic, copy, readonly) NSString *deviceModel;
@property (nonatomic, copy, readonly) NSString *deviceUUID;
@property (nonatomic, copy, readonly) NSString *userPhoneName;
@property (nonatomic, copy, readonly) NSString *deviceName;
@property (nonatomic, copy, readonly) NSString *getPlatformString;
@property (nonatomic, copy, readonly) NSString *localizedModel;
@property (nonatomic, copy, readonly) NSString *appVersion;
@property (nonatomic, copy, readonly) NSString *appBuiltVersion;
@property (nonatomic, copy, readonly) NSString *appBundleID ;
@property (nonatomic, copy, readonly) NSString *appBundleName ;
+ (instancetype)sharedInstance;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,89 @@
//
// CocoaDebug
// liman
//
// Created by liman 02/02/2023.
// Copyright © 2023 liman. All rights reserved.
//
#import "CocoaDebugDeviceInfo.h"
#import "sys/utsname.h"
#import "_DeviceUtil.h"
@implementation CocoaDebugDeviceInfo
+ (instancetype)sharedInstance {
static CocoaDebugDeviceInfo *sharedInstance;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedInstance = [[CocoaDebugDeviceInfo alloc] init];
});
return sharedInstance;
}
- (NSString *)systemType {
return [[UIDevice currentDevice] systemName];
}
- (NSString *)userName {
return [[UIDevice currentDevice] name];
}
- (NSString *)systemVersion {
return [[UIDevice currentDevice] systemVersion];
}
- (NSString *)deviceModel {
return [[UIDevice currentDevice] model];
}
- (NSString *)deviceUUID {
return [[[UIDevice currentDevice] identifierForVendor] UUIDString];
}
- (NSString *)deviceName {
struct utsname systemInfo;
uname(&systemInfo);
NSString *code = [NSString stringWithCString:systemInfo.machine
encoding:NSUTF8StringEncoding];
return code;
}
- (NSString *)getPlatformString {
return [[_DeviceUtil new] hardwareSimpleDescription];
}
- (NSString *)localizedModel {
return [[UIDevice currentDevice] localizedModel];
}
- (NSString *)appVersion {
return [[NSBundle mainBundle] infoDictionary][@"CFBundleShortVersionString"];
}
- (NSString *)appBuiltVersion {
return [[NSBundle mainBundle] infoDictionary][@"CFBundleVersion"];
}
- (NSString *)appBundleID {
NSString *bundleID = [[NSBundle mainBundle] bundleIdentifier];
return bundleID;
}
- (NSString *)appBundleName {
NSString *bundleName = [[NSBundle mainBundle] objectForInfoDictionaryKey:(__bridge NSString *)kCFBundleNameKey];
return bundleName;
}
- (CGSize)resolution {
return CGSizeMake([UIScreen mainScreen].bounds.size.width * [[UIScreen mainScreen] scale], [UIScreen mainScreen].bounds.size.height * [[UIScreen mainScreen] scale]);
}
@end

View File

@@ -0,0 +1,277 @@
//
// Example
// man
//
// Created by man 11/11/2018.
// Copyright © 2020 man. All rights reserved.
//
import Foundation
@objc public class CocoaDebugSettings: NSObject {
@objc public static let shared = CocoaDebugSettings()
@objc public var slowAnimations: Bool = false {
didSet {
if slowAnimations == false {
UIApplication.shared.windows.first?.layer.speed = 1;
} else {
UIApplication.shared.windows.first?.layer.speed = 0.1;
}
}
}
@objc public var responseShake: Bool = false {
didSet {
UserDefaults.standard.set(responseShake, forKey: "responseShake_CocoaDebug")
UserDefaults.standard.synchronize()
}
}
@objc public var firstIn: String? = nil {
didSet {
UserDefaults.standard.set(firstIn, forKey: "firstIn_CocoaDebug")
UserDefaults.standard.synchronize()
}
}
@objc public var enableCrashRecording: Bool = false {
didSet {
UserDefaults.standard.set(enableCrashRecording, forKey: "enableCrashRecording_CocoaDebug")
UserDefaults.standard.synchronize()
if enableCrashRecording == true {
CrashLogger.shared.enable = true
} else {
CrashLogger.shared.enable = false
CrashStoreManager.shared.resetCrashs()
}
}
}
@objc public var enableUIBlockingMonitoring: Bool = false {
didSet {
UserDefaults.standard.set(enableUIBlockingMonitoring, forKey: "enableUIBlockingMonitoring_CocoaDebug")
UserDefaults.standard.synchronize()
}
}
@objc public var enableWKWebViewMonitoring: Bool = false {
didSet {
UserDefaults.standard.set(enableWKWebViewMonitoring, forKey: "enableWKWebViewMonitoring_CocoaDebug")
UserDefaults.standard.synchronize()
}
}
@objc public var enableLogMonitoring: Bool = false {
didSet {
UserDefaults.standard.set(enableLogMonitoring, forKey: "enableLogMonitoring_CocoaDebug")
UserDefaults.standard.synchronize()
}
}
@objc public var disableNetworkMonitoring: Bool = false {
didSet {
UserDefaults.standard.set(disableNetworkMonitoring, forKey: "disableNetworkMonitoring_CocoaDebug")
UserDefaults.standard.synchronize()
}
}
@objc public var enableRNMonitoring: Bool = false {
didSet {
UserDefaults.standard.set(enableRNMonitoring, forKey: "enableRNMonitoring_CocoaDebug")
UserDefaults.standard.synchronize()
}
}
@objc public var enableMemoryLeaksMonitoring_ViewController: Bool = false {
didSet {
UserDefaults.standard.set(enableMemoryLeaksMonitoring_ViewController, forKey: "enableMemoryLeaksMonitoring_UIViewController_CocoaDebug")
UserDefaults.standard.synchronize()
}
}
@objc public var enableMemoryLeaksMonitoring_View: Bool = false {
didSet {
UserDefaults.standard.set(enableMemoryLeaksMonitoring_View, forKey: "enableMemoryLeaksMonitoring_UIView_CocoaDebug")
UserDefaults.standard.synchronize()
}
}
@objc public var enableMemoryLeaksMonitoring_MemberVariables: Bool = false {
didSet {
UserDefaults.standard.set(enableMemoryLeaksMonitoring_MemberVariables, forKey: "enableMemoryLeaksMonitoring_MemberVariables_CocoaDebug")
UserDefaults.standard.synchronize()
}
}
@objc public var visible: Bool = false {
didSet {
UserDefaults.standard.set(visible, forKey: "visible_CocoaDebug")
UserDefaults.standard.synchronize()
}
}
@objc public var showBubbleAndWindow: Bool = false {
didSet {
UserDefaults.standard.set(showBubbleAndWindow, forKey: "showBubbleAndWindow_CocoaDebug")
UserDefaults.standard.synchronize()
let x = WindowHelper.shared.vc.bubble.frame.origin.x
let width = WindowHelper.shared.vc.bubble.frame.size.width
if showBubbleAndWindow == true
{
if x > UIScreen.main.bounds.size.width/2 {
WindowHelper.shared.vc.bubble.frame.origin.x = UIScreen.main.bounds.size.width - width/8*8.25
} else {
WindowHelper.shared.vc.bubble.frame.origin.x = -width + width/8*8.25
}
WindowHelper.shared.enable()
}
else
{
if x > UIScreen.main.bounds.size.width/2 {
WindowHelper.shared.vc.bubble.frame.origin.x = UIScreen.main.bounds.size.width
} else {
WindowHelper.shared.vc.bubble.frame.origin.x = -width
}
WindowHelper.shared.disable()
}
}
}
@objc public var serverURL: String? = nil {
didSet {
UserDefaults.standard.set(serverURL, forKey: "serverURL_CocoaDebug")
UserDefaults.standard.synchronize()
}
}
@objc public var tabBarSelectItem: Int {
didSet {
UserDefaults.standard.set(tabBarSelectItem, forKey: "tabBarSelectItem_CocoaDebug")
UserDefaults.standard.synchronize()
}
}
@objc public var logSelectIndex: Int {
didSet {
UserDefaults.standard.set(logSelectIndex, forKey: "logSelectIndex_CocoaDebug")
UserDefaults.standard.synchronize()
}
}
@objc public var networkLastIndex: Int {
didSet {
UserDefaults.standard.set(networkLastIndex, forKey: "networkLastIndex_CocoaDebug")
UserDefaults.standard.synchronize()
}
}
@objc public var bubbleFrameX: Float {
didSet {
UserDefaults.standard.set(bubbleFrameX, forKey: "bubbleFrameX_CocoaDebug")
UserDefaults.standard.synchronize()
}
}
@objc public var bubbleFrameY: Float {
didSet {
UserDefaults.standard.set(bubbleFrameY, forKey: "bubbleFrameY_CocoaDebug")
UserDefaults.standard.synchronize()
}
}
@objc public var logSearchWordNormal: String? = nil {
didSet {
UserDefaults.standard.set(logSearchWordNormal, forKey: "logSearchWordNormal_CocoaDebug")
UserDefaults.standard.synchronize()
}
}
@objc public var logSearchWordRN: String? = nil {
didSet {
UserDefaults.standard.set(logSearchWordRN, forKey: "logSearchWordRN_CocoaDebug")
UserDefaults.standard.synchronize()
}
}
@objc public var logSearchWordWeb: String? = nil {
didSet {
UserDefaults.standard.set(logSearchWordWeb, forKey: "logSearchWordWeb_CocoaDebug")
UserDefaults.standard.synchronize()
}
}
@objc public var networkSearchWord: String? = nil {
didSet {
UserDefaults.standard.set(networkSearchWord, forKey: "networkSearchWord_CocoaDebug")
UserDefaults.standard.synchronize()
}
}
@objc public var mainColor: String {
didSet {
UserDefaults.standard.set(mainColor, forKey: "mainColor_CocoaDebug")
UserDefaults.standard.synchronize()
_NetworkHelper.shared().mainColor = mainColor.hexColor
}
}
@objc public var additionalViewController: UIViewController? = nil
//share via email
@objc public var emailToRecipients: [String]? = nil
@objc public var emailCcRecipients: [String]? = nil
//objc
@objc public var ignoredURLs: [String]? = nil {
didSet {
_NetworkHelper.shared().ignoredURLs = ignoredURLs
}
}
@objc public var onlyURLs: [String]? = nil {
didSet {
_NetworkHelper.shared().onlyURLs = onlyURLs
}
}
@objc public var ignoredPrefixLogs: [String]? = nil {
didSet {
_NetworkHelper.shared().ignoredPrefixLogs = ignoredPrefixLogs
}
}
@objc public var onlyPrefixLogs: [String]? = nil {
didSet {
_NetworkHelper.shared().onlyPrefixLogs = onlyPrefixLogs
}
}
//protobuf
@objc public var protobufTransferMap: [String: [String]]? = nil {
didSet {
_NetworkHelper.shared().protobufTransferMap = protobufTransferMap
}
}
private override init() {
responseShake = UserDefaults.standard.bool(forKey: "responseShake_CocoaDebug")
firstIn = UserDefaults.standard.string(forKey: "firstIn_CocoaDebug")
serverURL = UserDefaults.standard.string(forKey: "serverURL_CocoaDebug")
visible = UserDefaults.standard.bool(forKey: "visible_CocoaDebug")
showBubbleAndWindow = UserDefaults.standard.bool(forKey: "showBubbleAndWindow_CocoaDebug")
enableCrashRecording = UserDefaults.standard.bool(forKey: "enableCrashRecording_CocoaDebug")
enableUIBlockingMonitoring = UserDefaults.standard.bool(forKey: "enableUIBlockingMonitoring_CocoaDebug")
enableWKWebViewMonitoring = UserDefaults.standard.bool(forKey: "enableWKWebViewMonitoring_CocoaDebug")
enableLogMonitoring = UserDefaults.standard.bool(forKey: "enableLogMonitoring_CocoaDebug")
disableNetworkMonitoring = UserDefaults.standard.bool(forKey: "disableNetworkMonitoring_CocoaDebug")
enableRNMonitoring = UserDefaults.standard.bool(forKey: "enableRNMonitoring_CocoaDebug")
tabBarSelectItem = UserDefaults.standard.integer(forKey: "tabBarSelectItem_CocoaDebug")
logSelectIndex = UserDefaults.standard.integer(forKey: "logSelectIndex_CocoaDebug")
networkLastIndex = UserDefaults.standard.integer(forKey: "networkLastIndex_CocoaDebug")
bubbleFrameX = UserDefaults.standard.float(forKey: "bubbleFrameX_CocoaDebug")
bubbleFrameY = UserDefaults.standard.float(forKey: "bubbleFrameY_CocoaDebug")
logSearchWordNormal = UserDefaults.standard.string(forKey: "logSearchWordNormal_CocoaDebug")
logSearchWordRN = UserDefaults.standard.string(forKey: "logSearchWordRN_CocoaDebug")
logSearchWordWeb = UserDefaults.standard.string(forKey: "logSearchWordWeb_CocoaDebug")
networkSearchWord = UserDefaults.standard.string(forKey: "networkSearchWord_CocoaDebug")
mainColor = UserDefaults.standard.string(forKey: "mainColor_CocoaDebug") ?? "#42d459"
//objc
ignoredURLs = _NetworkHelper.shared().ignoredURLs
onlyURLs = _NetworkHelper.shared().onlyURLs
ignoredPrefixLogs = _NetworkHelper.shared().ignoredPrefixLogs
onlyPrefixLogs = _NetworkHelper.shared().onlyPrefixLogs
//protobuf
protobufTransferMap = _NetworkHelper.shared().protobufTransferMap
//Memory
enableMemoryLeaksMonitoring_ViewController = UserDefaults.standard.bool(forKey: "enableMemoryLeaksMonitoring_UIViewController_CocoaDebug")
enableMemoryLeaksMonitoring_View = UserDefaults.standard.bool(forKey: "enableMemoryLeaksMonitoring_UIView_CocoaDebug")
enableMemoryLeaksMonitoring_MemberVariables = UserDefaults.standard.bool(forKey: "enableMemoryLeaksMonitoring_MemberVariables_CocoaDebug")
}
}

View File

@@ -0,0 +1,51 @@
//
// Example
// man
//
// Created by man 11/11/2018.
// Copyright © 2020 man. All rights reserved.
//
static const char *kPropertyKey = "kApplicationDidFinishLaunching_CocoaDebug_Key";
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#import <objc/runtime.h>
#import "_NetworkHelper.h"
@interface NSObject (CocoaDebugAutoLaunch)
@property (nonatomic, assign) BOOL cocoadebug_applicationDidFinishLaunching;
@end
@implementation NSObject (CocoaDebugAutoLaunch)
#pragma mark - load
+ (void)load {
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(cocoadebug_applicationDidFinishLaunchingNotification:) name:UIApplicationDidFinishLaunchingNotification object:nil];
}
#pragma mark - notification
- (void)cocoadebug_applicationDidFinishLaunchingNotification:(NSNotification *)notification {
if (self.cocoadebug_applicationDidFinishLaunching) {return;}
self.cocoadebug_applicationDidFinishLaunching = YES;
Class CocoaDebug = NSClassFromString(@"_TtC10CocoaDebug10CocoaDebug");
if (CocoaDebug) {
[[CocoaDebug class] performSelector:@selector(enable)];
}
}
#pragma mark - getter setter
- (BOOL)cocoadebug_applicationDidFinishLaunching {
NSNumber *number = objc_getAssociatedObject(self, kPropertyKey);
return [number boolValue];
}
- (void)setCocoadebug_applicationDidFinishLaunching:(BOOL)applicationDidFinishLaunching {
NSNumber *number = [NSNumber numberWithBool:applicationDidFinishLaunching];
objc_setAssociatedObject(self, kPropertyKey, number, OBJC_ASSOCIATION_RETAIN);
}
@end

View File

@@ -0,0 +1,325 @@
//
// CocoaDebug
// liman
//
// Created by liman 02/02/2023.
// Copyright © 2023 liman. All rights reserved.
//
typedef NS_ENUM(NSUInteger, Hardware) {
IPHONE_2G,
IPHONE_3G,
IPHONE_3GS,
IPHONE_4,
IPHONE_4_CDMA,
IPHONE_4S,
IPHONE_5,
IPHONE_5_CDMA_GSM,
IPHONE_5C,
IPHONE_5C_CDMA_GSM,
IPHONE_5S,
IPHONE_5S_CDMA_GSM,
IPHONE_6_PLUS,
IPHONE_6,
IPHONE_6S,
IPHONE_6S_PLUS,
IPHONE_SE,
IPHONE_7,
IPHONE_7_PLUS,
IPHONE_7_GSM,
IPHONE_7_PLUS_GSM,
IPHONE_8_CN,
IPHONE_8_PLUS_CN,
IPHONE_X_CN,
IPHONE_8,
IPHONE_8_PLUS,
IPHONE_X,
IPHONE_XS,
IPHONE_XS_MAX,
IPHONE_XS_MAX_CN,
IPHONE_XR,
IPHONE_11,
IPHONE_11_PRO,
IPHONE_11_PRO_MAX,
IPHONE_SE_2G,
IPHONE_12_MINI,
IPHONE_12,
IPHONE_12_PRO,
IPHONE_12_PRO_MAX,
IPHONE_13_PRO,
IPHONE_13_PRO_MAX,
IPHONE_13_MINI,
IPHONE_13,
IPHONE_SE_3G,
IPHONE_14,
IPHONE_14_PLUS,
IPHONE_14_PRO,
IPHONE_14_PRO_MAX,
IPOD_TOUCH_1G,
IPOD_TOUCH_2G,
IPOD_TOUCH_3G,
IPOD_TOUCH_4G,
IPOD_TOUCH_5G,
IPOD_TOUCH_6G,
IPOD_TOUCH_7G,
IPAD,
IPAD_3G,
IPAD_2_WIFI,
IPAD_2,
IPAD_2_CDMA,
IPAD_MINI_WIFI,
IPAD_MINI,
IPAD_MINI_WIFI_CDMA,
IPAD_3_WIFI,
IPAD_3_WIFI_CDMA,
IPAD_3,
IPAD_4_WIFI,
IPAD_4,
IPAD_4_GSM_CDMA,
IPAD_AIR_WIFI,
IPAD_AIR_WIFI_GSM,
IPAD_AIR_WIFI_CDMA,
IPAD_MINI_RETINA_WIFI,
IPAD_MINI_RETINA_WIFI_CDMA,
IPAD_MINI_RETINA_WIFI_CELLULAR_CN,
IPAD_MINI_3_WIFI,
IPAD_MINI_3_WIFI_CELLULAR,
IPAD_MINI_3_WIFI_CELLULAR_CN,
IPAD_MINI_4_WIFI,
IPAD_MINI_4_WIFI_CELLULAR,
IPAD_AIR_2_WIFI,
IPAD_AIR_2_WIFI_CELLULAR,
IPAD_5_WIFI,
IPAD_5_WIFI_CELLULAR,
IPAD_PRO_97_WIFI,
IPAD_PRO_97_WIFI_CELLULAR,
IPAD_PRO_WIFI,
IPAD_PRO_WIFI_CELLULAR,
IPAD_PRO_2G_WIFI,
IPAD_7_WIFI,
IPAD_7_WIFI_CELLULAR,
IPAD_PRO_2G_WIFI_CELLULAR,
IPAD_PRO_105_WIFI,
IPAD_PRO_105_WIFI_CELLULAR,
IPAD_6_WIFI,
IPAD_6_WIFI_CELLULAR,
IPAD_PRO_11_2G_WIFI_CELLULAR,
IPAD_PRO_11_WIFI,
IPAD_PRO_4G_WIFI,
IPAD_PRO_11_1TB_WIFI,
IPAD_PRO_11_WIFI_CELLULAR,
IPAD_PRO_11_1TB_WIFI_CELLULAR,
IPAD_PRO_3G_WIFI,
IPAD_PRO_3G_1TB_WIFI,
IPAD_PRO_3G_WIFI_CELLULAR,
IPAD_PRO_4G_WIFI_CELLULAR,
IPAD_PRO_3G_1TB_WIFI_CELLULAR,
IPAD_PRO_11_2G_WIFI,
IPAD_MINI_5_WIFI,
IPAD_MINI_5_WIFI_CELLULAR,
IPAD_AIR_3_WIFI,
IPAD_AIR_3_WIFI_CELLULAR,
IPAD_9_WIFI,
IPAD_9_WIFI_CELLULAR,
IPAD_PRO_5_WIFI_CELLULAR,
IPAD_AIR_4_WIFI,
IPAD_AIR_5_WIFI,
IPAD_AIR_5_WIFI_CELLULAR,
IPAD_AIR_4_WIFI_CELLULAR,
IPAD_PRO_11_3_WIFI,
IPAD_PRO_11_3_WIFI_CELLULAR,
IPAD_PRO_5_WIFI,
IPAD_MINI_6_WIFI,
IPAD_MINI_6_WIFI_CELLULAR,
APPLE_WATCH_38,
APPLE_WATCH_42,
APPLE_WATCH_SERIES_2_38,
APPLE_WATCH_SERIES_2_42,
APPLE_WATCH_SERIES_1_38,
APPLE_WATCH_SERIES_1_42,
APPLE_WATCH_SERIES_3_38_CELLULAR,
APPLE_WATCH_SERIES_3_42_CELLULAR,
APPLE_WATCH_SERIES_3_38,
APPLE_WATCH_SERIES_3_42,
APPLE_WATCH_SERIES_4_40,
APPLE_WATCH_SERIES_4_44,
APPLE_WATCH_SERIES_4_40_CELLULAR,
APPLE_WATCH_SERIES_4_44_CELLULAR,
APPLE_WATCH_SERIES_5_40,
APPLE_WATCH_SERIES_5_44,
APPLE_WATCH_SERIES_5_40_CELLULAR,
APPLE_WATCH_SERIES_5_44_CELLULAR,
APPLE_TV_1G,
APPLE_TV_2G,
APPLE_TV_3G,
APPLE_TV_3_2G,
APPLE_TV_4G,
APPLE_TV_4K,
SIMULATOR,
UNKNOWN
};
extern NSString* const AppleTV1_1;
extern NSString* const AppleTV2_1;
extern NSString* const AppleTV3_1;
extern NSString* const AppleTV3_2;
extern NSString* const AppleTV5_3;
extern NSString* const AppleTV6_2;
extern NSString* const Watch1_1;
extern NSString* const Watch1_2;
extern NSString* const Watch2_3;
extern NSString* const Watch2_4;
extern NSString* const Watch2_6;
extern NSString* const Watch2_7;
extern NSString* const Watch3_1;
extern NSString* const Watch3_2;
extern NSString* const Watch3_3;
extern NSString* const Watch3_4;
extern NSString* const Watch4_1;
extern NSString* const Watch4_2;
extern NSString* const Watch4_3;
extern NSString* const Watch4_4;
extern NSString* const Watch5_1;
extern NSString* const Watch5_2;
extern NSString* const Watch5_3;
extern NSString* const Watch5_4;
extern NSString* const i386_Simulator;
extern NSString* const iPad1_1;
extern NSString* const iPad1_2;
extern NSString* const iPad11_1;
extern NSString* const iPad11_2;
extern NSString* const iPad11_3;
extern NSString* const iPad11_4;
extern NSString* const iPad12_1;
extern NSString* const iPad12_2;
extern NSString* const iPad13_1;
extern NSString* const iPad13_10;
extern NSString* const iPad13_11;
extern NSString* const iPad13_16;
extern NSString* const iPad13_17;
extern NSString* const iPad13_2;
extern NSString* const iPad13_4;
extern NSString* const iPad13_5;
extern NSString* const iPad13_6;
extern NSString* const iPad13_7;
extern NSString* const iPad13_8;
extern NSString* const iPad13_9;
extern NSString* const iPad14_1;
extern NSString* const iPad14_2;
extern NSString* const iPad2_1;
extern NSString* const iPad2_2;
extern NSString* const iPad2_3;
extern NSString* const iPad2_4;
extern NSString* const iPad2_5;
extern NSString* const iPad2_6;
extern NSString* const iPad2_7;
extern NSString* const iPad3_1;
extern NSString* const iPad3_2;
extern NSString* const iPad3_3;
extern NSString* const iPad3_4;
extern NSString* const iPad3_5;
extern NSString* const iPad3_6;
extern NSString* const iPad4_1;
extern NSString* const iPad4_2;
extern NSString* const iPad4_3;
extern NSString* const iPad4_4;
extern NSString* const iPad4_5;
extern NSString* const iPad4_6;
extern NSString* const iPad4_7;
extern NSString* const iPad4_8;
extern NSString* const iPad4_9;
extern NSString* const iPad5_1;
extern NSString* const iPad5_2;
extern NSString* const iPad5_3;
extern NSString* const iPad5_4;
extern NSString* const iPad6_11;
extern NSString* const iPad6_12;
extern NSString* const iPad6_3;
extern NSString* const iPad6_4;
extern NSString* const iPad6_7;
extern NSString* const iPad6_8;
extern NSString* const iPad7_1;
extern NSString* const iPad7_11;
extern NSString* const iPad7_12;
extern NSString* const iPad7_2;
extern NSString* const iPad7_3;
extern NSString* const iPad7_4;
extern NSString* const iPad7_5;
extern NSString* const iPad7_6;
extern NSString* const iPad8_1;
extern NSString* const iPad8_10;
extern NSString* const iPad8_11;
extern NSString* const iPad8_12;
extern NSString* const iPad8_2;
extern NSString* const iPad8_3;
extern NSString* const iPad8_4;
extern NSString* const iPad8_5;
extern NSString* const iPad8_6;
extern NSString* const iPad8_7;
extern NSString* const iPad8_8;
extern NSString* const iPad8_9;
extern NSString* const iPhone1_1;
extern NSString* const iPhone1_2;
extern NSString* const iPhone10_1;
extern NSString* const iPhone10_2;
extern NSString* const iPhone10_3;
extern NSString* const iPhone10_4;
extern NSString* const iPhone10_5;
extern NSString* const iPhone10_6;
extern NSString* const iPhone11_2;
extern NSString* const iPhone11_4;
extern NSString* const iPhone11_6;
extern NSString* const iPhone11_8;
extern NSString* const iPhone12_1;
extern NSString* const iPhone12_3;
extern NSString* const iPhone12_5;
extern NSString* const iPhone12_8;
extern NSString* const iPhone13_1;
extern NSString* const iPhone13_2;
extern NSString* const iPhone13_3;
extern NSString* const iPhone13_4;
extern NSString* const iPhone14_2;
extern NSString* const iPhone14_3;
extern NSString* const iPhone14_4;
extern NSString* const iPhone14_5;
extern NSString* const iPhone14_6;
extern NSString* const iPhone14_7;
extern NSString* const iPhone14_8;
extern NSString* const iPhone15_2;
extern NSString* const iPhone15_3;
extern NSString* const iPhone2_1;
extern NSString* const iPhone3_1;
extern NSString* const iPhone3_2;
extern NSString* const iPhone3_3;
extern NSString* const iPhone4_1;
extern NSString* const iPhone5_1;
extern NSString* const iPhone5_2;
extern NSString* const iPhone5_3;
extern NSString* const iPhone5_4;
extern NSString* const iPhone6_1;
extern NSString* const iPhone6_2;
extern NSString* const iPhone7_1;
extern NSString* const iPhone7_2;
extern NSString* const iPhone8_1;
extern NSString* const iPhone8_2;
extern NSString* const iPhone8_4;
extern NSString* const iPhone9_1;
extern NSString* const iPhone9_2;
extern NSString* const iPhone9_3;
extern NSString* const iPhone9_4;
extern NSString* const iPod1_1;
extern NSString* const iPod2_1;
extern NSString* const iPod3_1;
extern NSString* const iPod4_1;
extern NSString* const iPod5_1;
extern NSString* const iPod7_1;
extern NSString* const iPod9_1;
extern NSString* const x86_64_Simulator;

View File

@@ -0,0 +1,334 @@
//
// CocoaDebug
// liman
//
// Created by liman 02/02/2023.
// Copyright © 2023 liman. All rights reserved.
//
#import "_DeviceUtil.h"
NSString* const AppleTV1_1 = @"AppleTV1,1";
NSString* const AppleTV2_1 = @"AppleTV2,1";
NSString* const AppleTV3_1 = @"AppleTV3,1";
NSString* const AppleTV3_2 = @"AppleTV3,2";
NSString* const AppleTV5_3 = @"AppleTV5,3";
NSString* const AppleTV6_2 = @"AppleTV6,2";
NSString* const Watch1_1 = @"Watch1,1";
NSString* const Watch1_2 = @"Watch1,2";
NSString* const Watch2_3 = @"Watch2,3";
NSString* const Watch2_4 = @"Watch2,4";
NSString* const Watch2_6 = @"Watch2,6";
NSString* const Watch2_7 = @"Watch2,7";
NSString* const Watch3_1 = @"Watch3,1";
NSString* const Watch3_2 = @"Watch3,2";
NSString* const Watch3_3 = @"Watch3,3";
NSString* const Watch3_4 = @"Watch3,4";
NSString* const Watch4_1 = @"Watch4,1";
NSString* const Watch4_2 = @"Watch4,2";
NSString* const Watch4_3 = @"Watch4,3";
NSString* const Watch4_4 = @"Watch4,4";
NSString* const Watch5_1 = @"Watch5,1";
NSString* const Watch5_2 = @"Watch5,2";
NSString* const Watch5_3 = @"Watch5,3";
NSString* const Watch5_4 = @"Watch5,4";
NSString* const i386_Simulator = @"i386";
NSString* const iPad1_1 = @"iPad1,1";
NSString* const iPad1_2 = @"iPad1,2";
NSString* const iPad11_1 = @"iPad11,1";
NSString* const iPad11_2 = @"iPad11,2";
NSString* const iPad11_3 = @"iPad11,3";
NSString* const iPad11_4 = @"iPad11,4";
NSString* const iPad12_1 = @"iPad12,1";
NSString* const iPad12_2 = @"iPad12,2";
NSString* const iPad13_1 = @"iPad13,1";
NSString* const iPad13_10 = @"iPad13,10";
NSString* const iPad13_11 = @"iPad13,11";
NSString* const iPad13_16 = @"iPad13,16";
NSString* const iPad13_17 = @"iPad13,17";
NSString* const iPad13_2 = @"iPad13,2";
NSString* const iPad13_4 = @"iPad13,4";
NSString* const iPad13_5 = @"iPad13,5";
NSString* const iPad13_6 = @"iPad13,6";
NSString* const iPad13_7 = @"iPad13,7";
NSString* const iPad13_8 = @"iPad13,8";
NSString* const iPad13_9 = @"iPad13,9";
NSString* const iPad14_1 = @"iPad14,1";
NSString* const iPad14_2 = @"iPad14,2";
NSString* const iPad2_1 = @"iPad2,1";
NSString* const iPad2_2 = @"iPad2,2";
NSString* const iPad2_3 = @"iPad2,3";
NSString* const iPad2_4 = @"iPad2,4";
NSString* const iPad2_5 = @"iPad2,5";
NSString* const iPad2_6 = @"iPad2,6";
NSString* const iPad2_7 = @"iPad2,7";
NSString* const iPad3_1 = @"iPad3,1";
NSString* const iPad3_2 = @"iPad3,2";
NSString* const iPad3_3 = @"iPad3,3";
NSString* const iPad3_4 = @"iPad3,4";
NSString* const iPad3_5 = @"iPad3,5";
NSString* const iPad3_6 = @"iPad3,6";
NSString* const iPad4_1 = @"iPad4,1";
NSString* const iPad4_2 = @"iPad4,2";
NSString* const iPad4_3 = @"iPad4,3";
NSString* const iPad4_4 = @"iPad4,4";
NSString* const iPad4_5 = @"iPad4,5";
NSString* const iPad4_6 = @"iPad4,6";
NSString* const iPad4_7 = @"iPad4,7";
NSString* const iPad4_8 = @"iPad4,8";
NSString* const iPad4_9 = @"iPad4,9";
NSString* const iPad5_1 = @"iPad5,1";
NSString* const iPad5_2 = @"iPad5,2";
NSString* const iPad5_3 = @"iPad5,3";
NSString* const iPad5_4 = @"iPad5,4";
NSString* const iPad6_11 = @"iPad6,11";
NSString* const iPad6_12 = @"iPad6,12";
NSString* const iPad6_3 = @"iPad6,3";
NSString* const iPad6_4 = @"iPad6,4";
NSString* const iPad6_7 = @"iPad6,7";
NSString* const iPad6_8 = @"iPad6,8";
NSString* const iPad7_1 = @"iPad7,1";
NSString* const iPad7_11 = @"iPad7,11";
NSString* const iPad7_12 = @"iPad7,12";
NSString* const iPad7_2 = @"iPad7,2";
NSString* const iPad7_3 = @"iPad7,3";
NSString* const iPad7_4 = @"iPad7,4";
NSString* const iPad7_5 = @"iPad7,5";
NSString* const iPad7_6 = @"iPad7,6";
NSString* const iPad8_1 = @"iPad8,1";
NSString* const iPad8_10 = @"iPad8,10";
NSString* const iPad8_11 = @"iPad8,11";
NSString* const iPad8_12 = @"iPad8,12";
NSString* const iPad8_2 = @"iPad8,2";
NSString* const iPad8_3 = @"iPad8,3";
NSString* const iPad8_4 = @"iPad8,4";
NSString* const iPad8_5 = @"iPad8,5";
NSString* const iPad8_6 = @"iPad8,6";
NSString* const iPad8_7 = @"iPad8,7";
NSString* const iPad8_8 = @"iPad8,8";
NSString* const iPad8_9 = @"iPad8,9";
NSString* const iPhone1_1 = @"iPhone1,1";
NSString* const iPhone1_2 = @"iPhone1,2";
NSString* const iPhone10_1 = @"iPhone10,1";
NSString* const iPhone10_2 = @"iPhone10,2";
NSString* const iPhone10_3 = @"iPhone10,3";
NSString* const iPhone10_4 = @"iPhone10,4";
NSString* const iPhone10_5 = @"iPhone10,5";
NSString* const iPhone10_6 = @"iPhone10,6";
NSString* const iPhone11_2 = @"iPhone11,2";
NSString* const iPhone11_4 = @"iPhone11,4";
NSString* const iPhone11_6 = @"iPhone11,6";
NSString* const iPhone11_8 = @"iPhone11,8";
NSString* const iPhone12_1 = @"iPhone12,1";
NSString* const iPhone12_3 = @"iPhone12,3";
NSString* const iPhone12_5 = @"iPhone12,5";
NSString* const iPhone12_8 = @"iPhone12,8";
NSString* const iPhone13_1 = @"iPhone13,1";
NSString* const iPhone13_2 = @"iPhone13,2";
NSString* const iPhone13_3 = @"iPhone13,3";
NSString* const iPhone13_4 = @"iPhone13,4";
NSString* const iPhone14_2 = @"iPhone14,2";
NSString* const iPhone14_3 = @"iPhone14,3";
NSString* const iPhone14_4 = @"iPhone14,4";
NSString* const iPhone14_5 = @"iPhone14,5";
NSString* const iPhone14_6 = @"iPhone14,6";
NSString* const iPhone14_7 = @"iPhone14,7";
NSString* const iPhone14_8 = @"iPhone14,8";
NSString* const iPhone15_2 = @"iPhone15,2";
NSString* const iPhone15_3 = @"iPhone15,3";
NSString* const iPhone2_1 = @"iPhone2,1";
NSString* const iPhone3_1 = @"iPhone3,1";
NSString* const iPhone3_2 = @"iPhone3,2";
NSString* const iPhone3_3 = @"iPhone3,3";
NSString* const iPhone4_1 = @"iPhone4,1";
NSString* const iPhone5_1 = @"iPhone5,1";
NSString* const iPhone5_2 = @"iPhone5,2";
NSString* const iPhone5_3 = @"iPhone5,3";
NSString* const iPhone5_4 = @"iPhone5,4";
NSString* const iPhone6_1 = @"iPhone6,1";
NSString* const iPhone6_2 = @"iPhone6,2";
NSString* const iPhone7_1 = @"iPhone7,1";
NSString* const iPhone7_2 = @"iPhone7,2";
NSString* const iPhone8_1 = @"iPhone8,1";
NSString* const iPhone8_2 = @"iPhone8,2";
NSString* const iPhone8_4 = @"iPhone8,4";
NSString* const iPhone9_1 = @"iPhone9,1";
NSString* const iPhone9_2 = @"iPhone9,2";
NSString* const iPhone9_3 = @"iPhone9,3";
NSString* const iPhone9_4 = @"iPhone9,4";
NSString* const iPod1_1 = @"iPod1,1";
NSString* const iPod2_1 = @"iPod2,1";
NSString* const iPod3_1 = @"iPod3,1";
NSString* const iPod4_1 = @"iPod4,1";
NSString* const iPod5_1 = @"iPod5,1";
NSString* const iPod7_1 = @"iPod7,1";
NSString* const iPod9_1 = @"iPod9,1";
NSString* const x86_64_Simulator = @"x86_64";
@implementation _DeviceUtil (Constant)
- (Hardware)hardware {
NSString *hardware = [self hardwareString];
if ([hardware isEqualToString:AppleTV1_1]) return APPLE_TV_1G;
if ([hardware isEqualToString:AppleTV2_1]) return APPLE_TV_2G;
if ([hardware isEqualToString:AppleTV3_1]) return APPLE_TV_3G;
if ([hardware isEqualToString:AppleTV3_2]) return APPLE_TV_3_2G;
if ([hardware isEqualToString:AppleTV5_3]) return APPLE_TV_4G;
if ([hardware isEqualToString:AppleTV6_2]) return APPLE_TV_4K;
if ([hardware isEqualToString:Watch1_1]) return APPLE_WATCH_38;
if ([hardware isEqualToString:Watch1_2]) return APPLE_WATCH_42;
if ([hardware isEqualToString:Watch2_3]) return APPLE_WATCH_SERIES_2_38;
if ([hardware isEqualToString:Watch2_4]) return APPLE_WATCH_SERIES_2_42;
if ([hardware isEqualToString:Watch2_6]) return APPLE_WATCH_SERIES_1_38;
if ([hardware isEqualToString:Watch2_7]) return APPLE_WATCH_SERIES_1_42;
if ([hardware isEqualToString:Watch3_1]) return APPLE_WATCH_SERIES_3_38_CELLULAR;
if ([hardware isEqualToString:Watch3_2]) return APPLE_WATCH_SERIES_3_42_CELLULAR;
if ([hardware isEqualToString:Watch3_3]) return APPLE_WATCH_SERIES_3_38;
if ([hardware isEqualToString:Watch3_4]) return APPLE_WATCH_SERIES_3_42;
if ([hardware isEqualToString:Watch4_1]) return APPLE_WATCH_SERIES_4_40;
if ([hardware isEqualToString:Watch4_2]) return APPLE_WATCH_SERIES_4_44;
if ([hardware isEqualToString:Watch4_3]) return APPLE_WATCH_SERIES_4_40_CELLULAR;
if ([hardware isEqualToString:Watch4_4]) return APPLE_WATCH_SERIES_4_44_CELLULAR;
if ([hardware isEqualToString:Watch5_1]) return APPLE_WATCH_SERIES_5_40;
if ([hardware isEqualToString:Watch5_2]) return APPLE_WATCH_SERIES_5_44;
if ([hardware isEqualToString:Watch5_3]) return APPLE_WATCH_SERIES_5_40_CELLULAR;
if ([hardware isEqualToString:Watch5_4]) return APPLE_WATCH_SERIES_5_44_CELLULAR;
if ([hardware isEqualToString:i386_Simulator]) return SIMULATOR;
if ([hardware isEqualToString:iPad1_1]) return IPAD;
if ([hardware isEqualToString:iPad1_2]) return IPAD_3G;
if ([hardware isEqualToString:iPad11_1]) return IPAD_MINI_5_WIFI;
if ([hardware isEqualToString:iPad11_2]) return IPAD_MINI_5_WIFI_CELLULAR;
if ([hardware isEqualToString:iPad11_3]) return IPAD_AIR_3_WIFI;
if ([hardware isEqualToString:iPad11_4]) return IPAD_AIR_3_WIFI_CELLULAR;
if ([hardware isEqualToString:iPad12_1]) return IPAD_9_WIFI;
if ([hardware isEqualToString:iPad12_2]) return IPAD_9_WIFI_CELLULAR;
if ([hardware isEqualToString:iPad13_1]) return IPAD_AIR_4_WIFI;
if ([hardware isEqualToString:iPad13_10]) return IPAD_PRO_5_WIFI_CELLULAR;
if ([hardware isEqualToString:iPad13_11]) return IPAD_PRO_5_WIFI_CELLULAR;
if ([hardware isEqualToString:iPad13_16]) return IPAD_AIR_5_WIFI;
if ([hardware isEqualToString:iPad13_17]) return IPAD_AIR_5_WIFI_CELLULAR;
if ([hardware isEqualToString:iPad13_2]) return IPAD_AIR_4_WIFI_CELLULAR;
if ([hardware isEqualToString:iPad13_4]) return IPAD_PRO_11_3_WIFI;
if ([hardware isEqualToString:iPad13_5]) return IPAD_AIR_4_WIFI_CELLULAR;
if ([hardware isEqualToString:iPad13_6]) return IPAD_PRO_11_3_WIFI_CELLULAR;
if ([hardware isEqualToString:iPad13_7]) return IPAD_PRO_11_3_WIFI_CELLULAR;
if ([hardware isEqualToString:iPad13_8]) return IPAD_PRO_5_WIFI;
if ([hardware isEqualToString:iPad13_9]) return IPAD_PRO_5_WIFI_CELLULAR;
if ([hardware isEqualToString:iPad14_1]) return IPAD_MINI_6_WIFI;
if ([hardware isEqualToString:iPad14_2]) return IPAD_MINI_6_WIFI_CELLULAR;
if ([hardware isEqualToString:iPad2_1]) return IPAD_2_WIFI;
if ([hardware isEqualToString:iPad2_2]) return IPAD_2;
if ([hardware isEqualToString:iPad2_3]) return IPAD_2_CDMA;
if ([hardware isEqualToString:iPad2_4]) return IPAD_2;
if ([hardware isEqualToString:iPad2_5]) return IPAD_MINI_WIFI;
if ([hardware isEqualToString:iPad2_6]) return IPAD_MINI;
if ([hardware isEqualToString:iPad2_7]) return IPAD_MINI_WIFI_CDMA;
if ([hardware isEqualToString:iPad3_1]) return IPAD_3_WIFI;
if ([hardware isEqualToString:iPad3_2]) return IPAD_3_WIFI_CDMA;
if ([hardware isEqualToString:iPad3_3]) return IPAD_3;
if ([hardware isEqualToString:iPad3_4]) return IPAD_4_WIFI;
if ([hardware isEqualToString:iPad3_5]) return IPAD_4;
if ([hardware isEqualToString:iPad3_6]) return IPAD_4_GSM_CDMA;
if ([hardware isEqualToString:iPad4_1]) return IPAD_AIR_WIFI;
if ([hardware isEqualToString:iPad4_2]) return IPAD_AIR_WIFI_GSM;
if ([hardware isEqualToString:iPad4_3]) return IPAD_AIR_WIFI_CDMA;
if ([hardware isEqualToString:iPad4_4]) return IPAD_MINI_RETINA_WIFI;
if ([hardware isEqualToString:iPad4_5]) return IPAD_MINI_RETINA_WIFI_CDMA;
if ([hardware isEqualToString:iPad4_6]) return IPAD_MINI_RETINA_WIFI_CELLULAR_CN;
if ([hardware isEqualToString:iPad4_7]) return IPAD_MINI_3_WIFI;
if ([hardware isEqualToString:iPad4_8]) return IPAD_MINI_3_WIFI_CELLULAR;
if ([hardware isEqualToString:iPad4_9]) return IPAD_MINI_3_WIFI_CELLULAR_CN;
if ([hardware isEqualToString:iPad5_1]) return IPAD_MINI_4_WIFI;
if ([hardware isEqualToString:iPad5_2]) return IPAD_MINI_4_WIFI_CELLULAR;
if ([hardware isEqualToString:iPad5_3]) return IPAD_AIR_2_WIFI;
if ([hardware isEqualToString:iPad5_4]) return IPAD_AIR_2_WIFI_CELLULAR;
if ([hardware isEqualToString:iPad6_11]) return IPAD_5_WIFI;
if ([hardware isEqualToString:iPad6_12]) return IPAD_5_WIFI_CELLULAR;
if ([hardware isEqualToString:iPad6_3]) return IPAD_PRO_97_WIFI;
if ([hardware isEqualToString:iPad6_4]) return IPAD_PRO_97_WIFI_CELLULAR;
if ([hardware isEqualToString:iPad6_7]) return IPAD_PRO_WIFI;
if ([hardware isEqualToString:iPad6_8]) return IPAD_PRO_WIFI_CELLULAR;
if ([hardware isEqualToString:iPad7_1]) return IPAD_PRO_2G_WIFI;
if ([hardware isEqualToString:iPad7_11]) return IPAD_7_WIFI;
if ([hardware isEqualToString:iPad7_12]) return IPAD_7_WIFI_CELLULAR;
if ([hardware isEqualToString:iPad7_2]) return IPAD_PRO_2G_WIFI_CELLULAR;
if ([hardware isEqualToString:iPad7_3]) return IPAD_PRO_105_WIFI;
if ([hardware isEqualToString:iPad7_4]) return IPAD_PRO_105_WIFI_CELLULAR;
if ([hardware isEqualToString:iPad7_5]) return IPAD_6_WIFI;
if ([hardware isEqualToString:iPad7_6]) return IPAD_6_WIFI_CELLULAR;
if ([hardware isEqualToString:iPad8_1]) return IPAD_PRO_11_WIFI;
if ([hardware isEqualToString:iPad8_10]) return IPAD_PRO_11_2G_WIFI_CELLULAR;
if ([hardware isEqualToString:iPad8_11]) return IPAD_PRO_4G_WIFI;
if ([hardware isEqualToString:iPad8_12]) return IPAD_PRO_4G_WIFI_CELLULAR;
if ([hardware isEqualToString:iPad8_2]) return IPAD_PRO_11_1TB_WIFI;
if ([hardware isEqualToString:iPad8_3]) return IPAD_PRO_11_WIFI_CELLULAR;
if ([hardware isEqualToString:iPad8_4]) return IPAD_PRO_11_1TB_WIFI_CELLULAR;
if ([hardware isEqualToString:iPad8_5]) return IPAD_PRO_3G_WIFI;
if ([hardware isEqualToString:iPad8_6]) return IPAD_PRO_3G_1TB_WIFI;
if ([hardware isEqualToString:iPad8_7]) return IPAD_PRO_3G_WIFI_CELLULAR;
if ([hardware isEqualToString:iPad8_8]) return IPAD_PRO_3G_1TB_WIFI_CELLULAR;
if ([hardware isEqualToString:iPad8_9]) return IPAD_PRO_11_2G_WIFI;
if ([hardware isEqualToString:iPhone1_1]) return IPHONE_2G;
if ([hardware isEqualToString:iPhone1_2]) return IPHONE_3G;
if ([hardware isEqualToString:iPhone10_1]) return IPHONE_8_CN;
if ([hardware isEqualToString:iPhone10_2]) return IPHONE_8_PLUS_CN;
if ([hardware isEqualToString:iPhone10_3]) return IPHONE_X_CN;
if ([hardware isEqualToString:iPhone10_4]) return IPHONE_8;
if ([hardware isEqualToString:iPhone10_5]) return IPHONE_8_PLUS;
if ([hardware isEqualToString:iPhone10_6]) return IPHONE_X;
if ([hardware isEqualToString:iPhone11_2]) return IPHONE_XS;
if ([hardware isEqualToString:iPhone11_4]) return IPHONE_XS_MAX;
if ([hardware isEqualToString:iPhone11_6]) return IPHONE_XS_MAX_CN;
if ([hardware isEqualToString:iPhone11_8]) return IPHONE_XR;
if ([hardware isEqualToString:iPhone12_1]) return IPHONE_11;
if ([hardware isEqualToString:iPhone12_3]) return IPHONE_11_PRO;
if ([hardware isEqualToString:iPhone12_5]) return IPHONE_11_PRO_MAX;
if ([hardware isEqualToString:iPhone12_8]) return IPHONE_SE_2G;
if ([hardware isEqualToString:iPhone13_1]) return IPHONE_12_MINI;
if ([hardware isEqualToString:iPhone13_2]) return IPHONE_12;
if ([hardware isEqualToString:iPhone13_3]) return IPHONE_12_PRO;
if ([hardware isEqualToString:iPhone13_4]) return IPHONE_12_PRO_MAX;
if ([hardware isEqualToString:iPhone14_2]) return IPHONE_13_PRO;
if ([hardware isEqualToString:iPhone14_3]) return IPHONE_13_PRO_MAX;
if ([hardware isEqualToString:iPhone14_4]) return IPHONE_13_MINI;
if ([hardware isEqualToString:iPhone14_5]) return IPHONE_13;
if ([hardware isEqualToString:iPhone14_6]) return IPHONE_SE_3G;
if ([hardware isEqualToString:iPhone14_7]) return IPHONE_14;
if ([hardware isEqualToString:iPhone14_8]) return IPHONE_14_PLUS;
if ([hardware isEqualToString:iPhone15_2]) return IPHONE_14_PRO;
if ([hardware isEqualToString:iPhone15_3]) return IPHONE_14_PRO_MAX;
if ([hardware isEqualToString:iPhone2_1]) return IPHONE_3GS;
if ([hardware isEqualToString:iPhone3_1]) return IPHONE_4;
if ([hardware isEqualToString:iPhone3_2]) return IPHONE_4;
if ([hardware isEqualToString:iPhone3_3]) return IPHONE_4_CDMA;
if ([hardware isEqualToString:iPhone4_1]) return IPHONE_4S;
if ([hardware isEqualToString:iPhone5_1]) return IPHONE_5;
if ([hardware isEqualToString:iPhone5_2]) return IPHONE_5_CDMA_GSM;
if ([hardware isEqualToString:iPhone5_3]) return IPHONE_5C;
if ([hardware isEqualToString:iPhone5_4]) return IPHONE_5C_CDMA_GSM;
if ([hardware isEqualToString:iPhone6_1]) return IPHONE_5S;
if ([hardware isEqualToString:iPhone6_2]) return IPHONE_5S_CDMA_GSM;
if ([hardware isEqualToString:iPhone7_1]) return IPHONE_6_PLUS;
if ([hardware isEqualToString:iPhone7_2]) return IPHONE_6;
if ([hardware isEqualToString:iPhone8_1]) return IPHONE_6S;
if ([hardware isEqualToString:iPhone8_2]) return IPHONE_6S_PLUS;
if ([hardware isEqualToString:iPhone8_4]) return IPHONE_SE;
if ([hardware isEqualToString:iPhone9_1]) return IPHONE_7;
if ([hardware isEqualToString:iPhone9_2]) return IPHONE_7_PLUS;
if ([hardware isEqualToString:iPhone9_3]) return IPHONE_7_GSM;
if ([hardware isEqualToString:iPhone9_4]) return IPHONE_7_PLUS_GSM;
if ([hardware isEqualToString:iPod1_1]) return IPOD_TOUCH_1G;
if ([hardware isEqualToString:iPod2_1]) return IPOD_TOUCH_2G;
if ([hardware isEqualToString:iPod3_1]) return IPOD_TOUCH_3G;
if ([hardware isEqualToString:iPod4_1]) return IPOD_TOUCH_4G;
if ([hardware isEqualToString:iPod5_1]) return IPOD_TOUCH_5G;
if ([hardware isEqualToString:iPod7_1]) return IPOD_TOUCH_6G;
if ([hardware isEqualToString:iPod9_1]) return IPOD_TOUCH_7G;
if ([hardware isEqualToString:x86_64_Simulator]) return SIMULATOR;
NSLog(@"This is a device which is not listed in this category. Please visit https://github.com/InderKumarRathore/DeviceUtil and add a comment there.");
NSLog(@"Your device hardware string is: %@", hardware);
return UNKNOWN;
}
@end

View File

@@ -0,0 +1,55 @@
//
// CocoaDebug
// liman
//
// Created by liman 02/02/2023.
// Copyright © 2023 liman. All rights reserved.
//
#import <UIKit/UIKit.h>
#import "_DeviceUtil+Constant.h"
/// Enum of the different Apple's device platforms
typedef NS_ENUM(NSUInteger, Platform) {
iPhone,
iPodTouch,
iPad,
AppleTV,
AppleWatch,
Unknown
};
@interface _DeviceUtil : NSObject
/// This method returns the hardware type
- (NSString*)hardwareString;
/// This method returns the Platform enum depending upon hardware string
- (Platform)platform;
/// This method returns the readable description of hardware string
- (NSString*)hardwareDescription;
/// This method returns the readable simple description of hardware string
- (NSString*)hardwareSimpleDescription;
/// This method returns the hardware number not actual but logically. e.g. if the hardware string is 5,1 then hardware number would be 5.1
- (float)hardwareNumber;
/// This method returns if we are running in the simulator
- (BOOL)isSimulator;
/// This method returns the resolution for still image that can be received from back camera of the current device. Resolution returned for image oriented landscape right.
- (CGSize)backCameraStillImageResolutionInPixels;
@end
@interface _DeviceUtil (Constant)
/// This method returns the Hardware enum depending upon hardware string
- (Hardware)hardware;
@end

849
Pods/CocoaDebug/Sources/Core/_DeviceUtil.m generated Normal file
View File

@@ -0,0 +1,849 @@
//
// CocoaDebug
// liman
//
// Created by liman 02/02/2023.
// Copyright © 2023 liman. All rights reserved.
//
#import "_DeviceUtil.h"
#import "_DeviceUtil+Constant.h"
#include <sys/sysctl.h>
@implementation _DeviceUtil {
NSDictionary *deviceList;
}
- (instancetype)init
{
self = [super init];
if (self) {
deviceList = @{
@"AppleTV1,1" : @{
@"name": @"Apple TV 1G",
@"version": @"1.1",
},
@"AppleTV2,1" : @{
@"name": @"Apple TV 2G",
@"version": @"2.1",
},
@"AppleTV3,1" : @{
@"name": @"Apple TV 2012",
@"version": @"3.1",
},
@"AppleTV3,2" : @{
@"name": @"Apple TV 2013",
@"version": @"3.2",
},
@"AppleTV5,3" : @{
@"name": @"Apple TV 4G",
@"version": @"5.3",
},
@"AppleTV6,2" : @{
@"name": @"Apple TV 4K",
@"version": @"6.2",
},
@"Watch1,1" : @{
@"name": @"Apple Watch (38 mm)",
@"version": @"1.1",
},
@"Watch1,2" : @{
@"name": @"Apple Watch (42 mm)",
@"version": @"1.2",
},
@"Watch2,3" : @{
@"name": @"Apple Watch Series 2 (38 mm)",
@"version": @"2.3",
},
@"Watch2,4" : @{
@"name": @"Apple Watch Series 2 (42 mm)",
@"version": @"2.4",
},
@"Watch2,6" : @{
@"name": @"Apple Watch Series 1 (38 mm)",
@"version": @"2.6",
},
@"Watch2,7" : @{
@"name": @"Apple Watch Series 1 (42 mm)",
@"version": @"2.7",
},
@"Watch3,1" : @{
@"name": @"Apple Watch Series 3 (38 mm/Cellular)",
@"version": @"3.1",
},
@"Watch3,2" : @{
@"name": @"Apple Watch Series 3 (42 mm/Cellular)",
@"version": @"3.2",
},
@"Watch3,3" : @{
@"name": @"Apple Watch Series 3 (38 mm)",
@"version": @"3.3",
},
@"Watch3,4" : @{
@"name": @"Apple Watch Series 3 (42 mm)",
@"version": @"3.4",
},
@"Watch4,1" : @{
@"name": @"Apple Watch Series 4 (40 mm)",
@"version": @"4.1",
},
@"Watch4,2" : @{
@"name": @"Apple Watch Series 4 (44 mm)",
@"version": @"4.2",
},
@"Watch4,3" : @{
@"name": @"Apple Watch Series 4 (40 mm/Cellular)",
@"version": @"4.3",
},
@"Watch4,4" : @{
@"name": @"Apple Watch Series 4 (44 mm/Cellular)",
@"version": @"4.4",
},
@"Watch5,1" : @{
@"name": @"Apple Watch Series 5 (40 mm)",
@"version": @"5.1",
},
@"Watch5,2" : @{
@"name": @"Apple Watch Series 5 (44 mm)",
@"version": @"5.2",
},
@"Watch5,3" : @{
@"name": @"Apple Watch Series 5 (40 mm/Cellular)",
@"version": @"5.3",
},
@"Watch5,4" : @{
@"name": @"Apple Watch Series 5 (44 mm/Cellular)",
@"version": @"5.4",
},
@"i386" : @{
@"name": @"Simulator",
@"version": @"-1",
},
@"iPad1,1" : @{
@"name": @"iPad (WiFi)",
@"version": @"1.1",
},
@"iPad1,2" : @{
@"name": @"iPad 3G",
@"version": @"1.2",
},
@"iPad11,1" : @{
@"name": @"iPad mini 5 (Wi-Fi Only)",
@"version": @"11.1",
},
@"iPad11,2" : @{
@"name": @"iPad mini 5 (Wi-Fi/Cellular)",
@"version": @"11.2",
},
@"iPad11,3" : @{
@"name": @"iPad Air 3 (Wi-Fi)",
@"version": @"11.3",
},
@"iPad11,4" : @{
@"name": @"iPad Air 3 (Wi-Fi + Cellular)",
@"version": @"11.4",
},
@"iPad12,1" : @{
@"name": @"iPad 9 (Wi-Fi)",
@"version": @"12.1",
},
@"iPad12,2" : @{
@"name": @"iPad 9 (Wi-Fi + Cellular)",
@"version": @"12.2",
},
@"iPad13,1" : @{
@"name": @"iPad Air 4 (Wi-Fi)",
@"version": @"13.1",
},
@"iPad13,10" : @{
@"name": @"iPad Pro 12.9\" 5th Gen (Wi-Fi + Cellular)",
@"version": @"13.1",
},
@"iPad13,11" : @{
@"name": @"iPad Pro 12.9\" 5th Gen (Wi-Fi + Cellular)",
@"version": @"13.11",
},
@"iPad13,16" : @{
@"name": @"iPad Air 5th Gen (Wi-Fi)",
@"version": @"13.16",
},
@"iPad13,17" : @{
@"name": @"iPad Air 5th Gen (Wi-Fi + Cellular)",
@"version": @"13.17",
},
@"iPad13,2" : @{
@"name": @"iPad Air 4 (Wi-Fi + Cellular)",
@"version": @"13.2",
},
@"iPad13,4" : @{
@"name": @"iPad Pro 11\" 3rd Gen (Wi-Fi)",
@"version": @"13.4",
},
@"iPad13,5" : @{
@"name": @"iPad Pro 11\" 3rd Gen (Wi-Fi + Cellular)",
@"version": @"13.5",
},
@"iPad13,6" : @{
@"name": @"iPad Pro 11\" 3rd Gen (Wi-Fi + Cellular)",
@"version": @"13.6",
},
@"iPad13,7" : @{
@"name": @"iPad Pro 11\" 3rd Gen (Wi-Fi + Cellular)",
@"version": @"13.7",
},
@"iPad13,8" : @{
@"name": @"iPad Pro 12.9\" 5th Gen (Wi-Fi)",
@"version": @"13.8",
},
@"iPad13,9" : @{
@"name": @"iPad Pro 12.9\" 5th Gen (Wi-Fi + Cellular)",
@"version": @"13.9",
},
@"iPad14,1" : @{
@"name": @"iPad Mini 6 (Wi-Fi)",
@"version": @"14.1",
},
@"iPad14,2" : @{
@"name": @"iPad Mini 6 (Wi-Fi + Cellular)",
@"version": @"14.2",
},
@"iPad2,1" : @{
@"name": @"iPad 2 (WiFi)",
@"version": @"2.1",
},
@"iPad2,2" : @{
@"name": @"iPad 2 (GSM)",
@"version": @"2.2",
},
@"iPad2,3" : @{
@"name": @"iPad 2 (CDMA)",
@"version": @"2.3",
},
@"iPad2,4" : @{
@"name": @"iPad 2 (WiFi Rev. A)",
@"version": @"2.4",
},
@"iPad2,5" : @{
@"name": @"iPad Mini (WiFi)",
@"version": @"2.5",
},
@"iPad2,6" : @{
@"name": @"iPad Mini (GSM)",
@"version": @"2.6",
},
@"iPad2,7" : @{
@"name": @"iPad Mini (CDMA)",
@"version": @"2.7",
},
@"iPad3,1" : @{
@"name": @"iPad 3 (WiFi)",
@"version": @"3.1",
},
@"iPad3,2" : @{
@"name": @"iPad 3 (CDMA)",
@"version": @"3.2",
},
@"iPad3,3" : @{
@"name": @"iPad 3 (Global)",
@"version": @"3.3",
},
@"iPad3,4" : @{
@"name": @"iPad 4 (WiFi)",
@"version": @"3.4",
},
@"iPad3,5" : @{
@"name": @"iPad 4 (CDMA)",
@"version": @"3.5",
},
@"iPad3,6" : @{
@"name": @"iPad 4 (Global)",
@"version": @"3.6",
},
@"iPad4,1" : @{
@"name": @"iPad Air (WiFi)",
@"version": @"4.1",
},
@"iPad4,2" : @{
@"name": @"iPad Air (WiFi+GSM)",
@"version": @"4.2",
},
@"iPad4,3" : @{
@"name": @"iPad Air (WiFi+CDMA)",
@"version": @"4.3",
},
@"iPad4,4" : @{
@"name": @"iPad Mini Retina (WiFi)",
@"version": @"4.4",
},
@"iPad4,5" : @{
@"name": @"iPad Mini Retina (WiFi+CDMA)",
@"version": @"4.5",
},
@"iPad4,6" : @{
@"name": @"iPad Mini Retina (Wi-Fi + Cellular CN)",
@"version": @"4.6",
},
@"iPad4,7" : @{
@"name": @"iPad Mini 3 (Wi-Fi)",
@"version": @"4.7",
},
@"iPad4,8" : @{
@"name": @"iPad Mini 3 (Wi-Fi + Cellular)",
@"version": @"4.8",
},
@"iPad4,9" : @{
@"name": @"iPad mini 3 (Wi-Fi/Cellular, China)",
@"version": @"4.9",
},
@"iPad5,1" : @{
@"name": @"iPad mini 4 (Wi-Fi Only)",
@"version": @"5.1",
},
@"iPad5,2" : @{
@"name": @"iPad mini 4 (Wi-Fi/Cellular)",
@"version": @"5.2",
},
@"iPad5,3" : @{
@"name": @"iPad Air 2 (Wi-Fi)",
@"version": @"5.3",
},
@"iPad5,4" : @{
@"name": @"iPad Air 2 (Wi-Fi + Cellular)",
@"version": @"5.4",
},
@"iPad6,11" : @{
@"name": @"9.7-inch iPad (Wi-Fi)",
@"version": @"6.11",
},
@"iPad6,12" : @{
@"name": @"9.7-inch iPad (Wi-Fi + Cellular)",
@"version": @"6.12",
},
@"iPad6,3" : @{
@"name": @"iPad Pro 9.7-inch (Wi-Fi Only)",
@"version": @"6.3",
},
@"iPad6,4" : @{
@"name": @"iPad Pro 9.7-inch (Wi-Fi + Cellular)",
@"version": @"6.4",
},
@"iPad6,7" : @{
@"name": @"iPad Pro (Wi-Fi Only)",
@"version": @"6.7",
},
@"iPad6,8" : @{
@"name": @"iPad Pro (Wi-Fi/Cellular)",
@"version": @"6.8",
},
@"iPad7,1" : @{
@"name": @"iPad Pro 12.9-Inch (Wi-Fi Only - 2nd Gen)",
@"version": @"7.1",
},
@"iPad7,11" : @{
@"name": @"iPad 10.2-Inch 7th Gen (Wi-Fi Only)",
@"version": @"7.11",
},
@"iPad7,12" : @{
@"name": @"iPad 10.2-Inch 7th Gen (Wi-Fi/Cellular Only)",
@"version": @"7.12",
},
@"iPad7,2" : @{
@"name": @"iPad Pro 12.9-Inch (Wi-Fi/Cell - 2nd Gen)",
@"version": @"7.2",
},
@"iPad7,3" : @{
@"name": @"iPad Pro 10.5-Inch (Wi-Fi Only)",
@"version": @"7.3",
},
@"iPad7,4" : @{
@"name": @"iPad Pro 10.5-Inch (Wi-Fi/Cellular)",
@"version": @"7.4",
},
@"iPad7,5" : @{
@"name": @"iPad 9.7-Inch 6th Gen (Wi-Fi Only)",
@"version": @"7.5",
},
@"iPad7,6" : @{
@"name": @"iPad 9.7-Inch 6th Gen (Wi-Fi/Cellular)",
@"version": @"7.6",
},
@"iPad8,1" : @{
@"name": @"iPad Pro 11-Inch (Wi-Fi Only)",
@"version": @"8.1",
},
@"iPad8,10" : @{
@"name": @"iPad Pro 11-Inch (Wi-Fi/Cellular - 2nd Gen)",
@"version": @"8.1",
},
@"iPad8,11" : @{
@"name": @"iPad Pro 12.9-Inch 1TB (Wi-Fi Only - 4th Gen)",
@"version": @"8.109999999999999",
},
@"iPad8,12" : @{
@"name": @"iPad Pro 12.9-Inch (Wi-Fi/Cell - 4th Gen)",
@"version": @"8.800000000000001",
},
@"iPad8,2" : @{
@"name": @"iPad Pro 11-Inch 1TB (Wi-Fi Only)",
@"version": @"8.199999999999999",
},
@"iPad8,3" : @{
@"name": @"iPad Pro 11-Inch (Wi-Fi/Cellular)",
@"version": @"8.300000000000001",
},
@"iPad8,4" : @{
@"name": @"iPad Pro 11-Inch 1TB (Wi-Fi/Cellular)",
@"version": @"8.4",
},
@"iPad8,5" : @{
@"name": @"iPad Pro 12.9-Inch (Wi-Fi Only - 3rd Gen)",
@"version": @"8.5",
},
@"iPad8,6" : @{
@"name": @"iPad Pro 12.9-Inch 1TB (Wi-Fi Only - 3rd Gen)",
@"version": @"8.6",
},
@"iPad8,7" : @{
@"name": @"iPad Pro 12.9-Inch (Wi-Fi/Cell - 3rd Gen)",
@"version": @"8.699999999999999",
},
@"iPad8,8" : @{
@"name": @"iPad Pro 12.9-Inch 1TB (Wi-Fi/Cell - 3rd Gen)",
@"version": @"8.800000000000001",
},
@"iPad8,9" : @{
@"name": @"iPad Pro 11-Inch (Wi-Fi Only - 2nd Gen)",
@"version": @"8.9",
},
@"iPhone1,1" : @{
@"name": @"iPhone 2G",
@"version": @"1.1",
},
@"iPhone1,2" : @{
@"name": @"iPhone 3G",
@"version": @"1.2",
},
@"iPhone10,1" : @{
@"name": @"iPhone 8",
@"version": @"10.1",
},
@"iPhone10,2" : @{
@"name": @"iPhone 8 Plus",
@"version": @"10.2",
},
@"iPhone10,3" : @{
@"name": @"iPhone X",
@"version": @"10.3",
},
@"iPhone10,4" : @{
@"name": @"iPhone 8",
@"version": @"10.4",
},
@"iPhone10,5" : @{
@"name": @"iPhone 8 Plus",
@"version": @"10.5",
},
@"iPhone10,6" : @{
@"name": @"iPhone X",
@"version": @"10.6",
},
@"iPhone11,2" : @{
@"name": @"iPhone XS",
@"version": @"11.2",
},
@"iPhone11,4" : @{
@"name": @"iPhone XS Max",
@"version": @"11.4",
},
@"iPhone11,6" : @{
@"name": @"iPhone XS Max China",
@"version": @"11.6",
},
@"iPhone11,8" : @{
@"name": @"iPhone XR",
@"version": @"11.8",
},
@"iPhone12,1" : @{
@"name": @"iPhone 11",
@"version": @"12.1",
},
@"iPhone12,3" : @{
@"name": @"iPhone 11 Pro",
@"version": @"12.3",
},
@"iPhone12,5" : @{
@"name": @"iPhone 11 Pro Max",
@"version": @"12.5",
},
@"iPhone12,8" : @{
@"name": @"iPhone SE (2 Gen)",
@"version": @"12.8",
},
@"iPhone13,1" : @{
@"name": @"iPhone 12 mini",
@"version": @"13.1",
},
@"iPhone13,2" : @{
@"name": @"iPhone 12",
@"version": @"13.2",
},
@"iPhone13,3" : @{
@"name": @"iPhone 12 Pro",
@"version": @"13.3",
},
@"iPhone13,4" : @{
@"name": @"iPhone 12 Pro Max",
@"version": @"13.4",
},
@"iPhone14,2" : @{
@"name": @"iPhone 13 Pro",
@"version": @"14.2",
},
@"iPhone14,3" : @{
@"name": @"iPhone 13 Pro Max",
@"version": @"14.3",
},
@"iPhone14,4" : @{
@"name": @"iPhone 13 mini",
@"version": @"14.4",
},
@"iPhone14,5" : @{
@"name": @"iPhone 13",
@"version": @"14.5",
},
@"iPhone14,6" : @{
@"name": @"iPhone SE (3 Gen)",
@"version": @"14.6",
},
@"iPhone14,7" : @{
@"name": @"iPhone 14",
@"version": @"14.7",
},
@"iPhone14,8" : @{
@"name": @"iPhone 14 Plus",
@"version": @"14.8",
},
@"iPhone15,2" : @{
@"name": @"iPhone 14 Pro",
@"version": @"15.2",
},
@"iPhone15,3" : @{
@"name": @"iPhone 14 Pro Max",
@"version": @"15.3",
},
@"iPhone2,1" : @{
@"name": @"iPhone 3GS",
@"version": @"2.1",
},
@"iPhone3,1" : @{
@"name": @"iPhone 4 (GSM)",
@"version": @"3.1",
},
@"iPhone3,2" : @{
@"name": @"iPhone 4 (GSM Rev. A)",
@"version": @"3.2",
},
@"iPhone3,3" : @{
@"name": @"iPhone 4 (CDMA)",
@"version": @"3.3",
},
@"iPhone4,1" : @{
@"name": @"iPhone 4S",
@"version": @"4.1",
},
@"iPhone5,1" : @{
@"name": @"iPhone 5 (GSM)",
@"version": @"5.1",
},
@"iPhone5,2" : @{
@"name": @"iPhone 5 (Global)",
@"version": @"5.2",
},
@"iPhone5,3" : @{
@"name": @"iPhone 5c (GSM)",
@"version": @"5.3",
},
@"iPhone5,4" : @{
@"name": @"iPhone 5c (Global)",
@"version": @"5.4",
},
@"iPhone6,1" : @{
@"name": @"iPhone 5s (GSM)",
@"version": @"6.1",
},
@"iPhone6,2" : @{
@"name": @"iPhone 5s (Global)",
@"version": @"6.2",
},
@"iPhone7,1" : @{
@"name": @"iPhone 6 Plus",
@"version": @"7.1",
},
@"iPhone7,2" : @{
@"name": @"iPhone 6",
@"version": @"7.2",
},
@"iPhone8,1" : @{
@"name": @"iPhone 6s",
@"version": @"8.1",
},
@"iPhone8,2" : @{
@"name": @"iPhone 6s Plus",
@"version": @"8.199999999999999",
},
@"iPhone8,4" : @{
@"name": @"iPhone SE",
@"version": @"8.4",
},
@"iPhone9,1" : @{
@"name": @"iPhone 7",
@"version": @"9.1",
},
@"iPhone9,2" : @{
@"name": @"iPhone 7 Plus",
@"version": @"9.199999999999999",
},
@"iPhone9,3" : @{
@"name": @"iPhone 7",
@"version": @"9.300000000000001",
},
@"iPhone9,4" : @{
@"name": @"iPhone 7 Plus",
@"version": @"9.4",
},
@"iPod1,1" : @{
@"name": @"iPod Touch (1 Gen)",
@"version": @"1.1",
},
@"iPod2,1" : @{
@"name": @"iPod Touch (2 Gen)",
@"version": @"2.1",
},
@"iPod3,1" : @{
@"name": @"iPod Touch (3 Gen)",
@"version": @"3.1",
},
@"iPod4,1" : @{
@"name": @"iPod Touch (4 Gen)",
@"version": @"4.1",
},
@"iPod5,1" : @{
@"name": @"iPod Touch (5 Gen)",
@"version": @"5.1",
},
@"iPod7,1" : @{
@"name": @"iPod Touch (6 Gen)",
@"version": @"7.1",
},
@"iPod9,1" : @{
@"name": @"iPod Touch (7 Gen)",
@"version": @"9.1",
},
@"x86_64" : @{
@"name": @"Simulator",
@"version": @"-1",
},
};
}
return self;
}
- (NSString*)nativeHardwareString {
int name[] = {CTL_HW,HW_MACHINE};
size_t size = 100;
sysctl(name, 2, NULL, &size, NULL, 0); // getting size of answer
char *hw_machine = malloc(size);
sysctl(name, 2, hw_machine, &size, NULL, 0);
NSString *hardware = [NSString stringWithUTF8String:hw_machine];
free(hw_machine);
return hardware;
}
- (NSString*)hardwareString {
NSString *hardware = [self nativeHardwareString];
// Check if the hardware is simulator
if ([hardware isEqualToString:i386_Simulator] || [hardware isEqualToString:x86_64_Simulator]) {
NSString *deviceID = [[[NSProcessInfo processInfo] environment] objectForKey:@"SIMULATOR_MODEL_IDENTIFIER"];
if (deviceID != nil) {
hardware = deviceID;
}
}
return hardware;
}
/* This is another way of gtting the system info
* For this you have to #import <sys/utsname.h>
*/
/*
NSString* machineName
{
struct utsname systemInfo;
uname(&systemInfo);
return [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];
}
*/
/// This method returns the Platform enum depending upon hardware string
///
///
/// - returns: `Platform` type of the device
///
- (Platform)platform {
NSString *hardware = [self hardwareString];
if ([hardware hasPrefix:@"iPhone"]) return iPhone;
if ([hardware hasPrefix:@"iPod"]) return iPodTouch;
if ([hardware hasPrefix:@"iPad"]) return iPad;
if ([hardware hasPrefix:@"Watch"]) return AppleWatch;
if ([hardware hasPrefix:@"AppleTV"]) return AppleTV;
return Unknown;
}
- (Hardware)nativeHardware {
NSString *hardware = [self nativeHardwareString];
if ([hardware isEqualToString:i386_Simulator]) return SIMULATOR;
if ([hardware isEqualToString:x86_64_Simulator]) return SIMULATOR;
return [self hardware];
}
- (NSString*)hardwareDescription {
NSString *hardware = [self hardwareString];
NSString *hardwareDescription = [[deviceList objectForKey:hardware] objectForKey:@"name"];
if (hardwareDescription) {
return hardwareDescription;
}
else {
//log message that your device is not present in the list
[self logMessage:hardware];
return nil;
}
}
- (NSString*)hardwareSimpleDescription {
NSString *hardwareDescription = [self hardwareDescription];
if (hardwareDescription == nil) {
return nil;
}
NSError *error = nil;
// this expression matches all strings between round brackets (e.g (Wifi), (GSM)) except the pattern "[0-9]+ Gen"
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"\\((?![0-9]+ Gen).*\\)" options:NSRegularExpressionCaseInsensitive error:&error];
NSString *hardwareSimpleDescription = [regex stringByReplacingMatchesInString:hardwareDescription options:0 range:NSMakeRange(0, [hardwareDescription length]) withTemplate:@""];
if (error) {
return nil;
} else {
return hardwareSimpleDescription;
}
}
- (float)hardwareNumber {
NSString *hardware = [self hardwareString];
float version = [[[deviceList objectForKey:hardware] objectForKey:@"version"] floatValue];
if (version != 0.0f) {
return version;
}
else {
//log message that your device is not present in the list
[self logMessage:hardware];
return 200.0f; //device might be new one of missing one so returning 200.0f
}
}
- (BOOL)isSimulator {
return [self nativeHardware] == SIMULATOR;
}
- (CGSize)backCameraStillImageResolutionInPixels {
switch ([self hardware]) {
case IPHONE_2G:
case IPHONE_3G:
return CGSizeMake(1600, 1200);
case IPHONE_3GS:
return CGSizeMake(2048, 1536);
case IPHONE_4:
case IPHONE_4_CDMA:
case IPAD_3_WIFI:
case IPAD_3_WIFI_CDMA:
case IPAD_3:
case IPAD_4_WIFI:
case IPAD_4:
case IPAD_4_GSM_CDMA:
return CGSizeMake(2592, 1936);
case IPHONE_4S:
case IPHONE_5:
case IPHONE_5_CDMA_GSM:
case IPHONE_5C:
case IPHONE_5C_CDMA_GSM:
case IPHONE_6:
case IPHONE_6_PLUS:
case IPOD_TOUCH_6G:
case IPAD_AIR_2_WIFI:
case IPAD_AIR_2_WIFI_CELLULAR:
case IPHONE_6S:
case IPHONE_6S_PLUS:
case IPAD_MINI_4_WIFI:
case IPAD_MINI_4_WIFI_CELLULAR:
case IPAD_MINI_5_WIFI:
case IPAD_MINI_5_WIFI_CELLULAR:
case IPAD_AIR_3_WIFI:
case IPAD_AIR_3_WIFI_CELLULAR:
return CGSizeMake(3264, 2448);
case IPHONE_7:
case IPHONE_7_GSM:
case IPHONE_7_PLUS:
case IPHONE_7_PLUS_GSM:
case IPHONE_8:
case IPHONE_8_CN:
case IPHONE_8_PLUS:
case IPHONE_8_PLUS_CN:
case IPHONE_X:
case IPHONE_X_CN:
return CGSizeMake(4032, 3024);
case IPOD_TOUCH_4G:
return CGSizeMake(960, 720);
case IPOD_TOUCH_5G:
return CGSizeMake(2440, 1605);
case IPAD_2_WIFI:
case IPAD_2:
case IPAD_2_CDMA:
return CGSizeMake(872, 720);
case IPAD_MINI_WIFI:
case IPAD_MINI:
case IPAD_MINI_WIFI_CDMA:
return CGSizeMake(1820, 1304);
case IPAD_PRO_97_WIFI:
case IPAD_PRO_97_WIFI_CELLULAR:
return CGSizeMake(4032, 3024);
default:
NSLog(@"We have no resolution for your device's camera listed in this category. Please, make photo with back camera of your device, get its resolution in pixels (via Preview Cmd+I for example) and add a comment to this repository (https://github.com/InderKumarRathore/DeviceUtil) on GitHub.com in format Device = Hpx x Wpx.");
NSLog(@"Your device is: %@", [self hardwareDescription]);
break;
}
return CGSizeZero;
}
- (void)logMessage:(NSString *)hardware {
NSLog(@"This is a device which is not listed in this category. Please visit https://github.com/InderKumarRathore/DeviceUtil and add a comment there.");
NSLog(@"Your device hardware string is: %@", hardware);
}
@end