//
// 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) //推出页面;
}
}
项目1_TyeTool.swift
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
推荐阅读更多精彩内容
- 告别零散学习,为开发者打造系统、实战的Swift学习体系,极客学院中国首发Swift学习路径图! 自从WWDC上苹...
- Swift 类方法 和OC类似,就是通过类本身调用方法,在方法(func)关键字前面用static修饰,如果父类允...
- 前言 我们网络请求后得到数据需要转模型,一般项目就是使用一种解析数据的方式,常见的Codable、Swiftyjs...
- Swift 算法实战一(集合,字典,链表,栈,队列等算法) Swift 算法实战二(二叉树、二分搜索) 前言 这是...