Sexy beautiful girl sitting on a floor with apple by artur k on 500px.com
其实不太懂iOS
其实对iOS,我理解并不深刻,几个产品的iOS端迭代都是的从Android端(保护键盘,从我做起,下文都称为「安卓」)的需求直接跟进开发的。除了一些明线的区别,基本没有在iOS端上下太大功夫。
不过随着工作越来越忙,越发现,不折腾会死星人的激情渐渐褪去,所以痛下杀手,入了iPhone,开始以iOS作为日常主力系统来使用,也渐渐开始对iOS熟悉了起来。
本文的主要从产品角度,介绍了iOS沙盒基本原理,App间通信的常见方法,还有若干其他同行们在这样的机制下为了提升用户体验的奇淫巧技,希望同大家一同学习。
iOS的沙盒机制
可能很多人都听过说沙盒,但是不明白具体沙盒是什么东西,所以第一个问题:
什么是沙盒?
沙盒,即sandbox(显然是直译,哈哈哈哈),也可以叫沙盘、或者沙
箱,就是那种可以再上面随便乱涂乱画,然后随便一抹就回到原始状态的东东。
概括来说,沙盒可以理解为一种虚拟环境的技术的一种,通过为每一个需要运行的程序,建议一个独立的环境来隔离可能造成的伤害破坏。
不同应用场景下的具体沙盒技术会有些区别,比如在操作系统中,为了检查木马而设计的沙盒:如果代码需要对关键文件进行操作时,沙盒可以重定向操作的文件,再比如未知程序说要看《海天盛筵.avi》,然后沙盒就拿着《葫芦娃全集.avi》说,这就是你要的,拿去看,从而保护系统的关键文件的安全。
回到iOS,其每一个App的有一个独有的空间,起本质就是一个沙盒:
- 每个应用程序都有自己的存储空间
- 应用程序不能翻过自己的围墙去访问别的存储空间的内容
- 应用程序请求的数据都要通过权限检测,假如不符合条件的话,不会被放行。
iOS这么做的原因很简单,就是为了安全和控制。举几个例子,让大家理解起来更加清晰一些:
- 所有图片相关的应用,需要拿你系统相册的时候,都回弹出一个请求访问「照片」授权提示。权限本身很好理解,但是背后,其实「照片」是一个独立App(当然因为是系统应用,还是小区别)。iOS中,系统相机拍摄的所有照片都是直接放入「照片」这个App中,而我们知道每个App都是一个沙盒,因此,如果没有得到授权,其他应用是无法读取「照片」这个App中的照片文件的,甚至第三方拍照App在没有授权的情况下拍的照片也只能存在自己的沙盒空间中,无法放入到系统相册。
简单来说,「照片」可以理解为一个独立的App,「美图秀秀」之类的App也是个独立的App,除非得到授权,「美图秀秀」们是拿不到「照片」里的数据的。
- 习惯了PC或者安卓的用户,第一次拿到iOS设备时,最常有的困惑,就是怎么往手机里传音乐还有视频、照片?其实产生问题的原因就是,大家不知道存在沙盒机制,习惯上还是要往一个文件夹里放东西,然后大家都能访问了。在iOS里音视频App的空间也是独立的。
比如,如果你想把电影到到暴风影音,那么就要通过iTunes或者其他方式将视频文件导入到暴风影音的沙盒环境中。
PS:如果在家庭网络的环境下,更好的方式建立类似通过NAS等设备建立流媒体播放系统,upnp、samba、airplay爽歪歪,额,扯远了。
- 前段时间的Xcode Ghost事件,黑客通过在Xcode编译器里植入代码,然后App运行自动向黑客服务器上传数据。幸好有沙盒的机制存在,除了一些设备型号,地区等非敏感数据外,用户隐私数据都得以保护。当然,被黑的App自身数据本质上还是有危险的。
我觉得这件事情告诉我们,网络环境的科学与否(你懂得),影响每个人的生活,即使你不上国外网络。要是网络好,直接官网下Xcode可能就没事了,我猜的,请不要给我寄快递。
- iOS下为什么没有清理软件,没有第三方通话记录管理软件,都是这个原因,根本没权限,苹果不开放的话,第三方自然没得做。
当然如果越狱的话,那就当我什么也没说。越狱软件的权限是系统级的,对于其他App来说,只能淡淡的说一句,大家快来看上帝。
App间通信
既然没有App都处在一个沙盒当中,那么他们之间又如何通信呢?下面的内容主要是介绍,大家了解下就好,代码的问题,还是交给程序猿们吧,要尊重社会分工呀,科科。
目前来看,常见的两种方式(我脑海中的「常见」,当然还有其他办法,可以问问iOS的开发大哥们,或者读文档,泪目):
-
使用UIActivityViewController
UIActivityViewController 是iOS 6开始提供的系统方法,目标就是解决应用间数据分享的问题。
说类名大家可能有点懵,那么就放截图,科科:
是不是很熟悉 -
自定义URLScheme
看名字可能可以猜出来,本质上就是第三方应用绑定的URL Scheme,当浏览器或者其他第三方调用这个URL时,就能够启动绑定的App,同时传递对应的数据。目前来看这是最常用的App间通信方式。听上去很炫酷,其实大家也一定经常见到,比如在使用Safari浏览网页时看到,如图:
是不是很炫酷?
不过由于最初设计上的问题,URL Scheme的绑定并没有经过校验,系统App的优先级高于第三方,但是第三方的多个App注册同一个URL Scheme的话,可能会有些问题,感兴趣的同学可以参考原文:
《iOS URL Scheme 劫持-在未越狱的 iPhone 6上盗取支付宝和微信支付的帐号密码》
PS :
- 安卓端的App间通信的核心是Intent,安卓的三个基本组件Activity,Service和Broadcast Receiver都是通过Intent机制激活的,不同类型的组件有不同的传递Intent方式。
- iOS的应用间通信的设计本身貌似不是很强大,和安卓的各种唤醒,各种应用联动比还是有些差距。这主要是设计理念的不同,从效果来看,iOS反倒是给了用户清净,不用像安卓用户那样整天纠结App莫名其妙启动,造成耗电、跑流量的问题。
突破沙盒的奇淫巧技
沙盒机制虽然好,保证了iOS端用户体验的安全性,已经第三方App运行的可控性。但是越安全,越可控,在功能设计上受到的限制也就越多。在这样的背景下,iOS端的产品经理和开发大哥们,有时也必须想一些办法「突破」iOS的沙盒限制
比如,iOS上最受人诟病的中文输入法,在Apple开放接口之前,是普通用户越狱的最大原因之一。
举一个经典案例——骚扰拦截 on iOS
再比如,目前国内手机最大痛点之一,骚扰电话的拦截,iOS在功能上和安卓完全是两个数量级的。现在基本国内大厂的手机都自带了骚扰拦截模块,通过云端的骚扰电话标记库,对骚扰电话、垃圾甚至诈骗短信进行过滤。像比如呼死你这种恶劣骚扰,iOS除了打开勿扰模式甚至飞行模式,基本没辙,而勿扰模式相当于一种白名单模式,还无法有电话识别标记的能力,在实际功能上与安卓的体验差别太大,更别说有如360手机卫士等长期耕耘这块功能的第三方安卓App的支持。
由于沙盒机制,在来电的时候,iOS下除了拨号以外,其他App根本不知道当前状态,也就无从下手解决。而安卓的地方应用可以绑定事件,当来电时,可以获取通过Broadcast 得到相应的信息,从而开始对号码进行识别并显示。(当然,自动挂断之类的功能第三方需要root,或者系统级权限的应用才行)
针对iOS骚扰电话的问题,国内最早的奇淫巧技,是搜狗的号码通发布的,其实就是把原本在云端的骚扰电话库,经过筛选和定制,以联系人的方式存到手机通讯录中,联系人姓名就叫「骚扰电话」之类来,这样,一旦骚扰电话拨入,就会显示标记的内容。
这个方法尽管很奇葩,但的确是目前唯一有效的方法了,后续360、触宝等团队都对这个方案进行了优化,并发布到自己的产品中。
实际是用上来说,差强人意吧,只能说是一种临时方案。
这个方案有两个问题
会让通讯录变得无比大,我的2011 MBA,打开通讯录的时候就因为某应用导入太多号码而死机。唉,手机没挂,电脑挂了,有哪位官人捐助我买台新电脑咩?请私信~~2333。
另外在优化之前,很多社交软件都会读取通讯录作为好友数据的推荐基础数据,结果这样做,直接把骚扰电话都当联系人处理,突然间,你有了一堆卖保险的好友,哎,崩溃(这个问题貌似现在已经解决了)。
其实还有很多其他产品在突破iOS沙盒上有过不错的案例,这篇文章页有若干介绍:
产品经理们是如何越过 iOS 沙盒机制的?
PS:
由于淘宝和微信的爱恨情仇(具体我就不说了,我也不知道内幕),即使iOS本身不是障碍,由于人为原因依然相互屏蔽。于是淘宝想了其他方案:
- 生成纯文本分享内容,利用微信传播。
- 用户根据提示复制文本打开淘宝。
- 淘宝读取iOS剪切板。
- 淘宝解析内容并执行相应的页面逻辑。
哎,冤冤相报何时了,早日和解吧
到了该总结的时候了
其实作为产品经理,我个人觉得不需要知道太多技术细节,但是对于一些技术内容的掌握,既可以帮助提高沟通效率,也可以对需求的落地流程有更多的认识。
然后嘛,对于iOS,特别是交互设计这块,我也是新人,很多时候太忙,接就借鉴( 额,原型设计不能算抄的吧,我还是闭嘴吧 )其他产品的设计,一直没有时间好好看看,学习学习,希望未来能有进步。
团队设计师大哥:「这种事情靠天赋,急不来~~2333」
附:
- 上一篇日志《产品经理的技术修养之路 - Android适配篇》
- 文集目录,目前完成两篇《产品经理的技术修养之路》