谷歌手机使用私人iPhone API

Google刚刚发布并广为宣传的谷歌手机iPhone应用程序更新功能为语音搜索功能提供了一些非常聪明的交互设计屏幕上有一个按钮可以点击以手动启动语音搜索,但是,如图所示示例视频,只需将iPhone抬到耳边即可启动语音搜索。

要触发此自动语音提示,您必须:

  1. 移动iPhone。
  2. 触发iPhone顶部扬声器旁边的接近传感器。

您需要按此顺序执行这两项操作。1语音提示永远不会仅由动作触发,也不会在未先移动手机的情况下覆盖接近传感器触发它的唯一方法是移动手机然后触发接近传感器它非常聪明,最终的用户体验非常好。

但这就是阴谋:iPhone SDK中没有公共API用于以这种方式使用接近传感器。

正如您可能想象的那样,考虑到App Store中加速度计驱动游戏的数量,有很多公共API调用可以从iPhone的加速度计访问数据但是,应用程序可以用接近传感器做的唯一事情就是打开和关闭它When the proximity sensor is on, the screen turns off and stops accepting touch input when you cover the sensor (typically with your head, when holding the phone to your ear to, say, make a phone call, but you can just as easily trigger it by covering the sensor with your finger)默认情况下,接近传感器关闭,绝大多数应用程序都是这样。

如果您是注册的iPhone开发人员,则可以阅读相关文档为了proximitySensingEnabled属性在UIApplication类参考中一个应用程序可以检查此属性的状态(是打开还是关闭?),并可以切换它,但就是这样应用程序打开接近传感器后,应用程序永远不会发现它何时或是否已实际使用触发接近传感器时,无法通知应用程序。

没办法,就是通过公共API。

如果你使用命令行之类的东西字符串用于检查UIKit框架的实用程序,您可以看到有一个未记录的(因此私有的Apple)方法命名proximityStateChanged如果要将FairPlay DRM从当前的Google移动应用程序二进制文件中删除 - 当然,你不会这样做,因为你不应该删除FairPlay DRM,但我只是说如果one were to do this — a class dump of the application binary would show that Google Mobile does in fact implementproximityStateChanged

So, (a) Google Mobile is using an undocumented API, and (b) to my knowledge, there is no way to duplicate the behavior of Google Mobile’s “just lift the phone to your ear to trigger the voice prompt” feature using only the public APIs in the iPhone SDK不用说,使用未记录的API违反了iPhone SDK准则按规则播放的开发人员无法执行Google正在执行的操作。


I can think of three explanations for how Google got away with this:

  1. Apple批准此Google移动更新的任何人都没有意识到它正在使用私有proximityStateChanged方法。

  2. 无论谁在Apple批准它知道它使用私有API,但无论如何批准它。

  3. Google寻求并获得Apple的许可使用此方法。

我不相信#3是这样的我非常确定App Store的批准程序对于Google来说和其他人一样都是黑盒子。

这留下了#1和#2,其中任何一个都表明Google移动团队遵循的格言是,要求宽恕比获得宽恕更容易如果是这种情况 -如果- 它可以解释为什么谷歌开始宣传语音搜索功能几天前它实际上出现在App Store中约翰马可夫在“纽约时报”上刊登的宣传内容压力在Apple上接受该应用程序如果Apple内部有关于是否允许这样做的任何内部辩论,这可能解释为什么该应用程序需要花费几天才能出现在商店中,而不是Markoff的故事表明谷歌预期。

#1是可能的没有任何技术障碍阻止第三方iPhone应用程序调用未记录的API,我听说有几个应用程序已经过了App Store审批流程但我认为,检查App Store提交内容的Apple员工对于通过官方公共API公开哪些硬件功能非常精通。

如果它是#2,那么这很臭第三方iPhone开发据称是一个公平的竞争环境如果常规开发人员被迫遵守规则,但谷歌被允许使用私有API只是因为他们是谷歌,系统就被操纵了。

所以这是希望它是#1即使在这种情况下,情况只是突出了iPhone的私有API背后的许多很酷的功能的问题 - 苹果自己的应用程序充分利用的私有API我理解谷歌移动开发人员使用这种方法的原因 - 没有它,这个功能是不可能的(坦白说,接近传感器用处不大)然而,第三方使用任何未记录的API的缺点是,未记录的API可能会在未来的iPhone OS更新中发生变化或消失,这种情况不可避免地导致一些用户感到愤怒,Apple没有支持不支持


谢谢你罗伯特马里尼帮助研究本文的某些技术方面,包括建立一个iPhone应用程序,以测试接近传感器何时被触发是否有任何文档化的应用程序代表(答案是不。)


  1. 这解释了为什么,如果您打开Goog​​le移动的默认设置以允许用户界面旋转,则会禁用自动语音搜索提示By default Google Mobile tracks motion to see if you’ve moved the phone to your ear; turning the UI rotation option on means it instead tracks motion to see if the display orientation should be changedI suspect the two uses conflict, in that when you rotate the iPhone, your thumb is likely to cover the proximity sensor. ↩︎