iOS开发
文章平均质量分 79
记录iOS开发的常用技术,方便自己与他人。
我们都曾拥有最美的时光
https://github.com/Soulghost
展开
-
iOS汇编入门教程
前言对于应用层开发人员而言,仅仅掌握Objective-C和系统框架即可较好的完成开发,但在涉及到应用加固、逆向分析等内容时仅有应用层开发技能就会显得非常的无力,因此掌握汇编对于突破iOS开发水平的瓶颈十分有效。一个例子以反调试为例,我们知道,通过调用ptrace函数可以阻止调试器依附。ptrace(31, 0, 0, 0)这种方式能够被函数hook轻易破解,例如使用f...原创 2018-03-16 21:45:09 · 672 阅读 · 0 评论 -
iOS端JSON转Model链式编程框架SuperKVC用法与原理
背景在客户端编程中,字典转模型是一个极为常见的问题,苹果提供了KVC来实现NSDictionary到Model的注入,但是KVC只能进行单层浅注入,且无法处理类型转换、key与属性名不对应、深度注入等问题,笔者从Masonry得到启发,开发了一个通过链式配置注入器实现深度注入、类型转换、key-属性名映射等功能的轻量级注入框架SuperKVC。目前已经开源到GitHub,点击这里前往,欢迎Star和原创 2017-04-16 10:36:32 · 2487 阅读 · 0 评论 -
iOS端执行包含外部引用的js并相互通信
背景某些情况下,需要调用js的一些代码来执行一些操作,并且将处理结果回传到OC。概述为了执行一段包含外部引用的js,需要使用UIWebView,通过fileURL去加载一个js或者HTML页面,为了方便的在两个语言之间通信,需要借助一个第三方框架WebViewJavascriptBridge,它可以实现跨语言的请求与回调。实现本文讨论的是,从OC调用WebView加载的js的某个方法来处理数据,并且原创 2016-12-06 14:03:47 · 1720 阅读 · 0 评论 -
iOS控制反转(IoC)与依赖注入(DI)的实现
背景最近接触了一段时间的SpringMVC,对其控制反转(IoC)和依赖注入(DI)印象深刻,此后便一直在思考如何使用OC语言较好的实现这两个功能。Java语言自带的注解特性为IoC和DI带来了极大的方便,要在OC上较好的实现这两个功能,需要一些小小的技巧。控制反转和依赖注入控制反转简单来说,将一个类对象的创建由手动new方式改为从IOC容器内获取,就是一种控制反转,例如我们现在要创建一个Class原创 2016-08-21 22:37:23 · 6121 阅读 · 5 评论 -
iOS开源照片浏览器框架SGPhotoBrowser的设计与实现
简介近日在制作一个开源加密相册时附带着设计了一个照片浏览器,在进一步优化后发布到了GitHub供大家使用,该框架虽然没有MWPhotoBrowser那么强大,但是使用起来更为方便,操作更符合常规相册习惯,自定义和修改源码也十分简单。 本文主要介绍这个照片浏览器框架的技术要点,如果要深入研究和使用,可以在下面的链接中下载源码。如果你对这个框架有兴趣,可以点击这里前去GitHub下载源码,欢迎Star原创 2016-07-29 21:43:42 · 6404 阅读 · 0 评论 -
iOS开源加密相册Agony的实现(七)
简介虽然目前市面上有一些不错的加密相册App,但不是内置广告,就是对上传的张数有所限制。本文介绍了一个加密相册的制作过程,该加密相册将包括多密码(输入不同的密码即可访问不同的空间,可掩人耳目)、WiFi传图、照片文件加密等功能。目前项目和文章会同时前进,项目的源代码可以在github上下载。 点击前往GitHub概述上一篇文章主要介绍了图片浏览器原图浏览、缩放和滑动切换图片的实现细节。本文主要介绍原创 2016-07-18 19:06:26 · 3121 阅读 · 0 评论 -
iOS开源加密相册Agony的实现(六)
简介虽然目前市面上有一些不错的加密相册App,但不是内置广告,就是对上传的张数有所限制。本文介绍了一个加密相册的制作过程,该加密相册将包括多密码(输入不同的密码即可访问不同的空间,可掩人耳目)、WiFi传图、照片文件加密等功能。目前项目和文章会同时前进,项目的源代码可以在github上下载。 点击前往GitHub概述上一篇文章主要介绍了照片的保存、删除批处理的实现。这篇文章将介绍图片浏览器原图浏览原创 2016-07-16 22:45:54 · 3396 阅读 · 0 评论 -
iOS开源加密相册Agony的实现(五)
简介虽然目前市面上有一些不错的加密相册App,但不是内置广告,就是对上传的张数有所限制。本文介绍了一个加密相册的制作过程,该加密相册将包括多密码(输入不同的密码即可访问不同的空间,可掩人耳目)、WiFi传图、照片文件加密等功能。目前项目和文章会同时前进,项目的源代码可以在github上下载。 点击前往GitHub概述上一篇文章主要介绍了照片浏览器的缩略图预览界面设计,本文主要介绍照片的保存、删除批原创 2016-07-15 21:17:48 · 3390 阅读 · 0 评论 -
iOS开源加密相册Agony的实现(四)
简介虽然目前市面上有一些不错的加密相册App,但不是内置广告,就是对上传的张数有所限制。本文介绍了一个加密相册的制作过程,该加密相册将包括多密码(输入不同的密码即可访问不同的空间,可掩人耳目)、WiFi传图、照片文件加密等功能。目前项目和文章会同时前进,项目的源代码可以在github上下载。点击前往GitHub概述上一篇文章主要介绍了相册管理界面的设计与实现。本文主要介绍图片浏览器设计的技术细节。图原创 2016-07-14 17:47:02 · 3608 阅读 · 0 评论 -
iOS开源加密相册Agony的实现(三)
简介虽然目前市面上有一些不错的加密相册App,但不是内置广告,就是对上传的张数有所限制。本文介绍了一个加密相册的制作过程,该加密相册将包括多密码(输入不同的密码即可访问不同的空间,可掩人耳目)、WiFi传图、照片文件加密等功能。目前项目和文章会同时前进,项目的源代码可以在github上下载。 点击前往GitHub概述上一篇文章主要介绍了登录与注册页面的设计。这一篇文章将会介绍相册的设计与实现。相册原创 2016-07-11 15:52:38 · 4202 阅读 · 0 评论 -
iOS开源加密相册Agony的实现(二)
简介虽然目前市面上有一些不错的加密相册App,但不是内置广告,就是对上传的张数有所限制。本文介绍了一个加密相册的制作过程,该加密相册将包括多密码(输入不同的密码即可访问不同的空间,可掩人耳目)、WiFi传图、照片文件加密等功能。目前项目和文章会同时前进,项目的源代码可以在github上下载。 点击前往GitHub概述上一篇文章主要介绍了账户存储类与工具类的设计,这一篇将通过工具类,实现登陆与注册的原创 2016-07-10 14:34:51 · 1977 阅读 · 2 评论 -
iOS开源加密相册Agony的实现(一)
简介虽然目前市面上有一些不错的加密相册App,但不是内置广告,就是对上传的张数有所限制。本文介绍了一个加密相册的制作过程,该加密相册将包括多密码(输入不同的密码即可访问不同的空间,可掩人耳目)、WiFi传图、照片文件加密等功能。目前项目和文章会同时前进,项目的源代码可以在github上下载。 点击前往GitHub概述本文主要介绍加密相册的登录验证与注册模块的实现。注册时只需要密码,每个密码对应一个原创 2016-07-09 23:54:59 · 3098 阅读 · 0 评论 -
基于AOP的iOS用户操作引导框架设计
背景有一种现象,App设计者觉得理所当然的操作方式,却常常被用户所忽视,为了防止这种现象发生,就要为App设计一个帮助,一种低成本的方案是将帮助文档写成HTML然后展示给用户,这样的方式常常不能带来好的效果,一种较好的方式是高亮用户应该点击的区域,对其他部分进行遮盖,并用说明文字提醒用户,如下图所示。点击这里观看动画演示 下载框架SGUserGuide已经上传到github,点击前去github下原创 2016-07-06 17:58:36 · 2882 阅读 · 0 评论 -
iOS图形手势识别框架SGGestureRecognizer
简介苹果官方为我们提供了简单手势的识别器,但对于图形手势,例如五角星、三角形等的识别,就需要自己实现了。通过识别这些手势,可以去执行特定的操作,或是输入公式、释放魔法等,可以为App增光添彩。下载与使用该框架已经上传到github,点击这里前去下载,欢迎Star! 有关该框架的使用在github上已经写明,这里不再赘述,本文主要介绍的是图形手势识别的实现原理与框架的结构。框架的结构一个图形手势是一原创 2016-07-03 17:56:38 · 4398 阅读 · 1 评论 -
WiFi文件上传框架SGWiFiUpload
背景在iOS端由于文件系统的封闭性,文件的上传变得十分麻烦,一个比较好的解决方案是通过局域网WiFi来传输文件并存储到沙盒中。简介SGWiFiUpload是一个基于CocoaHTTPServer的WiFi上传框架。CocoaHTTPServer是一个可运行于iOS和OS X上的轻量级服务端框架,可以处理GET和POST请求,通过对代码的初步改造,实现了iOS端的WiFi文件上传与上传状态监听。下载与原创 2016-06-30 13:14:51 · 4613 阅读 · 7 评论 -
基于Nginx服务器和iOS9的HTTPS安全通信
简介在网络通信中,使用抓包软件可以对网络请求进行分析,并进行重放攻击,重放攻击的解决方案一般是使用一个变化的参数,例如RSA加密的时间戳,但考虑到网络传输时延,时间戳需要有一定的误差容限,这样仍然不能从根本上防止重放攻击。想要较好的解决重放攻击问题,应考虑使用HTTPS通信,HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比HTTP协议安全。实现对于用浏览器访问的网站原创 2016-03-02 17:08:22 · 2670 阅读 · 2 评论 -
利用BBRSACryptor实现iOS端的RSA加解密
背景RSA这种非对称加密被广泛的运用于网络数据的传输,但其在iOS上很那直接实现,BBRSACryptor框架通过移植openssl实现了iOS端的RSA,本文将介绍如何使用BBRSACryptor生成证书,加载公钥,以及后端如何用php读取证书,加载私钥。iOS加密新建工程并集成BBRSACryptor这个框架自带的demo将工程文件与框架放在了同一目录,因此在配置Header Search Pa原创 2016-01-17 21:21:02 · 2089 阅读 · 0 评论 -
UIScrollView实现图片轮播器的无限滚动
简介在现在的一些App中常常见到图片轮播器,一般用于展示广告、新闻等数据,在iOS内并没有现成的控件直接实现这种功能,但是通过UIScrollView的允许分页设置,可以实现滚动轮播的功能。轮播原理UIScrollView对象有pagingEnable成员,如果设置为YES,那么每一个scrollView尺寸这么大的区域就会被当作一页,在滚动时会根据滚动的比例自动计算应该切换到哪一页。无限滚动原理要原创 2015-11-30 18:00:38 · 5804 阅读 · 1 评论 -
在OC代码中创建Swift编写的视图控制器
背景近日在和一群朋友做项目,我和另一位同学负责iOS客户端,我是一直使用OC的,而他只会Swift,因此在我们分工协作之后,就需要把代码合在一起,这就牵扯到如何在TabbarController中添加一个Swift创建的子控制器的问题。解决首先在一个OC项目中新建一个Swift类,继承自UITableViewController,并且修改其view背景色,方便后续测试。import UIKitcl原创 2015-12-06 10:33:40 · 1945 阅读 · 0 评论 -
利用CocoaHTTPServer实现wifi局域网传输文件到iphone
背景近日在做一个代码阅读器,其中涉及到代码文件的上传,之前看到过许多app支持局域网传文件,因此就通过查询和研究实现了此功能,我是用的框架是CocoaHTTPServer。原理CocoaHTTPServer框架能够在iOS上建立起一个本地服务器,只要电脑和移动设备连入同一热点,即可使用电脑访问iOS服务器的页面,利用POST实现文件的上传。实现CocoaHTTPServer没有现成的向iOS设备传输原创 2015-12-20 19:10:34 · 6803 阅读 · 7 评论 -
(一三〇)UITextField的光标操作扩展
简介在iOS开发中,有时候需要完全自主的定义键盘,用于完整的单词输入,例如计算机应用中,需要一次性的输入sin(,在移动光标时要完整的跳过sin(,在删除时也要完整的删除,这就需要对光标的位置进行精确控制,而iOS并没有相关的函数可以直接操作光标,只给出了选择某个区域的功能,本文将介绍基于区域选择设计的UITextField扩展,用于获取光标位置以及移动光标。实现原理光标位置的获取。原创 2015-10-03 20:18:27 · 5519 阅读 · 0 评论 -
(一二九)获取文件的MineType、利用SSZipArchive进行压缩解压
MineType简介文件在网络上以二进制流的方式传播,为了区分不同的文件类型,用MineType来标明。为什么要获取文件的拓展名较短,比较好记,但是MineType是很长的,比如docx拓展名的MineType是application/vnd.openxmlformats-officedocument.wordprocessingml.document,因此比较合适的方案是根据拓展名直接得到Mine原创 2015-09-25 16:54:46 · 2259 阅读 · 0 评论 -
(一二八)使用POST上传文件
简介上传文件到服务器是一个比较常用的操作,最基本的方式是通过POST上传,文件以二进制形式,作为一个参数传递,但是这个POST的结构相当复杂,且必须完全符合HTTP标准。文件上传的POST格式该POST主要由下面几个部分构成。请求头 1.Content-Length(请求体的二进制大小)注意这里的二进制大小应该根据请求体计算2.Content-Type multipart/form-data;原创 2015-09-16 22:53:28 · 1949 阅读 · 0 评论 -
(一二七)NSURLSession的基本用法 下载与数据获取
简介NSURLSession是苹果官方提供的一系列网络接口库,使用他们可以轻松实现下载和数据获取等任务。在上一篇文章中,我们介绍了使用NSURLConnection下载文件和断点续传的功能,实现起来比较麻烦,对于文件的操作也比较繁琐,如果使用NSURLSession,这一切都将变得极为容易。用法数据请求 1.获取URLSession单例对象,并利用该对象创建一个dataTask,使用结构体回调。原创 2015-09-15 22:23:11 · 2406 阅读 · 1 评论 -
(一二六)单线程文件下载与断点续传
本文讨论单线程的文件下载和断点续传,通过从本地服务器下载一个较大的文件,实现显示进度、中途暂停与断点续传。下载过程大致如下:①通过NSURL创建指向特定下载地址的请求,本文中下载的文件位于网站根目录的lesson1下的nav.dmg,因此URL应为http://127.0.0.1/lesson1/nav.dmg。②通过NSURL创建URLRequest,为了能够更改HTTP请求头,实现原创 2015-09-14 22:36:05 · 1985 阅读 · 0 评论 -
(一二五)手机网络状态的监听
对于一些需要与服务器进行长连接的App,需要对网络状态进行监控,当网络不佳时及时提醒用户,从而提高用户体验。通过苹果自带的框架和Reachability类可以实现网络状态改变的监听。要实现网络监听,按照下面的步骤进行。①导入SystemConfiguration框架。②通过Xcode的帮助文档搜索Reachability,打开样例工程,将其中的Reachability类的代码拷贝到自己原创 2015-08-25 22:47:54 · 1017 阅读 · 0 评论 -
(一二四)tableView的多组数据展示和手动排序
最近在写一个轻量级的网络游戏,遇到了技能优先顺序手动排序的需求,我就想到了iOS自带的tableView编辑功能,对其进行了初步探索,最后做出的效果如下图所示:点击左边可以删除,拖住右边可以手动排序,要实现这个功能,分以下步骤。①用plist存储这些数据,可以看到数据分两个职业,每个职业4个技能,因此建立如下的plist结构:②因为每个职业除了技能还有名称这个属性,因此应该用职原创 2015-08-19 09:31:40 · 2358 阅读 · 0 评论 -
iOS7 CookBook精彩瞬间(三)UIActivityViewController的基本使用及自定义Activity
1.基本使用UIActivityViewController主要用于分享内容,创建activityView的方法很简单,调用下面的方法创建:[[UIActivityViewController alloc] initWithActivityItems: applicationActivities:第一个参数为要分享的内容数组,可以为任何类,常见的为NSString和UIImage,原创 2015-08-31 19:16:57 · 1422 阅读 · 0 评论 -
iOS7 CookBook精彩瞬间(二)NSSet、通过Subscript访问类成员等
1.NSSet的用法 ①NSSet是一种无序集合,基于hash实现,可以在线性时间复杂度内查找某个元素,如果要让元素有序,应当使用NSOrderedSet,要让集合可变,与NSArray类似,使用NSMutableSet和NSMutableOrderedSet即可。 ②从Set中取出元素只能用anyObject随机取,NSSet被系统用于存放用户的触摸点。 ③Set的另原创 2015-08-31 18:40:01 · 679 阅读 · 0 评论 -
iOS7 CookBook精彩瞬间(一)property、selector细节、__unused
1.我们常常使用nonatomic,很多人只知道它的效率较高,却不知道其含义,其含义是非线程安全的,也就是说多线程修改时不加锁,可能出现多个线程先后修改而成为脏数据的情况。2.unsafe_unretained和assign的作用是一致的,如果对象数据也采用这种方式,这个property就只是指向数据的指针而已,这样说来,似乎assign和weak是一样的,但他们有个很大的区别,在下一条中说明原创 2015-08-30 21:07:25 · 1110 阅读 · 0 评论 -
(一二三)基于GCD的dispatch_once实现单例设计
要实现单例,关键是要保证类的alloc和init只被调用一次,并且被自身强引用防止释放。近日读唐巧先生的《iOS开发进阶》,受益匪浅,通过GCD实现单例就是收获之一,下面把这个方法与大家分享。在GCD中,有一个函数dispatch_once,可以实现代码段的一次性执行,和static修饰的变量赋值的一次性一样,我们结合static和dispatch_once,就可以简单的实现单例。原创 2015-08-17 21:02:00 · 1354 阅读 · 0 评论 -
(一二二)核心动画进阶
上节我们介绍了核心动画基础,这一节介绍核心动画的主要应用和局限性。【核心动画的局限性】有一点需要注意,所有的核心动画都是假象,只是修改了View的展示位置,而不能修改真实位置,即使设置了不复位,仿佛是位置移动了,其实layer还在原位,要证明这一点,可以在动画完成后打印layer的位置。为了获得动画结束时机,可以通过代理,UIView已经遵循了相关协议,可以实现动画开始和结束的两个方法原创 2015-08-13 20:20:18 · 872 阅读 · 0 评论 -
(一二一)核心动画基础
核心动画基于QuartzCore框架,只能用于CALayer,可以实现3D效果,它在子线程中执行动画,不会阻塞主线程。要实现核心动画,主要使用CABasicAnimation实现单步动画、使用CAKeyframeAnimation实现帧动画。动画的主要属性有duration、keyPath、value、repeatCount等。动画执行完毕后默认会复位,要取消复位,需要以下两行代码:原创 2015-08-12 22:39:40 · 946 阅读 · 0 评论 -
(一二〇)CALayer的一些特性
1.每个View都自带一个CALayer,称为rootLayer,layer可以和实现与View一样的显示功能,但是它不继承UIResponse,也就是说它无法处理事件,所以为了处理事件还是要用View,如果只是显示,可以选择layer。下面的代码实现了自定义一个layer添加到控制器的rootLayer上,layer可以正常显示。CALayer *layer = [CALayer lay原创 2015-08-12 21:20:50 · 829 阅读 · 0 评论 -
(一一九)通过CALayer实现阴影、圆角、边框和3D变换
在每个View上都有一个CALayer作为父图层,View的内容作为子层显示,通过layer的contents属性决定了要显示的内容,通过修改过layer的一些属性可以实现一些华丽的效果。下面以一个普通的蓝色View为例,介绍layer的功能:_blueView.layer.shadowOpacity = 1.0; // 阴影不透明度_blueView.layer.shadowColor原创 2015-08-12 20:41:50 · 2289 阅读 · 0 评论 -
(一一八)利用block实现链式编程
有些时候需要不断地调用方法,如果使用传统方案,需要拿到对象多次调用,例如有一个Ball对象,实现了up、down、left、right四个方法,分别控制球的运动方向,如果要实现球向右再向下,需要这么写:[ball right];[ball down];如果能够按照下面这样写,会更加方便。[[ball right] down];要实现这样的功能十分简单,只要每个方法都返回self即可,原创 2015-08-11 22:26:39 · 1240 阅读 · 0 评论 -
(一一七)基本文件操作 -SDWebImage清除缓存 -文件夹的大小计算
在iOS的App沙盒中,Documents和Library/Preferences都会被备份到iCloud,因此只适合放置一些记录文件,例如plist、数据库文件。缓存一般放置到Library/Caches,tmp文件夹会被系统随机清除,不适宜防止数据。【图片缓存的清除】在使用SDWebImage时,图片被大量的缓存,有时需要获取缓存的大小以及清除缓存。要获取缓存大小,使用SDImag原创 2015-08-11 22:16:02 · 1445 阅读 · 0 评论 -
(一一四)使用FMDB操作SQLite数据库
上节介绍了用系统自带的C语言库操作SQLite的方法,比较繁琐,使用FMDB会大幅度简化,并且是面向对象的,使用十分方便。使用步骤如下:先从github下载FMDB框架,然后把它导入工程。①导入libsqlite3.0.dylib库。②导入主头文件FMDatabase.h。③创建数据库对象,传入路径,打开数据库,如果数据库不存在会被创建。NSString *sqlitePa原创 2015-08-09 23:51:46 · 1045 阅读 · 0 评论 -
(一一三)使用系统自带框架操作SQLite3数据库
系统自带的框架是基于C语言的,使用比较繁琐。下面是使用步骤:首先导入libsqlite3.0.dylib。①在Document目录下打开数据库,如果没有则创建。NSString *sqlitePath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObj原创 2015-08-09 23:23:21 · 1147 阅读 · 0 评论 -
(一一二)图文混排中特殊文字的点击与事件处理
在上一篇文章(一一一)图文混排基础 -利用正则分割和拼接属性字符串中提到了对attributedText的特殊处理,将其中的话题、URL都用红色进行了表示,如下图所示:本节要实现的功能是这样的attributedText在点击话题、URL时应该有所响应,而在点击其他位置的时候把事件传递给父类处理。要获取到点击的位置很简单,只需要重写touchesBegan方法即可拿到触摸点,比原创 2015-08-08 23:28:51 · 7665 阅读 · 2 评论