项目1_TyeTool.swift

//
//  TyeTool.swift
//  TyeProject
//
//  Created by Tye on 20.../.../...
//

import Foundation
import StoreKit
import UIKit
import Social

///-- 全局用: 静态工具 (用结构体更加轻量)
struct TyeTool{
    //===
    //--- 1.1 得到键盘的信息:Frame (不同类型的键盘 高度不一样)
    static func yeGetKeyboardFrame(eNotification: Notification?) -> CGRect
    {
        guard let eUserInfo = eNotification?.userInfo, let eFrame = eUserInfo[UIResponder.keyboardFrameEndUserInfoKey] as? CGRect
        else { return CGRect(x: 0, y: 0, width: 0, height: 0)}
        return eFrame
    }
    
    //--- 1.2 获得App的主窗口:
    static func yeGetAppWindow() -> UIWindow? {
        if let eWindow = UIApplication.shared.windows.first(where: { (eWindowLS) -> Bool in eWindowLS.isKeyWindow}) {
            return eWindow
        }
        return nil
    }
    
    //--- 1.3 屏幕的安全区:
    static func yeGetSafeAreaHeight() -> CGFloat
    {
        if let eWindow = UIApplication.shared.windows.first(where: { (eWindowLS) -> Bool in eWindowLS.isKeyWindow}) {
            let eBottom = eWindow.safeAreaInsets.bottom
            return eBottom
        }
        return 0
    }
    
    //===
    //--- 2.1 保存 数据对象:
    static func yeSaveObjectToUserDefaults(eObject: NSObject, eStrKey: String) -> Bool{
        do{
            let eData = try NSKeyedArchiver.archivedData(withRootObject: eObject, requiringSecureCoding: true)
            UserDefaults.standard.set(eData, forKey: eStrKey)
            UserDefaults.standard.synchronize()
            return true
        }catch{
            return false
        }
    }
    
    static func yeGetObjectToUserDefaults(eStrKey: String) -> NSObject? {
        do{
            let eData = UserDefaults.standard.data(forKey: eStrKey)
            let eObject = try NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(eData!)
            return eObject as? NSObject
        }catch{
            return nil
        }
    }
    
    //===
    //--- 3.1 正则匹配: eg: 校验 注册登录的输入是否合法:
    static func yeRegexCheck(eStrInput:String, eType:EnumFieldType) -> Bool{
        if eStrInput.isEmpty {
            return false
        }
        
        ///
        let eStrPatternTel = "^1[0-9]{10}$"
        let eStrPatternEmail = "^([a-z0-9_\\.-]+)@([\\da-z\\.-]+)\\.([a-z\\.]{2,6})$"
        let eStrPatternPassword = "^[a-z0-9_-]{6,16}$"
        let eStrPatternVerifyCode = "^[0-9]{6,6}$"
        let eStrPatternNickName = "^[0-9_-a-zA-Z\\u4E00-\\u9FA5]{2,100}$"
        
        ///
        var eStrPattern = ""
        switch(eType){
        case .Tel: eStrPattern = eStrPatternTel
        case .Email: eStrPattern = eStrPatternEmail
        case .Password: eStrPattern = eStrPatternPassword
        case .VerifyCode: eStrPattern = eStrPatternVerifyCode
        case .NickName: eStrPattern = eStrPatternNickName
        //default: return false
        }
        
        ///
        do{
            //let eRegex: NSRegularExpression?
            let eRegex = try NSRegularExpression(pattern: eStrPattern, options: NSRegularExpression.Options.caseInsensitive) // 不区分字母大小写;
            
            let eLen = eStrInput.count
            let eRange = NSMakeRange(0, eLen)
            
            //进行匹配:
            let eMatches = eRegex.matches(in: eStrInput, options: .reportProgress, range: eRange)
            return eMatches.count > 0
        }catch{ }
        return false
    }
    
    //--- 3.2 加密:ASE, 最常见的对称加密算法(eg:微信小程序的加密传输);
    static func yeEncryptForAES(eStrToEncrypt:String) -> String
    { // ASE == (Advanced Encryption Standard 高级加密标准)
        let eStrOriginKey = "cakjpVPy6KlvmHiLO49dICXo7WMnsNJw" //TODO: 秘钥(服务端提供) (服务端进行解密)
        
        let date = Date()
        let year : Int = date.Year()
        let month : Int = date.Month()
        let result = year + month - 1
        
        // 将 日期与秘钥组合,得到更为复杂的秘钥:
        let fullKey = "\(result)\(eStrOriginKey)"
        let index = fullKey.index(fullKey.startIndex, offsetBy: 16)
        let key = fullKey[..<index]
        
        // 将要加密的字符串转成指定编码的二进制数据类型, 将秘钥也转成二进制数据类型;
        let inputData : Data = eStrToEncrypt.data(using: String.Encoding.utf8)!
        let keyData: Data = key.data(using: String.Encoding.utf8, allowLossyConversion: false)!
        
        // 创建一个非安全的可变原始指针, 向系统申请内存(个数为秘钥字节数);
        let keyBytes = UnsafeMutableRawPointer(mutating: (keyData as NSData).bytes)
        let keyLength = size_t(kCCKeySizeAES128) // 秘钥的长度;
        let dataLength = Int(inputData.count) // 数据的长度;
        
        // 创建一个非安全的可变原始指针, 向系统申请相应的内存:(作为加密的输入缓存)
        let dataBytes = UnsafeRawPointer((inputData as NSData).bytes)
        let bufferData = NSMutableData(length: Int(dataLength) + kCCBlockSizeAES128)!
        
        //创建一个变量,用来存储加密后的输出缓存的最终字节数:
        let bufferPointer = UnsafeMutableRawPointer(bufferData.mutableBytes)
        let bufferLength = size_t(bufferData.length)
        
        
        // 调用 #import <CommonCrypto/CommonCrypto.h> (OC文件)中的加解密方法;
        // CCCrypt(1.区分是加密还是解密, 2.加密算法, 3.加密的方式(eg: ECB电码本模式,...))
        var bytesDecrypted = Int(0)
        let cryptStatus = CCCrypt(UInt32(kCCEncrypt), UInt32(kCCAlgorithmAES128),
                    UInt32(kCCOptionECBMode + kCCOptionPKCS7Padding),
                    keyBytes, keyLength, nil, dataBytes, dataLength,
                    bufferPointer, bufferLength, &bytesDecrypted)
        
        if Int32(cryptStatus) == Int32(kCCSuccess) // 成功加密; (有7种状态)
        {
            bufferData.length = bytesDecrypted
            return bufferData.base64EncodedString(options: .init(rawValue: 0))
        }
        else
        {
            print("Error:\(cryptStatus)")
            return ""
        }
    }
    
    
    //=== 评分: 【系统自动的评分页面】
    static func yeReviewApp(eStrAppID:String = "id1063100471"){
        if let eScene = UIApplication.shared.connectedScenes.first as? UIWindowScene{
            if #available(iOS 14.0, *){ // 系统>14.0,新的API评分面板;
                /// import StoreKit
                SKStoreReviewController.requestReview(in: eScene)
            }else{
                /// 打开 App在应用商店中的页面,可在该页面进行评分;
                let eStrUrl = "itms-apps://itunes.apple.com/app/\(eStrAppID)?action=write-review"
                UIApplication.shared.open(URL(string: eStrUrl)!, options: [:], completionHandler: nil)
            }
        }
    }
    
    
    //=== 系统自带的分享: (底部弹窗分享)【不用接SDK】
    static func yeShare(eVCMain:UIViewController){
        let eImgIcon = UIImage(named: "ImgBaidu.png")!
        let eStrText = "分享的文字内容"
        let eUrl = URL(string: "https://www.baidu.com/")!
        
        let eArr = [eImgIcon, eStrText, eUrl] as [Any]
        
        let eVCActivity = UIActivityViewController(activityItems: eArr, applicationActivities: nil)
        eVCActivity.completionWithItemsHandler = {(eActivityType:UIActivity.ActivityType?, eCompleted:Bool, eArrReturned:[Any]?, eError:Error?) -> Void in
            if nil != eError{
                print("分享 出错:\(String(describing: eError))")
            } else if(nil == eActivityType || false == eCompleted){
                print("分享 取消")
            }else{
                print("分享 完成")
            }
        }
        eVCMain.present(eVCActivity, animated: true) //推出页面;
    }
    
    
}


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容