扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
1. AFNetworking在众多iOS开源项目中,AFNetworking可以称得上是最受开发者欢迎的库项目。AFNetworking是一个轻量级的iOS、Mac OS X网络通信类库,现在是GitHub上第三大Objective-C库。它建立在NSURLConnection、NSOperation等类库的基础上,让很多网络通信功能的实现变得十分简单,因此,许多iOS应用开发都会使用到它。支持HTTP请求和基于REST的网络服务(包括GET、POST、PUT、DELETE等);支持ARC;要求iOS 5.0及以上版本;有一些插件扩展已有的功能,还有一个功能齐全的API;从URL中获取JSON特别简单。2. Three20Three20原本是iPhone版Facebook中所使用的工具库,包括照片查看器等一系列的iPhone UI类集,以及HTTP磁盘缓存等一些通用工具。后来从Facebook iPhone应用中剥离出来,成为了一个深受开发者喜爱的通用框架。3. facebook-ios-sdk此前在“GitHub上最受欢迎的开源项目”Android系列文章(一)中,我们曾介绍过允许开发者将Facebook集成到Android应用中的Facebook SDK for Android。Facebook SDK for iOS和它一样,可以让开发者将Facebook相关功能集成到自己的iOS App中。Facebook无疑是最成功的SNS社区,如果能够让App具有与Facebook集成的功能,那势必会带来非常好的效果。Facebook SDK for iOS项目更新频率很高,想要获取更多关于示例、文档、将SDK集成到App中、源代码等信息,可直接登陆Facebook Developers查看。4. RestKitRestkit是一个主要用于iOS上网络通信的开源Objective-C框架,除了发送请求、接受响应这些基本功能外,还附带Core Data,以及将远程JSON映射为本地对象的功能。主要特点:可在iOS和Mac OS X的Objective-C中与RESTful Web服务进行简单交互;包含简单的HTTP Request/Response API;带有强大的对象映射系统,用于减少代码长度;RestKit可降低JSON/XML的处理的资源消耗,支持通过SBJSON和YAJL进行JSON解析。5. asi-http-requestASIHTTPRequest是一款极其强劲的HTTP访问开源项目,能够让简单的API完成非常复杂的功能,比如异步请求、队列请求、GZIP压缩、缓存、断点续传、进度跟踪、上传文件、HTTP认证。ASIHTTPRequest适用于基本的HTTP请求,和基于REST的服务之间的交互。使用Objective-C编写,能够同时用于Mac OS X和iPhone应用中。6. cocos2d-x在《GitHub上最火的40个Android开源项目(一)》中,我们已经非常详细地介绍了cocos2d-x开源项目。cocos2d-x支持iOS、Android、Windows Phone 8、Bada、BlackBerry、Marmalade、Windows、Linux等多个平台。7.cocos2d-iphone(cocos2d)cocos2d for iPhone是一个开源框架,用于为iPod Touch、iPhone、iPad及Mac OS X构建2D游戏、演示程序及其他图形交互式应用。基于cocos2d设计,使用相同的API,但不同于cocos2d使用Python,cocos2d for iPhone是使用Objective-C实现的。cocos2d for iPhone主要特性:快免费易于使用社区支持8.cocos2d-iphone(jpsarda)该项目是对cocos2d for iPhone的扩展。9. GPUImageGPUImage是一个基于GPU图像和视频处理的开源iOS框架。主要功能如下:提供各种各样的图像处理滤镜,并且支持照相机和摄像机的实时滤镜;GPUImage顾名思义,是基于GPU的图像加速,因此图像处理速度非常快,并且能够自定义图像滤镜;支持ARC。10. MonoGameMonoGame是一个Microsoft XNA 4.x Framework的开源跨平台实现。此前在Android开源项目系列文章(一)中我们也进行了详细的介绍。MonoGame支持平台:iOS(包括Ritina Display)AndroidWindows(OpenGL)Mac OS XLinuxWindows Store Apps(Windows 8、Windows RT)Windows Phone 8PlayStation Mobile(目前仅支持2D)OUYA11. NimbusNimbus是一个开源的iOS框架,比起Three20,Nimbus的文档更为全面、丰富,能够实现很多非常炫的界面特效。因此,开发者可以借助Nimbus来降低项目设计的复杂度。12. cheddar-iosCheddar是一个简单即时的任务管理器,Cheddar for iOS是Cheddar的iOS客户端,通用于iPhone和iPad。13. ViewDeckIIViewDeckController能够实现类似于Path 2.0 的视图左右滑动的效果,支持向左或向右顺滑的滑动操作。14. ShareKitShareKit是iPhone开发的第三方接口,允许你一键分享文字、图片、网址、文件等内容到Facebook、Twitter、Delicious、Tumblr、Google Reader等第三方网站上。15. GMGridViewGMGridView是一款开源的iOS(iPhone/iPad)表格视图,允许用户手势对表格单元进行排序,在单元格需要展示时才进行装载,这样极大地提高了表格的效率。其中的伸缩/旋转/平移手势能够让用户改变视图,还能够实现从CellView到全屏的切换。16. QuickDialogQuickDialog可以帮助开发者快速创建复杂的表单,实现包括登录界面在内的各种样式的TableView输入界面,此外,还可以创建带有多个文本域的表格及项目。17. appiraterAppirater是一个可以直接使用到任何iPhone应用(iOS4.0及以上)中的开源类,用于提醒用户在打开App时,对应用进行或打分。18. SVProgressHUDSVProgressHUD能够实现多种HUD效果,多用于程序正在执行耗时较长的任务,需要用户等待。除了显示等待的HUD,还可以显示命令执行成功或者失败的HUD。19. Reader该项目能够让iOS开发者轻而易举地在iOS设备屏幕上显示PDF文件。代码通用,不需要任何XIB(因为所有UI元素都是代码生成的,具有极大的灵活性),运行于iOS 4.0及其以上版本设备中,同时还支持所有Retina Display设备。支持:诸如iBooks等的文档导航;设备全方位旋转;对PDF进行加密(密码保护);PDF链接(URI及跳转页面);PDF旋转页面。20.CocoaAsyncSocketCocoaAsyncSocket提供了十分强大而又易用的Mac OS X及iOS异步套接库,支持TCP和UDP,其中,AsyncSocket类是支持TCP的,AsyncUdpSocket是支持UDP的。AsyncSocket是封装了CFSocket和CFSteam的TCP/IP socket网络库,提供异步操作。AsyncUdpSocket是UDP/IP socket网络库,包装自CFSocket。
西固ssl适用于网站、小程序/APP、API接口等需要进行数据传输应用场景,ssl证书未来市场广阔!成为创新互联的ssl证书销售渠道,可以享受市场价格4-6折优惠!如果有意向欢迎电话联系或者加微信:18982081108(备注:SSL证书合作)期待与您的合作!
Jukebox 这个框架是Swift版本
GitHub: :
第0步,pod把StreamingKit导进来
第一步
AppDelegate.m:
第二步初始化一个控制器:
还有后台如何播放音乐?一张图片就明白
如果有什么问题,可以微薄“梁同桌”私信我。留言都行
阿里妹导读:刚刚,阿里巴巴正式对外开源了基于 Apache 2.0 协议的协程开发框架 coobjc,开发者们可以在 Github 上自主下载。
coobjc是为iOS平台打造的开源协程开发框架,支持Objective-C和Swift,同时提供了cokit库为Foundation和UIKit中的部分API提供了 协程 化支持,本文将为大家详细介绍coobjc的设计理念及核心优势。
从2008年第一个iOS版本发布至今的11年时间里,iOS的异步编程方式发展缓慢。
基于 Block 的异步编程回调是目前 iOS 使用最广泛的异步编程方式,iOS 系统提供的 GCD 库让异步开发变得很简单方便,但是基于这种编程方式的缺点也有很多,主要有以下几点:
针对多线程以及尤其引发的各种崩溃和性能问题,我们制定了很多编程规范、进行了各种新人培训,尝试降低问题发生的概率,但是问题依然很严峻,多线程引发的问题占比并没有明显的下降,异步编程本来就是很复杂的事情,单靠规范和培训是难以从根本上解决问题的,需要有更加好的编程方式来解决。
上述问题在很多系统和语言开发中都可能会碰到,解决问题的标准方式就是使用协程,C#、Kotlin、Python、Javascript 等热门语言均支持协程极其相关语法,使用这些语言的开发者可以很方便的使用协程及相关功能进行异步编程。
2017 年的 C++ 标准开始支持协程,Swift5 中也包含了协程相关的标准,从现在的发展趋势看基于协程的全新的异步编程方式,是我们解决现有异步编程问题的有效的方式,但是苹果基本已经不会升级 Objective-C 了,因此使用Objective-C的开发者是无法使用官方的协程能力的,而最新 Swift 的发布和推广也还需要时日,为了让广大iOS开发者能快速享受到协程带来的编程方式上的改变,手机淘宝架构团队基于长期对系统底层库和汇编的研究,通过汇编和C语言实现了支持 Objective-C 和 Swift 协程的完美解决方案 —— coobjc。
核心能力
内置系统扩展库
coobjc设计
最底层是协程内核,包含了栈切换的管理、协程调度器的实现、协程间通信channel的实现等。
中间层是基于协程的操作符的包装,目前支持async/await、Generator、Actor等编程模型。
最上层是对系统库的协程化扩展,目前基本上覆盖了Foundation和UIKit的所有IO和耗时方法。
核心实现原理
协程的核心思想是控制调用栈的主动让出和恢复。一般的协程实现都会提供两个重要的操作:
我们基于线程的代码执行时候,是没法做出暂停操作的,我们现在要做的事情就是要代码执行能够暂停,还能够再恢复。 基本上代码执行都是一种基于调用栈的模型,所以如果我们能把当前调用栈上的状态都保存下来,然后再能从缓存中恢复,那我们就能够实现yield和 resume。
实现这样操作有几种方法呢?
上述第三种和第四种只是能过做到跳转,但是没法保存调用栈上的状态,看起来基本上不能算是实现了协程,只能算做做demo,第五种除非官方支持,否则自行改写编译器通用性很差。而第一种方案的 ucontext 在iOS上是废弃了的,不能使用。那么我们使用的是第二种方案,自己用汇编模拟一下 ucontext。
模拟ucontext的核心是通过getContext和setContext实现保存和恢复调用栈。需要熟悉不同CPU架构下的调用约定(Calling Convention). 汇编实现就是要针对不同cpu实现一套,我们目前实现了 armv7、arm64、i386、x86_64,支持iPhone真机和模拟器。
说了这么多,还是看看代码吧,我们从一个简单的网络请求加载图片功能来看看coobjc到底是如何使用的。
下面是最普通的网络请求的写法:
下面是使用coobjc库协程化改造后的代码:
原本需要20行的代码,通过coobjc协程化改造后,减少了一半,整个代码逻辑和可读性都更加好,这就是coobjc强大的能力,能把原本很复杂的异步代码,通过协程化改造,转变成逻辑简洁的顺序调用。
coobjc还有很多其他强大的能力,本文对于coobjc的实际使用就不过多介绍了,感兴趣的朋友可以去官方github仓库自行下载查看。
我们在iPhone7 iOS11.4.1的设备上使用协程和传统多线程方式分别模拟高并发读取数据的场景,下面是两种方式得到的压测数据。
从上面的表格我们可以看到使用在并发量很小的场景,由于多线程可以完全使用设备的计算核心,因此coobjc总耗时要比传统多线程略高,但是由于整体耗时都很小,因此差异并不明显,但是随着并发量的增大,coobjc的优势开始逐渐体现出来,当并发量超过1000以后,传统多线程开始出现线程分配异常,而导致很多并发任务并没有执行,因此在上表中显示的是大于20秒,实际是任务已经无法正常执行了,但是coobjc仍然可以正常运行。
我们在手机淘宝这种超级App中尝试了协程化改造,针对部分性能差的页面,我们发现在滑动过程中存在很多主线程IO调用、数据解析,导致帧率下降严重,通过引入coobjc,在不改变原有业务代码的基础上,通过全局hook部分IO、数据解析方法,即可让原来在主线程中同步执行的IO方法异步执行,并且不影响原有的业务逻辑,通过测试验证,这样的改造在低端机(iPhone6及以下的机器)上的帧率有20%左右的提升。
简明
易用
清晰
性能
程序是写来给人读的,只会偶尔让机器执行一下。——Abelson and Sussman
基于协程实现的编程范式能够帮助开发者编写出更加优美、健壮、可读性更强的代码。
协程可以帮助我们在编写并发代码的过程中减少线程和锁的使用,提升应用的性能和稳定性。
本文作者:淘宝技术
iOS脚本自动化打包方案--xcodebuild
本文主要xcodebuild脚本自动化打包并上传到蒲公英或者AppStore,废话不多说,直接上干货!
先了解一下xcodebuild打包需要的一些指令
-workspace XXX.xcworkspace
XXX.xcworkspace需要编译工程的工作空间名称,如果工程不是.xcworkspace的,可以不需要-workspace XXX.xcworkspace这段话
-scheme XXX
XXX是工程名称,-scheme XXX是指定构建工程的名称
-configuration Release
填入打包的方式是Debug或Release,就跟在Xcode中编译前需要在Edit scheme的Build configuration中选择打出来的包是Debug还是Release包一样,-configuration就是配置编译的Build configuration
-archivePath ./myArchivePath
配置生成.xcarchive的路径, ./表示生成在当前目录下,myArchivePath是生成的.Archive文件名称
ODE_SIGN_IDENTITY=证书
配置打包的指定证书,如果该工程的Xcode已经配置好了证书,那么不加入这段话也可以,打包出来的证书就是Xcode中配置好的。
PROVISIONING_PROFILE=描述文件UUID
配置打包的描述文件,同上,Xcode已经配置好了就不用在填入这段话了
CONFIGURATION_BUILD_DIR
配置编译文件的输出路径,如果需要用到.xcarchive文件内部的dSYM等文件,可以使用改字段指定输出路径。
如果工程是勾选了Automatically manage signing,那么就不用在配置ODE_SIGN_IDENTITY和PROVISIONING_PROFILE,今天这里讲到的Automatically manage signing自动配置证书,手动配置的就不多说了,有兴趣的话可以自己研究。
xcode工程配置自动获取证书,如下图:
打包所需要文件
配置打包的ExportOptions.plist文件,可以在任意一个Xcode工程中新建一个ExportOptions.plist文件。dev和adHoc和AppStore的配置文件内容不一样,可以先手动打包后看下plist文件的样式,这里提供一个样例:
这里method对应的value为打包对应的环境,有development、ad-hoc、app-store、enterprise根据打包环境来配置不同的值
编译脚本命令
xcodebuild archive -workspace XXX.xcworkspace -scheme XXX -configuration Release -archivePath ./myArchivePath CONFIGURATION_BUILD_DIR ./dir ODE_SIGN_IDENTITY=证书 PROVISIONING_PROFILE=描述文件UUID
导出ipa包命令
xcodebuild -exportArchive -archivePath ./myArchivePath.xcarchive -exportOptionsPlist ./ExportOptions.plist -exportPath ./out
-archivePath ./myArchivePath.xcarchive指定需要打包的.xcarchive路径,./myArchivePath.xcarchive表示在当前终端路径下的myArchivePath.xcarchive文件
-exportOptionsPlist ./ExportOptions.plist指定打包需要的ExportOptions.plist配置文件路径
-exportPath ./out指定打包输出的路径, ./out表示打包结果输出在终端的当前路径下的out文件家中。如果没有out文件夹会自动创建一个
脚本操作
首先:cd到需要自动打包的工程下
然后:在终端中输入touch xcodebuild.sh创建xcodebuild.sh脚本文件
然后:双击打开脚本写入下面 脚本内容(请确保所有版本的plist配置文件都写好了)
最后:在终端中输入./xcodebuild.sh运行脚本,按照步骤完成打包选择(如果运行的时候出现Permission denied,请先在终端中执行chmod a+x *.文件的后缀名后,在运行,相当于提高脚本文件的权限)
脚本内容
此脚本包含了自动上传蒲公英的选择操作,根据输入指令来执行具体操作
脚本实现
具体详细脚本见GitHub地址: 如果好用记得给star,谢谢!
如脚本打包执行遇到问题可留言沟通!
如果无注册信息,需要注册
注册成功之后你会看到如下确认邮件的提示:
那么赶紧打开你的小邮箱验证吧,打开邮箱看到如下:
然后复制中间的链接放在浏览器打开即可,出现如下提示表明验证成功:
结果如下:
注意:
其中Pods这一项中的HJAppSpSDK表示的是我的pods上已经有一个HJAppSpSDK项目了,如果你成功添加了现在的这个项目会再多一个的
进入需要配置项目目录下也就是.git仓库的同级目录,创建一个XXX(SDK名称).podspec的文件,最好不要直接touch一个空文件,然后直接去网上扒源码,这样会出现我最后面提到的问题,所以按照我的步骤来是不会出错的:
打开vi HJAppSPSDK.podspec文件
注意问题:
上面我需要使用到的:
1s.version版本一定要跟tag一致
2s.summary不改的话会有警告
3s.description要填写,不填写报错,如果嫌麻烦,可以用#注释掉
4s.homepage填写你的github上的项目地址
5s.license根据你github创建项目的时候使用的证书,一般选用MIT,后面的文件名LICENSE是谷歌创建的时候的文件名,你可以到你的项目中查找对应的文件名填写上
6s.source后面填写github上的项目地址,请务必正确填写
7s.resource后面的是你上传bundle的相对路径,我是把bundle放在FrameworkFramework目录下的,请按照我的填写来找到对应你自己的填写
8 s.ios.vendored_frameworks这一栏可能没有,可能有,没有就加上,这个是找到对应framework的路劲,我是放在FrameworkFramework下的,请按照我的填写来找到对应你自己的填写
9s.frameworks这个是系统的framework,那么我们自己的Framework里面用到了哪些系统的framework就加上
上面我没有使用到的,其他的:
1s.dependency这个是填写依赖的第三方库,比如说AFN:
2s.requires_arc表示是否是ARC,如果是那么就打开填写true,如下:
3s.source_files表示的是源码文件,这个是我们的开源框架了,我们这里并没有就没写,如果我们要搞开源的框架。那么路径和我们的bundle那样找路径是一样的
4s.library或者s.libraries指的是我们需要依赖系统的库,lib库,那么这个就看我们需要添加什么就写什么。比如说我们经常喜欢添加sqite
进入到XXX.podspec 同级目录下
提交到Cocoapods 在项目目录下也就是.git仓库的同级目录也就是现在的XXX.podspec文件的同级目录下
如果出现如下提示,说明上传成功了:
然后查看下pod信息:
结果如下:
创建项目,项目目录下
这个时候你更新下本地的repo仓库:
更新好之后,再查询下
查询结果如下:
生成Podfile 文件,修改Podfile文件,添加如下条目:
然后接下来打开白色的*******.xcworkspace文件,就能看到了pods目录中文件了
(1)供OC、swift同时使用需要暴露方法前加‘objc’
(2)pod lib lint xxx.podspec --verbose --use-libraries --allow-warnings
本地pod检测失败,报如下错误,说明swift 库链接失败(错误如下)
需要在framework工程中修改配置(如果OC项目pod引入该framework 源文件(非xx.framework)报错,也要检测下这个配置是否设置为YES)
添加/移除某个库的拥有者,上文有提到该命令。
你必须先运行过 pod trunk register 登录过,并且操作的是你账号拥有的库。
3-1、注册登录。
在你的 Mac 上只需要运行一次,然后去邮箱中点击确认邮件的链接即可,当然你也可以使用该命令在不同的账号中来回切换。
3-2、发布库
我一般在本地操作,PATH 一般就是 PodRepName.podspec。不过官网文档上说 PATH 缺省是当前目录,所以 cd 到库的本地目录,然后直接 pod trunk push 应该也是可以滴!
3-3、查看自己的账号信息,以及账号拥有的仓库。
3-4、查看某个库的信息,包括拥有者、各版本版本号及发布时间
3-5、不赞成使用,让某个库过期
暂时还没有尝试,仅做记录
1.在github官网( )注册一个账号;
2.登录账号,创建一个新的仓库,如下图
3.填写仓库名称,配置仓库相关信息
4.完成创建后,copy仓库地址备用
5.在本地创建一个文件夹作为git本地仓库文件夹,然后打开终端执行以下命令
cd 到git本地仓库文件夹中
git clone '上面copy的地址'
此时在git本地仓库文件夹中会看到一个README文件,然后将自己的工程根目录下的所有文件移到git本地仓库文件夹中,然后在终端执行以下命令
git add . //添加所有文件
git commit -m '添加了所有文件提交到本地仓库' //提交
git push -u origin master //推送到远程git仓库
此时去github网页查看自己提交的项目,大功告成!
如果在创建仓库时,未勾选.gitignore选项,则在使用git的过程中push时,改动的文件中会频繁出现UserInterfaceState.xcuserstate文件。原因就是未使用.gitignore文件(就是git软件要忽略的文件列表,如果要忽略某些文件,在Git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件。),如何创建呢?接下来用我的实际经验来给大家解决这个小问题咯????
cd到你的工程目录下,然后 touch .gitignore
vi .gitigonre
project.xcworkspace
xcuserdata
UserInterfaceState.xcuserstate
project.xcworkspace/
xcuserdata/
UserInterface.xcuserstate
4.保存退出
然后执行命令
git add .
git ommit -m '描述'
git push
成功后就不会出现UserInterfaceState.xcuserstate这种文件啦!
如果还是会出现,则用以下命令
1.git status
查看当前状态,会出现一个modifidy: UserInterfaceState.xcuserstate文件的路径,咱们copy这个路径;
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流