长沙戴维营教育学习博客

Coding forever。

从零创建ios调试证书和远程消息推送

前言

iOS开发中,iOS模拟器调试功能已经相当强大,但是涉及到和设备相关功能调试时,还是经常需要进行真机调试,而与Android不同的是,苹果由于对安全与隐私的保护,对权限管控的比较严谨,凡是要在真机上运行的App都需要经过授权签名后才可以.这就使得我们在开发测试阶段进行真机调试相对不那么方便了.苹果对调试阶段在真机运行的App和上架或者发布出去的App在真机上运行的签名是分别处理的, 分别用开发证书(Development)和发布证书(Distribution或者Production)进行代码签名.而且前提是需要有苹果的App开发者账号,每年$99的价格是"相当"便宜的.但是并不是每一个戴维营教育的iOS学员或者iOS开发从业者都有开发账号.在之前的Xcode版本里,其实有了开发者账号只要创建了对应AppID(指定的或者通配符的),要真机调试一个App也还是很方便的,完全可以让Xcode去自动Fix Issue来解决缺少调试证书Development Certificate和对应的配置文件Provisioning Profile的问题. 这个在2015年10月正式发布Xcode7之前,对于一个初学者是相对有一定麻烦的.自Xcode7发布后,苹果放出了使用App Store购买应用的Apple ID用户(非Apple开发者账号)也可以免费真机调试的功能.这一举措大大降低了我们戴维营教育iOS学员/iOS开发初学者进行iOS真机调试的门槛. 到如今Xcode7出来之后,在这方面的方便性简直是完全没感觉. 不过苹果在放开这些方便性的功能情况下是有一定前提的,那就是一般的App是可以方便的进行真机调试,但是如果用了苹果的一些其他服务(Game Center,In-App Purchase,Push Notification)功能的App如果也这样自动去采用Fix Issue生成的通用配置文件进行真机调试的话,那这些个服务是不会正常工作的. 所以如果要调试App的这些服务时,就需要为其单独创建配置文件(Provisioning Profile).

Http之cookie和session机制与安全防护

1. Cookie和Session介绍

Cookie和Session是为了在无状态的HTTP协议之上维护会话状态,使得服务器可以知道当前是和哪个客户在打交道。本文来详细讨论Cookie和Session的实现机制,以及其中涉及的安全问题。 因为HTTP协议是无状态的,即每次用户请求到达服务器时,HTTP服务器并不知道这个用户是谁、是否登录过等。现在的服务器之所以知道我们是否已经登录,是因为服务器在登录时设置了浏览器的Cookie!Session则是借由Cookie而实现的更高层的服务器与浏览器之间的会话。

Cookie是由网景公司的前雇员Lou Montulli在1993年发明的,现今Cookie已经广泛使用了。

Webrtc之apprtc与信令服务器构建

0.前言动机

早在去年初(2015年2月)的时候,戴维营教育由于课程需要讲WebRTC实时音视频聊天技术,就写过一个教程一步一步搭建一个WebRTC的后台服务器AppRTC的教程,但是由于Goggle官方代码有改变,导致大部分网友严格按步骤来操作不成功.

用polipo把shadowsocks转为http代理

1.polipo和shadowsocks简介

shadowsocks代理我想大家是耳熟能详了,在这里就不作过多的讲述. 不过有一点是需要指出的是,shadowsocks的1080代理端口的代理服务类型是传输层的socks代理.有些时候我们需要利用shadowsocks这个科学上网的隧道,同时需要HTTP代理的时候,我们就不得不想办法了. 我在这里就介绍另一款开源软件--polipo,一个小型快速的HTTP Web缓存代理服务器,还可以指定上级代理为socks类型.我们就利用这一点功能来实现我们的需求: 把shadowsocks的代理转换为http代理,让socks代理和http代理并行为我们提供科学上网服务. 这样尤其使得在unix-like系统中,很多命令行网络程序默认只能支持通过指定http_proxy环境变量来设置网络代理.这样利用polipo就把我们人人喜欢的shadowsocks服务科学上网功能扩展到http代理服务了.

深入理解ios开发中的bitcode功能

前言

做iOS开发的朋友们都知道,目前最新的Xcode7,新建项目默认就打开了bitcode设置.而且大部分开发者都被这个突如其来的bitcode功能给坑过导致项目编译失败,而这些因为bitcode而编译失败的的项目都有一个共同点,就是链接了第三方二进制的库或者框架,而这些框架或者库恰好没有包含bitcode的东西(暂且称为东西),从而导致项目编译不成功.所以每当遇到这个情况时候大部分人都是直接设置Xcode关闭bitcode功能,全部不生成bitcode.也不去深究这一开关背后隐藏的原理.中枪的请点个赞.

Ios应用内购买之应用下载

今天有人在潜心俱乐部(divein.club)提问:能否实现一个iOS版的手机应用助手,可以在应用内购买和下载应用,而不需要跳转到App Store(问题)。当时第一反应就是要做一个类似豌豆荚、360手机助手之类的应用商店,所以直接否定了。后来 @souhu 指出用SKStoreProductViewController可以实现,因此在这里总结和记录一下。

Protobuf在ios上的使用

介绍

在不同平台通信的时候,首先需要将对象进行序列化。iOS平台上我们常用NSKeyedArchiver进行归档,当然也可以将数据处理为JSON或者XML格式。NSKeyedArchiver只能在iOS/Mac平台使用,因此它归档的二进制数据不适合于在不同平台之间使用。JSON和XML虽然由于容易维护,易读而应用比较广泛,但是对数据的利用效率都不是高。Google提出了 Protocol Buffers 作为一种跨平台、语言无关的序列化数据格式。Protocol Buffers提供代码生成工具,能够根据定义好的数据格式生成不同语言的代码,然后集成到项目中使用。Protocol Buffers目前有两种格式:proto2和proto3。Protocol Buffers支持Java、Python、C++、Objective-C等代码的生成。

Ios和tvos按需请求资源简介

介绍

与iOS 9和watchOS 2一起,苹果引入了一套新的内容分发API,以便节约设备空间,这就是按需加载资源。通过使用按需加载资源,我们可以将特定的应用程序资源托管在苹果的服务器上,然后在需要的时候进行加载。在这个教程中,我将通过开发一个图片查看应用介绍一下按需加载资源的基本用法。

Afnetworking+nginx+https服务器通信

摘要

1.介绍iOS平台用AFNetworking与HTTPS后台接口进行安全通信。 2.介绍后台自签名证书制作步骤。 3.以及Linux平台Nginx配置HTTPS协议接口的Web站点。

Tvos多层图片的使用

Apple TV中的按钮或者Cell在获取焦点后,可以有一些有意思的阴影动态效果。这个效果可以通过视差图片很容易就实现。

Tvos模拟器遥控的快捷键

tvOS的模拟器需要通过遥控器模拟器才能操作,而不能直接在屏幕上点击,这与iOS和Mac是完全不一样的交互方式。虽然说物理的遥控挺好用的,但是模拟的遥控器却真是很难用,很多地方都需要按住Option键。其实苹果公司还提供了一些快捷键可以直接通过键盘进行操作。当然,并不是所有的操作都有对应的快捷键的,大家如果发现下面所没有的功能,欢迎纠正。

增加bitcode支持编译第三方框架

iOS 9开始支持bitcode,能够让用户按需安装设备对应的二进制,从而减少占用手机存储空间。Xcode 7默认开启的bitcode的支持(ENABLE_BITCODE = YES)。但是许多第三方框架并没有及时更新,尤其是大量使用的C语言开源代码。它们一般采用Makefile或者CMake编译,对大多数iOS开发者来说简直就是天书。实际上添加bitcode支持非常简单。

编译mupdf的ios版

MuPDF是一个强大的开源PDF框架,支持GPL和商业授权。下载地址: bash git clone --recursive git://git.ghostscript.com/mupdf.git

从masonry中学到的c++and关键字

一直在用Masonry对视图进行自动布局(AutoLayout),它的串联设置的方式很方便,多个相同的约束条件可以用and进行连接。今天@大茶园丁在测试MobileVLCKit时突然发现and变红了,貌似是一个关键字,并且编译也通不过。于是百度确认了一下,结果在@余璜同学的博客上早就介绍了(顺便汗颜了一下,一直说的坚持写博客)。

戴维营教育ios笔试题一

笔试是招揽人才的第一道关卡(简历筛选除外),它能够较全面的考察一个人对基础知识的掌握程度以及解决问题的能力。更多iOS笔试面试题请上潜心俱乐部

1. 数组NSArray用的是什么排序算法?

七牛云存储文件上传与下载

“陪你”校园陌生人交友APP中使用了七牛云存储,因此关注了一下这个人气很高的公有云平台的使用。七牛使用K-V的方式存放文具。在上传文件的时候,需要保证文件名是唯一的,当然,也可以不提供文件名(key),系统会自动将文件的MD5作为key。但是有一个问题,这样的话,不同用户就不能够上传相同的图片了,因为HASH值是一样的,上传失败。七牛给了我们一套使用上传策略(PutPolicy)计算上传令牌(UploadToken)的方法,下载同样需要下载令牌。这些值都是通过七牛提供的AccessKey和SecretKey计算出来的。Token的计算可以在客户端也可以在服务器端,但是为了安全起见,我们一般会将Token的生成过程放在服务器,而不是放在客户端。

使用post方法上传文件的两种做法

项目需要使用HTTP协议中的POST方法上传文件,稍微总结了一下,将过程贴出来,方便以后参考。有两种方法,第一是使用NSMutableURLRequest完全从零开始设置,可以加深对HTTP协议的理解;第二种是直接使用别人封装好的代码,如AFNetworking。

使用swig集成lua

项目需要在应用中集成Lua脚本,这个问题不大,因为Lua解释器是用C写的,直接将源码引入工程就可以了。麻烦的是实际编写代码的时候,经常需要在Lua中调用C的一些函数。当然可以自己编写中间代码进行黏合,但抱着能省就省的心态,找到了SWIG(Simplified Wrapper and Interface Generator)。SWIG允许C/C++代码向多种脚本提供接口,包括Ruby、Perl、Python等。下面简单介绍一下如何用SWIG将C语言函数和数据类型向Lua公开。在Mac下面需要事先安装SWIG。我们可以使用HomeBrew或者MacPort进行安装。

Html5 更新信息

Html5 有那些更新

这里我只做一个简单的介绍,后面的博客我详细介绍各个知识点

Objective C设计模式之外观模式facade

一个框架中如果包含的类比较多,或者功能比较复杂的情况下,可以通过一个较辅助类为一些常用的情况提供简单的接口。这样客户在使用这个框架的时候既可以比较简单的应付常见的场景,又可以使用框架中的内实现符合自己要求的功能。这就好比买电脑的时候,即可以买品牌机,又可以自己买配件组装。下面就拿买电脑来举例。

Xcode 6.3 小bug临时解决方法

昨天刚升级Xcode 6.3,看更新日志,增加了Swift 1.2的支持,不过也引入了一些“临时”性的Bug,估计很快就会被苹果修复。方便起见,在这里先记录一下。

Unity3d的ios插件开发

Unity3D是一个非常强大的跨平台游戏引擎,但还是也免不了需要访问平台本身的一些功能。Unity3D并没有将平台方方面面都创建对应的API,尤其是比较新的一些功能。这时需要我们自己编写本地插件来解决,本文主要介绍如何开发Unity3D的iOS本地相册插件GlobalBrowser(能够自动扫描Documents目录,并且使用照片墙展示,其中展示功能使用了一个Objective-C的开源控件MWPhotoBrowser)。

准备工作

本文使用Unity 5和Xcode 6.2进行开发,目前只有Unity 4.6和Unity 5支持arm64,并且只有Unity 5支持在插件中使用子目录。我们有三种使用Objective-C代码的方式:源码、静态库(.a)和框架(iOS 8),这一次我们选择纯源码的方式。

本地代码编写

1、新建iOS的项目PhotoBrowser,在项目目录下创建Library文件夹。

Mac os x 10.10上使用quicktime录制iphone屏幕

在上课或者出去宣讲的时候,经常需要在投影仪上演示APP,甚至需要将屏幕录制下来(貌似游戏演示更需要这功能)。以前一直在寻找各种办法,其中使用最多的就是通过在Mac上安装一个AirPlay服务器软件,然后使用iOS的AirPlay功能将屏幕投影到电脑上。但是由于苹果没有直接在Mac上提供这样的能力,因此只能去下载AirServer之类的软件。它们一般都不便宜,并且稳定性也不是太好。不过从Mac OS X 10.10开始,大家终于不用担心这件事情了。Yosemite的QuickTime(对,就是那个播放器)提供了录制摄像头、屏幕录像以及我们将要介绍的iPhone或者iPad屏幕录像功能。

嵌入式开发工具之串口模拟

串口编程是嵌入式开发最基础的工作之一,很多后续开发都是在读写串口的基础上进行的。程序调试过程中,交叉编译、烧写程序耗费的时间是相当可观的,如果能在本机解决大部分调试问题,仅仅在关键节点时再到板子上进行适配无疑会大大提高开发效率。毕竟高效、优雅是每个开发者都应该培养的素质,而且是和收益直接相关的素质。大多数情况下,通过本机模拟串口,减少实机调试的次数,对提高嵌入式开发的效率是相当显著的。

Wrtnode用摄像头做广域网视频监控

WRTNode用摄像头做广域网视频监控

本节目的: - 在WRTNode上驱动USB摄像头 - 在局域网上PC电脑上通过浏览器进行视频观看 - 在广域网上使其他人用过浏览器进行视频观看

为mac自带的emacs添加ruby模式

Mac自带的Emacs还是v22,实在是有点老,连现在流行的Package Manager都没有。由于它没有自带的Ruby mode,因此也不会为Ruby提供语法高亮了。不过如果是熟悉Emacs和elisp的大神,自己写个插件也不错。但是对于我这种玩票性质的小白用户来说,实在是太难了。不过幸亏这是一个广为人知的问题,Google上有许多答案。其中Diamond的这篇Adding Ruby Mode to Emacs in Mac OS X操作比较简单。下面是它的中文版。THX to Diamond...

Emacs常用快捷键笔记

一直用VIM,尝试了好几次Emacs都被它“多得像天上的星星”一样的快捷键给吓倒了。这几天终于下定决心再次尝试。将它的Tutor练习了一下,顺便对常用快捷键做了一下笔记,方便随时查看(在写这篇笔记的时候正对着快捷键列表^_^)。

Macosx Setdns

通过C语言接口在Mac App内部对系统的DNS配置进行修改。

Coredata第三课 数据查询

问题

小明班上最近月考了,老师大明想要给一部分优秀的同学进行奖励,而另外一部分要进行查漏补缺。大明决定将总分排名前10的,各科成绩排名前10的以及排名最后10名的按从高到低的顺序找出来。以前大明都是在家用笔一个个划出来。不过最近大明在长沙戴维营教育接受了残酷的iOS培训,决定装逼一把,给自己的“肾6+”开发了一款应用。只要各科老师将成绩提交给他,就可以直接看到这些学生的成绩了,并且各种曲线、柱状图、饼图。每个学生的情况就好比没穿衣服一样”透明“。现在的问题是,大明并不想自己去实现各种筛选和排序算法。

Coredata第一课 认识coredata

问题

在iOS/Mac中我们有许多方式去持久化存储数据:NSUserDefault、Key chain、C语言文件接口、NSFileHandle、基础框架中的write方法、归档等等。在实际应用中,我们经常需要将这些数据按一定格式转换为对象,并且进行一定的筛选等操作然后再使用,显得不是很方便。Apple给我们提供了Core Data框架,可以直接按对象的方式操作数据,让这些变得非常简单。

C++教程之auto关键字的使用

一、auto关键字的前世

从C语言开始,auto关键字就被当作是一个变量的存储类型修饰符,表示自动变量(局部变量)。它不能被单独使用,否则编译器会给出警告。

使用pushmebaby测试app的远程推送功能

什么是远程消息推送功能

苹果给iOS和Mac添加了消息推送的功能,使得我们可以通过后台服务器给应用程序(APP)发送消息,不管APP是否正在使用,比如邮箱的来件提示功能。这项服务被称为Apple Push Notification service(APNs)。里面一共涉及到四个角色:APP、设备、APNs和应用后台服务器(Provider),其中APP、后台服务器和APNs之间使用deviceToken唯一的标识一个用户。

Spritekit教程第四课 精彩的世界

问题

在实现《Fake Stick Hero》的过程中,需要绘制一些黑色的矩形作为忍者站立的地方。这些柱子都是纯黑色的,并且大小会随机变化,因此选用SKSpriteNode或者SKShapeNode来实现。可是使用如下代码创建柱子的时候,看不到柱子出现。

Cocoapods使用简介

什么是CocoaPods?

在开发一个应用的时候,我们通常很少从零开始编写所有功能代码,而是大量的使用已有的开源代码来减少工作量和提高开发效率。但是对于这些代码的维护通常是一个麻烦的事情:缺少一个统一的开源库查找平台、维持更新不方便等。CocoaPods是一个用于iOS、Mac开发的源代码依赖关系管理工具。它通过创建和更新Xcode的workspace来为我们的项目提供所需库的支持。它能够帮助我们解决代码库之间的依赖关系,并且提供了开源代码搜索功能,通过编辑和使用Podfile将多个开源库整合到项目中。

Spritekit之坑一 Sprite不显示

问题

在实现《Fake Stick Hero》的过程中,需要绘制一些黑色的矩形作为忍者站立的地方。这些柱子都是纯黑色的,并且大小会随机变化,因此选用SKSpriteNode或者SKShapeNode来实现。可是使用如下代码创建柱子的时候,看不到柱子出现。

提取assets.car中的图片

iOS应用中图片资源的提取

这两天需要写个Demo来讲解SpriteKit的使用,准备“抄袭”《Stick Hero》(英雄难过棍子关),因此想从里面提取一些图片资源出来使用。遗憾的是,解压下载后的ipa包,结果发现里面的图片都是处理过的,都是“.pack”文件。这就麻烦了,咱又没有设计师。不过还好的是App Store里还有一个赤裸裸的抄袭作品,同样解压后,里面没有发现图片资源,只有一个Assets.car文件。到了这一步,接下来的事情就简单了,因为Assets.car是Xcode的图片集(Images.xcassets)打包后生成的。虽然Apple并没有为我们提供之间查看Assets.car的功能,好在Google一下就会在Github上找到多个工具。

Jquery第八课 操作元素

获取和改变元素

在选择元素后,jQuery提供了很多从元素里获取信息或者修改元素的方法。我们通过对下面的HTML进行操作来熟悉这些方法。

Cocos2d 3.x中button的使用

在Cocos2d-x 3.x中有使用cocosGUI的Widget取代cocos2d-x extension中的控件的趋势,并且开始采用C++ 11中的一些新特性,比如Lambda表达式。下面用cocos2d::ui::Button的使用来展示一下cocosGUI中Widget的使用以及事件的添加。

增强现实第一课 环境设置

简介

增强现实是在虚拟现实的基础上发展而来的,主要是在现实场景上添加虚拟物体或者信息,将虚拟场景与现实场景进行叠加,增加使用者对世界的感知,又称混合现实。

Cordova开发第一课 环境准备

简介

Cordova是一个Adobe的开源的混合型(Hydrid)移动应用开发框架,现在由Apache基金会管理。它的前身是PhoneGap开源框架,现在这两个品牌都在使用,不过基本上除了名字以外,其它都相同。Cordova为HTML 5代码提供了对本地资源的访问能力,能够充分发挥HTML 5的跨平台能力和本地代码在性能以及资源访问上的优势。到目前为止,Cordova已经支持了所有的主流移动平台,可以减少企业在移动应用开发上的成本和时间。

Jquery第四课 Javascript中this的用法

this关键字的使用

在JavaScript中使用this关键字表示调用方法的对象,这与大部分面向对象语言是一样的。但是由于callapplybind等函数的影响,我们可以改变this所代指的对象。

Jquery第三课 Javascript基本语法

注释

JavaScript支持与C语言相同的注释方法,单行注释(//)和多行注释(/* */)。代码中的注释在执行的时候将被忽略,只是起到说明代码的功能,便于代码维护和理解。

Jquery第二课 Javascript基础

基础知识

网页由三个部分组成:HTML、CSS和JavaScript。它们分别完成不同的功能,其中HTML描述页面内容、CSS负责内容的展示、JavaScript添加交互功能和动态效果。三者一起组成一个完整的Web页面。

Jquery第一课 简介

获取jQuery

jQuery是一个开源的Javascript框架,在jquery.com上提供了各版本jQuery的下载以及详细的开发文档。每个版本一般都提供两个选择:未压缩版和压缩版(min)。它们的功能完全一样,只是压缩版删除了空白字符和格式,体积更小。一般在开发的时候为了方便查看源码,使用未压缩版,而在发布的时候改用压缩版。

Mantle Introduce

Mantle

Mantle是一个iOS模型框架,它为对象和JSON之间的相互转化提供了一种简便的方法。这在处理网络数据的时候非常有用。 下面我们将看一下MTLModelMTLJSONAdapter以及为什么你将会考虑在下一个项目中使用Mantle。