作者: xiao, yanzi

Siri触发器原理及改进

语音触发器
Hey Siri
“Hey Siri”功能允许用户启动Siri。一个很小的语音识别器一直在运行并监听这两个单词。当它检测到“Hey Siri”时,Siri将余下的语音作为命令或查询进行解析。“Hey Siri”探测器使用深度神经网络(DNN)将每个时刻的声音的声学模式转换为语音声音的概率分布。然后,它计算你所说的短语是“Hey Siri”的可能性分数。如果得分足够高,Siri会被唤醒。

%title插图%num

图1. iPhone上的Hey Siri流程
如图1所示,整个系统有几个部分。Siri的大部分实现都是“在云端”,包括主要的自动语音识别,自然语言解释和各种信息服务。还有一些服务器可以提供检测器使用的声学模型的更新。我们主要关注探测器:一个专门的语音识别器,它只关注“Hey Siri”。

监听“Hey Siri”
iPhone中的麦克风以每秒16000的速度将您的声音转换为瞬时波形样本流。频谱分析阶段将波形采样流转换成一系列帧,每帧描述约0.01秒的声谱。将这些帧中的大约20个(音频为0.2秒)送到深度神经网络(DNN),其将这些声学模式中的每一个转换成一组语音类别的概率分布:用于“Hey Siri”的短语,再加上沉默和其他的讲话,总共约20个音类。如图2。

%title插图%num
我们选择DNN的每个隐藏层中的单元数量,以适应​​“Hey Siri”检测器运行时可用的计算资源。我们使用的网络通常具有五个隐藏层,所有这些层都是相同的大小:32,128或192个单元,具体取决于内存和功率的限制。在iPhone上,我们使用两个网络,一个用于初始检测,另一个用作辅助检查器。初始检测器使用的次数少于辅助检查器。
假设我们使用的是*小的DNN,则可以通过查看表示不同阶段声学信号的图3来更好地了解探测器的工作原理。*底部是麦克风波形的光谱图。在这种情况下,有人在说“Hey Siri What…”更明亮的部分是这个短语中*响亮的部分。Hey Siri模式是在垂直的蓝线之间。

%title插图%num
从底部向上的第二个水平条显示了用梅尔滤波器组分析相同波形的结果,其基于感知测量给出频率的权重。由于声道的精细结构,这种转换使光谱图中可见的细节变得平滑:或者是随机的,如在/s/中,或者是周期性的,在这里被看作垂直条纹。
标记为H1至H5的交替的绿色和蓝色水平条显示了五个隐藏层中的每一个单元的数值(激活)。已经为这个数字安排了每层的32个隐藏单元,以便将具有相似输出的单元放在一起。
下一条(有黄色斜线)显示声学模型的输出。在每一帧中,短语中的每个位置都有一个输出,另外还有一些输出用于静音和其他语音。

双通道检测
“Hey Siri”探测器不仅要准确,而且需要快速,对电池寿命没有显着影响。我们还需要*大限度地减少内存使用和处理器需求,特别是处理器需求峰值。
为了避免整天运行主处理器来监听触发短语,iPhone的Always On Processor(AOP)(一个小型​​,低功耗的辅助处理器,即嵌入式运动协处理器)可以访问麦克风信号(6S及更新机型)。我们使用AOP有限处理能力的一小部分来运行具有小型声学模型(DNN)的探测器。当分数超过阈值时,运动协处理器唤醒主处理器,主处理器使用更大的DNN来分析信号。在支持AOP的*个版本中,*个探测器使用了一个有5层32隐藏单元的DNN,第二个探测器有5层192个隐藏单元。

%title插图%num
人脸触发器
概述
Hey Siri是一种基于语音识别的触发器,通过识别固定的关键字“Hey Siri”来触发Siri。基于人类固有的对话方式,提供另一种Siri触发器(Face Siri)。Face Siri通过判定使用者注视iPhone,进而触发Siri。

人类对话
假设场景,张三与李四对话,有以下两种方式:
1、 如图5所示,张三呼叫李四名字,并与李四建立一次对话。
步骤1:张三说:“李四”。
步骤2:李四听到后回答:“在”。
步骤3:张三问:“吃了吗”?
步骤4:李四回答:“吃过了”。
Hey Siri触发器类似于此种模式。iPhone监听到Hey Siri, 启动Siri并完成后续服务。

%title插图%num
2、 如图6所示,张三和李四看向对方,并建立一次对话。
步骤1:互相看向对方。
步骤2:张三问:“吃了吗”?
步骤3:李四回答:“吃过了”。
基于此种人类已有的对话模式,提供一种新的触发Siri的模式,并不需要喊出那个固定的关键字“Hey Siri”。

%title插图%num

Face Siri
如图7所示,使用者通过注视iPhone来启动Siri。
步骤1:使用者注视iPhone。使用者面部正对iPhone,并保持张开眼睛看向iPhone。
步骤2:判断是否注视iPhone。通过DNN判断摄像头获取图片的人脸占比是否超过阈值,眼睛是否张开。
步骤3:判断超时之前是否接收到语音。若有效时间内监测到有效语音输入,则触发Siri并等待语音输入完成。
步骤4:解析语音。Siri将语音输入解析为命令或者查询并提供服务。

%title插图%num

iOS常用的第三方

下拉刷新
  • EGOTableViewPullRefresh – *早的下拉刷新控件。
  • SVPullToRefresh – 下拉刷新控件。
  • MJRefresh – 仅需一行代码就可以为UITableView或者CollectionView加上下拉刷新或者上拉刷新功能。可以自定义上下拉刷新的文字说明。具体使用看“使用方法”。 (国人写)
  • XHRefreshControl – XHRefreshControl 是一款高扩展性、低耦合度的下拉刷新、上提加载更多的组件。(国人写)
  • CBStoreHouseRefreshControl – 一个效果很酷炫的下拉刷新控件。
  • BreakOutToRefresh – 一个下拉刷新打砖块的开源 Swift 库,能让用户在等待下拉刷新的时候边玩撞球游戏边等待。
  • KYJellyPullToRefresh – 实现弹性物理效果的下拉刷新,神奇的贝塞尔曲线,配合UIDynamic写的一个拟物的下拉刷新动画。
  • MHYahooParallaxView – 类似于Yahoo Weather和News Digest首屏的视差滚动。
  • SDRefreshView – 简单易用的上拉和下拉刷新(多版本细节适配)。
  • ZLSwiftRefresh – swift下拉刷新/上拉加载更多,支持自定义动画,集成简单,兼容UITableView/CollectionView/ScrollView/WebView。
  • BreakOutToRefresh – swift,上拉和下拉刷新。
  • GearRefreshControl – swift,上拉和下拉刷新。
  • refresher – swift,上拉和下拉刷新。
  • 可展开/收缩的下拉菜单–SvpplyTable – 一个可展开可收缩的下拉菜单,类似Svpply app。
  • ODRefreshControl – 原iOS6上的橡皮糖刷新样式,很有意思。现在也很多大的 App 在用,比如虾米音乐和 QQ 客户端。
  • PullToMakeSoup – PullToMakeSoup, 自定义下拉刷新的动画效果:煮饭, Yalantis新作!
  • TwitterCover – Twitter iOS客户端的下拉封面模糊效果。
  • Replace-iOS – Replace-iOS 让人眼前一亮的下拉刷新(iOS)。
  • Animations – 封装了一下,使用的时候只要两行代码。一些动画的飞机稿,都是一些单独分离出来的用于测试的子动画,现在统一归类一下。
  • PullToBounce – 下拉刷新的动画 for UIScrollView。
模糊效果
  • FXBlurView – 是一个UIView子类,支持iOS5.0以上版本,支持静态、动态模糊效果,继承与UIView的模糊特效。
  • VVBlurPresentation -很简单易用的在原来viewconntroller基础上做模糊,然后present新的viewcontroller的。
  • UICustomActionSheet – 通过模糊背景来着重强调与菜单相关的元素–对话框 里面已经收藏。
  • SABlurImageView – 支持渐变动画效果的图像模糊化类库。P.S. 与前几天推存类库 SAHistoryNavigationViewController 是同一位作者。
AutoLayout
  • Masonry – Masonry是一个轻量级的布局框架,拥有自己的描述语法,采用更优雅的链式语法封装自动布局,简洁明了并具有高可读性( 使用介绍1 使用介绍2),iOS自适应前段库-Masonry的使用),Masonry、Classy、ClassyLiveLayout介绍。使用DEMO 视图居中显示、子视图含边距、视图等距离摆放、计算ScrollView的contentsize。
  • Classy – Classy是一个能与UIKit无缝结合stylesheet(样式)系统。它借鉴CSS的思想,但引入新的语法和命名规则,Classy官网,Masonry、Classy、ClassyLiveLayout介绍。
  • ClassyLiveLayout – ClassyLiveLayout通过结合Classy stylesheets与Masonry一起使用,能够在运行的模拟器中微调Auto Layout约束实时显示效果的工具,Masonry、Classy、ClassyLiveLayout介绍。
  • Snap – Snap是Masonry Auto Layout DSL的Swift版本,是一款轻量级的布局框架,使用了更良好的语法封装了AutoLayout。Snap支持iOS和OS X。
  • SnapKit – 就是“snap”, –swift 喜欢自动布局吗?当然喜欢!至少在storyboard中创建时会喜欢。 在代码中纯手工创建约束灰常痛苦,但幸运的是我们有了SnapKit,在board中用上它,你可以简单直观地编写约束了。。
  • PureLayout – PureLayout 是 iOS & OS X Auto Layout 的终* API——非常简单,又非常强大。PureLayout 通过一个全面的Auto Layout API 扩展了 UIView/NSView, NSArray 和 NSLayoutConstraint,仿照苹果自身的框架。
  • UIView-AutoLayout – Deprecated in favor of PureLayout, which includes OS X support:https://github.com/smileyborg/PureLayout。
  • Cartography – Cartography 是用来声明 Swift 中的 Auto Layout,无需输入任何 stringly 就可设置自己 Auto Layout 的约束声明。
  • Auto-Layout-Showcase – swift,AutoLayout 进阶 Demo,宽高比约束、比例约束、不等约束、视差约束、低优先级约束等高级用法,无需写码即可进行复杂页面布局,Demo 还动态模拟了各屏幕下的效果。来自百度知道 iOS 小组的内部分享。
  • UIView-FDCollapsibleConstraints – 一个AutoLayout辅助工具,*优雅的方式解决自动布局中子View的动态显示和隐藏的问题。第二个Demo模拟了一个经典的FlowLayout,任意一个元素隐藏时,底下的元素需要自动“顶”上来,配合这个扩展,你可以在IB里连一连,选一选,不用一行代码就能搞定。
  • Autolayout_Demo – 在项目中用自动布局实现的类似抽屉效果。
  • 当view隐藏的时候也隐藏其autolayout的NSLayoutAttribute – 当view隐藏的时候也隐藏其autolayout的NSLayoutAttribute,从而不用大量的代码工作。
富文本
  • RTLabel – RTLabel 基于UILabel类的拓展,能够支持Html标记的富文本显示,它是基于Core Text,因此也支持Core Text上的一些东西。32位,很久没有更新了。
  • RTLabel – 富文本,RTLabel支持64位。
  • TYAttributedLabel – TYAttributedLabel。 简单易用的属性文本控件(无需了解CoreText),支持富文本,图文混排显示,支持添加链接,image和UIView控件,支持自定义排版显示。
  • TQRichTextView – 用于做富文本视图控件显示,用于即时通讯的表情显示,以及资源评论的富文本显示。
  • TTTAttributedLabel – 一个文字视图开源组件,是UILabel的替代元件,可以以简单的方式展现渲染的属性字符串。另外,还支持链接植入,不管是手动还是使用UIDataDetectorTypes自动把电话号码、事件、地址以及其他信息变成链接。用TTTAttributedLabel创建变化丰富的UILabel – 网易新闻iOS版使用。
  • MLEmojiLabel – 自动识别网址、号码、邮箱、@、#话题#和表情的label。可以自定义自己的表情识别正则,和对应的表情图像。(默认是识别微信的表情符号),继承自TTTAttributedLabel,所以可以像label一样使用。label的特性全都有,使用起来更友好更方便。
  • FXLabel – FXLabel是一个功能强大使用简单的类库,通过提供一个子类改进了标准的UILabel组件,为字体增加了阴影、内阴影和渐变色等,可以被用在任何标准的UILabel中。FXLabel还提供了更多控件,可以对字体行距、字体间距等进行调整。
  • WFReader – 一款简单的coretext阅读器,支持文本选择、高亮以及字体大小选择等。
  • WPAttributedMarkup – WPAttributedMarkup is a simple utility category that can be used to easily create an attributed string from text with markup tags and a style dictionary。
  • KMPlaceholderTextView – 可显示多行 placeholder 的 textView,可以在IB里面设置 — swift。
  • HHFlashSwitch – 一个另类的UISwitch,选择后,背景水波扩散变色效果。
  • UUColorSwitch – Switch 开关动画效果,当打开开关时,Switch可实现平滑渲染过渡到父视图的效果。
  • UITextViewDIYEmojiExample – UITextView编辑时插入自定义表情-简单的图文混编。
  • Shimmer – BlingBling闪光效果,酷炫的Label的效果,可以用于加载等待提示。
  • ZSSRichTextEditor – 适用于iOS的富文本WYSIWYG编辑器,支持语法高亮和源码查看。ZSSRichTextEditor包含所有WYSIWYG标准的编辑器工具。
  • RichEditorView – swift,一套可定制富文本编辑器组件及示例。功能完整、代码简练、实现逻辑巧妙(编辑器核心与 WebView 结合,采用 HTML5 contentEditable 编辑模式,执行JS 配套命令 execCommand 实现富文本编辑功能)。
  • DTCoreText – 可以解析HTML与CSS*终用CoreText绘制出来,通常用于在一些需要显示富文本的场景下代替低性能的UIWebView。DTCoreText源码解析。
  • CSGrowingTextView – 用作即时通讯文本框和评论文本框使用,可以显示多行输入。
  • MarkdownTextView – 显示Markdown的TextView。
  • 高仿微信限定行数文字内容 – 采用Autolayout高仿微信纯文字限定行数。
  • FuriganaTextView – 实现复杂的日文韩文排版。
  • ParkedTextField – 带固定文本的输入组件。
  • LTMorphingLabel – swift 能够实现文字变形动画效果的Label,用Swift写的一个能够实现文字变形动画效果的Label,很炫。
  • GJCFCoreText – 图文混排。
  • AttributedLabel – 显示性能数量级 UILabel 的 AttributedLabel。无畏无惧、挑战权威。
  • FFLabel – 自动检测 URLs, @username, #topic# 等关链词(提供响应扩展)。实用的标签文本小组件。
  • TextFieldEffects – 标准的UITextField有些枯燥么?来认识一下TextFieldEffects吧!废话不多说,只要看几个例子,是啊,都是些简单的dropin控制器。甚至可以在storyboard中使用IBDesignables。
图表
  • PNChart – 国内开源作者,动态的图表。
  • swift-linechart – 功能完整、实用的折线图组件。使用方便,参数配置简单。是不可多得的优质组件–swift。
  • ios-charts – 一款优秀 Android 图表开源库 MPAndroidChart 的 Swift 语言实现版(支持 Objective-C 和 Swift 调用)。缺省提供的示例代码为 Objective-C。
  • TEAChart – xhacker/TEAChart 一个简洁的 iOS 图表库,支持柱状图、饼图以及日历等。
  • YOChartImageKit – 支持在watchOS上绘制图表,看它*近更新挺勤快的,可以关注一下。
  • RealtimeGradientText – Fun With CALayer Mask 刚好今天开源了一个有趣的项目 RealtimeGradientText,所以也好聊一下 CALayer 的 Mask,说明。
表相关
  • SWTableViewCell – 国内开源作者,带很多手势的表单元格。
  • MCSwipeTableViewCell – 带很多手势的表单元格。
  • TMQuiltView – 瀑布流。
  • WaterfallFlowDemo – 一个简单的UICollectionView瀑布流布局演示demo。
  • XLForm – 很多表格类的table,写法更高冷一点,推荐使用。
  • RETableViewManager – 可以十分方便地生成各种样式、各种功能的TableView。只要开发者能想到的列表效果或者功能,都可以利用这份代码迅速编写出来。比如,之前要实现一个填写各种资料的列表,可能需要很多代码,现在只需要几行代码就可以实现。
  • UIScrollSlidingPages – 允许添加多视图控件,并且可以横向滚动。有点类似于Groupon app。
  • HBHorizontalTableView – swift,TableView 横向滚动小示例(仿照 AppStore 应用展示)。
  • HorizontalScrollCell – HorizontalScrollCell是一款使用方便的水平方向可滚动的单元格,适用于UICollectionView中实现水片方向滚动视图。 。
  • SYJiugonggeTableView – tableView封装的九宫格。
  • UUChatTableView – UUChatTableView 气泡聊天界面,支持文本、图片以及音频的气泡聊天界面。源码推荐说明。
  • Chats – 聊天 UI 示例程序。此项目应该只为演示或学习之用,没有服务器 — swift。
  • Atlas-iOS – 快速在iOS里集成聊天功能,类似开源版本的环信。Layer家开源了一套聊天app界面的解决方案.看起来很赞,很多蛮复杂的东西直接都帮封好了。不得不说现在做app开发真是很简单,大部分时间搭积木就可以了。官方网站。
  • DLSlideView – DLSlideView对常见的顶部Tab页点击、滑动分页做了封装。它使用基于ViewController的container特性(而不是scrollview)来管理各个子页面,以支持无限分页,源码推荐说明。
  • VOVCManager – 页面管理器:1.跳转指定页面,只需要知道viewController的Class名,如果有storyboard,则需要指定storyboard名;2.无需添加基类;3.支持URLScheme跳转指定页面。
  • MBXPageViewController – 简洁快速的页面切换–MBXPageViewController,带有按钮控件的UIPageController,非常整洁、简单以及快速。该项目通过三种形式展示页面之间的切换,比如导航栏上的多个tab切换、页面左右两端箭头指示切换,以及使用分段控件。
  • PagerTab – UIScrollView实现滑动转换页面,类似网易云音乐iOS版的页面滑动切换效果。
  • GUITabPagerViewController – 多个tab滑动切换。
  • VOMetroLayoutDemo – Metro风格的UICollectionView, 目前只支持横向布局,仅在iPad上应用。
  • KYCellAnimation – 给UITableViewCell增加进入的动画。
  • COBezierTableView – swift,通过编辑 Bezier 曲线四点位置设置 TableView 内 Cell 及对应按扭位置。实验效果很赞。
  • RDVTabBarController – 一个TabBar组件,可以方便设置底部菜单的文字图片,点击效果,小红点提示等。
    • LxTabBarController – 改变了原生tabbar切换tab时的生硬效果,并加入滑动切换手势(有和界面上的其它手势发生冲突的风险,可根据具体项目予以关闭),swift版本。
  • 横向展示文本内容的自定义cell – 可以横向展示文本内容的自定义cell,根据文本无限滚动。
  • UITableView-FDTemplateLayoutCell – UITableView-FDTemplateLayoutCell 是一个方便缓存 UITableViewCell 的高度的框架。
  • ExpandingStackCells – 采用 UIStackView 实现表格单元格扩展内容显示示例及解决方案。
  • Sapporo – swift 单元格模型驱动的集合视图管理器组件。又一个超实用的“轮子”。
  • MDIHorizontalSectionTableViewController – 根据产品需求开源了一个交互项目,可以理解为横向Section的TableView,section和cell同时支持拖拽,后续安卓版本也会开源出来。
  • JZNavigationExtension – 多功能导航控制器,可以透明返回栏。
  • QuickRearrangeTableView – 基于 UITableView 的快速重排功能扩展子类。通过长按选定单元格然后滚动移动到指定位置。
  • uicollectionview-reordering – UICollectionViews的拖拽(拖动、移动)效果,实例教程.
  • DZNEmptyDataSet – DZNEmptyDataSet算是一个很标准的iOS内建方式,适合用来处理空的table view和collection view。会自动将collection view处理完善,并将用户消息以合适美观的方式显示出来。每个iOS项目都可以自动处理。
  • MGSwipeTableCell – 另一个常见于很多应用中的UI组件,苹果应该考虑在标准的iOS SDK中加入一些类似的内容。Swipeable表格cell是这个pod的*佳描述,也是*好的。
隐藏与显示
  • SlideTapBar – 滚动栏菜单,向上滚动时隐藏tabbar,向下滚动马上显示tabbar。
  • FoldingTabBar.iOS – 可折叠Tab Bar和Tab Bar Controller。
  • LTNavigationBar – LTNavigationBar为app导航栏添加动态着色效果,可自定义其背景色。Demo包含:1.变换背景色;2.滚动视图,导航栏和状态栏重叠。
  • BLKFlexibleHeightBar – 固定Header的效果库。
HUD与Toast
  • MBProgressHUD – *多人用的loading。
  • SVProgressHUD – SVProgressHUD的loading,如果你需要定制化的等待提示器,这个就是了(也许是*好的)。
  • ProgressHUD – ProgressHUD的loading,使用*简单。
  • MMProgressHUD – 设置HUD出现和消失的方式(包括上下、左右、淡入淡出、放大缩小等等),设置HUD的内容(可以在HUD中加入帧动画、动态图片等等),设置HUD出现时的底部覆盖层颜色,等等。总而言之,这是一份集大成的HUD代码。慢慢看视频吧,囊括了所有效果。
  • WSProgressHUD – 一个小巧精致的HUD,支持添加到自定义View上, 还有更多小细节.。
对话框
  • WCAlertView – 自定义的对话框。
  • IOS7AlertView – IOS7AlertView的对话框。
  • AMSmoothAlert – 动画效果不错,*多star,但不支持arm64。
  • DQAlertView – 扁平化的样式不错。
  • HHAlertView – 一个简易的alertview 有三种样式,有成功,失败,和警告三种样式,支持Delegate和block两种回调。
  • MJPopupViewController – 实现弹出视图的各种弹出和消失效果,包括淡入淡出(fade in,fade out),从屏幕上方飞进,下方飞出,从屏幕左方飞进,右方飞出等等效果,弹窗。
  • Menu – 项目中可能会用到的常用菜单,以后有时间会继续补充,弹窗。
  • EasyTipView – 弹出提示框类及演示示例。同样地,API 简单、易用。好“轮子”,弹窗。
  • kxmenu – kxmenu弹出菜单,点击视图上任意位置的按钮,会弹出一个菜单,并且有个小箭头指向点击的按钮,类似气泡视图。弹出的菜单位置会根据按钮的位置来进行调整。
  • QBPopupMenu – QBPopupMenu弹出菜单,实现类似 UIMenuItem 的弹出菜单按钮。点击按钮,会弹出一个菜单,上面可以排列多个按钮。纯代码实现,不需要任何图片。
  • STModalDemo – 弹出视图(通知,提示,选择,窗口)。
  • TAOverlay – TAOverlay可通过叠加层展示有用的信息,可自定义文本和背景色,添加阴影和模糊效果,以及更改字体大小或者用自定义图片替换页面上的icon。
  • UICustomActionSheet – 通过模糊背景来着重强调与菜单相关的元素–模糊效果 里面已经收藏。
  • ActionSheetPicker-3.0 – 该项目是此前热门项目ActionSheetPicker的新版本,快速复制了iOS 8上的下拉 UIPickerView/ActionSheet功能。
  • MJAlertView – 3D效果转场效果警示图–MJAlertView。
  • SwiftyDrop – 轻量、易用的小清新弹出列表及信息提示组件真心不错。
其他UI
  • AwesomeMenu – *多人用的Path菜单。
  • DCPathButton – Path,4.0的弹出菜单,呼出或者关闭菜单时,多个小图标会分别按照逆时针和顺时针的方向进行滚动。
  • SphereMenu – 利用UIDynamicAnimator的有趣的菜单,path类似。
  • KYGooeyMenu – KYGooeyMenu 是一个具有 Gooey Effects 带粘性的扇形菜单控件(卫星菜单、path)。
  • TwitterPaggingViewer – 多个Tableview,左右滑动。
  • CircularProgressControl – Circular Progress Control using CAShapeLayer ,环形进度控制条。
  • KDCircularProgress – KDCircularProgress是使用swift制作的色彩炫丽的进度条,可以加入多种颜色来控制进度条的渐变效果。
  • TextProgress – 自定义实现数字进度条:1、可以自定义数字(0-100),填充的比例为当前设置的数字,2、可以实现自定义填充颜色,上下部分都可以,3、可以自定义边界的颜色4、实现了水波动画,可以设置打开或关闭。
  • SDProgressView – 简便美观的进度指示器,此系列共有六种样式的进度指示器。
  • NVActivityIndicatorView – loading 进度条动画,有20-30多种,是在此DGActivityIndicatorView 基础上做得修改。
  • LoopProgressDemo – 环形渐变进度条。
  • 环形渐变进度条实现,
  • XLPagerTabStrip – 做的很棒的iOS下的PagerTabStrip。
  • RandomColorSwift – 一个自动生成好看的颜色的 Swift 库,RandomColorSwift。
  • HexColorService – 将16进制颜色字符串转成UIColor。
  • Rainbow – 旨在提高代码可读性及易用性的 UIColor 扩展,它使原先有限的预定义颜色(方法)选择,扩展至超过 1200 种。
  • UIColor-ChineseTraditionalColors – 中国传统颜色引用 UIColor 扩展。“UIColor.桃红(),UIColor.竹青() …”,共158种。
  • 类似美团的下拉菜单 – 类似美团的下拉菜单,源码推荐说明。
  • 类似美团的下拉选项 – 类似于美团、大众点评的下拉菜单选项,code4app代码,评论代码有瑕疵。
  • CRMediaPickerController – 一个简单易用的图片/视频选择器。1.可同时选择照片和视频。 2.挑选范围有Camera、Camera Roll、Photo Library以及*近拍摄的照片和视频。3.可自定义UIImagePickerController属性(Camera Overlay、Camera Device、Camera View Transform以及allowsEditing)。4.支持横屏和竖屏5.原生的iOS UI。,源码推荐说明。
  • MDCSwipeToChoose – MDCSwipeToChoose可简单地添加滑动手势来调用UIView,并使用该行为提供了一个组件以创建类似Tinder app的like或者dislike界面的轻扫。基于轻扫的方向,你可以决定执行什么样的行为,并且你可以自定义文本颜色和图片。该项目适用于教学用的抽认卡、图片查看器以及其他等。
  • iOS Material Design库 – 该项目借鉴于谷歌的Material Design guideline,用户可自定义背景色。
    • Material-Controls-For-iOS – Material Design风格的各种控件,非常完整全面。
  • ZMaterialDesignUIButton – Swift Material Design UIButton。
  • MediumScrollFullScreen – Medium的可扩展滚动页面,上下滚动时,全屏显示内容,并自然消隐上下菜单。由此项目感知,作者是一位很注重细节的开发者,他的另外几个菜单类项目也都不错,值得参考,比如:PathMenu, MediumMenu 等。
  • WZFlashButton – WZFlashButton,点击后button里面出现水波扩散效果。
  • Twinkle – 为字体加上钻石版闪耀的效果。使用Swift编写。
  • ios-multi-back-button – 可替换内置的UInavigationController返回按钮,长按左上角的返回按钮,实现多层级的快速返回。
  • ASDayPicker – 适用于iOS (iPhone)的日期选择器,类似于Calendar app的周视图。
  • today extension – 用纯代码构建一个Widget(today extension) 。
  • FSCalendar – 日历视图,带有微妙和平滑的滚动效果,可自定义外观–国人。
  • HSDatePickerViewController – 带有Dropbox Mailbox感觉的时间日期选择器。启动是背景被模糊化。界面也是主流的扁平化风格。
  • CFCityPickerVC – 城市选取控制器。
  • JTCalendar – iOS下优美的 Calendar 组件,做 GTD 类 App 必备。
  • Persei – 动画隐藏或显示顶部菜单支持库及示例项目。–swift
  • PDTSimpleCalendar – 是iOS*棒的日历组件了。你可以在各个方面对它进行定制,无论是运行逻辑还是外观方面。
  • Form – JSON 驱动的 Form表单系统,复杂的表单填写类 App *其需要(比如淘宝呢!)。
  • SwiftyFORM – swift 表单输入框架(亮点是表单验证规则引擎),是我见过地*易用的 Swift 表单组件。
  • SwiftSpinner – SwiftSpinner是使用swift制作的一款精致带感的指示器,并且连带有字体信息显示,模糊背景,半透明,扁平化等IOS8的效果。
  • AKPickerView-Swift – 一款小而美的 3D 效果选择器。
  • ImagePickerSheet – 图片或视频选择器(可多选)组件及其示例项目。
  • iOS-RatingBar – iOS-RatingBar swift版的评分控件,跟Android的RatingBar一样有两种模式,评分模式和只读模式’支持视图编辑,自定义星星数量,评分等级,另外还能支持非整数星,0.5颗星,0.1颗星,可以开启动画效果。
  • RKNotificationHub – 快速给 UIView 添加上炫酷的通知图标(Badge、红点、提示)。
  • WZLBadge – Badge,支持横竖屏支持iOS5~iOS8允许高度定制化,包括“红点”的背景颜色,文字(字体大小、颜色),位置等。说明.
  • BubbleTransition – 以气泡膨胀和缩小的动画效果来显示和移除 controller,Uber的就是这种取消操作的方式。
  • KYFloatingBubble – 类似iOS7中Game Center浮动气泡的效果。
  • DKNightVersion – DKNightVersion 是一个支持夜间模式切换的框架。
  • EasyUIControl – 一个可以简化界面ui的控件框架。
  • LxGridView-oc LxGridView-swift – 利用UICollectionView模仿iOS系统桌面图标的交互,作用如动图。
  • QQBtn – 仿QQ未读消息弹性按钮动画,达到和手机QQ未读信息一样的动画效果,效果基本实现。
  • GMStepper – swift 带动画效果、支持手势滑动操作的步进标签。
  • TZStackView – OS 9 UIStackView 功能模拟实现于 iOS 7/ iOS 8 内。
  • LayoutTrait – swift 一个小类库。 做iPad 多任务分屏 适配的同学可以看一下。
  • HACursor – HACursor,是一个对横向ScrollView中的视图进行管理的UI控件。只要几行代码就可以集成类似于网易新闻对主题页面进行排序,删除操作的功能。
  • ZTPageController – 模仿网易新闻和其他新闻样式做的一个菜单栏,栏中有各自的控制器,其中有4中展示样式’网易style’ ’搜狐style’ ’腾讯style1′ ’网易style2′ 。
  • Ruler – 尺子。
  • HUMSlider – HUMSlider是一款能够自动显示刻度记号的滑竿,滑动到某处,该处的刻度会自动上升,两边还能配置图像。支持代码或storyboard中实现。
  • JDSelectedDemo – 仿京东筛选菜单实现。
  • BTNavigationDropdownMenu – 下拉列表暨导航标题组件。简单、直接、易用 -swift。

动画

  • Core Animation笔记,基本的使用方法 – Core Animation笔记,基本的使用方法:1.基本动画,2.多步动画,3.沿路径的动画,4.时间函数,5.动画组。
  • awesome-ios-animation – iOS Animation 主流炫酷动画框架(特效)收集整理 收集整理了下iOS平台下比较主流炫酷的几款动画框架。
侧滑与右滑返回手势
  • SloppySwiper – iOS系统自带的UINavigationController要7.0才支持,但不过该手势只能从屏幕左侧边缘识别,如果要扩大到整个屏幕范围怎么办?配合一个SloppySwiper无需代码就可以轻松实现。此库支持iOS5.0以上版本(另外:Nav的title滑动不明显,本人写了2个类似的控件),SloppySwiper-demo :代码方式与storyboard方式。
  • SCNavigation – UINavigation可以右滑返回,隐藏UINavigationBar。
  • UINavigationController-YRBackGesture – 支持右滑返回手势,标题栏不动。
  • GHSidebarNav – 现在比较流行使用侧开(侧滑)菜单设计。试了不少控件,感觉GHSidebarNav*成熟,尤其对纯代码创建的界面兼容性*好。在Storyboard中使用GHSidebarNav侧开菜单控件。
  • iOS-Slide-Menu – 能够类似Facebook和Path那样弹出左右边栏侧滑菜单,还支持手势。多种可以自定义的属性 (非常不错)。
  • ECSlidingViewController – 侧滑菜单。
  • JASidePanels – 侧滑菜单,有左右菜单,有pop功能,支持手势侧滑,本人使用中:简单。
  • animated-tab-bar – 让 Tabbar items能显示萌萌的动画。
  • tabbar图标动画 – tabbar上图标的动画实现,源码推荐说明。
  • SideMenu – swift实现,一款带动画效果可定制 Slide Menu,可以学习其动画实现思路。P.S. 对于Hamburger式菜单,虽然很常用,不过,苹果并不鼓励使用,甚至有开发小组对其弊病用自家上线应用前后数据对比进行了抨击。
  • RESideMenu – 侧开菜单,qq类似。
  • JHMenuTableViewDemo – 仿网易邮箱列表侧滑菜单。
  • SlideMenuView – 炫酷侧滑菜单布局框架,Android版本的一致实现。
  • QQConfiguration – swift,QQ-iPhone端框架,左侧菜单栏拖动手势。
  • KGFloatingDrawer – 侧滑菜单,qq类似,KyleGoddard/KGFloatingDrawer:一款适合于大屏手机或平板的浮动抽屉式导航界面组件。效果很赞- 侧开菜单,qq类似(与RESideMenu类似)。
  • AIFlatSwitch – 一款带平滑过渡动画的 Switch 组件类,类相同风格的 Menu/BackHamburgerButton,类似相同风格的 Menu/Closehamburger-button.
  • JHChainableAnimations – 在应用中采用链式写出酷炫的动画效果, 使代码更加清晰易读,利用block实现的链式编程。
  • WXGSlideMenuDemo – 个简单实现侧拉(侧滑)菜单的小demo,供初学者共同学习、练习使用。
  • PKRevealController – PKRevealController是一个可以滑动的侧边栏菜单(可向左、向右或者同时向两侧),只需手指轻轻一点(或者按一下按钮,但是这样滑动时不够炫酷),这类控制的其他库,而PKRevealController是*棒的。安装简便,高度定制且对手势识别良好。可以当做一个标准控件用在iOS SDK中。
  • SwiftPages – 高可定制类似 Instagram 视图滑动切换功能类库。API 简单、易用。
  • FlipBoardNavigationController – FlipBoardNavigationController。
  • MMDrawerController – *多人用的一个有关侧边“抽屉”导航框架,里面还有很多你意想不到的交互效果,侧滑。
  • UIWebView翻页返回效果 – UIWebView翻页返回效果(变通方法)。
gif动画
  • UIImageView-PlayGIF – UIImageView-PlayGIF。
  • YLGIFImage – YLGIFImage。
  • YLGIFImage-Swift – YLGIFImage-Swift。
其他动画
  • popping – popping是一个POP 使用实例工程
  • SinaMenuView – 用POP动画引擎写的Sina微博的Menu菜单。
  • MMTweenAnimation – facebook POP的自定义动画扩展(基于POPCustomAnimation) 提供10种函数式动画。
  • ZQLRotateMenu – 这是一个旋转视图的选择器。
  • CoolLoadAniamtion – 一个简单但是效果不错的loading动画。
  • SequenRotateAnimation – 一个简单的loading次序动画。
  • SYAppStart – App启动插画的自定义过度。
  • VJDeviceSpecificMedia – 如何根据设备选择不同尺寸的图片 可以通过设置不同尺寸设备的LaunchImage,来使得App适配这些设备,要是在不同不同尺寸设备上使用不同大小的图片,则需要在代码中一一判断,然后加载。
  • RMParallax – RMParallax是一个app启动页引导开源项目,除了细微的翻页视差效果,描述文本的过渡也非常美观(版本新特性)。
  • ADo_GuideView – 转动的用户引导页(模仿网易bobo) 因为没有从app包里抓到@3x的图片,建议在iPhone5模拟器运行,保证效果~ (版本新特性)。
    • CoreNewFeatureVC – 版本新特性(引导页),1.封装并简化了版本新特性启动视图!2.添加了版本的本地缓存功能,3.集成简单,使用方便,没有耦合度,4.支持block回调。
  • Spring – Spring是一个Swift编写的开源库,可简化Swift编写的iOS动画。支持shake、pop、morph、squeeze、wobble、swing、flipX、flipY、fall、squeezeLeft、squeezeRight以及squeezeDown等多种动画形式,用 IBDesignable 让使用者可以在 Xcode 中快速设置动画效果。
  • KYBezierBounceView – 手势控制贝塞尔曲线,取消手势贝塞尔曲线会有反弹效果。
  • cadisplaylinkanduibezierpath – CADisplayLink结合UIBezierPath的神奇妙用。
  • KYCuteView – 实现类似QQ消息拖拽消失的交互+GameCenter的浮动小球效果,分析。
  • KYWaterWaveView – 一个内置波浪动画的UIView,里面有鱼跳跃水溅起来的效果。
  • KYPingTransition – 实现圆圈放大放小的转场动画,可以根据自己的需要使用Paper中的弹性效果,有Material风格。
  • KYNewtonCradleAnimiation – 牛顿摆动画。
  • LayerPlayer – 一款全面展示核心动画 API 示例项目(上架应用)。包括 CALayer, CAScrollLayer, CATextLayer, AVPlayerLayer, CAGradientLayer, CAReplicatorLayer, CATiledLayer, CAShapeLayer, CAEAGLLayer, CATransformLayer, CAEmitterLayer 等使用的互动演示。
  • JGTransitionCollectionView – swift,基于集合视图扩展实现完成自动布局及单元项 Flip式动画效果(效果很赞)。组件使用方便、自然(只需设置集合视图数据源的标准方式即可)。
  • KYShareMenu – 带弹性动画的分享菜单。
  • Context-Menu.iOS – 可以为app的菜单添加漂亮的动画内容,可自定义icon,并可根据自己的喜好设计单元格和布局。
  • DeformationButton – 一个简单的变换形状动画按钮。
  • UnReadBubbleView – UnReadBubbleView是一个能够拖拽并拉长的气泡视图。拖拽到一定的长度会消失,可以通过系数设置来控制拖拽的长度。气泡也支持多种属性设置。
  • PPDragDropBadgeView – 实现了类似于QQ 5.0 水滴拖拽效果. 支持iOS 5.0+ ARC,气泡能够带有数字标识,同时支持消失block方法。消失时还带有消失效果动画。
  • GiftCard-Implementation – 购买的炫酷动画。
  • iCarousel – iCarousel是一个类,它继承于UIView。用于简化实现各种类型的旋转木马(分页滚动视图),无限轮播 ,iOS开发之多图片无缝滚动组件封装与使用。
  • KIPageView – 无限循环PageView,横向TableView,无限轮播。
  • HotGirls – 卡片动画。
  • tispr-card-stack – swift 卡片风格动画切换组件及完整交互示例。
  • ZLSwipeableViewSwift – swift 卡片堆叠效果的实现(ZLSwipeableView)】可实现类似Tinder和Potluck应用程序的卡片堆叠效果,该项目基于ZLSwipeableView objective-c实现。1.自定义动画。2.自定义滑动切换。3.自定义方向。4.撤销。
  • Koloda – 基于卡片的 Tinder-style 动画效果示例。精细*人。更赞的是额外附了详细开发教程 How We Built Tinder-Like Koloda Animation in Swift 网页链接 。Yalantis 出品动画程序款款精品。
  • QQPersonalInfoTransition – 仿照QQ的转场。
  • KYAnimatedPageControl – 除了滚动视图时PageControl会以动画的形式一起移动,点击目标页还可快速定位。支持两种样式:粘性小球和旋转方块。
  • KDIntroView – swift 动态介绍视图框架及演示。另外两个相似的类库是 RazzleDazzle和 Presentation,择需使用。
  • RazzleDazzle – 【IFTTT开源Swift编写的帧动画框架–RazzleDazzle】RazzleDazzle 是IFTTT开源的一个iOS帧动画框架,非常适用于APP初次使用时的介绍和引导信息。JazzHands是UIKit一个简单的关键帧基础动画框架,可通过手势、scrollview、KVO等控制动画,被IFTTT应用在IFTTT for iPhone上。
  • Presentation – 一个类似RazzleDazzle的框架。
  • FillableLoaders – 基于 CGPaths 可定制个性化填空式装载类库。附水波上涨式示例。
  • SXWaveAnimate – 实现非常美观的灌水动画。
  • LSPaomaView – 可循环滚动的较长文字,跑马灯,效果很好,一句话集成。
  • SIFloatingCollection_Swift – 可定制的 Apple Music 风格浮动形状动画组件及演示。
  • Cheetah – 易用、高可读链式动画类库。另一个类似类库是 DKChainableAnimationKit。
  • CKWaveCollectionViewTransition – swift, UICollectionViewController之间切换的动画。
  • TKSubmitTransition – 基于 UIButton 的登录加载、返回按钮转场动画组件及示例。

网络相关

网络连接
  • AFNetworking – ASI不升级以后,*多人用的网络连接开源库,iOS网络编程之AFNetworking使用,iOS开发下载文件速度计算。
  • Alamofire – Alamofire是AFNetworking的作者mattt新写的网络请求的swift库。
  • YTKNetwork – 是基于 AFNetworking 封装的 iOS网络库,提供了更高层次的网络访问抽象。相比AFNetworking,YTKNetwork提供了以下更高级的功能:按时间或版本号缓存网络请求内容、检查返回 JSON 内容的合法性、文件的断点续传、批量的网络请求发送、filter和插件机制等。
  • LxFTPRequest – 支持获取FTP服务器资源列表,下载/上传文件,创建/销毁ftp服务器文件/目录,以及下载断点续传,下载/上传进度,自动判断地址格式合法性跟踪等功能!国人开发,QQ:349124555。
  • HSDownloadManager – HSDownloadManager,下载音乐、视频、图片各种资源,支持多任务、断点下载。
  • MutableUploadDemo – 模拟需求:图文混编,要求用户选择图片后就上传,可选择多图,并行上传,用户确定提交后后台执行,必须全部图片上传完才能提交文字。
  • WTRequestCenter – 方便缓存的请求库,提供了方便的HTTP请求方法,传入请求url和参数,返回成功和失败的回调。 UIKit扩展提供了许多不错的方法,快速缓存图片,图片查看,缩放功能, 颜色创建,设备UUID,网页缓存,数据缓存等功能。 无需任何import和配置,目前实现了基础需求。
  • MMWormhole – Message passing between iOS apps and extensions 2个iOS设备之间通信。
  • socket.io-client-swift – WebSockect 客户端类库。开放的通讯协议,有利于构建强大地跨平台应用。
  • Transporter – swift, 短小、精悍、易用的多文件(并发或顺序)上传和下载传输库。还支持后台运行、传输进程跟踪、暂停/续传/取消/重试控制等功能。
  • STNetTaskQueue – STNetTaskQueue Objective-C 可扩展网络请求管理库。
  • CocoaAsyncSocket – 在iOS开发中使用socket,一般都是用第三方库AsyncSocket,不得不承认这个库确实很强大,使用教程。
  • GCDAsyncSocket – GCDAsyncSocket , 不错的Demo。
  • Just – 小而美的 HTTP 类。功能简单、直接、完整且健壮性高– swift。
  • Future – 基于微框架设计思想的异步执行及结果响应类,代码即简单又干净– swift。
  • MZDownloadManager – 下载管理。
  • DVR – 针对网络请求的测试框架,超实用的工具。且支持 iOS, OSX, watchOS 全平台。
  • HFDownLoad – iOS开发网络篇之文件下载、大文件下载、断点下载:NSData方式、NSURLConnection方式、NSURLSession下载方式 下载方式具体的思路、区别见Blog 。
图像获取
  • SDWebImage – SDWebImage 网络图片获取及缓存处理。
  • Kingfisher – 纯 Swift 实现的类 SDWebImage 库,实现了异步下载和缓存图片。
  • KFSwiftImageLoader – Swift,一个图像缓存加载库。
  • FastImageCache – FastImageCache 网络图片获取及缓存处理,iOS图片加载速度*限优化—FastImageCache解析。
  • EGOCache – 十分知名的第三方缓存类库,可以缓存NSString、UIImage、NSImage以及NSData。除此,如果还可以缓存任何一个实现了接口的对象。所有缓存的数据都可以自定义过期的时间,默认是1天。EGOCache 支持多线程(thread-safe),UITableView加载多张照片导致内存上涨的问题。
网络聊天
  • XMPPFramework – XMPPFramework openfire聊天。
  • SXTheQQ – 用xmppFramework框架编写QQ程序,主要为了练习通讯的一些原理,界面比较渣 必须要先在本地配置好环境才可以运行。
  • 环信 – 给开发者更稳定IM云功能。8200万用户考验,好用!(暂无及时语音、视频通话)
  • 融云 – 即时通讯云服务提供商。(暂无及时语音、视频通话)
  • 容联云通讯 – 提供基于互联网通话,视频会议,呼叫中心/IVR,IM等通讯服务。
  • chatsecure – 基于XMPP的iphone、android加密式聊天软件, chatsecure官网 。 iOS代码1,iOS代码2,iOS中文版。
  • MessageDisplayKit – 仿微信聊天,参考JSQMessagesViewController。(国人写)
  • JSQMessagesViewController – 聊天 。
  • SunFlower – 环信聊天demo,比较多功能 。
  • BlueTalk蓝牙聊天 – 以MultipeerConnectivity为基础, 实现了简单的蓝牙聊天。
网络测试
  • Reachability – 苹果提供过一个Reachability类,用于检测网络状态。但是该类由于年代久远,并不支持ARC。该项目旨在提供一个苹果的Reachability类的替代品,支持ARC和block的使用方式。iOS网络监测如何区分2、3、4G
  • SimpleCarrie – 简单的运营商信息获取!。
  • NetReachability – swift2.0 简单的方法检查网络连接的连通性,提供通知中心集成接口。
WebView
  • MGTemplateEngine – MGTemplateEngine比较象 PHP 中的 Smarty、FreeMarker 和 Django的模版引擎,是一个轻量级的引擎,简单好用。只要设置很多不同的HMTL模版,就能轻松的实现一个View多种内容格式的显示,对于不熟悉HTML或者减轻 工作量而言,把这些工作让设计分担一下还是很好的,也比较容易实现设计想要的效果。
  • NJKWebViewProgress – 一个 UIWebView 的进度条接口库,UIWebView 本身是不提供进度条的。
  • GTMNSString-HTML – 谷歌开源的用于过滤HTML标签。

Model

  • JSONKit – JSONKit库是非常简单易用而且效率又比较高的,重要的JSONKit适用于ios 5.0以下的版本,使用JSONKit库来解析json文件,只需要下载JSONKit.h 和JSONKit.m添加到工程中;然后加入libz.dylib即可。
  • JSONModel – 解析服务器返回的Json数据的库,JSONModel源码解析一。
  • Mantle – Mantle主要用来将JSON数据模型化为OC对象, 大系统中使用。为什么选择Mantle。
  • RFJModel – RFJModel是一个IOS类库,可以将JSON字典自动装填到OBJC对象。相比JSONModel有一些非常好的特性,使用上也比较简单。
  • XMLDictionary – ios与mac os平台下xml与NSDictionary相互转化开源类库。
  • MJExtension – 用于json转model进行使用,转换效率很高,使用也比较简单,只要前后台约定好,json直接就转成了model。
  • CFRuntime – “Swift 版的 MJExtension,运行时、反射与一键字典模型互转”。
  • DDModel – 快速搭建项目Model层,支持ORM映射关系,能从JSON/XML直接实例一个Model对象。支持SQLite本地数据持久化,封装了HTTP, 减少HTTP代码与UIViewController的代码耦合,支持Cache;类似RESTKit、Mantle的功能;使用该类库以后简化了网络层的开发工作,把更多的精力放在UI上面;目前只支持GET/POST方法的请求。使用到的第三方库有:1.SQLitePersistentObject; 2.JTObjectMapping; 3.AFNetworking; 4.XMLDictionary;
  • protobuf-swift – Protocol Buffers 的 Swift 语言实现库。P.S. Protocol Buffers 是 Google 开源项目,主要功能是实现直接序列化结构化的对象数据,方便跨平台快速传递,开发者也可以直接修改 protobuf 中的数据。相比 XML 和 JSON,protobuf 解析更快,存储更小。
  • JSONCodable – 基于 Swift 2.0 新特性(Protocol Extensions and Error Handling)的JSON 解析类。
  • SwiftyJSON – 使Swift的JSON解析变得简单。

其他

  • DateTimeKit – 一个超赞的时间处理的库,Joda-Time ! 他能帮你轻松处理时区,处理时间加减,计算到期时间等等场景下的问题。
  • SwiftDate – 特别完整、强大的日期时间操作管理类库。它几乎涵盖了已知开源日期类库所有优秀特性。 他能帮你轻松处理时区,处理时间加减,计算到期时间等等场景下的问题。
  • iOS私有API – 私有API,绿色 == public,红色 == private,蓝色 == dylib。
  • iOS源代码 – iOS源代码。
  • libfacedetection – C++ 人脸识别 包含正面和多视角人脸检测两个算法.优点:速度快(OpenCV haar+adaboost的2-3倍), 准确度高 (FDDB非公开类评测排名第二),能估计人脸角度。
  • Slidden – 一个老外开源的开发自定义键盘的库,利用这个开源库,可以方便的配置键位、颜色以及键位对应的图片。
  • TPKeyboardAvoiding – 用户键盘弹出自动计算高度,进行屏幕滚动操作。
  • CDPMonitorKeyboard – CDPMonitorKeyboard封装,可以解决输入视图(例如textField,textView等)被键盘覆盖问题,并可设置高于键盘多少。
  • 自动监听键盘高度 – 自动监听键盘高度,初始界面,输入框在屏幕*下方,当键盘出现时,输入框随即移动到键盘上方。
  • SYKeyboardTextField – SYKeyboardTextField 是一个轻巧,简单,非侵入式的键盘附随输入框! 采用Swift编写。
  • BlocksKit – block框架,为 OC 常用类提供了强大的 Block 语法支持,使得编写 OC 代码变得舒适、快速、优雅。
  • KVOController – 在项目中有使用 KVO ,那么 KVOController *对是个好选择。它是 facebook 开源的一个 KVO 增强框架。
  • appirater – 用于提醒用户给你的 APP 打分的工具。
  • MotionKitr – 为核心运动框架(The Core Motion framework)提供友好的类库封装,以更方便使用三轴陀螺仪和加速感应器特性。
  • Review Monitor – *时间自动推送 Apple Store 的用户评论到你的邮件箱或者 Slack,*时间跟进用户反馈,打造优秀 App 必备工具!类似的有:App annie 的类似功能。
  • WBWebViewConsole – 类似微博iPhone客户端的 “调试选项” 吗?把其中的 “内置浏览器网页调试” 开源在 Github 上了。
  • ios-good-practices – ios-good-practices iOS 开发*佳实践。
  • iOS开发*佳实践 – iOS 开发*佳实践 — 中文。
  • TodayExtensionSharingDefaults – TodayExtensionSharingDefaults是一个iOS 8 Today扩展示例,可以使用NSUserDefaults与其containing app分享数据。
  • QRCodeReader.swift – QRCodeReader.swift一款简单的 QR 二维码阅读组件及示例,提供前后相机切换功能。
  • QRCatcher – 一个简洁美观的二维码扫描应用, iOS学习:AVFoundation 视频流处理–二维码扫描。
  • Parsimmon – swift,小而美的语言学类库封装工具包。提供分词、标记词性、词形归并、朴素贝页斯分类、决策树等自然语言分析小工具。P.S. 英语分词效果好于中文,感兴趣的同学可以针对中文做一些优化开发。参考译文 NSHipster – NSLinguistic​Tagger。
  • Password-keyboard – 随机变换数字位置的密码键盘。 模仿银行类应用在付款时输入的随机密码键盘。
  • MKMapView-Extension – 这是关于 MKMapView 写的一个基于swift的扩展,可以扩展 MKMapView 的相关功能,减少复用代码量。
  • SemverKit – 针对符合『语义化版本规范 2.0.0』版本号的解析、比较运算类库。不仅支持 Major, Minor, Patch,还支持 Alpha 和 Beta 预发布版本,以及相应地递增运算扩展。
  • SwiftValidator – 基于规则的输入验证类库。项目良好的面向对象设计思想,使规则的扩展及自定义非常方便。更专业的规则引擎(甚至是基于自然语言的规则配置)解决方案,比如:开源的 Drools,商用的 ILOG 等。
  • Tesseract-OCR-iOS – 有关OCR文字识别项目。
  • Screenotate – 支持 OCR 文字识别的载屏笔记 Mac 完整应用。
  • iOS-Categories – 收集了许多有助于开发的iOS扩展,各种category。
  • Olla4iOS – 过去积累的一些方便复用的类和方法,还在整理中。
  • DKNightVersion – 用*快的方式给你的应用加上夜间和白天的切换效果。
  • TouchVisualizer – 实用的多点触摸可视化组件。扩展并作用于 UIWindows,结构上提供了简单地针对触摸显示定制,比如触摸点的颜色。
  • RegexKitLite – 用来处理正则表达式。
  • XcodeServerSDK – 非官方 Xcode Server SDK 封装库。 P.S. 该 SDK 分离自之前推荐的由该作者开发的自动测试框架 Buildasaur。
  • BFKit-Swift – BFKit-Swift 这套工具库可以提高应用开发效率。
  • CKSIncrementalStore – 基于 CloudKit 服务器实现多终端数据同步。
  • SwiftSequence – 简洁、灵活、多变的操作 SequenceType 的类库(基于微框架(μframework)设计思想)。
  • IDNFeedParser – 一个简单易用的Rss解析库。
  • CoreUmeng – 简单:友盟分享封装。
  • openshare – 不用官方SDK,利用社交软件移动客户端(微信/QQ/微博/人人/支付宝)分享/登录/支付。
  • Swifternalization – 一套实用的本地化工具库。使用教程及 API 文档完整。值得收入项目的“轮子”。
  • apous – 一款有趣的 Swift 应用 - 让 Swift 成为脚本语言。
  • Mirror – 通过反射(Refection)实现镜像对象封装库。从而可以更轻松获取(或输出)对象属性名、类型及值变量。
  • Proposer – Proposer 用单个 API 处理 iOS 上的权限请求,以便使用前确认可访问“相册”、“相机”、“麦克风”、“通讯录”或“用户位置”。
  • PermissionScope – 用这个库可以在询问用户前,就告知用户所需的系统权限,为用户带来更好的体验。接受度更高—>更多活跃用户->更高的留存率->数据更好->下载率更高。
  • LocationManager – CoreLocation使用起来还是比较麻烦的,需要授权,判断系统版本等等,所以推荐使用第三方框架LocationManager,使用Block,十分简单!iOS-CoreLocation:无论你在哪里,我都要找到你!。
  • pangu.objective-c – 有多种语言实现版本~ Pangu.Objective-C:格式化中英文之间的空格(OC)。
  • objection – 一个轻量级的依赖注入框架Objection。
  • ControlOrientation – 如何用代码控制以不同屏幕方向打开新页面【iOS】, 使用说明。
  • iRate – 问卷调查。
  • GameCenterManager – 在iOS上管理GameCenter vanilla并不算难,但是有了这个库会更简单也更快。好上加好不是更好么。
  • SlackTextViewController – 用作*佳、定制的文本输入控制时,自适应文本区域,手势识别、自动填充、多媒体合并,快速drop-in解决方案。
  • IAPHelper – 应用内付费给我们提供了很多样本代码,而这个库丢掉了那些代码,将金钱交易相关的大多通用任务做了简单的封装。
  • TAPromotee – 交叉推广应用是你可以免费实现的*佳市场推广策略之一。使用这个库做起来非常简单,不用都不可能——将TAPromotee加入你的podfile中,免费配置与享受更多下载吧。
  • DownloadFontOnline – 实现了在线下载一些字体的功能,不用在工程中导入字体库,下载的字体也不会保存在你的应用中,所以可以放心使用。修复了一下崩溃的bug。
  • STClock – 仿锤子时钟。
  • GitUp – GitUp是一个可视化的Git客户端,能够实时的进行编辑、合并、回滚等多种操作,更多功能,请下载体验。
  • 获取联系人信息,通讯录 – 获取联系人信息,通讯录。
  • Universal-Jump-ViewController – 根据规则跳转到指定的界面(runtime实用篇一)。

数据库

  • FMDB – sqlite的工具, 多线程FMDatabaseQueue实例,FMDB数据库的使用演示和封装工具类。
  • GXDatabaseUtils – 在FMDB基础上的工具。
  • realm-cocoa – Realm是一个真正为移动设备打造的数据库,同时支持Objective-C和Swfit。Realm宣称其相比Sqlite,在移动设备上有着更好的性能表现,官方中文。
  • Breeze – 用Swift写的一个轻量级的CoreData管理工具,并且还支持iCloud 。
  • AlecrimCoreData – Swift,更容易地访问 CoreData 对象封装类库。除了 CRUD,还提供指针定位,强大的排序、筛选,异步数据获取,以及独立线程后台存取数据。
  • CoreStore – Core Data 管理类库。 其中事务管理及查询是其比较大的亮点,整套 API 功能完整。
  • MagicRecord
  • MagicalRecord – MagicalRecord就像是给Core Data提供了一层外包装,隐藏掉所有不相关的东西。 其中事务管理及查询是其比较大的亮点,整套 API 功能完整。
  • Presentation – 重量级好项目 Presentation,它可以方便你制作定制的动画式教程、Release Notes、个性化演讲稿等。
  • CoreValue – Swift 2 版 Core Data 封装库。相比另外两个 SwiftRecord和 CoreStore更轻量。
  • SQLCipher – SQLCipher使用256-bit AES加密,SQLCipher分为收费版本和免费版本。官方教程,加密你的SQLite – 各种sqlite数据库加密介绍。 SQLCipherDemo下载 。

缓存处理

  • YTKKeyValueStore – Key-Value存储工具类,说明。
  • TMCache – TMCache 是 Tumblr 开源的一个基于 key/value 的数据缓存类库,可以用于缓存一些临时数据或者需要频繁加载的数据,比如某些下载的数据或者一些临时处理结果。
  • JLKeychain – 快捷使用keychain存储数据的类,使keychain像NSUserDefaults一样工作。
  • sskeychain – SSKeyChains对苹果安全框架API进行了简单封装,支持对存储在钥匙串中密码、账户进行访问,包括读取、删除和设置。
  • KeychainAccess – 管理Keychain接入的小助手。

PDF

  • Reader – Reader可提供类似iBooks的文档导航,支持屏幕旋转和所有方向,并通过密码保护加密PDF文件,支持PDF链接和旋转页面。

图像浏览及处理

  • FLAnimatedImage – gif播放处理的工具。
  • CLImageEditor – 超强的图片编辑库,快速帮你实现旋转,防缩,滤镜等等一系列麻烦的事情。
  • ios-image-filters – 图像滤镜,库比较旧了,很容易崩溃。
  • XBImageFilters – 图像滤镜,。
  • VIPhotoView – 用于展示图片的工具类,因为是个 View,所以你可以放在任何地方显示。支持旋转,双击指定位置放大等。
  • MWPhotoBrowser – 一个非常不错的照片浏览器,在github的star接近3000个,解决MWPhotoBrowser中的SDWebImage加载大图导致的内存警告问题。
  • core-image-explorer – Core Image 滤镜处理图片– swift ,Core Image 介绍。
  • CoreImageShop – CoreImageShop图片滤镜处理– Mac app that let you create a complete Core Image Filter usable on iOS using SCRecorder。
  • GPUImage – 处理图片效果。
  • RSKImageCropper – 适用于iOS的图片裁剪器,类似Contacts app,可上下左右移动图片选取*合适的区域。
  • WZRecyclePhotoStackView – 删除照片交互–WZRecyclePhotoStackView,就是模拟生活中是删除或保留犹豫不决的情形而产生的。 在上滑,下滑的部分,借鉴了TinderSimpleSwipeCards。
  • TimingFunctionEditor – TimingFunctionEditor用swift编写, 贝塞尔曲线编辑器,编辑后可以预览或拷贝代码片段直接使用。P.S. 该项目采用更简单的依赖管理器 Carthage ,而非常用的 CocoaPods。Carthage介绍中文。
  • AAFaceDetection – AAFaceDetection–swift,简单、实用的面部识别封装库。虽然该技术从 iOS 5 发展,不过真正有趣的应用还不多。。
  • PhotoTweaks – 这个库挺赞的,正好是对图像操作的。
  • Concorde – swift, Concorde, 一个可用于下载和解码渐进式 JPEG 的库, 可用来改善应用的用户体验。
  • ZoomTransition – swift, 通过手势操控图片的放大、缩小、旋转等自由变化效果的组件及示例。
  • AFImageHelper – swift,一套针对 UIImage 和 UIImageView 的实用扩展库,功能包含填色和渐变、裁剪、缩放以及具有缓存机制的在线图片获取。
  • PinterestSwift – swift,Pinterest 风格图片缩放、切换示例。
  • KYElegantPhotoGallery – 一个优雅的图片浏览库。
  • SDCycleScrollView – 无限循环自动图片轮播器(一步设置即可使用)。
  • SDPhotoBrowser – 仿新浪动感图片浏览器,非常简单易用的图片浏览器,模仿微博图片浏览器动感效果,综合了图片展示和存储等多项功能。
  • HZPhotoBrowser – 一个类似于新浪微博图片浏览器的框架(支持显示和隐藏动画;支持双击缩放,手势放大缩小;支持图片存储;支持网络加载gif图片,长图滚动浏览;支持横竖屏显示)。
  • PhotoStackView-Swift – PhotoStackView——照片叠放视图,使用说明。
  • MarkingMenu – 基于手势、类似 Autodesk Maya 风格标记菜单及图片渲染。
  • SXPhotoShow – UICollectionViewFlowLayout流水布局 是当下collectionView中常用且普通的布局方式。本代码也写了三种好看的布局,其中LineLayout和流水布局有很大的相同点就直接继承UICollectionViewFlowLayout,然后StackLayout,CircleLayout这两种都是直接继承自*原始的UICollectionViewLayout 布局方案。
  • PictureWatermark – 主要实现了给图片加文字以及图片水印的功能,已封装成了UIImage的类别,方便使用。
  • CocoaPicker – 仿 QQ 图片选择器(OC)。
  • 自定义宽高比的相册框 拍照 – 取出照片时 弹出自定义view。在这个自定义view上创建一个需要的相框大小的view层 把取出的图片赋值给UIImageView按缩放添加到这个层上。对uiimageView添加捏合、移动 手势。添加按钮 选取,*后根据位移和缩放比例 裁剪image。

摄像照相视频音频处理

  • SCRecorder – SCRecorder 短视频录制。
  • VideoPushDemo – 视频剪辑 视频特效制作1 视频特效制作2。
  • LLSimpleCamera – A simple, customizable camera control for iOS, 摄像头。
  • EZAudio – EZAudio 是一个 iOS 和 OSX 上简单易用的音频框架,根据音量实时显示波形图,基于Core Audio,适合实时低延迟音频处理,非常直观。中文介绍,官网。
  • ffmpeg – ffmpeg官网,FFmpeg在iOS上完美编译。
  • VCL – VCL官网。
  • kxmovie – 使用ffmpeg的影片播放器,修改说明, 修改代码。
  • ijkplayer – B站开源的视频播放器,支持Android和iOS。
  • StreamingKit – StreamingKit流媒体音乐播放器。
  • FreeStreamer – FreeStreamer流媒体音乐播放器,cpu占用非常小。
  • DOUAudioStreamer – DOUAudioStreamer豆瓣的音乐流媒体播放器。
  • fmpro – 电台播放器,支持锁屏歌词,支持基本播放流程,歌词展示,后台锁屏播放和控制以及锁屏后封面+歌词,fmpro_R 。
  • IPDFCameraViewController – 支持相机定焦拍摄、滤镜、闪光、实时边框检测以及透视矫正功能,并有简单易用的API。
  • SCRecorder – 酷似 Instagram/Vine 的音频/视频摄像记录器,以 Objective-C 为基础的过滤器框架。 你可以做很多如下的操作:记录多个视频录像片段。删除任何你不想要的记录段。可以使用任何视频播放器播放片段。保存的记录可以在序列化的 NSDictionary 中使用。(在 NSUserDefaults 的中操作)添加使用 Core Image 的视频滤波器。可自由选择你需要的 parameters 合并和导出视频。
  • Cool-iOS-Camera – Cool-iOS-Camera。
  • FastttCamera – FastttCamera 快速照相。
  • ICGVideoTrimmer – ICGVideoTrimmer提供提供视频剪切的视图(类似系统相册中浏览视频时顶部那个条状视图)。左右两个边界选择器还能够自定义。
  • IOS录音和播放功能demo – 比较完整的ios录音和播放功能的实现。
  • CameraManager – 相机管理封装类库。看着*好用的样子—-swift。
  • MCAudioInputQueue – 简易录音类,基于AudioQueue的。
  • DraggableYoutubeFloatingVideo – 展示像类似Youtube移动应用的那种浏览视频的效果,当点击某视频时能够从右下方弹出一个界面,并且该界面能够通过手势,再次收缩在右下方并继续播放。这是通过AutoLayout设计实现。
  • amr – 做即时通讯的音频处理,录音文件是m4a,便于web端的音频播放。
  • FSVoiceBubble – 一个轻量级播放录音音频的气泡:1.支持短时间的音频播放(支持网络音频);2.播放时的声波动画;3.自定义包括声波的颜色,气泡的背景等。
  • KRVideoPlayer – 类似Weico的播放器,支持竖屏模式下全屏播放。
  • VideoBeautify – 功能酷似美拍,秒拍等应用的源码:对视频进行各种美化处理,采用主题形式进行分类,内含各种滤镜,动画特效和音效等。

响应式框架

  • ReactiveCocoa – ReactiveCocoa 受函数响应式编程激发。不同于使用可变的变量替换和就地修改,RAC提供Signals来捕获当前值和将来值( 使用介绍 ),不错的例子,入门好教程:ReactiveCocoa入门教程:*部分 。Reactive Cocoa 3.0 在 MVVM 中的应用 。
  • ReactiveAnimation – ReactiveCocoa 推出了一个叫 ReactiveAnimation 的子项目,直接用完全用 Swift 来实现了。
  • BeeFramework – 与ReactiveCocoa类似,BeeFramework用户指南 v1.0。
  • Objective-Chain – Objective-Chain是一个面向对象的响应式框架,作者表示该框架吸收了 ReactiveCocoa 的思想,并且想做得更面向对象一些。

消息相关

消息推送客户端
  • SGPushDemo – 消息推送客户端
  • Orbiter – 消息推送客户端:Push Notification Registration for iOS.
  • PushDemo – 客户端消息接收消息代码,IOS开发之 —- IOS8推送消息注册 , 分分钟搞定IOS远程消息推送。
消息推送服务端
  • javapns源代码 – 消息推送的java服务端代码,注意:DeviceToken中间不能有空格。
  • pushMeBaby – Mac端消息推送端代码,注意:DeviceToken中间要有空格。
通知相关
  • JSQNotificationObserverKit – 一款轻量、易用的通知发送及响应框架类库。作者是知名开源项目 JSQMessagesViewController(Objective-C 版即时聊天)的作者 Jesse Squires.
  • GLPubSub – 一个简短实用的 NSNotificationCenter 的封装。
  • Homeoff – 用swift写了一个模仿Launcher通知中心快捷方式的应用。支持20个应用,并增加了一个返回到桌面来解放Home键的功能。
  • JDStatusBarNotification – 在状态栏顶部显示通知。可以自定义颜色字体以及动画。支持进度显示以及显示状态指示器。

版本新API的Demo

  • appleSample – iOS 苹果官方Demo合集, 官方demo.
  • iOS7-Sampler – 整合了iOS7.0的一些十分有用的特性,比如:Dynamic Behaviors、碰撞检测、语音合成、视图切换、图像滤镜、三维地图、Sprite Kit(动画精灵)、Motion Effect(Parallax)、附近蓝牙或者wifi搜索连接、AirDrop、运动物体追踪(iPhone 5S以上,需要M7处理器)等等。对于日常的应用开发十分实用。
  • iOS8-Sampler – 日本的shuさん制作的 iOS8 参考代码集。01.Audio Effects ;02.New Image Filters;03.Custom Filters;04.Metal Basic;05.Metal Uniform Streaming;06.SceneKit;07.HealthKit;08.TouchID;09.Visual Effects;10.WebKit;11.UIAlertController;12.User Notification;13.Pedometer;14.AVKit;15.Histogram;16.Code Generator;17.New Fonts;18.Popover;19.Accordion Fold Transition
  • iOS-9-Sampler – 通过实例介绍了iOS 9 SDK中重要新特性的使用。
  • MTSwift-Learning – 通过一些简单项目实战演练开始学习 Swift 。
  • iOS8-day-by-day – swift。
  • iOS9-day-by-day – swfit iOS9 Day-by-Day :: Day 2 :: UI Testing。
  • iOS 9 分屏多任务 – iOS 9 分屏多任务:Slide Over & Split View快速入门(中文版)。

代码安全与密码

  • ios-class-guard – 一个用于混淆iOS的类名、方法名以及变量名的开源库–有人反映编译出来的app运行不了。
  • 《Protecting iOS Applications》:文章系统地介绍了如何保护iOS程序的代码安全,防止反汇编分析。
  • fishhook – fishhook是Facebook开源的一个可以hook系统方法的工具。
  • GesturePassword – 一个iOS手势密码功能实现,iPad/iPhone 都可以用,没有使用图片,里面可以通过view自己添加。keychain做的数据持久化,利用苹果官方KeychainItemWrapper类。操作部分都在controller了。删除直接用一下clear。
  • JMPasswordView – 简单实用的手势密码,效果可自行调控。
  • 仿密码锁-九宫格 – 仿密码锁-九宫格,主要是使用UIButton 手势事件 UIBezierPath画图,解锁失败弹出“密码错误”。
  • CoreLock – 本框架是高仿支付宝,并集成了所有功能,并非一个简单的解锁界面展示。个人制作用时1周多,打造解锁终结者框架。
  • LikeAlipayLockCodeView – 高仿支付宝手势解锁(超级版)。
  • PCGestureUnlock – 目前*全面*高仿支付宝的手势解锁,而且提供方法进行参数修改,能解决项目开发中所有手势解锁的开发。
  • ICPayPassWordDemo – CPayPassWordDemo,一个模仿支付宝支付密码输入对话框小demo。
  • RSAESCryptor – 加密 RSA+AES Encryption/Decryption library for iOS. This library uses 2048-bit RSA and 256-bit key with 128-bit block size AES for encryption/decryption。

测试及调试

  • HeapInspector – HeapInspector是一个用于检测应用中的内存泄漏的开源调试工具。
  • Crashlytics – Crashlytics 崩溃报告 崩溃日志 使用说明 。
  • UIViewController-Swizzled – 把你进入的每一个controller的类名打出来,如果看一些特别复杂的项目的时候直接运行demo就可以知道执行次序了。
  • snoop-it – snoop-it比UIViewController-Swizzled好用,代码托管在google上。
  • Versions – 版本比较小工具。
  • MobileWebPageTest – MobileWebPageTest是用来测试移动网页性能的软件,它可以对页面的加载和渲染过程进行截屏,协助开发者分析出页面性能瓶颈。
  • KKLog – 一个日志管理系统。
  • CleanroomLogger – 相当于 CocoaLumberjack 或 Log4j 的 Swift 版本,功能上甚至更强大。另外,源代码中已经内含了完整的 API 文档,使用非常方便。 Buildasaur – 自动测试框架 Buildasaur。MMPlaceHolder – 一行代码显示UIView的位置及相关参数。 使用Quick框架和Nimble来测试ViewControler – Quick是一个用于创建BDD测试的框架。配合Nimbl,可以为你创建更符合预期目标的测试。
  • fastlane – 一套iOS开发和持续集成的命令行工具fastlane,可以用来快速搭建CI甚至自动提交的开发环境。这套工具中包括了上传ipa文件,自动截取多语言截屏,生成推送证书,管理产品证书等一系列实用工具。
  • KIF – 是一个开源的用户界面UI测试框架. 使用 KIF, 并利用 iOS中的辅助功能 API, 你将能够编写模拟用户输入,诸如点击,触摸和文本输入,自动化的UI测试.
  • Quick – 用于Swift中的单元测试(也可用于Objective-C),与Xcode整合在一起。如果你是Objective-C的粉丝,我建议用Specta代替这个,但是对Swift使用者来说,Quick是*佳选择。
  • Sleipnir – Swift的测试框架。
  • kiwi-bdd – TDD或BDD,objective-c语言的测试框架,*流行的BDD测试框架了,Kiwi*受欢迎(根据github上的star数来推断,行为描述和期望写起来也比较易懂,至少我是这么认为的) iOS开发中的测试框架。
  • specta – TDD或BDD,objective-c语言的测试框架,用的人多。
  • cedar – TDD或BDD,objective-c语言的测试框架,用的人少。

AppleWatch

  • Tesla汽车AppleWatch app demo演示 – 通过AppleWatch控制特斯拉汽车,同时可以看到汽车的相关信息,比如剩余电量、可续行里程等,以及解锁/上锁车门、调节司机和乘客的四区域空调温度、开启车辆大灯、定位汽车等。源码推荐说明。
  • WatchKit-Apps – WatchKit 开源小项目示例集锦。是不可多得地学习 WatchKit 的示例式教程(1.如何创建一个简单的交互式计数器;2.如何从手表上控制iOS app;3.如何在WatchKit app和iOS app之间共享数据;4.如何创建一个拥有不同背景色的数字时钟;5.展示不同的UI层;6.如何创建支持滑动手势的应用程序。)。
  • KYVoiceCurve – 类似Apple Watch中语音的声音曲线动画。
  • IGInterfaceDataTable – IGInterfaceDataTable是WKInterfaceTable对象的一个类别,可以让开发者更简单地配置多维数据。该项目使用类似UITableViewDataSource的数据源模式配置Apple Watch表格,而不是将数据结构扁平化成为数组。
  • Apple Watch开发教程资料汇总 – Apple Watch开发教程资料汇总。
  • Stargate – 通过 iPhone 桥接实现 Mac 与 Watch 的即时通讯。Stargate 通过封装两个优秀的基础类库 MMWormhole 和 PeerKit 实现高效的通讯应用。–swift
  • soon – 一款倒计时 WatchKit 示例应用。作者从架构的角度,思考如何设计一款完整、通讯高效且性能又好的 WatchKit 扩展应用。该示例学习性非常强。–swift
  • watchOS-2-Sampler – 基于 watchOS 2 若干新特性,写了相应的示例代码供大家学习、参考。
  • HMWatch – HMWatch是个有待完善的watchOS 2.0 HomeKit 应用示例。
  • CocoaMultipeer – CocoaMultipeer这个开源框架支持OS X, iOS和watchOS设备间的点对点通信,解决watchOS和Mac之间通信的方案还是很有用的。
  • HighstreetWatchApp – 是电商平台Highstreet针对App Watch的一款应用,该demo中加载的是虚拟数据。
  • NKWatchChart – NKWatchChart是一个基于PNChart专门为Apple Watch 开发的图表库,目前支持 line, bar, pie, circle 和 radar 等 图表形式。

*

  • *on – swift的* On 的源码和本地化内容都是开放的: 官方网站。
  • Hydro.network – Hydro.network 的开发旅程, gitcafe。

完整项目

  • v2ex – v2ex 的客户端,新闻、论坛。
  • apps-ios-wikipedia – apps-ios-wikipedia 客户端。
  • jetstream-ios – 一款 Uber 的 MVC 框架。它同时提供了多用户实时通讯支持,一旦启动 JetStream 后端服务,通过 WebSocket 协议可以分分钟建立多用户实时通讯应用。
  • DeckRocket – 在相同 WiFi 网络环境内,通过iPhone 控制并播放 Mac 中的 PDF 文档。
  • ScanBook – 扫扫图书:可以扫描条形码查询图书,也可以关键字搜索,遇到合乎你口味的书,还可以看看别人的读书笔记,不同角度去体会。
  • DesignerNewsApp – Swift 开发的 DesignerNews 客户端,看着美美的!
  • KYWeibo – 调用新浪API自己写的第三方微博客户端。
  • DouQu_IOS – 逗趣IOS手机端(一款笑话软件),拥有完整的功能的手机应用app 。
  • IT江湖iOS客户端 – IT江湖iOS客户端。
  • Eidolon – 艺术品拍卖的投标亭平台,用swift与反应式编程框架 ReactiveCocoa。
  • CrazyPuzzle – 模仿“看图猜成语”App,功能齐全,配有音效,效果很不错。游戏使用cocoa框架完成,没有使用cocos2d的框架。
  • WhoCall – 谁CALL我,iOS来电信息语音提醒,无需越狱。(需要iOS 7.0及以上版本。)骚扰电话预警、来电归属地提醒、联系人姓名播报,这些有中国特色人性化的电话功能,iOS上也应该有。电话提醒、私有API。
  • 仿iOS猎豹垃圾清理(实现原理+源码) – 仿iOS猎豹垃圾清理(实现原理+源码),用到私有API。
  • DSLolita – 模仿新浪微博做的一款app,有发送博文,评论,点赞,私聊功能。
  • GSD_ZHIFUBAO – 支付宝高仿版。
  • Tropos – Tropos, 由 thoughtbot 推出的一款用 Objective-C 写的开源天气类应用, 截至今天, thoughtbot 已在 GitHub 上贡献了 174 个开源项目, 实在令人敬佩。
  • SmileWeather -开源天气类应用,天气图标很完整。
  • MVVMReactiveCocoa – GitBucket 2.0 通过审核啦,她是我在公司实践了一年多 MVVM 和 RAC 的基础上,利用业余时间开发的第三方 GitHub 客户端,旨在能够对想实践 MVVM 和 RAC 的 iOS 开发者有所帮助。AppStore地址,欢迎下载使用GitBucket和收藏MVVMReactiveCocoa。
  • Tomate – 这个圆盘式计时器让你更专注于工作或学习。P.S. App Store 上架收费应用(0.99 欧)。
  • StoveFireiOSMenu – 炉火餐饮系统iPad点餐端。
  • BaiduFM-Swift – 百度FM, swift语言实现,基于*新xcode6.3+swift1.2,初步只是为了实现功能,代码比较粗燥,后面有时间会整理,支持Apple Watch。
  • WNXHuntForCity – iOS高仿城觅项目(开发思路和代码)。
  • ZYChat – 关于聊天界面的可消息类型扩展,响应绑定设计。
  • NiceAppDemo – 仿*美应用-每日*美的钢琴律动效果。
  • meituan – 美团5.7iOS版(高仿),功能包括,团购首页,高德地图搜索附近美食并显示在地图上,上门服务,商家,友盟分享。
  • chuanke – 高仿百度传课iOS版。
  • Tuan – 模仿MJ老师iPad版美团(swift版),偶有bug 见谅。
  • SXNews – 模仿网易新闻做的新闻软件,完成了主导航页,新闻详情页,图片浏览页,评论页。效果不错,比网上流传的各种和网易新闻UI架构有关的代码都要完整,都要好。
  • Monkey – Monkey for GitHub是一个GitHub开发者和仓库排名的开源App。这次主要增加了登录GitHub的功能,随手follow和star,并且增加发现模块,包括GitHub的trending,动态,showcases等。
  • Uther – 跟蠢萌的外星人聊天,还能帮你记事”。itunes下载 。

好的文章

  • 自定义转场动画 – 3 种方法~ 关于自定义转场动画。
  • iOS提高效率的方法和工具 – iOS提高效率的方法和工具。
  • 用 JSON 构建 API 的标准指南 – 用 JSON 构建 API 的标准指南。

Xcode插件

  • iOS开发进阶,从Xcode开始 – 学习使用Xcode构建出色的应用程序!
  • 在Xcode启动的时候,Xcode将会寻找位于~/Library/Application Support/Developer/Shared/Xcode/Plug-ins文件夹中的后缀名为.xcplugin的bundle作为插件进行加载(运行其中的可执行文件)。Xcode5 Plugins 开发简介 写个自己的Xcode4插件
  • Xcode 4 插件制作入门 – Xcode 4 插件制作入门:Xcode所使用的所有库都包含在Xcode.app/Contents/的Frameworks,SharedFrameworks和OtherFrameworks三个文件夹下。其中和Xcode关系*为直接以及*为重要的是Frameworks中的IDEKit和IDEFoundation,以及SharedFrameworks中的DVTKit和DVTFoundation四个。
  • RTImageAssets – 一个 Xcode 插件,用来生成 @3x 的图片资源对应的 @2x 和 @1x 版本。Asset Catalog Creator 功能强大,能自动生成全部尺寸:包括App Icons、Image Sets、Launch Screens Generator。
  • VVDocumenter-Xcode – 一个Xcode插件,build后,随手打开一个你之前的项目,然后在任意一个方法上面连按三下”/”键盘,就ok了。
  • Reveal-Plugin-for-XCode – 一个Reveal插件,可以使工程不作任何修改的情况下使用Reveal,该插件已在Alcatraz上架。Reveal:分析iOS UI的利器 。
  • java2Objective-c – Google公司出得java转Obje-C转换工具,转换逻辑,不转换UI。
  • RegX – 专治代码强迫症的 Xcode 插件,使用 Swift 和 Objective-C 编写。其用竖向对齐特定源代码的元素,使得代码更易读和易理解。说明 ; 菜单:xcode——》Edit-》Regx 。
  • KSImageNamed – 自动完成,特别是如果你正在写Objective-C,如果Xcode能自动完成文件名难道不会很伟大吗?比如图像文件的名称。
  • FuzzyAutocomplete – Xcode的实现自动完成还不完美,此插件能给出你所期望或想要的建议,设置:xcode-》Editor-》FuzzyAutocomplete-》plugin settings。
  • GitDiff – Xcode的代码编辑器的一个微妙的补强,加上了足够的可见信息以了解上次git提交以来发生了什么变化,设置:xcode-》Edit-》GitDiff。
  • XToDo – 这个插件不仅凸显TODO,FIXME,???,以及!!!注释,也在便利列表呈现他们。 菜单:xcode-》view-》snippets; 调出列表显示: xcode-》view-》ToDo List : ctrl + T 。
  • Backlight – 突出显示当前正在编辑的行。菜单:xcode-》view-》Backlight 。
  • CocoaPods – 该CocoaPods的插件增加了一个CocoaPods菜单到Xcode的产品菜单。如果你不喜欢命令行,那么你一定会喜欢这个插件。 用CocoaPods做iOS程序的依赖管理 。
  • Peckham – 添加import语句比较麻烦,此插件 按Command-Control-P,给出的选项列表中选择要的头文件。先要安装Alcatraz ,在终端输入: curl -fsSLhttps://raw.github.com/supermarin/Alcatraz/master/Scripts/install.sh | sh ; 重启xcode-》window-》Package Manager:搜索 Peckham 安装,打开Peckham.xcodeproj,编译 Peckham target,重启Xcode 。
  • Auto-Importer – Auto-Importer是一个自动导入类对应的头文件的Xcode插件。
  • Alcatraz -使用Alcatraz来管理Xcode插件 使用说明 。
  • KSHObjcUML -KSHObjcUML 是一个 Objective-C 类引用关系图的 Xcode 插件。
  • ColorSense-for-Xcode – 颜色插件,安装之后,就不用根据RGB选择颜色,直接从取色板中取颜色,会自动补齐RGB代码。。
  • 10款提高iOS开发效率的XCode插件 – 10款提高iOS开发效率的XCode插件:1. XcodeColors;5. ACCodeSnippetRepository;10. Dash for Xcode。
  • ZLGotoSandboxPlugin – 支持Xcode快捷键了跳转当前应用沙盒了!快捷键是 Shift+Common+w。
  • XcodeSwiftSnippets – XcodeSwiftSnippets, 提供了很多可在 Xcode 上使用的 Swift 代码片段, 通过自动补全的方式*大的提高了开发效率, 另外还有 Objective-C 版的。
  • CoPilot – 通过此插件, Xcode 可以协同编程了(采用 WebSocket 通讯)。如此强大的“黑工具”,不爱它能行吗。
  • ESJsonFormat-Xcode – 将Json格式化输出为模型的属性。
  • SCXcodeMiniMap – Xcode迷你小地图-SCXcodeMiniMap。
  • xTransCodelation – XCODE中英文翻译插件,提供API查询模式和网页模式,都是利用的百度翻译。另外集成了一个可以一键关闭其他所有APP的实用功能,方便开发者!

美工资源

  • TWG_Retina_Icons – 一套支持 Retina 高清屏的 iPhone 免费图标集。
  • ASCIImage – 使用 NSString 创建 image,说明。
  • my-sketch-colors – 配色。
  • Font Awesome – Font Awesome:一套*佳的图标字体库和CSS框架,详细的安装方法请参考官方网站中文网站,GitHub地址 。
  • DynamicColor – 强大的颜色操作扩展类。通过该类,你可以通过扩展方法基于某个颜色得到不同深浅、饱和度、灰度、色相,以及反转后的新颜色。是不可多得的好类库。
  • Chameleon – Chameleon是一个iOS的色彩框架。它运用现代化flat color将UIColor扩展地非常美观。我们还可以通过它运用自定义颜色创建调色板。它还有很多功用,请浏览readme。
  • FontBlaster – 载入定制字体时更简单。

其他资源

  • githuber – *好用的GitHub人才搜索工具。
  • codatlas – 源代码搜索利器。
  • searchcode – 源代码搜索利器:来自悉尼的代码搜索引擎汇聚了 Github, Bitbucket, Sourceforge…等多家开源站点超20万个项目、180亿行源代码,能以特殊字符、语言、仓库和源方式从90多种语言找到函数、API的真实代码。
  • kitematic – Mac 上使用 Docker *简单的方案。

开发资源

开发资料
  • 豆瓣iOS开源库列表 – 豆瓣iOS开源库列表,很多开源项目。
  • iOS-Core-Animation-Advanced-Techniques – 中文版iOS 高级动画技术。
  • iOS开发的一些奇巧淫技1 – TableView不显示没内容的Cell怎么办; 键盘事件:IQKeyboardManager; app不流畅:KMCGeigerCounter; CoreData用起来好烦:MagicalRecord; CollectionView实现悬停的header:CSStickyHeaderFlowLayout。
  • iOS开发的一些奇巧淫技2 – 用一个pan手势来代替UISwipegesture的各个方向、拉伸图片、播放GIF、上拉刷新、把tableview里cell的小对勾的颜色改变、navigationbar弄成透明的而不是带模糊的效果、改变uitextfield placeholder的颜色和位置。
  • cocoapods安装指南 – cocoapods安装指南。
  • RemoteControl – Control your iPhone from inside Xcode for end-to-end testing 。
  • MVVM 介绍 – 替换MVC的开发模式。
  • 第三方接口 – 基本所有第三方接口都在这,再也不用那么麻烦去找了。
  • 提高iOS开发效率的方法和工具 – 提高iOS开发效率的方法和工具。
  • 禅与 Objective-C 编程艺术 – 禅与 Objective-C 编程艺术 (Zen and the Art of the Objective-C Craftsmanship 中文翻译)。
  • Objective-C编码规范:26个方面解决iOS开发问题 – 【Objective-C编码规范:26个方面解决iOS开发问题:“我们制定Objective-C编码规范的原因是我们能够在我们的书,教程和初学者工具包的代码保持优雅和一致。”今天分享的规范来自raywenderlich.com团队成员共同完成的,希望对学习OC的朋友们有所指导和帮助。
swift
  • Swift中文指南 – 中文版Apple官方Swift教程《The Swift Programming Language》,老码版本 历史版本更新说明。
  • The Swift Programming Language 中文版 – The Swift Programming Language 中文版。
  • swifttoolbox – swifttoolbox swift开发的开源库汇总。
  • SwiftGuide – 这份指南汇集了Swift语言主流学习资源,并以开发者的视角整理编排– 非常不错,值得推荐。
  • Swift开源项目精选 – Swift开源项目精选–推荐,每周都有更新。
  • Awesome Swift – 一个收集了很多 Swift 开发资源的网站。
  • Developing_iOS_8_Apps_With_Swift – Developing iOS 8 Apps with Swift 字幕简体中文翻译项目(斯坦福白胡子老头swift教学视频)。
  • Swift-On-iOS – JohnLui 的 Swift On iOS 代码仓库。
他人开源总结
  • code4app – *多国人用的代码库。
  • cocoachina – 国内*热门的iOS社区的代码库。
  • awesome-ios – 一个老外整理的,中文版。
  • awesome-ios-ui – 收集了不少 iOS UI/UX 库, 包含了很多酷炫的动画效果。
  • ios-cosmos – The iOS Cosmos:收录了IOS*大部分的开源框架和工具。
  • Awesome Haskell资料大全 – Awesome Haskell 资料大全:框架,库和软件。
  • Cosmos – The iOS Cosmos:收录了IOS*大部分的开源框架和工具。
  • cocoacontrols – 收集了很多UI控件效果代码,缺点是需要*,而且代码分类不够好。
  • lexrus – lexrus国内出名的iOS开源coder,非常库的label动画、textfield动画。
  • open-source-ios-apps – iOS App集合,分:swift与Objective-C–国外人整理。
  • 适合iOS开发者的15大网站推荐 – 适合 iOS 开发者的 15 大网站推荐 — 英文网站。
  • Objective-C GitHub 排名前 100 项目简介 – 主要对当前 GitHub 排名前 100 的项目做一个简单的简介, 方便初学者快速了解到当前 Objective-C 在 GitHub 的情况。
  • Github-iOS备忘 -整理了比较常用的iOS第三方组件,以及github上的统计。

iOS 获取手机上已经安装的应用

前言

公司内部有一给自己的 App 发布后台,类似于 FIR 那样的存在, 有完整的 LDAP 账号登录。每天的 daily build 和 历史发布版都会放到那里去。然而每次都要登录后台扫描二维码下载实在是太麻烦了,我们就打算做一个客户端。

于是问题来了:如何知道我手机上安装的*物说版本号比我当前的要低呢?

方案们

方案一 剪贴板共享

我们知道同一个证书下的软件,是可以共享剪贴板的,所以我们可以把*物说的版本号丢到剪贴板里存下来。

但问题在于:

  1. *物说要运行过

  2. 致命伤:必须同一个 账号的 证书,内部 APP 肯定会去用企业证书,而*物说可能是线上证书,可能是企业证书。

所以这个方案被否掉了。

方案二 URLScheme

把*物说的 URLScheme 写成 GiftTalk233 这样的方案,然后在项目中 CanOpenURL 确认安装。

当问题在于:

iOS 9 之后,CanOpenURL 的白名单有上限,而且要修改编译脚本过于麻烦,这个方案也被否掉了。

于是,常规方案都不可行,那么要祭出大杀器了,私有 API

私有 API

毕竟是内部使用的 APP,所以用用私有 API 也没有什么问题。经过查阅越狱开发的文档,我们发现了这么一个私有库:MobileInstallation.framework

使用起来还是蛮方便的,直接:

CFDictionaryRef dict = MobileInstallationLookup(NULL);
NSLog(@"%@", (NSDictionary*) dict);

然而,这个库正常情况下是不会被 Link 进来的,于是我们该怎么做呢?

链接私有库

经过前几篇文章,我们知道动态链接库都是写在 Mach-O 的头部。然而它*终是经过 unix 的一个系统函数 dlopen 来加载的,这货是可以突破沙盒环境的,不信你可以给 dlopen 下个断点看看。所以我们可以手动调用 dlopen 加载想要的私有库。

void* libHandle = dlopen("/System/Library/PrivateFrameworks/MobileInstallation.framework/MobileInstallation",RTLD_NOW);

if (libHandle) {
  NSLog(@"加载成功!");
}

但是对于 C 语言函数来说,他在编译时就被换成了对应的函数指针,所以我们想调用上述方法并没有那么容易。而如果是 OC 的方法的话,我们直接通过 runtime 就可以拿到对应的结果了。

所以现在我们需要拿个函数指针做个映射:

%title插图%num这样就可以了!

然鹅,我拿这个这个东西去给同事得瑟的时候,被打脸了。

我拿了一台公司的 iPhone 4 iOS 7 做的开发,这个工作一切正常。但 iOS 8 以上,func 取不到。吓得我赶紧去 Github 上看头文件。

https://github.com/MP0w/iOS-Headers/blob/master/iOS8.1/PrivateFrameworks/MobileInstallation/MIInstallerClient.h

惊了个呆,iOS 8 居然重写了这个 framework,但仔细观察了一下,貌似有一个方法是我们想要的:

 - (void)fetchInstalledAppsWithOptions:(id)arg1 completion:(CDUnknownBlockType)arg2

好吧,我之前树的 Flag 应验了,那就 iOS 8 以上换一个写法吧。

%title插图%num真机运行得到:

required to have an entitlement named “com.apple.private.mobileinstall.allowedSPI” with an array containing “CopyInstalledAppsForLaunchServices” to call the MobileInstallation SPI

Wut?

%title插图%numentitlement.plist

若你对 iOS 签名机制了机的话,entitlement *对不陌生。不过我相信大多数开发者都很少和他打交道,这里我来简单说一下。

我们都知道签名需要证书的 profile 文件,而 entitlement 是一个授权机制,他里面约定了很多 iOS 的更高级的权限。有点像 Android 写在 manifest 里面的 permission。

比如:

  • 访问 HealthKit 需要添加 com.apple.developer.healthkit

  • 使用 Network Extension 查找 WI-FI 需要添加 com.apple.developer.networking.HotspotHelper

但是,这个是需要苹果授权的,且与 profile 对应的。于是我们想在 entitlement 里面添加 com.apple.private.mobileinstall.allowedSPI 是没问题,但是是无法通过签名,会提示找不到对应的 profile。

于是我们想调用私有的 entitlement 的话,越狱设备可以随便搞,但不越狱的话开发者层面是没有什么可以绕过去的方法 (但做安全的蒸米大大说其实是有解的,若有朋友知道欢迎留言)。

仿佛走入了死胡同

柳暗花明又一村

我们都知道同步推是有企业证书版本的,且能查看我们本地的全部 APP。于是,我们对着他们的代码找一下呗~

经过一番查找,我们定位到了一个叫做 ApplicationManager 的类,这个 loadInstalledApplications 的方法很抢眼

%title插图%num然后在逻辑结构中可以看到:

%title插图%num他很鸡贼的判断了一下系统版本是不是大于 8.0,如果不是,就用左边的 MobileInstallation.framework 来做,否则调用了一个方法,叫做 suoyouyianzhuangdeyingyong 。我能吐槽这名字么…

通过下面代码,我们可以发现一个类叫做 LSApplicationWorkspace
%title插图%num在 Github 的私有头文件里面搜了一下,惊了个呆:

https://github.com/nst/iOS-Runtime-Headers/blob/master/Frameworks/MobileCoreServices.framework/LSApplicationWorkspace.h

他居然是 MobileCoreServices 的私有函数!我们连 dlopen 都省了。

于是,照猫画虎,我们有:

%title插图%num任务完成!

iOS-微信sdk使用汇总

URL分享
WXMediaMessage * message = [WXMediaMessage message];
message.title = title;
message.description = desc;
[message setThumbImage:[UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:img]]]];
WXWebpageObject * web = [WXWebpageObject object];
web.webpageUrl = [NSString stringWithH5Route:url];
message.mediaObject = web;
SendMessageToWXReq *req= [[SendMessageToWXReq alloc]init];
req.bText = NO;
req.message = message;
req.scene = WXSceneSession;
[WXApi sendReq:req];

分享小程序
NSString *filePath = [[NSBundle mainBundle] pathForResource:@”shareMiniprogram” ofType:@”png”];
NSData *image = [NSData dataWithContentsOfFile:filePath];
NSRange range = [[NSString stringWithH5Route:_shareUrl] rangeOfString:@”?client”];//匹配得到的下标
NSString* urlStr = [[NSString stringWithH5Route:_shareUrl] substringToIndex:range.location];//截取范围类的字符串
WXMiniProgramObject *wxMiniObject = [WXMiniProgramObject object];
wxMiniObject.userName = @”gh_8de940b01a61″;
wxMiniObject.webpageUrl = urlStr; //打不开小程序的自动转成网页
wxMiniObject.path = [[[@”pages/cvShare/cvShare?url=” stringByAppendingString:urlStr] stringByAppendingString:@”&title=”]stringByAppendingString:_clName];
wxMiniObject.hdImageData = image;
WXMediaMessage *message = [WXMediaMessage message];
message.title = _clName;
message.description = @””;
message.mediaObject = wxMiniObject;
message.thumbData = image; //分享出去的网页的图片
SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init];
req.message = message;
req.scene = WXSceneSession;
[WXApi sendReq:req];

直接打开小程序
WXLaunchMiniProgramReq *launchMiniProgramReq = [WXLaunchMiniProgramReq object];
launchMiniProgramReq.userName = name; //拉起的小程序的username(gh_7a4d78xxxxx)
launchMiniProgramReq.path = @“pages/index/index”; //拉起小程序页面的可带参路径,不填默认拉起小程序首页
launchMiniProgramReq.miniProgramType = WXMiniProgramTypeRelease;
[WXApi sendReq:launchMiniProgramReq];

Image分享
NSDictionary * dataDir = (NSDictionary*)data;
NSString * img = [NSString stringWithFormat:@”%@”, [dataDir objectForKey:@”img”]];
UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:img]]];
NSData*imageData = UIImageJPEGRepresentation(image, 0.7);
WXImageObject *imageObject = [WXImageObject object];
imageObject.imageData = imageData;
WXMediaMessage *message = [WXMediaMessage message];
NSString *filePath = [[NSBundle mainBundle] pathForResource:@”invite”
ofType:@”png”];
message.thumbData = [NSData dataWithContentsOfFile:filePath];
message.mediaObject = imageObject;
SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init];
req.bText = NO;
req.message = message;
req.scene = WXSceneTimeline;//分享到朋友圈 分享给会话是WXSceneSession
[WXApi sendReq:req];

ps: 几点注意
1.微信小程序分享图片不能超过32k 否则分享不出去
2.微信小程序分享图片必须是nsdata格式

NSString *filePath = [[NSBundle mainBundle] pathForResource:@”shareMiniprogram” ofType:@”png”];
NSData *image = [NSData dataWithContentsOfFile:filePath];

所以一定要这么取

ps:有时候图片拖进项目里会找不到图片这个时候需要选中图片之后选择菜单中的
Source Control —> add selected files 就加进去了

 

NSString * img = [NSString stringWithFormat:@”%@”, [dataDir objectForKey:@”img”]];
NSURL *url = [NSURL URLWithString:img];
NSData *imgData = [NSData dataWithContentsOfURL:url];
UIImage *image = [UIImage imageWithData:imgData];

免Root脚本之微信自动添加好友

使用Siri打开自己的应用并触发自己应用的呼叫视频或者语音功能
1.使用Siri这个功能,首先要引入SiriKit这个扩展程序(App Extension).
1.创建一个应用扩展.

在自己的项目下,通过 file->new->target->Intenst Extension. 而在next 后,Product name 设置扩展程序名字,Project选项看是自己的项目吗 ,Embed in Application 是不是自己的项目 如果都是那就点击finish完成.

Add an Intents App Extension to Your Project
Adding an Intents app extension target provides the initial files you need to build your Intents extension and configures your Xcode project to build that extension and include it in your app’s bundle.

Open your existing app project in Xcode.

Choose File > New > Target.

Select Intents extension from the Application Extension group of the iOS or watchOS platform.

Click Next.

Specify the name of your extension and configure the language and other options.

For an iOS app, enable the Include UI Extension option if you plan to customize portions of the Siri interface.

Click Finish.

Note

You may add more than one Intents extension to your app, but each extension must support different intents. Create multiple extensions only if doing so provides a performance advantage or reduces the memory footprint of each extension.

%title插图%num

2.修改默认的Intens事件

Intens事件有

SiriKit groups intents into domains based on the type of app that is likely to support them.

Messaging
Send messages and search the user’s received messages.

Lists and Notes
Create and manage notes and to-do list items.

Workouts
Start, end, and manage fitness routines.

Payments
Send payments between users or pay bills.

VoIP Calling
Initiate calls and search the user’s call history.

Media
Provide media playback.

Visual Codes
Convey contact and payment information using Quick Response (QR) codes.

Photos
Search for and display photos.

Ride Booking
Book rides and report their status.

Car Commands
Manage vehicle door locks and get the vehicle’s status.

CarPlay
Interact with a vehicle’s CarPlay system.

Restaurant Reservations
Create and manage restaurant reservations with help from the Maps app.

需要使用到的是VoIp calling 域 的INStartVideoCallIntent INStartAudioCallIntent两个事件

%title插图%num

将扩展程序的info.plist文件的NSExtension项 默认的IntentsSupported IntentsRestrictedWhileLocked改成这两个

并且还要设置Siri权限 Privacy – Siri Usage Description 和 Privacy – Speech Recognition Usage Description 权限 这两个权限*好也在主程序info.plist里设置一下.

3.IntentHnadler.m 里添加INStartVideoCallIntentHandling和INStartAudioCallIntentHandling

然后实现协议方法

#pragma mark – INStartVideoCallIntentHandling
//解决联系人
– (void)resolveContactsForStartVideoCall:(INStartVideoCallIntent *)intent withCompletion:(void (^)(NSArray<INPersonResolutionResult *> *resolutionResults))completion{
//NSLog(@”呼叫视频:33333333″);
INPerson *peson = [[INPerson alloc] initWithPersonHandle:[[INPersonHandle alloc] initWithValue:@”志愿者” type:INPersonHandleTypeUnknown] nameComponents:nil displayName:@”志愿者” image:nil contactIdentifier:@”志愿者” customIdentifier:@”志愿者”];
INPersonResolutionResult *result = [INPersonResolutionResult successWithResolvedPerson:peson];
completion(@[result]);
}
//
– (void)confirmStartVideoCall:(INStartVideoCallIntent *)intent completion:(void (^)(INStartVideoCallIntentResponse *response))completion{
//NSLog(@”呼叫视频:22222222″);
NSUserActivity *userActivity = [[NSUserActivity alloc] initWithActivityType:NSStringFromClass([INStartVideoCallIntent class])];
userActivity.title = @”志愿者”;
userActivity.keywords = [NSSet setWithArray:@[@”测试人员”, @”测试”, @”测试”]];
userActivity.eligibleForHandoff = YES;
userActivity.eligibleForSearch = YES;
INStartVideoCallIntentResponse *response = [[INStartVideoCallIntentResponse alloc] initWithCode:INStartVideoCallIntentResponseCodeReady userActivity:userActivity];
completion(response);
}
– (void)handleStartVideoCall:(INStartVideoCallIntent *)intent completion:(void (^)(INStartVideoCallIntentResponse *response))completion{
//NSLog(@”呼叫视频:11111111″);
NSUserActivity *userActivity = [[NSUserActivity alloc] initWithActivityType:NSStringFromClass([INStartVideoCallIntent class])];
userActivity.title = @”测试”;
userActivity.keywords = [NSSet setWithArray:@[@”测试”, @”测试”, @”测试”]];
userActivity.eligibleForHandoff = YES;
userActivity.eligibleForSearch = YES;
INStartVideoCallIntentResponse *response = [[INStartVideoCallIntentResponse alloc] initWithCode:INStartVideoCallIntentResponseCodeContinueInApp userActivity:userActivity];
completion(response);
}

#pragma mark – INStartAudioCallIntentHandling
– (void)resolveContactsForStartAudioCall:(INStartAudioCallIntent *)intent withCompletion:(void (^)(NSArray<INPersonResolutionResult *> *resolutionResults))completion{
//NSLog(@”呼叫电话:33333333″);
INPerson *peson = [[INPerson alloc] initWithPersonHandle:[[INPersonHandle alloc] initWithValue:@”测试” type:INPersonHandleTypeUnknown] nameComponents:nil displayName:@”测试” image:nil contactIdentifier:@”测试” customIdentifier:@”测试”];
INPersonResolutionResult *result = [INPersonResolutionResult successWithResolvedPerson:peson];
completion(@[result]);
}
– (void)confirmStartAudioCall:(INStartAudioCallIntent *)intent completion:(void (^)(INStartAudioCallIntentResponse *response))completion{
//NSLog(@”呼叫电话:22222222″);
NSUserActivity *userActivity = [[NSUserActivity alloc] initWithActivityType:NSStringFromClass([INStartVideoCallIntent class])];
userActivity.title = @”测试”;
userActivity.keywords = [NSSet setWithArray:@[@”测试”, @”测试”, @”测试”]];
userActivity.eligibleForHandoff = YES;
userActivity.eligibleForSearch = YES;
INStartAudioCallIntentResponse *response = [[INStartAudioCallIntentResponse alloc] initWithCode:INStartAudioCallIntentResponseCodeReady userActivity:userActivity];
completion(response);
}
//
– (void)handleStartAudioCall:(INStartAudioCallIntent *)intent completion:(void (^)(INStartAudioCallIntentResponse *response))completion{
//NSLog(@”呼叫电话:11111111″);
NSUserActivity *userActivity = [[NSUserActivity alloc] initWithActivityType:NSStringFromClass([INStartVideoCallIntent class])];
userActivity.title = @”测试”;
userActivity.keywords = [NSSet setWithArray:@[@”测试”, @”测试”, @”测试”]];
userActivity.eligibleForHandoff = YES;
userActivity.eligibleForSearch = YES;
INStartAudioCallIntentResponse *response = [[INStartAudioCallIntentResponse alloc] initWithCode:INStartAudioCallIntentResponseCodeContinueInApp userActivity:userActivity];
completion(response);
}
4.权限设置

#import <Intents/Intents.h>
//Siri
if (@available(iOS 10.0, *)) {
[INPreferences requestSiriAuthorization:^(INSiriAuthorizationStatus status) {
switch (status) {
case INSiriAuthorizationStatusNotDetermined:
NSLog(@”用户尚未对该应用程序作出选择。”);
break;
case INSiriAuthorizationStatusRestricted:
NSLog(@”此应用程序无权使用Siri服务”);
break;
case INSiriAuthorizationStatusDenied:
NSLog(@”用户已明确拒*此应用程序的授权”);
break;
case INSiriAuthorizationStatusAuthorized:
NSLog(@”用户可以使用此应用程序的授权”);
break;
default:
break;
}
}];
} else {
// Fallback on earlier versions
}

5.在主程序也就是AppDelegate里调用回调监听这个事件

– (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler{
NSLog(@”视频呼叫:触发了%@”,userActivity.title);
return YES;
}

6.出现不在通讯录事件,首先查看扩展程序target版本应该设置低一些不超出

%title插图%num

IOS项目接入微信SDK

先是环境配置:

首先*步,去官网下载微信sdk文件,SDK文件包括 libWeChatSDK.a,WXApi.h,WXApiObject.h 三个。下载链接:https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419319164&lang=zh_CN

第二步:讲下载后的sdk文件libWeChatSDK.a,,WXApi.h,WXApiObject.h添加到你的工程中(注:请使用xCode4.5及以上版本),

%title插图%num
第三步:微信开放平台新增了微信模块用户统计功能,便于开发者统计微信功能模块的用户使用和活跃情况。开发者需要在选中工程->build Phases->Link Binary With Libraries添加SystemConfiguration.framework,libz.dylib,libsqlite3.0.dylib,libc++.dylib库文件
第四步:选中工程选项->info->URL Types添加”URL scheme”为你所注册的应用程序id(如上图所示)。

第五步:在你准备使用微信终端API文件中import WXApi.h 头文件,并增加 WXApiDelegate 协议。如下:

#import <UIKit/UIKit.h>
#import “WXApi.h”

@interface AppDelegate : UIResponder<UIApplicationDelegate, WXApiDelegate>

@property (strong, nonatomic) UIWindow *window;

@end

手动集成

将SDK文件中包含的 libWeChatSDK.a,WXApi.h,WXApiObject.h 三个文件添加到你所建的工程中(如下图所示,建立了一个名为Test 的工程,并把以上三个文件添加到Test文件夹下)。

(注:请使用xCode4.5及以上版本)

%title插图%num

微信开放平台新增了微信模块用户统计功能,便于开发者统计微信功能模块的用户使用和活跃情况。开发者需要在工程中链接上:SystemConfiguration.framework, libz.dylib, libsqlite3.0.dylib, libc++.dylib, Security.framework, CoreTelephony.framework, CFNetwork.framework,CoreGraphics.framework。(注意坑一:如果不导入会报错:Undefined symbols for architecture x86_64:
“_CNCopyCurrentNetworkInfo”, referenced from:
-[MTAWXOHelper fetchSSIDInfo] in libWeChatSDK.a(MTAWXOHelper.o)
“_CNCopySupportedInterfaces”, referenced from:
-[MTAWXOHelper fetchSSIDInfo] in libWeChatSDK.a(MTAWXOHelper.o)
)(注意坑二:后期的版本修改了后缀,没有dylib文件;可以导入tdb后缀同名文件)

 

在你的工程文件中选择Build Setting,在”Other Linker Flags”中加入”-Objc -all_load”,在Search Paths中添加 libWeChatSDK.a ,WXApi.h,WXApiObject.h,文件所在位置(如下图所示)。

(注:请使用xCode4.5及以上版本)

%title插图%num

%title插图%num
在Xcode中,选择你的工程设置项,选中“TARGETS”一栏,在“info”标签栏的“LSApplicationQueriesSchemes“添加weixin(如下图所示)。

%title插图%num

错误解决记录:

错误提示:—-canOpenURL: failed for URL: “weixin://app/:

解决方法:

除了要在项目info URL Types中设置URL Schemes,还需要在info.plist里面增加可信任的调用app,否则回报如下错误

-canOpenURL: failed for URL: “weixin://app/wx9c8771d3c07dfd30/” – error: “This app is not allowed to query for scheme weixin”

-canOpenURL: failed for URL: “wtloginmqq2://qzapp” – error: “This app is not allowed to query for scheme wtloginmqq2”

info.plist加入

<key>LSApplicationQueriesSchemes</key>

<array>

<string>urlscheme</string>

<string>urlscheme2</string>

<string>urlscheme3</string>

<string>urlscheme4</string>

</array>

解决了,
分享到qq,需要加上

%title插图%num

分享到微信需要加上:

%title插图%num

<key>LSApplicationQueriesSchemes</key>
<array>
<string>mqqOpensdkSSoLogin</string>
<string>mqzone</string>
<string>sinaweibo</string>
<string>alipayauth</string>
<string>alipay</string>
<string>safepay</string>
<string>mqq</string>
<string>mqqapi</string>
<string>mqqopensdkapiV3</string>
<string>mqqopensdkapiV2</string>
<string>mqqapiwallet</string>
<string>mqqwpa</string>
<string>mqqbrowser</string>
<string>wtloginmqq2</string>
<string>weixin</string>
<string>wechat</string>
</array>加了15条
这个问题据说要用真机测试,模拟器会一直报错

iOS9中实现微信分享到好友、朋友圈

微信SDKdemo运行错误问题
微信SDK接入设置
实现分享到好友、朋友圈
微信SDKdemo运行错误问题
下载了官方的demo,激动地运行了一下,十几个错误,内心其实是崩溃的。

%title插图%num

根据错误提示,去修改architecture,然并卵,几经周折,终于发现问题所在!进入工程->targets->Build Phases->Link Binary With Libraries 添加Security.framework,OK,编译运行成功。

%title插图%num

微信SDK接入
做分享的时候,不想用第三方分享平台的话,自己实现也是比较有趣的,接下来假设你已经注册成为微信开放平台的开发者,且为你的APP申请到AppID和AppSecret。如果没有,请戳:1.注册微信平台开发者:http://jingyan.baidu.com/article/3052f5a1c8090397f31f8620.html 2.创建APP:http://jingyan.baidu.com/article/c45ad29c35d938051653e257.html
做好准备好工作后,从官网下载*新的WeChatSDK,本文使用的是WeChatSDK1.6.2,解压之后里面将文件夹拖入工程中,记得勾选Copy items if needed。
接下来,首先添加sdk所需要链接的.a文件,进入 工程->targets->Build Phases->Link Binary With Libraries 点击 +,选中Add others…, 选中SDK文件夹中libWeChatSDK.a 确定即可。其次添加所需要的frameworks,完成如下图(注意添加libc++.tdb,官方文档缺少):

%title插图%num

另,iOS中程序之间都是相互隔离,跳转到其他APP使用的是URL Scheme,进入 Targets -> info设置LSApplicationQueriesSchemes(类型NSArray),添加weixin,如下图:

%title插图%num
编译一下,出现如下提示:

%title插图%num

这是因为iOS9引入了新特性App Transport Security (ATS),即要求APP内部访问的网络必须使用Https协议,但微信的SDK使用的仍然是Http,需要进入 Targets -> info设置App Transport Security Settings(类型Dictionary),在NSAppTransportSecurity下添加Allow Arbitrary Loads(类型 Boolean)值为YES。如下图:

%title插图%num

编译一下成功!
实现分享到好友、朋友圈
说了这么多,该进入代码实现了。在APPdelegate注册微信

 

– (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

[WXApi registerApp:@”your APPID”];
return YES;
}

你可以通过[WXApi isWXAppInstalled]、[WXApi isWXAppSupportApi]判断出用户是否安装微信、微信是否支持API,做出相应的操作。
我们的APP要想打开微信,遵循微信代理WXApiDelegate,重写application: openURL:options:方法,设置微信代理:

– (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString *,id> *)options {
return [WXApi handleOpenURL:url delegate:self];
}
#pragma mark -WXApiDelegate协议方法
– (void) onReq:(BaseReq *)req {

}
– (void) onResp:(BaseResp *)resp {
}

 

协议方法具体使用,请自行command或参考官方demo。接下来可以实现分享,在.m文件中 #import “WXApiObject.h” #import “WXApi.h”。笔者写了两个按钮点击事件,项目中看具体的需求了,响应事件如下:

– (void)shareToTimeline {
NSLog(@”分享到朋友圈”);
SendMessageToWXReq * req = [[SendMessageToWXReq alloc] init];
req.text = @”看我看我。。。”;
req.bText = YES;
req.scene = WXSceneTimeline;

[WXApi sendReq:req];
}
– (void)shareToSession {
NSLog(@”分享到好友”);
WXMediaMessage *message = [WXMediaMessage message];
[message setThumbImage:[UIImage imageNamed:@”res5thumb.png”]];
WXWebpageObject *ext = [WXWebpageObject object];
ext.webpageUrl = @”http://cul.qq.com/a/20160226/009086.htm?pgv_ref=aio2015&ptlang=2052#p=1″;
message.mediaObject = ext;
message.title = @”点开看看,有惊喜”;
message.description = @”揭古代妃子阿哥真实照 样貌丑气质差引吐槽”;
SendMessageToWXReq* req = [[SendMessageToWXReq alloc] init];
req.bText = NO;
req.message = message;
req.scene = WXSceneSession;

[WXApi sendReq:req];
}

聪明的小伙伴会发现SendMessageToWXReq的对象的secne属性是发送的目标场景,可以选择发送到会话(WXSceneSession)或者朋友圈(WXSceneTimeline)。 这个属性默认发送到会话。
分享的内容和场景可以根据需求设置SendMessageToWXReq的对象属性实现啦,暂写到这里了。
*次尝试写博客,很多地方很蹩脚,请各位多多指教!谢谢!

IOS 微信共享给好友或者朋友圈

用XCode6开发微信共享功能步骤

1.在微信开放平台注册应用程序id

请到 开发者应用登记页面 进行登记,登记并选择移动应用进行设置后,将获得AppID,可立即用于开发。但应用登记完成后还需要提交审核,只有审核通过的应用才能正式发布使用。

2.下载微信终端SDK文件

SDK文件包括 libWeChatSDK.a,WXApi.h,WXApiObject.h 三个。
请前往“资源下载页”下载*新SDK包

3.搭建开发环境

[1] 在XCode中建立你的工程。

[2] 将SDK文件中包含的 libWeChatSDK.a,WXApi.h,WXApiObject.h 三个文件添加到你所建的工程中(如下图所示,建立了一个名为WeiXinTest 的工程,并把以上三个文件添加到Test文件夹下)。

[3]微信开放平台新增了微信模块用户统计功能,便于开发者统计微信功能模块的用户使用和活跃情况。开发者需要在工程中链接上:SystemConfiguration.framework,libz.dylib,libsqlite3.0.dylib,libc++.dylib。

[4] 在你的工程文件中选择Build Setting,在Search Paths中添加 libWeChatSDK.a ,WXApi.h,WXApiObject.h 三个文件所在位置(如下图所示)。

[5] 在Xcode中,选择你的工程设置项,选中“TARGETS”一栏,在“info”标签栏的“URL type“添加“URL scheme”为你所注册的应用程序id(如下图所示)。

Xcode设置URL scheme

[5] 在你需要使 用微信终端API的文件中import WXApi.h 头文件,并增加 WXApiDelegate 协议。

4.在代码中使用开发工具包
[1] 要使你的程序启动后微信终端能响应你的程序,必须在代码中向微信终端注册你的id。(如下图所示,在 AppDelegate 的 didFinishLaunchingWithOptions 函数中向微信注册id)。

– (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.

[WXApiregisterApp:@”wx28b424d0f0a228fc”];

returnYES;

}

[2] 重写AppDelegate的handleOpenURL和openURL方法:

– (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url

{
return  [WXApihandleOpenURL:urldelegate:self];

}

[3] 现在,你的程序要实现和微信终端交互的具体请求与回应,因此需要实现WXApiDelegate协议的两个方法:

-(void) onReq:(BaseReq*)req
onReq是微信终端向第三方程序发起请求,要求第三方程序响应。第三方程序响应完后必须调用sendRsp返回。在调用sendRsp返回时,会切回到微信终端程序界面。

-(void) onReq:(BaseReq*)req

{
if([reqisKindOfClass:[GetMessageFromWXReqclass]])

{

}

elseif([reqisKindOfClass:[ShowMessageFromWXReqclass]])

{

}

}

-(void) onResp:(BaseResp*)resp
如果第三方程序向微信发送了sendReq的请求,那么onResp会被回调。sendReq请求调用后,会切到微信终端程序界面。

-(void) onResp:(BaseResp*)resp

{
//可以省略

if([respisKindOfClass:[SendMessageToWXRespclass]])

{
}

elseif([respisKindOfClass:[SendAuthRespclass]])

{
}

}

具体在此两方法中所要完成的内容由你定义,具体可参考微信开发工具包中的SDK Sample Demo源码。

[4] 如果你的程序要发消息给微信,那么需要调用WXApi的sendReq函数:

-(BOOL) sendReq:(BaseReq*)req
其中req参数为SendMessageToWXReq类型。

1.要有一个事件触发

– (IBAction)share:(id)sender {

UIActionSheet *acSheet = [[UIActionSheetalloc]initWithTitle:nildelegate:selfcancelButtonTitle:@”取消”destructiveButtonTitle:nilotherButtonTitles:@”分享给微信好友”,@”分享到朋友圈”,nil];

acSheet.tag =1;

acSheet.actionSheetStyle =UIActionSheetStyleBlackTranslucent;

[acSheet showInView:[[UIApplicationsharedApplication]keyWindow]];

}

2.响应选择
– (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex

{
if (actionSheet.tag==1){
if (buttonIndex ==0) {
[selfsendMusicContent];

[_delegatechangeScene:WXSceneSession];

}

elseif (buttonIndex ==1) {
[_delegatechangeScene:WXSceneTimeline];

[selfsendVideoContent];

}

}

}

分享实现:

– (void)sendMusicContent

{
//    if (_delegate)

//    {
//        [_delegate sendMusicContent] ;

//    }

if ([WXApiisWXAppInstalled] && [WXApiisWXAppSupportApi]) {

WXMediaMessage *message = [WXMediaMessagemessage];

message.title = @”阴天”;

message.description =@””;

[messagesetThumbImage:[UIImageimageNamed:@”res3.jpg”]];

WXMusicObject *ext = [WXMusicObjectobject];

ext.musicUrl =@””;

message.mediaObject = ext;

SendMessageToWXReq* req = [[SendMessageToWXReqalloc]init];

req.bText =NO;

req.message = message;

req.scene =_scene;

[WXApisendReq:req];

}else{

UIAlertView *alView = [[UIAlertViewalloc]initWithTitle:@””message:@”你的iPhone上还没有安装微信,无法使用此功能,使用微信可以方便的把你喜欢的作品分享给好友。”delegate:selfcancelButtonTitle:@”取消”otherButtonTitles:@”免费下载微信”,nil];

[alViewshow];

}

}

头文件加上协议:
@protocol sendMsgToWeChatViewDelegate <NSObject>

– (void) sendMusicContent ;

– (void) sendVideoContent ;

– (void) changeScene:(NSInteger)scene;

@end

@interface ViewController :UIViewController<UIActionSheetDelegate,WXApiDelegate,sendMsgToWeChatViewDelegate>

{
enumWXScene _scene;

}

@property (nonatomic,assign)id<sendMsgToWeChatViewDelegate> delegate;

– (void)sendVideoContent

{
//    if (_delegate)

//    {
//        [_delegate sendVideoContent] ;

//    }

if ([WXApiisWXAppInstalled] && [WXApiisWXAppSupportApi]) {

WXMediaMessage *message = [WXMediaMessagemessage];

message.title =@””;

message.description =@””;

[messagesetThumbImage:[UIImageimageNamed:@”res2.jpg”]];

WXVideoObject *ext = [WXVideoObjectobject];

ext.videoUrl =@””;

message.mediaObject = ext;

SendMessageToWXReq* req = [[SendMessageToWXReqalloc]init];

req.bText =NO;

req.message = message;

req.scene =WXSceneTimeline;

[WXApisendReq:req];

}else{

UIAlertView *alView = [[UIAlertViewalloc]initWithTitle:@””message:@”你的iPhone上还没有安装微信,无法使用此功能,使用微信可以方便的把你喜欢的作品分享给好友。”delegate:selfcancelButtonTitle:@”取消”otherButtonTitles:@”免费下载微信”,nil];

[alViewshow];

}

}

需要注意的是,SendMessageToWXReq的scene成员,如果scene填WXSceneSession,那么消息会发送至微信的会话内。如果scene填WXSceneTimeline,那么消息会发送至朋友圈。如果scene填WXSceneFavorite,那么消息会发送到“我的收藏”中。scene默认值为WXSceneSession。

IOS下微信好友和朋友圈分享实现

1、IOS分享到微信好友和微信朋友圈

*步,先检测微信客户端是否存在:

[WXApi isWXAppInstalled]; —  这个方法返回一个bool值,来验证微信客户端是否存在

第二步,跳转到微信界面(好友或者朋友圈):

//创建发送对象实例

SendMessageToWXReq *sendReq = [[SendMessageToWXReq alloc] init];

sendReq.bText = NO;//不使用文本信息

//sendReq.scene = 1;//0 = 好友列表 1 = 朋友圈 2 = 收藏

//创建分享内容对象

WXMediaMessage *urlMessage = [WXMediaMessage message];

urlMessage.title = [NSString stringWithUTF8String:“title”];//分享标题

urlMessage.description = [NSString stringWithFormat:@”%s”, “分享描述”];//分享描述

[urlMessage setThumbImage:[UIImage imageNamed:[NSString stringWithUTF8String:“1.png”]];//分享图片,使用SDK的setThumbImage方法可压缩图片大小

//创建多媒体对象

WXWebpageObject *webObj = [WXWebpageObject object];

webObj.webpageUrl = [NSString stringWithFormat:@”%s”, “www.baidu.coom”];//分享链接

 

//完成发送对象实例

urlMessage.mediaObject = webObj;

sendReq.message = urlMessage;

 

//发送分享信息

[WXApi sendReq:sendReq];

第三步:验证分享回调:

在AppController.mm文件中,实现如下方法:

– (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey, id> *)options NS_AVAILABLE_IOS(9_0) // no equiv. notification. return NO if the application can’t open for some reason

{

if([url.host isEqualToString:@”platformId=wechat”])

{

return [WXApi handleOpenURL:url delegate:self];

}

else

{

return true;

}

}

//上面这个方法针对IOS9以上,但是对于IOS8的系统来说, 要实现下边的方法:

– (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation

{

if(url.host isEqualToString:@”platformId=wechat”])

{

return [WXApi handleOpenURL:url delegate:self];

}

else

{

return true;

}

}

实际上这两个方法只是方法名不一致,内容都是一样的。
然后实现微信分享的回调方法:

-(void)onResp:(BaseResp *)resp

{
if([resp isKindOfClass:[SendMessageToWXResp class]]) {

SendMessageToWXResp *sendResp = (SendMessageToWXResp *)resp;

switch (sendResp.errCode) {

case WXSuccess://分享成功

{

printf(“微信朋友圈分享成功\n”);

break;

}

case WXErrCodeUserCancel://分享取消

{

printf(“微信朋友圈分享取消\n”);

break;

}

case WXErrCodeSentFail://分享失败

{

printf(“微信朋友圈分享失败\n”);

break;

}

default://分享失败

{

break;

}

}

}

然后再进行相应的处理即可。

 

iOS逆向-微信自动添加好友

前言

上次完成了 macOS 版微信小助手,现在终于有(xian)时(de)间(huang)来说说 iOS 逆向了。本篇主要实现在微信上自动添加好友(即自动验证新的朋友申请),从而熟悉 iOS 逆向分析的过程,可能总结的有点粗糙,如果有不懂的地方欢迎探讨。

github地址: iOS 版微信小助手(防撤回、修改微信运动、群管理、好友请求管理)

工具

以下工具的详细使用方法可以查看iOS应用逆向工程 第2版 第二部分 工具篇。

macbook 软件

  • theos

    制作 Tweak 的工具

  • hopper disassembler

    用于静态分析

  • usbmuxd

    端口转发,可以让我们通过 usb 连接手机进行 ssh、lldb 调试等。主要使用python-client目录下的文件

  • class-dump

dump 目标对象的 class 信息的工具.

  • lldb

调试神器,用过的都说好。默认自带,在/Applications/Xcode.app/Contents/Developer/usr/bin/lldb 中。

越狱 iPhone 软件

以下软件在 Cydia 中即可下载(debugserver 除外)

  • OpenSSH

实现在越狱手机上远程进行 ssh 服务,通过 ssh,即可以通过终端连接 iPhone 进行控制。

  1. **iOS 工具大部分都需要在 ssh 环境中使用**
  2. 复制代码
  • Cycript

脚本语言,用于 hook 正在运行的进程,并实时注入代码。

  • ondeviceconsole

用于在 Terminal 中查看手机的 log

  • debugserver

用于连接手机进行 lldb 调试的工具。用 Xcode 在手机上进行 app 调试即可在iPhone目录的 /Developer/usr/bin/ 中生成。

使用 debugserver 需要先进行处理。因为缺少task_for_pid权限,所以调试不了其他的 app。 先通过 ssh 拷贝 debugserver

  1. scp root@iOSIP:/Developer/usr/bin/debugserver ~/debugserver // iOSIP 为手机的ip地址
  2. 复制代码

下载 ldid 与 ent,进行

  1. ldid – Sent.xml debugserver
  2. 复制代码

在使用 ssh 拷贝至手机,完成。

分析

思路:想要实现自动验证好友请求,则要拿到获取好友请求的方法,以及通过好友请求的方法。hook 获取好友请求的方法,在接收到好友请求的时候,执行添加好友的方法。 而这些主要逻辑在“新的朋友”界面。

定位好友请求的方法

UI 分析

我们知道,根据 MVC 模式,一般的方法实现都是在 ViewController 中的,所以想要拿到好友请求的方法,要先拿到当前界面的控制器。而这时候可以通过 UI 分析获得。

先打开新的朋友界面。

使用 usbmuxd 进行端口的转发(若手机不卡,可以跳过这步直接使用 ssh 进行 wifi 远程连接)

  1. python tcprelay.py -t 22:2222
  2. 复制代码

再使用 ssh 连接至手机

  1. ssh root@localhost -p 2222
  2. // ssh [email protected] 如果是wifi连接,请查看当前手机的wifi地址。
  3. 复制代码

查看微信的进程信息

  1. ps -e |grep WeChat
  2. 复制代码

Cycript 注入

  1. cycript -p WeChat // 或者是当前微信的进程号,如下所示
  2. 复制代码

启动Cycript后,使用以下命令查看当前 UI 布局

  1. UIApp.keyWindow.recursiveDescription().toString()
  2. 复制代码

因为知道当前的视图有 tableView,所以找到 tableView 的对象。从上图可以看到该对象的地址为0x18c4be00。 在使用 nextResponder()根据响应者往上找当前的 ViewController。

找到当前的控制器,为 SayHelloViewController

Log 分析

使用class-dump dump 出微信的 class 信息。

  1. class-dump -S -s -H demo.app -o ~/Document/headers/
  2. // dump 微信app的头文件保存在 ~/Document/headers/ 目录中
  3. 复制代码

再使用 theos 的 logify 工具,该工具用来注入NSLog来打印方法的入参和出参。(就是在 hook 某个类的所有的方法,并在里面加 log,并导出xm文件)

  1. logify.pl ~/Document/headers/SayHelloViewController.h > ~/Desktop/Tweak.xm
  2. 复制代码

**注意:**一般该Tweak.xm仍然无法执行,需要进行修改:

  • 去掉 .cxx_destruct 方法
  • 将 HBLogDebug 改为 NSLog
  • 去掉所有的 delegate
  • 将所有的参数对象类型改成 id
  • 去掉所有的 weak

再使用 theos 配置相关文件, 然后进行make package install 安装至手机。

重新启动微信进入新的朋友界面。

在ssh中使用ondeviceconsole打印手机的 log。

这时用另一个微信号添加自己好友。触发好友请求的方法。可以看到以下的 log

说明有好友添加请求的时候,会调用 -[SayHelloViewController OnSayHelloDataChange]

动态分析

既然已经知道了有好友请求的时候会调用OnSayHelloDataChange,那么我们可以在当前方法中进行处理,然而有个弊端,就是当有好友请求时,微信不在新的朋友界面时,是不会调用该方法的。所以我们应该在更底层的类中(假设为消息管理类)中进行处理,而怎么找到消息管理类呢?按照一般的逻辑,消息管理类中一定有方法触发了OnSayHelloDataChange,这时候就要用到 lldb + hopper 神器来找到相应的消息管理类与其处理方法了。

lldb 进行手机端调试,hopper 进行静态分析,分析OnSayHelloDataChange方法的信息,找出突破口。

先用 hopper 打开微信的二进制文件。搜索SayHelloViewController OnSayHelloDataChange方法。 可以看到当前方法在微信中的偏移地址0x14a4824。

启动debugserver 配合lldb调试

先打开微信,并使用 usbmuxd 转换端口

  1. python tcprelay.py -t 1234:1234
  2. 复制代码

再 ssh 到手机上,开启 debugserver 。

  1. debugserver *:1234 -a “WeChat”
  2. 复制代码

使用新的 Terminal 窗口,打开 lldb,连接1234端口,并查看当前微信的进程信息(一般会在所有进程的首行)。 此时会卡住一段时间。

  1. // 打开lldb
  2. /Applications/Xcode.app/Contents/Developer/usr/bin/lldb
  3. // 连接端口调试
  4. (lldb) process connect connect://localhost:1234
  5. // 打印所有进程
  6. (lldb) image list -o -f
  7. 复制代码

找到微信在当前手机上的进程内存基地址为0x000b2000(这个值不是定值)

通过以上可以找到 [SayHelloViewController OnSayHelloDataChange]方法在手机上的内存地址。即

  1. 内存地址 = 进程内存基地址 + 方法偏移地址
  2. 复制代码

使用br打断点查看

  1. br s -a “0x000b2000 + 0x14a4824”
  2. 复制代码

接着输入c继续运行,重新使用另一微信账号添加好友,会触发该断点。

使用bt查看调用栈信息,即哪些方法调用了当前的方法,找到方法的上游。(异步调用的话没办法查看)

*个表示当前的方法,可以看到在调用此方法前,该进程总共调用了3个方法。 分别计算出这三个方法在微信中的偏移量。

将这三个地址在 hopper 中查看(按快捷键g,输入地址),找到了对应的方法为

  1. // 调用的顺序为从下到上
  2. [SayHelloViewController OnSayHelloDataChange]
  3. [SayHelloDataLogic onFriendAssistAddMsg:]
  4. [FriendAsistSessionMgr OnAddMsgForSpecialSession:MsgList:]
  5. [CMessageMgr MainThreadNotifyToExt:]
  6. 复制代码

从以上方法名可以猜测

  1. [FriendAsistSessionMgr OnAddMsgForSpecialSession:MsgList:]
  2. 复制代码

是用来接收添加好友消息的函数处理,其中MsgList:后面的参数可能为消息的数组,为了证明我们可以在该方法中打个断点查看下。 使用命令register read读取寄存器地址,并使用po打印该对象。

看出r3寄存器确实是个数组,同时也得到了消息的对象为CMessageWrap 证明我们是对的。

ps: 解释下为什么要看r3,因为在 armv7 中,一个方法的调用,一般寄存器都是这么存储的:前四个参数放在r0~r3,剩下的存放在堆栈中。查看堆栈的话使用x/10 $sp 查看前10个堆栈里的对象地址。

然而FriendAsistSessionMgr这个类可能在新的好友界面进行一些初始化,且放在SayHelloViewController中,而我们想要的是不管在哪个控制器里都可以 hook 住上面的消息数组对象。因此我们往上找,[CMessageMgr MainThreadNotifyToExt:],然而里面并没有我们需要的信息。而根据类名我们推测CMessageMgr是用来管理消息的。有可能是在异步执行了消息数组的获取。

因此,重复以上步骤,使用 logify 对CMessageMgr进行 Log 分析。*终锁定了 CMessageMgr MessageReturn:MessageInfo:Event:

定位通过好友请求的方法

动态分析

既然找到了接收好友请求的方法,那么是时候找通过好友请求的方法了。 我们知道,通过好友请求的方法,是在新的朋友界面,点击接受的时候触发的。(可以通过 Log 分析,然而这里还有另一个比较快速的方法)

Cycript 定位

先通过 Cycript 打印出所有的 UI 层级。 找到接受按钮的对象,(有个技巧,我们知道当前按钮是在某个 cell 下面的,所以定位这个)。

再通过cycript将该对象的 hidden 动态修改为 1,看是否隐藏。

  1. #0x186922f0.hidden = 1
  2. 复制代码

发现按钮不见了,证明我们是对的。这时候需要找到点击按钮的事件。

而我们知道 UIButton 是继承 UIControl 的,在 Cycript 中, 可以通过allTargets 与 allControlEvents查看当前UIControl所有的targets与events,再使用actionsForTarget:forControlEvent:从而找到触发的方法。

看出所触发的方法为[ContactsItemView onRightBtnAction]

静态分析

既然拿到了方法名,那我们怎么看他具体的实现呢? 接下来就是大名鼎鼎的 hopper 登场了。 用 hopper 打开微信的二进制文件,并进行汇编与伪代码的转换。 ~~由于汇编读起来比较晦涩,所以还是进行伪代码的转换,这样效率比较快。~~点击该按钮进行转换

可以得到伪代码

上图我们看到了

  1. r10 = self;
  2. r5 = r10 + *0x33befe8;
  3. r4 = objc_loadWeakRetained(r5);
  4. r8 = @selector(onContactsItemViewRightButtonClick:);
  5. r11 = [r4 respondsToSelector:r8];
  6. 复制代码

可以得出,r11 = [r5 onContactsItemViewRightButtonClick:btn],而 r5 我们判断为 self 的代理,这个我们也可以通过在之前用 class-dump 的头文件里面搜索onContactsItemViewRightButtonClick,会发现在ContactsItemViewDelegate中。 也就是[ContactsItemView onRightBtnAction]内部调用了[self.delegate onContactsItemViewRightButtonClick:]. 而 ContactsItemView 的delegate为 SayHelloViewController

再用 hopper 定位onContactsItemViewRightButtonClick

 

看到这里估计会很懵逼不知道从何下手。这时候只要加以推测就可以了。 上图中进行了两个if判断,*个为

  1. r10 = @selector(class);
  2. r2 = loc_1c099bc(@class(CPushContact), r10);
  3. r1 = @selector(isKindOfClass:);
  4. r5 = loc_1c099bc(r4, r1, r2);
  5. loc_1c099d4(r4);
  6. if ((r5 & 0xff) != 0x0) {
  7. 复制代码

可以得出其实是执行了 if([r4 isKindOfClass:[CPushContact class]]); 而r4是什么呢?可以肯定是CPushContact对象,不然下面的代码都不执行了。我们可以根据动态分析,通过 lldb 打断点,并查看r3寄存器的对象类型,可以看到该对象为CPushContact对象。因此r4就是CPushContact对象,根据字面意思可以得到就是联系人对象。

继续看下面的代码,可以看到也进行了一次判断if (((loc_1c099bc(r6, @selector(m_bSuspiciousUser)) & 0xff) != 0x0) && ((loc_1c099bc(r6, @selector(isMMContact)) & 0xff) == 0x0)),看到了MMUIAlertView。推测是弹窗的 view ,推测如果是可疑的用户或者当前申请的好友已经是自己的好友,那就进行弹窗。而另一部分为verifyContactWithOpCode:opcode:,推测该部分为添加好友的方法。 可以通过 Log 分析或者通过 lldb 打断点,会看到都会进入该方法。且参数分别为CPushContact对象与 3。 接着继续分析verifyContactWithOpCode:opcode:方法。主要的部分如下所示。

通过分析,我们可以得到,确认好友申请,显示构造了CContactVerifyLogic对象。再构造了一个CVerifyContactWrap对象,并设置了相关属性,比如m_nsUsrName m_uiScene m_nsTicket.然后通过添加到数组中,通过CContactVerifyLogic对象的startWithVerifyContactWrap:opCode:parentView:fromChatRoom:方法发送。 代码如下:

  1. CContactVerifyLogic *verifyLogic = [[CContactVerifyLogic alloc] init];
  2. CVerifyContactWrap *wrap = [[CVerifyContactWrap alloc] init];
  3. [wrap setM_nsUsrName:contact.m_nsEncodeUserName];
  4. [wrap setM_uiScene:contact.m_uiFriendScene];
  5. [wrap setM_nsTicket:contact.m_nsTicket];
  6. [wrap setM_nsChatRoomUserName:contact.m_nsChatRoomUserName];
  7. wrap.m_oVerifyContact = contact;
  8. AutoSetRemarkMgr *mgr = [[MMServiceCenter defaultCenter] getService:[AutoSetRemarkMgr class]];
  9. id attr = [mgr GetStrangerAttribute:contact AttributeName:1001];
  10. if([attr boolValue]) {
  11. [wrap setM_uiWCFlag:(wrap.m_uiWCFlag | 1)];
  12. }
  13. [verifyLogic startWithVerifyContactWrap:[NSArray arrayWithObject:wrap] opCode:3 parentView:[UIView new] fromChatRoom:NO];
  14. 复制代码

这样我们就得到了 获取好友请求的方法与添加好友的方法。 而这里还有一个问题,就是添加好友的对象是CPushContact,而获得好友请求的对象的CMessageWrap。这里需要进行转换,而转换的方法也在SayHelloViewController中,可以重复上面的分析方法获得。


编写Tweak

通过以上的分析,将代码合并起来

  1. %hook CMessageMgr
  2. – (void)MessageReturn:(unsigned int)arg1 MessageInfo:(NSDictionary *)info Event:(unsigned int)arg3 {
  3. %orig;
  4. if (arg1 == 332) { // 收到添加好友消息
  5. NSString *keyStr = [info objectForKey:@“5”];
  6. if ([keyStr isEqualToString:@“fmessage”]) {
  7. NSArray *wrapArray = [info objectForKey:@“27”];
  8. [self addAutoVerifyWithArray:wrapArray];
  9. }
  10. }
  11. }
  12. %new
  13. – (void)addAutoVerifyWithArray:(NSArray *)ary {
  14. [ary enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
  15. CPushContact *contact = [%c(SayHelloDataLogic) getContactFrom:obj];
  16. if (![contact isMyContact] && [contact.m_nsDes isEqualToString:autoVerifyKeyword]) {
  17. CContactVerifyLogic *verifyLogic = [[%c(CContactVerifyLogic) alloc] init];
  18. CVerifyContactWrap *wrap = [[%c(CVerifyContactWrap) alloc] init];
  19. [wrap setM_nsUsrName:contact.m_nsEncodeUserName];
  20. [wrap setM_uiScene:contact.m_uiFriendScene];
  21. [wrap setM_nsTicket:contact.m_nsTicket];
  22. [wrap setM_nsChatRoomUserName:contact.m_nsChatRoomUserName];
  23. wrap.m_oVerifyContact = contact;
  24. AutoSetRemarkMgr *mgr = [[%c(MMServiceCenter) defaultCenter] getService:%c(AutoSetRemarkMgr)];
  25. id attr = [mgr GetStrangerAttribute:contact AttributeName:1001];
  26. if([attr boolValue]) {
  27. [wrap setM_uiWCFlag:(wrap.m_uiWCFlag | 1)];
  28. }
  29. [verifyLogic startWithVerifyContactWrap:[NSArray arrayWithObject:wrap] opCode:3 parentView:[UIView new] fromChatRoom:NO];
  30. }
  31. }];
  32. }
  33. 复制代码

总结

本文为本人根据iOS应用逆向工程 第2版的内容进行分析,由于整个逆向流程有点繁琐,有时候也不是只要分析一次就可以成功的,需要反反复复的进行UI分析、Log分析、lldb 分析。

友情链接: SITEMAP | 旋风加速器官网 | 旋风软件中心 | textarea | 黑洞加速器 | jiaohess | 老王加速器 | 烧饼哥加速器 | 小蓝鸟 | tiktok加速器 | 旋风加速度器 | 旋风加速 | quickq加速器 | 飞驰加速器 | 飞鸟加速器 | 狗急加速器 | hammer加速器 | trafficace | 原子加速器 | 葫芦加速器 | 麦旋风 | 油管加速器 | anycastly | INS加速器 | INS加速器免费版 | 免费vqn加速外网 | 旋风加速器 | 快橙加速器 | 啊哈加速器 | 迷雾通 | 优途加速器 | 海外播 | 坚果加速器 | 海外vqn加速 | 蘑菇加速器 | 毛豆加速器 | 接码平台 | 接码S | 西柚加速器 | 快柠檬加速器 | 黑洞加速 | falemon | 快橙加速器 | anycast加速器 | ibaidu | moneytreeblog | 坚果加速器 | 派币加速器 | 飞鸟加速器 | 毛豆APP | PIKPAK | 安卓vqn免费 | 一元机场加速器 | 一元机场 | 老王加速器 | 黑洞加速器 | 白石山 | 小牛加速器 | 黑洞加速 | 迷雾通官网 | 迷雾通 | 迷雾通加速器 | 十大免费加速神器 | 猎豹加速器 | 蚂蚁加速器 | 坚果加速器 | 黑洞加速 | 银河加速器 | 猎豹加速器 | 海鸥加速器 | 芒果加速器 | 小牛加速器 | 极光加速器 | 黑洞加速 | movabletype中文网 | 猎豹加速器官网 | 烧饼哥加速器官网 | 旋风加速器度器 | 哔咔漫画 | PicACG | 雷霆加速