首页 文章 精选 留言 我的

精选列表

搜索[ios],共10000篇文章
优秀的个人博客,低调大师

iOS Bluetooth(蓝牙)

1. 蓝牙发送照片 #import "ViewController.h" #import <GameKit/GameKit.h> @interface ViewController ()<UINavigationControllerDelegate, UIImagePickerControllerDelegate, GKPeerPickerControllerDelegate> @property (weak, nonatomic) IBOutlet UIImageView *imageView; /** 会话类*/ @property (nonatomic, strong) GKSession *session; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. } #pragma mark 连接设备 - (IBAction)connectClick:(id)sender { //1. 创建GKPeerPickerController连接控制器 GKPeerPickerController * picker = [GKPeerPickerController new]; //2. 设置代理 --> 获取数据 picker.delegate = self; //3. 显示控制器 --> show 此控制器和AlertView很像, 不是全屏的, 不用push modal [picker show]; } #pragma mark GKPeerPickerController 代理方法 /** 此方法在连接到另一台设备时, 会调用 peerID: 另一台设备的ID session: 会话类, 用于接收和发送数据 */ - (void)peerPickerController:(GKPeerPickerController *)picker didConnectPeer:(NSString *)peerID toSession:(GKSession *)session { //1. 保留session self.session = session; //2. 设置句柄 (设置代理) --> 将来一旦受到数据, 将由句柄的方法来处理数据 // 一旦设置了句柄, 那么还需要实现另一个方法 [self.session setDataReceiveHandler:self withContext:nil]; //3. 消失控制器 [picker dismiss]; } // 一旦设置了句柄, 还需要实现此方法 #pragma mark 接收到数据的时候, 会调用此方法来处理 - (void)receiveData:(NSData *)data fromPeer:(NSString *)peer inSession: (GKSession *)session context:(void *)context { //1. 将Data转换成image对象 UIImage *image = [UIImage imageWithData:data]; //2. 然后设置到界面上 self.imageView.image = image; } #pragma mark 发送照片方法 - (IBAction)sendPhotoClick:(id)sender { //1. 将image转换成Data NSData *data = UIImageJPEGRepresentation(self.imageView.image, 0.5); //2. 使用会话类发送数据 /** GKSendDataReliable, 如果发送失败, 会重新发送, 直到成功 GKSendDataUnreliable, 发送一次就不管了 */ [self.session sendDataToAllPeers:data withDataMode:GKSendDataReliable error:nil]; } #pragma mark 选择照片 - (IBAction)selectPhontoClick:(id)sender { //1. 判断是否可用 if (![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]) { return; } //2. 创建UIImagePickerController UIImagePickerController *picker = [UIImagePickerController new]; //3. 设置类型 picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; //4. 设置代理 picker.delegate = self; //5. 模态视图弹出 [self presentViewController:picker animated:YES completion:nil]; } #pragma mark UIImagePickerController 代理方法 - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info { //1. 获取照片并显示到界面上 self.imageView.image = info[UIImagePickerControllerOriginalImage]; //2. 关闭控制器 [picker dismissViewControllerAnimated:YES completion:nil]; } @end 2. CoreBluetooth #import "ViewController.h" #import <CoreBluetooth/CoreBluetooth.h> @interface ViewController ()<CBCentralManagerDelegate, CBPeripheralDelegate> /** 中央管理者*/ @property (nonatomic, strong) CBCentralManager *mgr; /** 扫描到的外围设备的数据数组*/ @property (nonatomic, strong) NSMutableArray *peripheralArray; @end @implementation ViewController - (NSMutableArray *)peripheralArray { if (_peripheralArray == nil) { _peripheralArray = [NSMutableArray array]; } return _peripheralArray; } - (void)viewDidLoad { [super viewDidLoad]; //1. 建立中央管理者 //queue: 如果传空, 就代表着在主队列 self.mgr = [[CBCentralManager alloc] initWithDelegate:self queue:nil]; //2. 扫描周边设备 //Services: 是服务的UUID, 而且是个数据. 如果不穿, 默认扫描全部服务 [self.mgr scanForPeripheralsWithServices:nil options:nil]; } #pragma mark - CBCentralManager 代理方法 #pragma mark 必须调用的代理方法 - (void)centralManagerDidUpdateState:(CBCentralManager *)central { NSLog(@"state: %zd",central.state); } #pragma mark 当发现外围设备时, 会调用的方法 /** Peripheral: 外围设备 Data : 相关的数据 RSSI : 信号强度 */ - (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary<NSString *,id> *)advertisementData RSSI:(NSNumber *)RSSI { //3. 记录扫描到的设备 if (![self.peripheralArray containsObject:peripheral]) { [self.peripheralArray addObject:peripheral]; } // 隐藏的步骤: 你应该搞一个列表给用户选择, 让用户自己选择要连接到哪一个设备 } #pragma mark 连接扫描到的设备 --> 此方法是咱们自己写的, 用户当选中了设备时,应该调用此方法 - (void)connectPeripheral:(CBPeripheral *)peripheral { //4. 连接外围设备 [self.mgr connectPeripheral:peripheral options:nil]; } #pragma mark 此方法是连接到外设时会调用的代理方法 - (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral { #warning //5. 设置外围设备的代理 --> 一旦连接外设, 那么将有外设来管理服务和特征的处理 peripheral.delegate = self; //6. 扫描服务 --> 可以传入UUID // 传空, 代表扫描所有服务 [peripheral discoverServices:nil]; } #pragma mark 外设的代理方法 当发现到服务的时候会调用 - (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error { //7. 获取指定的服务, 然后根据此服务来查找特征 //services : 外设的所有服务, 会保存在一个services中 for (CBService *service in peripheral.services) { //加入我们的服务的UUID是 "123" if ([service.UUID.UUIDString isEqualToString:@"123"]) { //如果UUID一致, 则开始扫描特征 [peripheral discoverCharacteristics:nil forService:service]; } } } #pragma mark 外设的代理方法 当发现到特征的时候会调用 - (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error { //8. 获取指定的特征, 然后根据此特征, 才能根据自己的需求进行数据交互处理 //char<#(nonnull CBCharacteristic *)#>acteristics : 服务的数组中, 会包含在一个characteristics的数组 for (CBCharacteristic *characteristic in service.characteristics) { //假如我们的特征的UUID是 "456" if ([characteristic.UUID.UUIDString isEqualToString:@"456"]) { // 如果获取到了指定的特征, 则可以进行数据交互处理 //[peripheral readValueForCharacteristic:characteristic]; // peripheral writeValue:<#(nonnull NSData *)#> forCharacteristic: type:<#(CBCharacteristicWriteType)#> } } // } #pragma mark 断开连接 - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; //9. 断开连接 [self.mgr stopScan]; } @end

优秀的个人博客,低调大师

iOS Spin(换肤)

MTSkinTools.h #import <UIKit/UIKit.h> //专门写常量值的 // 以下的格式, 只是对常量的声明 //extern: 代表其他类可以引用 extern NSString *const MTSkinToolLabelTextDayColor; extern NSString *const MTSkinToolLabelBackgroundDayColor; @interface MTSkinTools : NSObject /** 返回对应的皮肤的图像*/ + (UIImage *)imageWithImageName:(NSString *)imageName; /** 保存皮肤信息*/ + (void)saveSkinName:(NSString *)skinName; /** 返回制定标识符所对应的颜色*/ + (UIColor *)colorWithName:(NSString *)name; @end MTSkinTools.m #import "MTSkinTools.h" //专门写常量值的 // 以下的格式, 只是对常量的声明 NSString *const MTSkinToolLabelTextDayColor = @"labelTextDayColor"; NSString *const MTSkinToolLabelBackgroundDayColor = @"labelBackgroundDayColor"; static NSString *_skinName; //#1. 创建一个static的可变字典 static NSMutableDictionary *_colorDict; @implementation MTSkinTools /** 保证代码只加载一次: 1. 多线程 --> dispatchOnce 2. 只调用一次的方法 */ /** load方法, 只要头文件参与了编译就会调用此方法 */ + (void)load { NSLog(@"%s",__func__); } /** 类的实例创建时, 才会调用此方法*/ + (void)initialize { //1. 读取偏好设置信息 --> 访问磁盘是耗性能的, 所以只需要加载一次即可 _skinName = [[NSUserDefaults standardUserDefaults] objectForKey:@"skinName"]; if (_skinName == nil) { _skinName = @"green"; } //#2. 可变字典做初始化 _colorDict = [NSMutableDictionary dictionary]; //#3. 加载颜色plist [self loadColorDict]; } /** 返回对应的皮肤的图像*/ + (UIImage *)imageWithImageName:(NSString *)imageName { //1. 拼接文件路径 NSString *imageStr = [NSString stringWithFormat:@"skin/%@/%@",_skinName,imageName]; //2. 返回一个指定的图像 return [UIImage imageNamed:imageStr]; } /** 保存皮肤信息*/ + (void)saveSkinName:(NSString *)skinName { //当皮肤读取改变成一次之后, 那么我们做皮肤切换保存操作, 原来的_skinName //更改皮肤 _skinName = skinName; // 当设置了不同皮肤时, 我们还需要将皮肤plist颜色信息进行重新加载 [self loadColorDict]; //保存皮肤 [[NSUserDefaults standardUserDefaults] setObject:skinName forKey:@"skinName"]; [[NSUserDefaults standardUserDefaults] synchronize]; } /** 返回制定标识符所对应的颜色*/ + (UIColor *)colorWithName:(NSString *)name { return _colorDict[name]; } /** 初始化时需要调用一次, 来加载字典及转换颜色*/ + (void)loadColorDict { //1. 获取plist列表 //2. 颜色转换(255,0,0,1 --> UIColor对象) //1. plist只需要加载一次 //2. 将转换后的UIColor做保存 //1. 获取plist路径 NSString *pathStr = [NSString stringWithFormat:@"skin/%@/SkinColors.plist",_skinName]; NSString *path = [[NSBundle mainBundle] pathForResource:pathStr ofType:nil]; //2. 获取字典 NSDictionary *colorDict = [NSDictionary dictionaryWithContentsOfFile:path]; //3. 直接获取所有颜色值将其转换成UIColor对象 [colorDict enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull colorStr, BOOL * _Nonnull stop) { //4. 截取字符串 NSArray *colorArr = [colorStr componentsSeparatedByString:@","]; //5. 创建颜色赋值给缓存字典 CGFloat r = [colorArr[0] doubleValue]; CGFloat g = [colorArr[1] doubleValue]; CGFloat b = [colorArr[2] doubleValue]; CGFloat a = [colorArr[3] doubleValue]; //字典的里面存的是转换好的UIColor对象, 当设置切换皮肤后, 需要重新调用此方法, 进行_colorDict的更新 _colorDict[key] = [UIColor colorWithRed:r / 255.0 green:g / 255.0 blue:b / 255.0 alpha:a]; }]; } @end ViewController.m #import "ViewController.h" #import "MTSkinTools.h" @interface ViewController () @property (weak, nonatomic) IBOutlet UIImageView *faceView; @property (weak, nonatomic) IBOutlet UIImageView *heartView; @property (weak, nonatomic) IBOutlet UIImageView *rectView; @property (weak, nonatomic) IBOutlet UILabel *label; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // 启动时加载皮肤 [self changeSkinWithSkinName:nil]; } - (IBAction)redClick:(id)sender { // 切换皮肤 [self changeSkinWithSkinName:@"red"]; } - (IBAction)greenClick:(id)sender { // 切换皮肤 [self changeSkinWithSkinName:@"green"]; } - (IBAction)blueClick:(id)sender { // 切换皮肤 [self changeSkinWithSkinName:@"blue"]; } - (IBAction)orangeClick:(id)sender { // 切换皮肤 [self changeSkinWithSkinName:@"orange"]; } //抽取公用方法 - (void)changeSkinWithSkinName:(NSString *)skinName { // 判断如果皮肤名称传了空, 那么不用管保存 if (skinName != nil) { [MTSkinTools saveSkinName:skinName]; } // 切换图像 self.faceView.image = [MTSkinTools imageWithImageName:@"face"]; self.heartView.image = [MTSkinTools imageWithImageName:@"heart"]; self.rectView.image = [MTSkinTools imageWithImageName:@"rect"]; // 切换文字颜色 self.label.textColor = [MTSkinTools colorWithName:MTSkinToolLabelTextDayColor]; // 切换背景颜色 self.label.backgroundColor = [MTSkinTools colorWithName:MTSkinToolLabelBackgroundDayColor]; } @end

优秀的个人博客,低调大师

iOS UIWebView使用

1. 加载 WebView可直接加载.mp4,.pdf,.html,.doc等格式文件。 @interface ViewController () @property (nonatomic, strong) UIWebView *webView; @end @implementation ViewController - (void)loadView { self.webView = [[UIWebView alloc] initWithFrame:[UIScreen mainScreen].bounds]; self.view = self.webView; } - (void)viewDidLoad { [super viewDidLoad]; self.webView.backgroundColor = [UIColor whiteColor]; // 加载网页 // NSURL *url = [[NSBundle mainBundle] URLForResource:@"index.html" withExtension:nil]; // 加载doc // NSURL *url = [[NSBundle mainBundle] URLForResource:@"面向对象C.doc" withExtension:nil]; // 加载pdf // NSURL *url = [[NSBundle mainBundle] URLForResource:@"史提夫乔布斯传.pdf" withExtension:nil]; // 播放视频 NSURL *url = [[NSBundle mainBundle] URLForResource:@"qixi.mp4" withExtension:nil]; NSURLRequest *request = [NSURLRequest requestWithURL:url]; [self.webView loadRequest:request]; // 自动检测电话号码、网址、邮件地址 self.webView.dataDetectorTypes = UIDataDetectorTypePhoneNumber; // 缩放网页 self.webView.scalesPageToFit = YES; } @end 2. 与JS交互 1). OC调用JS代码 @interface ViewController () <UIWebViewDelegate> @property (nonatomic, strong) UIWebView *webView; @end @implementation ViewController - (void)loadView { self.webView = [[UIWebView alloc] initWithFrame:[UIScreen mainScreen].bounds]; self.view = self.webView; } - (void)viewDidLoad { [super viewDidLoad]; self.webView.backgroundColor = [UIColor whiteColor]; NSURL *url = [[NSBundle mainBundle] URLForResource:@"index.html" withExtension:nil]; NSURLRequest *request = [NSURLRequest requestWithURL:url]; [self.webView loadRequest:request]; self.webView.scalesPageToFit = YES; // 设置代理 self.webView.delegate = self; } #pragma mark 代理方法 // 等待网页加载完成 才能执行js - (void)webViewDidFinishLoad:(UIWebView *)webView { // 调用网页中的函数 NSString *string = [webView stringByEvaluatingJavaScriptFromString:@"test();"]; NSLog(@"----%@", string); } index.html <!DOCTYPE html> <html xmlns="[http://www.w3.org/1999/xhtml](http://www.w3.org/1999/xhtml)"> <head> <meta name="viewport" content="width=device-width, initial-scale=1.0"/> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title></title> <script> function test() { return "abc"; } </script> </head> <body> <br /> <br /><br /> 11111111111 <br />abc <br /> <a href="source:///showMessage:/helloworld">HelloWorld!</a> <br /> <a href="http://www.baidu.com">baidu</a> <br /> 123@abc.com <br /> http://www.baidu.com <div id="container"> </div> </body> </html> 2). JS调用OC代码 @interface ViewController () <UIWebViewDelegate> @property (nonatomic, strong) UIWebView *webView; @end @implementation ViewController - (void)loadView { self.webView = [[UIWebView alloc] initWithFrame:[UIScreen mainScreen].bounds]; self.view = self.webView; } - (void)viewDidLoad { [super viewDidLoad]; self.webView.backgroundColor = [UIColor whiteColor]; NSURL *url = [[NSBundle mainBundle] URLForResource:@"index.html" withExtension:nil]; NSURLRequest *request = [NSURLRequest requestWithURL:url]; [self.webView loadRequest:request]; self.webView.scalesPageToFit = YES; // 设置代理 self.webView.delegate = self; } #pragma mark 代理方法 // 发送请求之前, JS调用OC代码 - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { // 获取url中的协议 NSLog(@"%@", request.URL.scheme); // 判断协议是否是自定义协议 if ([request.URL.scheme isEqualToString:@"source"]) { NSLog(@"%@", request.URL.pathComponents); // 获取方法名 NSString *methodName = request.URL.pathComponents[1]; // 获取参数 NSString *param = request.URL.pathComponents[2]; // 调用方法 // 把字符串的方法名称转换为一个selector SEL method = NSSelectorFromString(methodName); if ([self respondsToSelector:method]) { // 解决执行方法的内存泄漏问题 #pragma clang diagnostic push #pragma clang diagnostic ignored "-Warc-performSelector-leaks" // 调用放法 [self performSelector: method withObject:param]; #pragma mark diagnostic pop } } // 返回NO,所有的请求都不执行 return YES; } // 显示对话框 - (void)showMessage:(NSString *)str { UIAlertController *vc = [UIAlertController alertControllerWithTitle:@"提示" message:str preferredStyle:UIAlertControllerStyleAlert]; // 弹出的按钮 UIAlertAction *action = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDestructive handler:^(UIAlertAction * _Nonnull action) { NSLog(@"clicker"); }]; [vc addAction:action]; [self presentViewController:vc animated:YES completion:nil]; } @end

优秀的个人博客,低调大师

iOS 关联对象

关联对象的作用: 可以在运行期间给某个对象增加属性 可以在运行期间获取某个对象的所有属性名称 交换方法 示例: UIImageView+MyView.h #import <UIKit/UIKit.h> @interface UIImageView (MyView) @property (nonatomic, copy) NSString *urlString; @end UIImageView+MyView.m #import <objc/runtime.h> //1 可以在运行期间给某个对象增加属性 //2 可以在运行期间获取某个对象的所有属性名称 //3 交换方法 @implementation UIImageView (MyView) - (NSString *)urlString { return objc_getAssociatedObject(self, "str"); } - (void)setUrlString:(NSString *)urlString { //可以在运行期间给某个对象增加属性 //关联对象 objc_setAssociatedObject(self, "str", urlString, OBJC_ASSOCIATION_COPY_NONATOMIC); } @end

优秀的个人博客,低调大师

iOS NSURLSession HTTPS

@interface ViewController () <NSURLSessionTaskDelegate> @property (nonatomic, strong) NSURLSession *session; @end @implementation ViewController - (NSURLSession *)session { if (_session == nil) { NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration]; _session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:nil]; } return _session; } - (void)viewDidLoad { [super viewDidLoad]; //https://kyfw.12306.cn/otn/ NSURL *url = [NSURL URLWithString:@"https://kyfw.12306.cn/otn/"]; [[self.session dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { NSString *html = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; NSLog(@"%@",html); }] resume]; } //代理的方法 //接受服务器的挑战,信任服务器 - (void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition, NSURLCredential * _Nullable))completionHandler { if (challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust) { NSURLCredential *credential = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]; completionHandler(0,credential); } } @end

优秀的个人博客,低调大师

iOS NSString 加密

NSString+Hash.h #import <Foundation/Foundation.h> @interface NSString (Hash) #pragma mark - 散列函数 /** * 计算MD5散列结果 * * 终端测试命令: * @code * md5 -s "string" * @endcode * * <p>提示:随着 MD5 碰撞生成器的出现,MD5 算法不应被用于任何软件完整性检查或代码签名的用途。<p> * * @return 32个字符的MD5散列字符串 */ - (NSString *)md5String; /** * 计算SHA1散列结果 * * 终端测试命令: * @code * echo -n "string" | openssl sha -sha1 * @endcode * * @return 40个字符的SHA1散列字符串 */ - (NSString *)sha1String; /** * 计算SHA256散列结果 * * 终端测试命令: * @code * echo -n "string" | openssl sha -sha256 * @endcode * * @return 64个字符的SHA256散列字符串 */ - (NSString *)sha256String; /** * 计算SHA 512散列结果 * * 终端测试命令: * @code * echo -n "string" | openssl sha -sha512 * @endcode * * @return 128个字符的SHA 512散列字符串 */ - (NSString *)sha512String; #pragma mark - HMAC 散列函数 /** * 计算HMAC MD5散列结果 * * 终端测试命令: * @code * echo -n "string" | openssl dgst -md5 -hmac "key" * @endcode * * @return 32个字符的HMAC MD5散列字符串 */ - (NSString *)hmacMD5StringWithKey:(NSString *)key; /** * 计算HMAC SHA1散列结果 * * 终端测试命令: * @code * echo -n "string" | openssl sha -sha1 -hmac "key" * @endcode * * @return 40个字符的HMAC SHA1散列字符串 */ - (NSString *)hmacSHA1StringWithKey:(NSString *)key; /** * 计算HMAC SHA256散列结果 * * 终端测试命令: * @code * echo -n "string" | openssl sha -sha256 -hmac "key" * @endcode * * @return 64个字符的HMAC SHA256散列字符串 */ - (NSString *)hmacSHA256StringWithKey:(NSString *)key; /** * 计算HMAC SHA512散列结果 * * 终端测试命令: * @code * echo -n "string" | openssl sha -sha512 -hmac "key" * @endcode * * @return 128个字符的HMAC SHA512散列字符串 */ - (NSString *)hmacSHA512StringWithKey:(NSString *)key; #pragma mark - 文件散列函数 /** * 计算文件的MD5散列结果 * * 终端测试命令: * @code * md5 file.dat * @endcode * * @return 32个字符的MD5散列字符串 */ - (NSString *)fileMD5Hash; /** * 计算文件的SHA1散列结果 * * 终端测试命令: * @code * openssl sha -sha1 file.dat * @endcode * * @return 40个字符的SHA1散列字符串 */ - (NSString *)fileSHA1Hash; /** * 计算文件的SHA256散列结果 * * 终端测试命令: * @code * openssl sha -sha256 file.dat * @endcode * * @return 64个字符的SHA256散列字符串 */ - (NSString *)fileSHA256Hash; /** * 计算文件的SHA512散列结果 * * 终端测试命令: * @code * openssl sha -sha512 file.dat * @endcode * * @return 128个字符的SHA512散列字符串 */ - (NSString *)fileSHA512Hash; @end NSString+Hash.m #import "NSString+Hash.h" #import <CommonCrypto/CommonCrypto.h> @implementation NSString (Hash) #pragma mark - 散列函数 - (NSString *)md5String { const char *str = self.UTF8String; uint8_t buffer[CC_MD5_DIGEST_LENGTH]; CC_MD5(str, (CC_LONG)strlen(str), buffer); return [self stringFromBytes:buffer length:CC_MD5_DIGEST_LENGTH]; } - (NSString *)sha1String { const char *str = self.UTF8String; uint8_t buffer[CC_SHA1_DIGEST_LENGTH]; CC_SHA1(str, (CC_LONG)strlen(str), buffer); return [self stringFromBytes:buffer length:CC_SHA1_DIGEST_LENGTH]; } - (NSString *)sha256String { const char *str = self.UTF8String; uint8_t buffer[CC_SHA256_DIGEST_LENGTH]; CC_SHA256(str, (CC_LONG)strlen(str), buffer); return [self stringFromBytes:buffer length:CC_SHA256_DIGEST_LENGTH]; } - (NSString *)sha512String { const char *str = self.UTF8String; uint8_t buffer[CC_SHA512_DIGEST_LENGTH]; CC_SHA512(str, (CC_LONG)strlen(str), buffer); return [self stringFromBytes:buffer length:CC_SHA512_DIGEST_LENGTH]; } #pragma mark - HMAC 散列函数 - (NSString *)hmacMD5StringWithKey:(NSString *)key { const char *keyData = key.UTF8String; const char *strData = self.UTF8String; uint8_t buffer[CC_MD5_DIGEST_LENGTH]; CCHmac(kCCHmacAlgMD5, keyData, strlen(keyData), strData, strlen(strData), buffer); return [self stringFromBytes:buffer length:CC_MD5_DIGEST_LENGTH]; } - (NSString *)hmacSHA1StringWithKey:(NSString *)key { const char *keyData = key.UTF8String; const char *strData = self.UTF8String; uint8_t buffer[CC_SHA1_DIGEST_LENGTH]; CCHmac(kCCHmacAlgSHA1, keyData, strlen(keyData), strData, strlen(strData), buffer); return [self stringFromBytes:buffer length:CC_SHA1_DIGEST_LENGTH]; } - (NSString *)hmacSHA256StringWithKey:(NSString *)key { const char *keyData = key.UTF8String; const char *strData = self.UTF8String; uint8_t buffer[CC_SHA256_DIGEST_LENGTH]; CCHmac(kCCHmacAlgSHA256, keyData, strlen(keyData), strData, strlen(strData), buffer); return [self stringFromBytes:buffer length:CC_SHA256_DIGEST_LENGTH]; } - (NSString *)hmacSHA512StringWithKey:(NSString *)key { const char *keyData = key.UTF8String; const char *strData = self.UTF8String; uint8_t buffer[CC_SHA512_DIGEST_LENGTH]; CCHmac(kCCHmacAlgSHA512, keyData, strlen(keyData), strData, strlen(strData), buffer); return [self stringFromBytes:buffer length:CC_SHA512_DIGEST_LENGTH]; } #pragma mark - 文件散列函数 #define FileHashDefaultChunkSizeForReadingData 4096 - (NSString *)fileMD5Hash { NSFileHandle *fp = [NSFileHandle fileHandleForReadingAtPath:self]; if (fp == nil) { return nil; } CC_MD5_CTX hashCtx; CC_MD5_Init(&hashCtx); while (YES) { @autoreleasepool { NSData *data = [fp readDataOfLength:FileHashDefaultChunkSizeForReadingData]; CC_MD5_Update(&hashCtx, data.bytes, (CC_LONG)data.length); if (data.length == 0) { break; } } } [fp closeFile]; uint8_t buffer[CC_MD5_DIGEST_LENGTH]; CC_MD5_Final(buffer, &hashCtx); return [self stringFromBytes:buffer length:CC_MD5_DIGEST_LENGTH]; } - (NSString *)fileSHA1Hash { NSFileHandle *fp = [NSFileHandle fileHandleForReadingAtPath:self]; if (fp == nil) { return nil; } CC_SHA1_CTX hashCtx; CC_SHA1_Init(&hashCtx); while (YES) { @autoreleasepool { NSData *data = [fp readDataOfLength:FileHashDefaultChunkSizeForReadingData]; CC_SHA1_Update(&hashCtx, data.bytes, (CC_LONG)data.length); if (data.length == 0) { break; } } } [fp closeFile]; uint8_t buffer[CC_SHA1_DIGEST_LENGTH]; CC_SHA1_Final(buffer, &hashCtx); return [self stringFromBytes:buffer length:CC_SHA1_DIGEST_LENGTH]; } - (NSString *)fileSHA256Hash { NSFileHandle *fp = [NSFileHandle fileHandleForReadingAtPath:self]; if (fp == nil) { return nil; } CC_SHA256_CTX hashCtx; CC_SHA256_Init(&hashCtx); while (YES) { @autoreleasepool { NSData *data = [fp readDataOfLength:FileHashDefaultChunkSizeForReadingData]; CC_SHA256_Update(&hashCtx, data.bytes, (CC_LONG)data.length); if (data.length == 0) { break; } } } [fp closeFile]; uint8_t buffer[CC_SHA256_DIGEST_LENGTH]; CC_SHA256_Final(buffer, &hashCtx); return [self stringFromBytes:buffer length:CC_SHA256_DIGEST_LENGTH]; } - (NSString *)fileSHA512Hash { NSFileHandle *fp = [NSFileHandle fileHandleForReadingAtPath:self]; if (fp == nil) { return nil; } CC_SHA512_CTX hashCtx; CC_SHA512_Init(&hashCtx); while (YES) { @autoreleasepool { NSData *data = [fp readDataOfLength:FileHashDefaultChunkSizeForReadingData]; CC_SHA512_Update(&hashCtx, data.bytes, (CC_LONG)data.length); if (data.length == 0) { break; } } } [fp closeFile]; uint8_t buffer[CC_SHA512_DIGEST_LENGTH]; CC_SHA512_Final(buffer, &hashCtx); return [self stringFromBytes:buffer length:CC_SHA512_DIGEST_LENGTH]; } #pragma mark - 助手方法 /** * 返回二进制 Bytes 流的字符串表示形式 * * @param bytes 二进制 Bytes 数组 * @param length 数组长度 * * @return 字符串表示形式 */ - (NSString *)stringFromBytes:(uint8_t *)bytes length:(int)length { NSMutableString *strM = [NSMutableString string]; for (int i = 0; i < length; i++) { [strM appendFormat:@"%02x", bytes[i]]; } return [strM copy]; } @end

优秀的个人博客,低调大师

iOS 使用Socket

Socket 套接字 纯C语言的,跨平台的 HTTP协议是基于Socket的 基本操作: 导入头文件 创建Socket 连接到服务器 发送数据给服务器 从服务器接收数据 关闭连接 服务开启 打开本机模拟服务器端口 打开Netcat 模拟服务器 nc -lk 12345 nc-->Netcat终端下用于调试和检查网络的工具 代码操作: #import <sys/socket.h> #import <netinet/in.h> #import <arpa/inet.h> - (void)viewDidLoad { [super viewDidLoad]; // 1. 创建Socket // domain 协议域, 常用AF_INET,指定IPv4 // type socket类型. SOCK_STREAM 流式, SOCK_DGRAM 数据报 // protocol IPPROTO_TCP TCP方式,可以设置为0,根据第二参数来自动确定第二个参数 // 返回值,如果创建成功返回的是socket的描述符,失败返回-1 // int socket(int domain, int type, int protocol); int clientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); // 2. 连接服务器 // sockfd 套接字描述符 // serv_addr 指向数据结构sockaddr的指针,其中包括目的端口和IP地址 // addrlen 参数二serv_addr的长度,可以通过sizeof(struct sockaddr)获取 // 成功返回0 失败返回非0 // int connect(int sockfd, struct sockaddr *serv_addr, int addrlen); // 创建结构体 struct sockaddr_in addr; // 指定IPv4地址 addr.sin_family = AF_INET; // 指定IP地址 addr.sin_addr.s_addr = inet_addr("127.0.0.1"); // 指定端口 addr.sin_port = htons(12345); // 连接 int result = connect(clientSocket, (const struct sockaddr *)&addr, sizeof(addr)); /** 一、判断是否连接成功 if (0 == result) { // 打开本机模拟服务器端口 // 打开Netcat 模拟服务器 // nc -lk 12345 // nc-->Netcat终端下用于调试和检查网络的工具 NSLog(@"成功"); } else { // 服务器未打开时连接失败 NSLog(@"失败"); } */ if (result != 0) { NSLog(@"失败"); } // 3. 发送消息 // 1). 套接字id // 2). 发送的消息 // 3). 发送的消息的大小,不是字节数,而是字符数 // 4). 阻塞或者不阻塞,一般填0 // 返回值,成功返回发送出去的字节数,失败返回-1 // ssize_t send(int s, const void *msg, size_t len, int flags) __DARWIN_ALIAS_C(send); const char *msg = "Hello world!"; ssize_t sendCount = send(clientSocket, msg, strlen(msg), 0); NSLog(@"发送的字节数 %zd", sendCount); // 4. 接收服务器返回的数据 // 返回的是实际接受的字节个数 // 定义字符数组 uint8_t buffer[1024]; ssize_t recvCount = recv(clientSocket, buffer, 1024, 0); NSLog(@"发送的字节数 %zd", recvCount); // 把字节数组转换成字符串 // 二进制数据 NSData *data = [NSData dataWithBytes:buffer length:recvCount]; NSString *recvMsg = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; NSLog(@"收到的消息 : %@", recvMsg); // 5. 关闭连接 close(clientSocket); }

优秀的个人博客,低调大师

iOS UIButton(按钮)

UIButton属性 1.UIButton状态: UIControlStateNormal // 正常状态 UIControlStateHighlighted // 高亮状态 UIControlStateDisabled // 禁用状态 UIControlStateSelected // 选中状态 UIControlStateApplication // UIControlStateReserved // 保留状态 2.Uibutton类型: UIButtonTypeCustom //自定义类型 添加图片: 灰色背景颜色: UIButtonTypeSystem // 系统 UIButtonTypeRoundedRect //圆角类型 UIButtonTypeDetailDisclosure //细节展示按钮 UIButtonTypeInfoLight //浅色背景的信息按钮 UIButtonTypeInfoDark //暗色背景的信息按钮 UIButtonTypeContactAdd // 添加按钮 3.UIButton常用属性 给按钮设置文字时,苹果文档说明,不能使用label对象设置文字的颜色或者阴影颜色,相反必须使用setTitleColor:forState: and setTitleShadowColor:forState:这两个方法才能修改这些值。 设置按钮中其他属性依次类推。。。。 //设置对应状态的标题内容default is nil. title is assumed to be single line - (void)setTitle:(NSString *)title forState:(UIControlState)state; //设置对应状态的标题颜色 - (void)setTitleColor:(UIColor *)color forState:(UIControlState)state; //设置对应状态的标题阴影颜色 - (void)setTitleShadowColor:(UIColor *)color forState:(UIControlState)state; //设置对应状态的按钮的图片 - (void)setImage:(UIImage *)image forState:(UIControlState)state; //设置对应状态的按钮背景图片 - (void)setBackgroundImage:(UIImage *)image forState:(UIControlState)state; 添加事件 - (void)addTarget:(id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents; 这些事件都是基于触摸、基于值、基于编辑。有如下事件会触发。 在点击按钮是按钮是凹下去,然后弹起才触发起事件,按钮的状态有: UIControlEventTouchDown // 按下 UIControlEventTouchDownRepeat 多次按下 UIControlEventTouchUpInside // 在按钮及其一定外围内松开 UIControlEventTouchUpOutside // 按钮外面松开 4.adjustsImageWhenDisabled 当按钮禁用的情况下,图像的颜色会被画深一点,默认为YES。 5.adjustsImageWhenHighlighted 当按钮高亮的情况下,图像的颜色会被画深一点,默认为YES。 6.showsTouchWhenHighlighted button.showsTouchWhenHighlighted=YES;点击时的闪光效果会被前景图片遮住中间部分; 7.contentEdgeInsets 设置按钮的内部内容(包含按钮图片和标题)离按钮边缘上下左右的距离。 8.按钮实例 有些时候我们想让UIButton的title居左对齐,我们设置btn.textLabel.textAlignment = UITextAlignmentLeft 是没有作用的,我们需要设置btn.contentHorizontalAlignment = UIControlContentHorizonAlignmentLeft; 但是问题又出来,此时文字会紧贴到左边框,我们可以设置btn.contentEdgeInsets = UIEdgeInsetsMake(0,10, 0, 0); 使文字距离左边框保持10个像素的距离。

优秀的个人博客,低调大师

iOS UIImageView(图片)

UIImageView属性 1.Image 设置图片,默认显示 UIImageView *_imageView = [[UIImageView alloc]init]; _imageView.image = [UIImage imageNamed:@"me.png"]; 2.highlightedImage 设置高亮状态下显示的图片 _imageView.highlightedImage = [UIImage imageNamed:@"other.png"]; 3.animationImages 设置序列帧动画的图片数组 [_imageView setAnimationImages:[NSArray array]]; 4.highlightedAnimationImages 设置高亮状态下序列帧动画的图片数组 [_imageView setHighlightedAnimationImages:[NSArray array]]; 5.animationDuration 设置序列帧动画播放的时常 [_imageView setAnimationDuration:0.3f]; 6.animationRepeatCount 设置序列帧动画播放的次数 [_imageView setAnimationRepeatCount:2]; 7.userInteractionEnabled 设置是否允许用户交互,默认不允许用户交互 [_imageView setUserInteractionEnabled:YES]; 8.highlighted 设置是否为高亮状态,默认为普通状态 _imageView.highlightedImage = [UIImage imageNamed:@"other.png"]; [_imageView setHighlighted:YES]; 注意的是在highlighted状态下设置的图片与序列帧动画要显示,必须同时设置UIImageView的状态为highlighted。

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册