<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>iPhoneGeek 爱疯极客 &#187; proximity</title>
	<atom:link href="http://www.iphone-geek.cn/tag/proximity/feed" rel="self" type="application/rss+xml" />
	<link>http://www.iphone-geek.cn</link>
	<description>iPhone 新闻，编程，技巧与提示，代码，教程</description>
	<lastBuildDate>Wed, 01 Sep 2010 06:51:34 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.5</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>iPhone 3.0新特性系列教程之四 &#8211; 临近监测</title>
		<link>http://www.iphone-geek.cn/%e7%bc%96%e7%a8%8b/iphone-3-0%e6%96%b0%e7%89%b9%e6%80%a7%e7%b3%bb%e5%88%97%e6%95%99%e7%a8%8b%e4%b9%8b%e5%9b%9b-%e4%b8%b4%e8%bf%91%e7%9b%91%e6%b5%8b</link>
		<comments>http://www.iphone-geek.cn/%e7%bc%96%e7%a8%8b/iphone-3-0%e6%96%b0%e7%89%b9%e6%80%a7%e7%b3%bb%e5%88%97%e6%95%99%e7%a8%8b%e4%b9%8b%e5%9b%9b-%e4%b8%b4%e8%bf%91%e7%9b%91%e6%b5%8b#comments</comments>
		<pubDate>Sat, 28 Nov 2009 10:38:48 +0000</pubDate>
		<dc:creator>bagusflyer</dc:creator>
				<category><![CDATA[编程]]></category>
		<category><![CDATA[proximity]]></category>
		<category><![CDATA[教程]]></category>
		<category><![CDATA[代码片段]]></category>

		<guid isPermaLink="false">http://www.iphone-geek.cn/?p=332</guid>
		<description><![CDATA[去年当Google发布了一款iPhone应用程序时引起了一段辩论：他们的程序使用了未公开的API来检测是否电话靠近说话者的耳朵。
&#160;
而在iPhone 3.0 SDK中，此API可以被任何程序使用了。本文展示怎样使用此API：
&#160;

临近监测
&#160;
Apple提供了一个UIDevice类，此单例对象展示了有关运行你程序代码的设备的物理特性。通过设定单例对象的proximityMonitoringEnabled属性可以启动/禁止临近监测：
12UIDevice *device = &#91;UIDevice currentDevice&#93;;
device.proximityMonitoringEnabled = YES;
&#160;
设备支持
&#160;
Apple的文档中提到“并不是所有iPhone OS设备都具有一个接近传感器”。要确定你的设备是否支持临近监测，你应将 proximityMonitoringEnabled属性设为YES，然后检查其值：
1234UIDevice *device = &#91;UIDevice currentDevice&#93;;
device.proximityMonitoringEnabled = YES;
if &#40;device.proximityMonitoringEnabled == YES&#41;
&#160; &#160; // do something
&#160;
在iPhone 3G上运行上述代码显示其确实支持临近监测；而在模拟器上运行同样的代码则显示它并不支持临近监测。（注意：Apple的文档中有一个错误：它提示要检查proximityStatus属性而不是 proximityMonitoringEnabled属性）。
&#160;
在大部分情况下，你可能需要提供一套逻辑当电话靠近耳朵旁边时触发某种功能。对于Google程序而言，你需要按下按钮进行声音搜索。
&#160;
获取接近通知
&#160;
临近监测事件没有使用大家熟悉的代理（delegate）方式。相反，接近改变会触发notifications（通知）。与delegate相反，notification用于当不止一方对某种改变有兴趣时传播事件。
&#160;
对事件有兴趣的各方添加一个observer（观察者)到它们希望接收通知的对象。observer构成了一个 notification center当特定事件发生时触发回调。补充我们先前的代码，下面代码注册了一个当临近事件发生时被触发的回调：
123456UIDevice *device = &#91;UIDevice currentDevice&#93;;
device.proximityMonitoringEnabled = YES;
if &#40;device.proximityMonitoringEnabled == YES&#41;
&#160; &#160; &#91;&#91;NSNotificationCenter defaultCenter&#93; addObserver:self 
&#160; &#160; &#160; &#160; &#160; &#160; selector:@selector&#40;proximityChanged:&#41; 
&#160; &#160; &#160; &#160; &#160; &#160; name:@&#34;UIDeviceProximityStateDidChangeNotification&#34; [...]]]></description>
			<content:encoded><![CDATA[<p>去年当Google发布了一款iPhone应用程序时引起了一段辩论：他们的程序使用了<a href="http://www.mobileorchard.com/google-using-undocumented-iphone-api-features/">未公开的API</a>来检测是否电话靠近说话者的耳朵。</p>
<p>&nbsp;</p>
<p>而在iPhone 3.0 SDK中，此API可以被任何程序使用了。本文展示怎样使用此API：</p>
<p>&nbsp;</p>
<p><span id="more-332"></span></p>
<h2>临近监测</h2>
<p>&nbsp;</p>
<p>Apple提供了一个<strong>UIDevice</strong>类，此单例对象展示了有关运行你程序代码的设备的物理特性。通过设定单例对象的<strong>proximityMonitoringEnabled</strong>属性可以启动/禁止临近监测：</p>
<div class="codecolorer-container objc mac-classic" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br /></div></td><td><div class="objc codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">UIDevice <span style="color: #002200;">*</span>device <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>UIDevice currentDevice<span style="color: #002200;">&#93;</span>;<br />
device.proximityMonitoringEnabled <span style="color: #002200;">=</span> <span style="color: #a61390;">YES</span>;</div></td></tr></tbody></table></div>
<p>&nbsp;</p>
<p><strong>设备支持</strong></p>
<p>&nbsp;</p>
<p>Apple的文档中提到“并不是所有iPhone OS设备都具有一个接近传感器”。要确定你的设备是否支持临近监测，你应将 <strong>proximityMonitoringEnabled</strong>属性设为YES，然后检查其值：</p>
<div class="codecolorer-container objc mac-classic" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br /></div></td><td><div class="objc codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">UIDevice <span style="color: #002200;">*</span>device <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>UIDevice currentDevice<span style="color: #002200;">&#93;</span>;<br />
device.proximityMonitoringEnabled <span style="color: #002200;">=</span> <span style="color: #a61390;">YES</span>;<br />
<span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>device.proximityMonitoringEnabled <span style="color: #002200;">==</span> <span style="color: #a61390;">YES</span><span style="color: #002200;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #11740a; font-style: italic;">// do something</span></div></td></tr></tbody></table></div>
<p>&nbsp;</p>
<p>在iPhone 3G上运行上述代码显示其确实支持临近监测；而在模拟器上运行同样的代码则显示它并不支持临近监测。（注意：Apple的文档中有一个错误：它提示要检查<strong>proximityStatus</strong>属性而不是 <strong>proximityMonitoringEnabled</strong>属性）。</p>
<p>&nbsp;</p>
<p>在大部分情况下，你可能需要提供一套逻辑当电话靠近耳朵旁边时触发某种功能。对于Google程序而言，你需要按下按钮进行声音搜索。</p>
<p>&nbsp;</p>
<p><strong>获取接近通知</strong></p>
<p>&nbsp;</p>
<p>临近监测事件<em>没有</em>使用大家熟悉的代理（delegate）方式。相反，接近改变会触发<em>notifications（通知）</em>。与delegate相反，notification用于当不止一方对某种改变有兴趣时传播事件。</p>
<p>&nbsp;</p>
<p>对事件有兴趣的各方添加一个<em>observer（观察者)</em>到它们希望接收通知的对象。observer构成了一个 <em>notification center</em>当特定事件发生时触发回调。补充我们先前的代码，下面代码注册了一个当临近事件发生时被触发的回调：</p>
<div class="codecolorer-container objc mac-classic" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br /></div></td><td><div class="objc codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">UIDevice <span style="color: #002200;">*</span>device <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>UIDevice currentDevice<span style="color: #002200;">&#93;</span>;<br />
device.proximityMonitoringEnabled <span style="color: #002200;">=</span> <span style="color: #a61390;">YES</span>;<br />
<span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>device.proximityMonitoringEnabled <span style="color: #002200;">==</span> <span style="color: #a61390;">YES</span><span style="color: #002200;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSNotificationCenter_Class/"><span style="color: #400080;">NSNotificationCenter</span></a> defaultCenter<span style="color: #002200;">&#93;</span> addObserver<span style="color: #002200;">:</span>self <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; selector<span style="color: #002200;">:</span><span style="color: #a61390;">@selector</span><span style="color: #002200;">&#40;</span>proximityChanged<span style="color: #002200;">:</span><span style="color: #002200;">&#41;</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; name<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;UIDeviceProximityStateDidChangeNotification&quot;</span> object<span style="color: #002200;">:</span>device<span style="color: #002200;">&#93;</span>;</div></td></tr></tbody></table></div>
<p>&nbsp;</p>
<p>下面在代码中加入回调功能。这里，我们只是将临近事件记录在控制台中：</p>
<div class="codecolorer-container objc mac-classic" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br /></div></td><td><div class="objc codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span> proximityChanged<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSNotification_Class/"><span style="color: #400080;">NSNotification</span></a> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>notification <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; UIDevice <span style="color: #002200;">*</span>device <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>notification object<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; NSLog<span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;In proximity: %i&quot;</span>, device.proximityState<span style="color: #002200;">&#41;</span>;<br />
<span style="color: #002200;">&#125;</span></div></td></tr></tbody></table></div>
<p>&nbsp;</p>
<p>不管是否设备持续靠近你的耳朵，<strong>proximityState</strong>属性并不总会保持其值为YES。它会被设为YES，然后很快被复位成NO。你需要自己处理它的状态。以Google程序为例：将手机从耳边移开并不表示搜索结束，一段时间的沉默才指示状态的改变。</p>
<p>&nbsp;</p>
<h5>原文见：<a href="http://www.mobileorchard.com/new-in-iphone-30-tutorial-series-part-4-proximity-detection">New In iPhone 3.0 Tutorial Series, Part 4: Proximity Monitoring</a> 作者：<span><a href="http://www.mobileorchard.com/author/dgrigsby/">Dan Grigsby</a></span></h5>
]]></content:encoded>
			<wfw:commentRss>http://www.iphone-geek.cn/%e7%bc%96%e7%a8%8b/iphone-3-0%e6%96%b0%e7%89%b9%e6%80%a7%e7%b3%bb%e5%88%97%e6%95%99%e7%a8%8b%e4%b9%8b%e5%9b%9b-%e4%b8%b4%e8%bf%91%e7%9b%91%e6%b5%8b/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
