<?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/"
	xmlns:media="http://search.yahoo.com/mrss/"
>

<channel>
	<title>iOS开发 归档 - Tinyfool的个人网站</title>
	<atom:link href="https://codechina.org/category/tech/ios/feed/" rel="self" type="application/rss+xml" />
	<link>https://codechina.org/category/tech/ios/</link>
	<description></description>
	<lastBuildDate>Thu, 27 Jun 2024 02:09:50 +0000</lastBuildDate>
	<language>zh-Hans</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>
	<item>
		<title>用 Xcode cloud 解决 Xcode-beta 无法提交 App 的问题</title>
		<link>https://codechina.org/2024/06/30876/</link>
					<comments>https://codechina.org/2024/06/30876/#respond</comments>
		
		<dc:creator><![CDATA[tinyfool]]></dc:creator>
		<pubDate>Wed, 26 Jun 2024 03:55:17 +0000</pubDate>
				<category><![CDATA[iOS开发]]></category>
		<category><![CDATA[MacOS]]></category>
		<category><![CDATA[技术]]></category>
		<guid isPermaLink="false">https://codechina.org/?p=30876</guid>

					<description><![CDATA[<p>前两天苹果的 WWDC 2024结束，每次苹果召开 WWDC 都是苹果平台开发者的节日。听完 Keynote， [&#8230;]</p>
<p><a href="https://codechina.org/2024/06/30876/">用 Xcode cloud 解决 Xcode-beta 无法提交 App 的问题</a>最先出现在<a href="https://codechina.org">Tinyfool的个人网站</a>。</p>
]]></description>
										<content:encoded><![CDATA[
<p>前两天苹果的 WWDC 2024结束，每次苹果召开 WWDC 都是苹果平台开发者的节日。听完 Keynote，大家往往就想最先下载测试版本的操作系统和 Xcode 来尝鲜。</p>



<p>但是这里也有一个矛盾，一般来说从测试版到正式版要1个多月的时间。而测试版的 Xcode-beta 是无法提交 App。也就是尝鲜的话，你就有一个多月没办法提交你的 App。</p>



<p>解决的方法，一般是如果自己有多台 mac，其中一台不升级，专门留着用来提交 App。还有一种就是安装多系统。</p>



<p>但是前几年，苹果推出了 Xcode cloud，我就想是不是可以利用 Xcode cloud来解决这个问题呢？果然解决了。</p>



<span id="more-30876"></span>



<p>大概做法如下：</p>



<p>首先，打开 Xcode 打开你的代码工程文件。然后按键盘&nbsp;⌘+9 。这会打开侧边栏的 report 页面，如下图，选择 Cloud。即可看到常见 Xcode cloud的向导。</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img fetchpriority="high" decoding="async" width="468" height="892" src="https://codechina.org/wp-content/uploads/2024/06/截屏2024-06-26-10.52.26.png" alt="" class="wp-image-30877" srcset="https://codechina.org/wp-content/uploads/2024/06/截屏2024-06-26-10.52.26.png 468w, https://codechina.org/wp-content/uploads/2024/06/截屏2024-06-26-10.52.26-157x300.png 157w" sizes="(max-width: 468px) 100vw, 468px" /></figure>
</div>


<p>点击 Get Started&#8230; 按钮，然后按照向导一步步执行即可。</p>



<p>过程包括选择 product，授权 Xcode 访问你的 Github 代码库等步骤。</p>



<p>完成后，Cloud 页面如图：</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img decoding="async" width="484" height="494" src="https://codechina.org/wp-content/uploads/2024/06/截屏2024-06-26-10.55.48.png" alt="" class="wp-image-30878" srcset="https://codechina.org/wp-content/uploads/2024/06/截屏2024-06-26-10.55.48.png 484w, https://codechina.org/wp-content/uploads/2024/06/截屏2024-06-26-10.55.48-294x300.png 294w" sizes="(max-width: 484px) 100vw, 484px" /></figure>
</div>


<p>主要显示的是，Build的历史记录，对勾和叉，代表了成功的构建和失败的构建，这很一目了然。</p>



<p>默认的设置是每次代码提交到 Github 就会自动 build 一次。熟悉其他 CI 系统的人应该很好上手。也可以在 Xcode 当前界面右侧的详情页，右上角点击 Start Build 手动 Build。</p>



<p>在 App Store Connect 网站的 App 页面也可以找到 Xcode cloud 的页面，也可以用页面右上角的 “启动构建版本” 按钮来手动构建。</p>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="523" src="https://codechina.org/wp-content/uploads/2024/06/截屏2024-06-26-10.59.43-1024x523.png" alt="" class="wp-image-30879" srcset="https://codechina.org/wp-content/uploads/2024/06/截屏2024-06-26-10.59.43-1024x523.png 1024w, https://codechina.org/wp-content/uploads/2024/06/截屏2024-06-26-10.59.43-300x153.png 300w, https://codechina.org/wp-content/uploads/2024/06/截屏2024-06-26-10.59.43-768x392.png 768w, https://codechina.org/wp-content/uploads/2024/06/截屏2024-06-26-10.59.43-1536x785.png 1536w, https://codechina.org/wp-content/uploads/2024/06/截屏2024-06-26-10.59.43-1200x613.png 1200w, https://codechina.org/wp-content/uploads/2024/06/截屏2024-06-26-10.59.43.png 1852w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<ol class="wp-block-list">
<li>这样直接设置的 Xcode cloud 工作流，直接 build 往往会失败。因为我们往往会用 CocoaPods 或者&nbsp;Carthage 来管理我们依赖的第三方库。直接从 Github 拉出来的代码不包含这些库的代码，就无法正常编译。我自己用的是 CocoaPods 下面就介绍一下。</li>
</ol>



<p>这需要自定义的 build 脚本，不过不用担心，非常简单，如果你熟悉其他的 CI 系统就更容易理解。</p>



<p>Xcode Cloud 的构建过程如下图：</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="165" src="https://codechina.org/wp-content/uploads/2024/06/Custom-Build-Scripts-1024x165.png" alt="" class="wp-image-30880" srcset="https://codechina.org/wp-content/uploads/2024/06/Custom-Build-Scripts-1024x165.png 1024w, https://codechina.org/wp-content/uploads/2024/06/Custom-Build-Scripts-300x48.png 300w, https://codechina.org/wp-content/uploads/2024/06/Custom-Build-Scripts-768x123.png 768w, https://codechina.org/wp-content/uploads/2024/06/Custom-Build-Scripts-1200x193.png 1200w, https://codechina.org/wp-content/uploads/2024/06/Custom-Build-Scripts.png 1406w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<ol class="wp-block-list">
<li>创建临时环境</li>



<li>Clone 代码</li>



<li>执行 Post-Clone 脚本（自定义的在 Clone后做处理的脚本）</li>



<li>解决依赖关系</li>



<li>执行&nbsp;Xcodebuild 之前的前置脚本</li>



<li>执行 xcodebuild 命令</li>



<li>执行&nbsp;Xcodebuild&nbsp;之前的后置脚本</li>



<li>保存结果<br></li>
</ol>



<p>图中蓝色部分，都是系统自动执行的。而3，5，6部分分别对应三个自定义脚本。</p>



<p><code>ci<wbr>_post<wbr>_clone<wbr>.sh 文件</code>处理 clone 代码后续的处理。ci_pre_xcodebuild.sh&nbsp;文件处理执行 Xcodebuild 之前的前置工作。ci_post_xcodebuild.sh 文件处理执行&nbsp;Xcodebuild 之后的后续操作。</p>



<p>在你的代码目录下创建一个&nbsp;ci_scripts 目录，在里面创建这三个文件就可以。加入 CocoaPods 的第三方依赖处理代码，我觉得可以放在&nbsp;ci_post_clone.sh 里，也可以放在&nbsp;ci_pre_xcodebuild.sh。区别不大，我做的时候，放在&nbsp;ci_pre_xcodebuild.sh 里了。</p>



<p>我找到的一个建议&nbsp;CocoaPods 处理代码为：</p>



<pre class="wp-block-code"><code lang="bash" class="language-bash"><code>#!/bin/sh</code>
<code>gem install cocoapods</code>
<code>pod&nbsp;install</code></code></pre>



<p><br>经测试失败，因为 xcode build 环境是 gem 2.6 而且不可直接安装新的库。</p>



<p>我经过测试，自己写的处理代码为：</p>



<pre class="wp-block-code"><code lang="bash" class="language-bash">#!/bin/bash
\curl -sSL https://get.rvm.io | bash -s stable
source /Users/local/.rvm/scripts/rvm
rvm install 2.7.2
rvm use 2.7.2 --default
gem install cocoapods
pod install
</code></pre>



<p><br>经测试，完全没问题。</p>



<p>手动给脚本加上执行权限&nbsp;chmod +x&nbsp;ci_pre_xcodebuild.sh，然后提交到 Git 以后，就OK了。</p>



<p>最后一个操作是在 App Store Connect 的你的 App 的 Xcode Cloud 页面选择“管理工作流程”：</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="506" src="https://codechina.org/wp-content/uploads/2024/06/截屏2024-06-26-11.28.28-1024x506.png" alt="" class="wp-image-30881" srcset="https://codechina.org/wp-content/uploads/2024/06/截屏2024-06-26-11.28.28-1024x506.png 1024w, https://codechina.org/wp-content/uploads/2024/06/截屏2024-06-26-11.28.28-300x148.png 300w, https://codechina.org/wp-content/uploads/2024/06/截屏2024-06-26-11.28.28-768x379.png 768w, https://codechina.org/wp-content/uploads/2024/06/截屏2024-06-26-11.28.28.png 1130w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>然后点击你的工作流程，我这里是Default（默认的名称）。</p>



<p>在详情页面里，找到操作：</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="298" src="https://codechina.org/wp-content/uploads/2024/06/截屏2024-06-26-11.30.00-1024x298.png" alt="" class="wp-image-30882" srcset="https://codechina.org/wp-content/uploads/2024/06/截屏2024-06-26-11.30.00-1024x298.png 1024w, https://codechina.org/wp-content/uploads/2024/06/截屏2024-06-26-11.30.00-300x87.png 300w, https://codechina.org/wp-content/uploads/2024/06/截屏2024-06-26-11.30.00-768x224.png 768w, https://codechina.org/wp-content/uploads/2024/06/截屏2024-06-26-11.30.00-1536x448.png 1536w, https://codechina.org/wp-content/uploads/2024/06/截屏2024-06-26-11.30.00-1200x350.png 1200w, https://codechina.org/wp-content/uploads/2024/06/截屏2024-06-26-11.30.00.png 1860w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>分发准备里面，选择 App Store Connect。</p>



<p>默认是无，就是只做 build 不提交到 App Store，把这个改好后，每次 build 成功，就会自动把 build 好的 App 提交到 App Store，然后你选择是 TestFlight，还是正式提交了。</p>



<p>昨天我的<a href="https://apps.apple.com/us/app/%E8%8B%B1%E8%AF%AD%E8%BD%BB%E6%9D%BE%E8%AF%BB/id1471605122">英语轻松读</a>的最新版本 1.21，使用 Xcode-beta 开发，使用 Xcode cloud build 的版本已经提交到了 App Store，也过审了。</p>



<p>这个版本，加入了调整文章行间距的功能。</p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="850" height="1024" src="https://codechina.org/wp-content/uploads/2024/06/Simulator-Screenshot-iPhone-15-Pro-Max-2024-06-26-at-09.58.14-850x1024.png" alt="" class="wp-image-30883" srcset="https://codechina.org/wp-content/uploads/2024/06/Simulator-Screenshot-iPhone-15-Pro-Max-2024-06-26-at-09.58.14-850x1024.png 850w, https://codechina.org/wp-content/uploads/2024/06/Simulator-Screenshot-iPhone-15-Pro-Max-2024-06-26-at-09.58.14-249x300.png 249w, https://codechina.org/wp-content/uploads/2024/06/Simulator-Screenshot-iPhone-15-Pro-Max-2024-06-26-at-09.58.14-768x925.png 768w, https://codechina.org/wp-content/uploads/2024/06/Simulator-Screenshot-iPhone-15-Pro-Max-2024-06-26-at-09.58.14-1275x1536.png 1275w, https://codechina.org/wp-content/uploads/2024/06/Simulator-Screenshot-iPhone-15-Pro-Max-2024-06-26-at-09.58.14-1200x1446.png 1200w, https://codechina.org/wp-content/uploads/2024/06/Simulator-Screenshot-iPhone-15-Pro-Max-2024-06-26-at-09.58.14.png 1290w" sizes="auto, (max-width: 850px) 100vw, 850px" /></figure>
</div>


<p>最后，如果 build 失败，该怎么调试呢？</p>



<p>你可以在 Xcode 侧栏的 report 页面，选择失败的 Build，然后在右边详情页面，选择 log。然后查看具体的 log，根据 log 的提示去修改你的 build 脚本即可。</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="723" src="https://codechina.org/wp-content/uploads/2024/06/Xcode-Cloud-Solution-2-1024x723.webp" alt="" class="wp-image-30884" srcset="https://codechina.org/wp-content/uploads/2024/06/Xcode-Cloud-Solution-2-1024x723.webp 1024w, https://codechina.org/wp-content/uploads/2024/06/Xcode-Cloud-Solution-2-300x212.webp 300w, https://codechina.org/wp-content/uploads/2024/06/Xcode-Cloud-Solution-2-768x543.webp 768w, https://codechina.org/wp-content/uploads/2024/06/Xcode-Cloud-Solution-2.webp 1080w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>参考文献：</p>



<ul class="wp-block-list">
<li><strong><a href="https://developer.apple.com/documentation/xcode/writing-custom-build-scripts">Writing custom build scripts</a></strong></li>



<li><strong><a href="https://developer.apple.com/documentation/xcode/making-dependencies-available-to-xcode-cloud#Make-Carthage-dependencies-available-to-Xcode-Cloud">Making dependencies available to Xcode Cloud</a></strong></li>
</ul>
<p><a href="https://codechina.org/2024/06/30876/">用 Xcode cloud 解决 Xcode-beta 无法提交 App 的问题</a>最先出现在<a href="https://codechina.org">Tinyfool的个人网站</a>。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://codechina.org/2024/06/30876/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			<media:content url="https://codechina.org/wp-content/uploads/2024/06/DALL·E-Xcode-Cloud-1024x585.webp" medium="image" />
	</item>
		<item>
		<title>WWDC 2024将近，苹果的AI革命会给基于AI的独立开发者带来灭顶之灾么？</title>
		<link>https://codechina.org/2024/06/30798/</link>
					<comments>https://codechina.org/2024/06/30798/#respond</comments>
		
		<dc:creator><![CDATA[tinyfool]]></dc:creator>
		<pubDate>Thu, 06 Jun 2024 01:20:00 +0000</pubDate>
				<category><![CDATA[iOS开发]]></category>
		<category><![CDATA[IT行业]]></category>
		<category><![CDATA[技术]]></category>
		<guid isPermaLink="false">https://codechina.org/?p=30798</guid>

					<description><![CDATA[<p>6月11日，WWDC 2024 就要召开了。每年 WWDC 召开以后，随着苹果发布一堆新的内嵌功能，就会在推特 [&#8230;]</p>
<p><a href="https://codechina.org/2024/06/30798/">WWDC 2024将近，苹果的AI革命会给基于AI的独立开发者带来灭顶之灾么？</a>最先出现在<a href="https://codechina.org">Tinyfool的个人网站</a>。</p>
]]></description>
										<content:encoded><![CDATA[
<p>6月11日，WWDC 2024 就要召开了。每年 WWDC 召开以后，随着苹果发布一堆新的内嵌功能，就会在推特和各种 blog 网站引发很多讨论。很多独立开发者就会哭着喊着说，苹果在搞垄断，苹果新内嵌的某某功能会影响他们的生意，甚至毁掉他们的营生。</p>



<span id="more-30798"></span>



<p>最早的一个例子可能是手电筒功能，在这个功能被内嵌之前，类似的小工具类应用是 AppStore 上的现金奶牛。很多小厂商和独立开发者都喜欢做这类的小工具。然而，苹果内置这个功能了，一边哀鸿遍野。现在你在 AppStore 搜索还可以找到很多手电筒应用，但是显然他们已经不是当下最热门的应用了。</p>



<p>后来的例子也很多，比如在苹果把 Podcast 功能独立成一个 App 以后，很多做 Podcast 应用的作者都倍感压力。当然也存在反例，Reddit 上一篇非常火热的文章标题是“<a href="https://www.reddit.com/r/apple/comments/o1fvq0/apple_podcasts_is_made_by_a_2_trillion_dollar/">Apple Podcasts is made by a 2 trillion dollar company and yet one developer bests it with Overcast; why?</a>”，即使是苹果推出了自己的独立 Podcast App，还是有很多人更喜欢 Overcast。在中国也是，有很多人更喜欢小宇宙、或者是喜马拉雅之类的类似应用。</p>



<p>苹果推出的 Shortcuts、睡眠跟踪、屏幕时间、甚至是 Safari 内置的广告拦截，等等，各种功能的推出都曾经被一些收到伤害的独立开发者批评。</p>



<p>那么据说最近苹果会在 WWDC 2024 全面拥抱大语言模型，会不会给很多独立开发者带来伤害呢？</p>



<p>我们最直接可以想到的就是语音备忘录类的 App， 比如 <a href="https://apps.apple.com/us/app/rev-record-transcribe/id598332111">Rev</a> 或者我朋友的团队做的 <a href="https://apps.apple.com/cn/app/slaxnote/id6480166286">SlaxNote</a> 都是基于 AI 的语音备忘录 App，它们不仅可以录制语音备忘录，而且可以利用大语言模型把这些录音转换为文本，甚至可以润色、翻译，等等。</p>



<p>然而，现在传言这次 WWDC 苹果会把这些能力都在其内置的语音备忘录 App 里面实现了。</p>



<p>还有就是那些做文章摘要的 App，这次据说 Safari 也会内嵌文章摘要能力。</p>



<p>还有就是轻松可以想到的是在苹果自己的备忘录App里面也会嵌入 AI 能力，这样的话，前些日子因为集成了 AI 能力而吸引了眼球的 <a href="https://www.craft.do/">Craft</a> 和 <a href="https://www.notion.so/">Notion</a> 又何去何从呢？</p>



<p>显而易见的是，邮件、消息 AI 回复建议之类的 App，照片 AI 编辑类的 App，都有可能在这次 WWDC 的发布后，受到波及。</p>



<h2 class="wp-block-heading">那么该怎么办呢？</h2>



<p>以下几点，应该是比较好的应对：</p>



<h3 class="wp-block-heading">1、深挖用户群体需求，构建自己的用户群体</h3>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="585" src="https://codechina.org/wp-content/uploads/2024/06/DALL·E-2024-06-05-16.57.44-Developers-interacting-1024x585.webp" alt="" class="wp-image-30804" srcset="https://codechina.org/wp-content/uploads/2024/06/DALL·E-2024-06-05-16.57.44-Developers-interacting-1024x585.webp 1024w, https://codechina.org/wp-content/uploads/2024/06/DALL·E-2024-06-05-16.57.44-Developers-interacting-300x171.webp 300w, https://codechina.org/wp-content/uploads/2024/06/DALL·E-2024-06-05-16.57.44-Developers-interacting-768x439.webp 768w, https://codechina.org/wp-content/uploads/2024/06/DALL·E-2024-06-05-16.57.44-Developers-interacting-1536x878.webp 1536w, https://codechina.org/wp-content/uploads/2024/06/DALL·E-2024-06-05-16.57.44-Developers-interacting-1200x686.webp 1200w, https://codechina.org/wp-content/uploads/2024/06/DALL·E-2024-06-05-16.57.44-Developers-interacting.webp 1792w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>苹果内置的功能，集成度高，用户体验好。但是往往是针对最广泛的手机、平板用户去设计的。对特别用户群体的思考比较少。也不会做太深入的探索和用户体验的打磨。</p>



<p>拿刚才提到的 Overcast 为例，Marco Arment 设计了非常独特的 Podcast 加速播放技术，他可以压缩一些语音文件里面的空白部分，从而得到了一个既加速播放，但是又听起来很自然的感觉。这些独特的思路和研究，不太可能出现在苹果设计的内置 App 里面。</p>



<p>再比如，苹果做的睡眠跟踪功能利用了 Apple Watch 的强大能力，甚至可以监控你睡眠的时候的体温。但是有两个问题，如果你不买 Apple Watch，单用 iPhone 是无法跟踪睡眠的，另外，它没有鼾声录制功能。我以前用过的一款<a href="https://apps.apple.com/cn/app/%E8%9C%97%E7%89%9B%E7%9D%A1%E7%9C%A0-%E6%A2%A6%E8%AF%9D%E9%BC%BE%E5%A3%B0%E7%9D%A1%E7%9C%A0%E7%9B%91%E6%B5%8B%E8%AE%B0%E5%BD%95%E5%8F%8A%E5%A4%B1%E7%9C%A0%E6%89%93%E9%BC%BE%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88/id1025313530">蜗牛睡眠</a>，就可以录制鼾声，让自己知道自己打鼾到底多么严重，也可以知道自己说了什么梦话。这些独特的功能，让 Apple Watch 大行其道的时候，这些睡眠监控 App，也仍旧有自己的生存空间。</p>



<h3 class="wp-block-heading">2、长期战略坚持战斗</h3>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="585" src="https://codechina.org/wp-content/uploads/2024/06/DALL·E-Inspiring-Scene-2024-06-05-1024x585.webp" alt="" class="wp-image-30805" srcset="https://codechina.org/wp-content/uploads/2024/06/DALL·E-Inspiring-Scene-2024-06-05-1024x585.webp 1024w, https://codechina.org/wp-content/uploads/2024/06/DALL·E-Inspiring-Scene-2024-06-05-300x171.webp 300w, https://codechina.org/wp-content/uploads/2024/06/DALL·E-Inspiring-Scene-2024-06-05-768x439.webp 768w, https://codechina.org/wp-content/uploads/2024/06/DALL·E-Inspiring-Scene-2024-06-05-1536x878.webp 1536w, https://codechina.org/wp-content/uploads/2024/06/DALL·E-Inspiring-Scene-2024-06-05-1200x686.webp 1200w, https://codechina.org/wp-content/uploads/2024/06/DALL·E-Inspiring-Scene-2024-06-05.webp 1792w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>从一般的角度来说，很多人会认为苹果的产品是无坚不摧的，是非常强大的。但是，其实长期使用苹果的软件和服务以后，我相信很多人会发现。苹果更擅长做硬件，或者说做硬件和软件结合的产品。对长期稳定的更新软件和进行服务的能力其实不如微软、Google等竞争对手。</p>



<p>例如 Siri 最早推出的时候，是独步天下的。但是在竞争对手 Google 和亚马逊下场后，Siri 的进步缓慢就逐渐被大家认识到了。</p>



<p>我们会发现，苹果的硬件一年更新一次，很多软件也是按照这个频率去更新的。除了在 WWDC 每年发布操作系统的大更新，其实平常 MacOS、iPhone 的软件更新往往局限于安全和细节上的小修改。很少出现功能的提升和用户体验的显著改进。当然苹果的操作系统和软件部门的程序员也是每天工作的，但是按照苹果的习惯，这些工作成果是每年一次性的发布的。</p>



<p>也就是今天苹果推出了某个功能，超越了你的产品，或者说涵盖了你的产品的功能。你有一年的时间，加入一些新的能力和用户体验细节。在这个同时，苹果会安静的等待一年，才有可能用心的体验来跟你竞争。很多时候，苹果的软件产品一旦发布，几年都不会做大的修改。这其实在现在的互联网时代是非常少见的。</p>



<h3 class="wp-block-heading">3、多平台战略</h3>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="585" src="https://codechina.org/wp-content/uploads/2024/06/DALL·E-dynamic-scene-2024-06-05-1024x585.webp" alt="" class="wp-image-30806" srcset="https://codechina.org/wp-content/uploads/2024/06/DALL·E-dynamic-scene-2024-06-05-1024x585.webp 1024w, https://codechina.org/wp-content/uploads/2024/06/DALL·E-dynamic-scene-2024-06-05-300x171.webp 300w, https://codechina.org/wp-content/uploads/2024/06/DALL·E-dynamic-scene-2024-06-05-768x439.webp 768w, https://codechina.org/wp-content/uploads/2024/06/DALL·E-dynamic-scene-2024-06-05-1536x878.webp 1536w, https://codechina.org/wp-content/uploads/2024/06/DALL·E-dynamic-scene-2024-06-05-1200x686.webp 1200w, https://codechina.org/wp-content/uploads/2024/06/DALL·E-dynamic-scene-2024-06-05.webp 1792w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>苹果绝大多数应用是肯定不会做其他平台版本的。有一些需求上，多平台应用第三方开发者天生有优势。举个例子，苹果有自己的密码仓库功能，但是并不影响 1password 之类的应用。</p>



<p>从安卓到 Mac 传输文件，从 iPhone 传输文件到 Windows PC 之类的需求，都是天生不用担心苹果会去涉足的领域。</p>



<h3 class="wp-block-heading">4、以其人之道，还治其人之身</h3>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="585" src="https://codechina.org/wp-content/uploads/2024/06/DALL·E-Independent-Developer-Scene-1024x585.webp" alt="" class="wp-image-30807" srcset="https://codechina.org/wp-content/uploads/2024/06/DALL·E-Independent-Developer-Scene-1024x585.webp 1024w, https://codechina.org/wp-content/uploads/2024/06/DALL·E-Independent-Developer-Scene-300x171.webp 300w, https://codechina.org/wp-content/uploads/2024/06/DALL·E-Independent-Developer-Scene-768x439.webp 768w, https://codechina.org/wp-content/uploads/2024/06/DALL·E-Independent-Developer-Scene-1536x878.webp 1536w, https://codechina.org/wp-content/uploads/2024/06/DALL·E-Independent-Developer-Scene-1200x686.webp 1200w, https://codechina.org/wp-content/uploads/2024/06/DALL·E-Independent-Developer-Scene.webp 1792w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>很多开发者没有特别注意到的是，每次苹果开发一些内置功能和 App，都会更新自己的 API，比如屏幕时间就是有 API 的，苹果的健康应用也有 API。有时候你可以站在苹果的肩膀上去跟苹果竞争，苹果把一个需求的基础已经做好了。你可以调用苹果的 API 去完成更深入细分的需求，去跟苹果竞争。</p>



<p>总之，苹果发布基于 AI 的各种功能更新，肯定是对很多现在正在做基于 AI 的产品的独立开发者带来了一些挑战，但是也可能是新的机会。</p>



<p>本文英文版：<a href="https://iapp4me.com/news/83/is-apples-ai-revolution-at-wwdc-2024-a-doomsday-for-ai-based-independent-developers/">Is Apple’s AI Revolution at WWDC 2024 a Doomsday for AI-Based Independent Developers?</a></p>
<p><a href="https://codechina.org/2024/06/30798/">WWDC 2024将近，苹果的AI革命会给基于AI的独立开发者带来灭顶之灾么？</a>最先出现在<a href="https://codechina.org">Tinyfool的个人网站</a>。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://codechina.org/2024/06/30798/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			<media:content url="https://codechina.org/wp-content/uploads/2024/06/DALL·E-dramatic-conference-1024x585.webp" medium="image" />
	</item>
		<item>
		<title>Swift编程中应用@available和deprecated在自己的编程中提供便利</title>
		<link>https://codechina.org/2024/04/30772/</link>
					<comments>https://codechina.org/2024/04/30772/#comments</comments>
		
		<dc:creator><![CDATA[tinyfool]]></dc:creator>
		<pubDate>Thu, 25 Apr 2024 02:52:49 +0000</pubDate>
				<category><![CDATA[iOS开发]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[swift]]></category>
		<category><![CDATA[swiftui]]></category>
		<guid isPermaLink="false">https://codechina.org/?p=30772</guid>

					<description><![CDATA[<p>在 Swift 中，@available 是一个属性标注（Attribute），它用来表示一个类、结构体、枚举 [&#8230;]</p>
<p><a href="https://codechina.org/2024/04/30772/">Swift编程中应用@available和deprecated在自己的编程中提供便利</a>最先出现在<a href="https://codechina.org">Tinyfool的个人网站</a>。</p>
]]></description>
										<content:encoded><![CDATA[
<p>在 Swift 中，@available 是一个属性标注（Attribute），它用来表示一个类、结构体、枚举、函数或者方法等的可用性信息，指示特定的平台和版本。通过这个属性标注，开发者可以对代码中的各个部分设定适用的操作系统平台及最低支持的版本，也可以指定在某个版本中它们已经过期或不推荐使用，甚至是未来某个版本中会被添加的特性。</p>



<p>我们使用苹果的标准 Swift 库的时候，经常遇到 @available ，一个老代码的某个函数调用，系统升级后，可能会发现一个警告，</p>



<pre class="wp-block-code"><code class="">'oldMethod(text:messages:key:)' is deprecated: Use newMethod() instead</code></pre>



<p>意思就是这个方法或者函数，现在已经被废弃了，最好不要再使用。在这个情况下，往往你其实还可以编译还可以执行。但是这些被废弃的老方法，要么也许有 bug ，或者系统的代码风格，习惯变了，已经被推荐使用了。有的人觉的既然可以编译和执行，何必理会呢？其实不然，有些方法会在某一个操作系统版本废弃，然后在后续的某个大操作系统版本就彻底消失，无法编译和运行。也就是说，废弃声明就是提醒你可以修改代码了，未来这个方法或者类有可能完全不能用了。最好尊重这些声明来写代码。</p>



<p>我们去看系统代码和头文件的时候，会看到很多类似的例子：</p>



<pre class="wp-block-code"><code class="">1. 指定功能在平台上的最小可用版本：<br>@available(iOS 10, *)<br>func newiOS10Method() {<br>    // 这个方法只会在 iOS 10 及以上版本可用<br>}<br><br>2. 标示一个功能在新版本中被弃用：<br>@available(iOS, deprecated: 11.0, message: "Use newMethod instead")<br>func oldMethod() {<br>    // 这个方法在 iOS 11 中被标记为弃用<br>}<br><br>3. 标示一个功能在新版本中被废弃或移除：<br>@available(iOS, obsoleted: 11.0, message: "Use anotherMethod instead")<br>func obsoleteMethod() {<br>    // 这个方法从 iOS 11 开始就废弃了，调用它会出错<br>}<br><br>4. 标示功能未来新增：<br>@available(iOS 15, *)<br>func futureMethod() {<br>    // 这个方法在未来的 iOS 15 版本中会被添加<br>}<br><br>5. 跨多平台设置可用性：<br>@available(iOS 10, macOS 10.12, *)<br>func crossPlatformMethod() {<br>    // 这个方法在 iOS 10 和 macOS 10.12 及以上版本都可用<br>}<br><br>6. 为不同的平台指定不同的最小版本：<br>@available(iOS 14, watchOS 7, *)<br>func multiPlatformMethod() {<br>    // 对于 iOS 平台，这个方法要求版本 14.0 及以上<br>    // 对于 watchOS 平台，这个方法要求版本 7.0 及以上<br>}</code></pre>



<p>但是，这是一般情况下我们接触的 @available 和 deprecated。其实我们自己的代码里面也可以用这些用法。比如我最近在给 <a href="https://tinystudio.ai/">TinyStudio（最好的Mac字幕软件之一）</a>增加新的功能，代码里面涉及到如何调用 ChatGPT，以及用 ChatGPT 来进行一些复杂的字幕后续处理操作。</p>



<p>在此之前我不知道 Swift 的 await 和 actor 语法，所以涉及到 ChatGPT 的代码非常复杂，比如一个巨长的文本发给 ChatGPT 需要实现分段，然后一段一段的去调用 ChatGPT 来进行处理。代码就非常复杂，我用递归调用和回调函数的方法来做，非常麻烦。虽然我可以轻松的写出这样的代码，但是这样的代码在调试、调优和异常处理方面简直是噩梦。</p>



<p>我知道了 Swift 的 await 和 actor 语法后，发现这个场景用这些并发语法来写，代码可以变得非常简洁，而且在调试、调优和异常处理方面非常方便。于是我就着手写 ChatGPT 和文本处理库的异步版本（await/actor）。写的时候，原有的函数叫 send ，新版本就叫做 asyncSend，原有的函数叫 format，新的就叫做 asyncFormat。</p>



<p>初步实现以后，我发现原有的 send 和 format 在很多地方都有调用，直接用文字搜索也会遇到一些类似的函数名。于是我就想起了 @available 和 deprecated 语法。</p>



<p>首先，我先把 ChatGPTKit 类和 TextKit 类的新老版本函数，放在不同的 extension 里（不影响执行，但是从代码来看，就可以把不同类型的方法条理清晰的分明白了）：</p>



<pre class="wp-block-code"><code class="">// 遗留版本函数<br>extension TextKit {<br><br>    func format(textString)  {<br>...<br><br>// 遗留版本函数<br>extension TextKit {<br><br>    func asyncFormat(textString)  {<br>...</code></pre>



<p>然后，在遗留版本函数的 extension 声明前，标注 @available 即可：</p>



<pre class="wp-block-code"><code class="">// 遗留版本函数<br><strong>@available</strong>(*, deprecated, message: "老版本已废弃，请使用异步版本")<br>extension TextKit {<br><br>    func format(textString)  {<br>...<br></code></pre>



<p>这时候编译程序，就会发现还在用老版本函数的代码就会被编译器发出警告，然后我们根据警告信息，一一替换为新版本就好了。如下：</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="682" height="122" src="https://codechina.org/wp-content/uploads/2024/04/截屏2024-04-25-10.41.43-1.png" alt="" class="wp-image-30781" srcset="https://codechina.org/wp-content/uploads/2024/04/截屏2024-04-25-10.41.43-1.png 682w, https://codechina.org/wp-content/uploads/2024/04/截屏2024-04-25-10.41.43-1-300x54.png 300w" sizes="auto, (max-width: 682px) 100vw, 682px" /></figure>
<p><a href="https://codechina.org/2024/04/30772/">Swift编程中应用@available和deprecated在自己的编程中提供便利</a>最先出现在<a href="https://codechina.org">Tinyfool的个人网站</a>。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://codechina.org/2024/04/30772/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			<media:content url="https://codechina.org/wp-content/uploads/2024/04/截屏2024-04-25-10.51.11-1.png" medium="image" />
	</item>
		<item>
		<title>使用StoreKit2不再需要恢复购买按钮，但是为了审核你还需要放一个【AppStore审核手记】</title>
		<link>https://codechina.org/2023/01/26850/</link>
					<comments>https://codechina.org/2023/01/26850/#respond</comments>
		
		<dc:creator><![CDATA[tinyfool]]></dc:creator>
		<pubDate>Wed, 04 Jan 2023 04:31:14 +0000</pubDate>
				<category><![CDATA[iOS开发]]></category>
		<guid isPermaLink="false">https://codechina.org/?p=26850</guid>

					<description><![CDATA[<p>昨天我提交了一个新App，2023年我的计划就是开发一系列的小App试图在独立开发领域有一份收入。但是今天一早 [&#8230;]</p>
<p><a href="https://codechina.org/2023/01/26850/">使用StoreKit2不再需要恢复购买按钮，但是为了审核你还需要放一个【AppStore审核手记】</a>最先出现在<a href="https://codechina.org">Tinyfool的个人网站</a>。</p>
]]></description>
										<content:encoded><![CDATA[
<p>昨天我提交了一个新App，2023年我的计划就是开发一系列的小App试图在独立开发领域有一份收入。但是今天一早就发现被拒绝了。</p>



<p>理由是：</p>



<span id="more-26850"></span>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><strong>Guideline 3.1.1 &#8211; Business &#8211; Payments &#8211; In-App Purchase</strong></p>



<p>We found that your app offers in-app purchases that can be restored but does not include a &#8220;Restore Purchases&#8221; feature to allow users to restore the previously purchased in-app purchases, as specified in the &#8220;Restoring Purchase Products&#8221; section of the <a href="https://developer.apple.com/library/archive/documentation/NetworkingInternet/Conceptual/StoreKitGuide/Introduction.html">In-App Purchase Programming Guide</a>:</p>



<p>&#8220;Users restore transactions to maintain access to content they&#8217;ve already purchased. For example, when they upgrade to a new phone, they don&#8217;t lose all of the items they purchased on the old phone. Include some mechanism in your app to let the user restore their purchases, such as a Restore Purchases button.&#8221;</p>



<p><strong>Next Steps</strong></p>



<p>To restore previously purchased in-app purchase products, it would be appropriate to provide a &#8220;Restore&#8221; button and initiate the restore process when the &#8220;Restore&#8221; button is tapped by the user. Note that automatically restoring purchases on launch will not resolve this issue.</p>
</blockquote>



<p>这段大概可以翻译为：</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>准则3.1.1 &#8211; 业务 &#8211; 支付 &#8211; 应用内购买</p>



<p>我们发现你的应用程序提供了可以恢复的应用内购买，但不包括 &#8220;恢复购买 &#8220;功能，以允许用户恢复之前购买的应用内购买，如应用内购买程序指南的 &#8220;恢复购买产品 &#8220;部分所规定的。</p>



<p>&#8220;用户恢复交易以保持对他们已经购买的内容的访问。例如，当他们升级到一个新的手机时，他们不会失去他们在旧手机上购买的所有物品。在你的应用程序中包括一些机制，让用户恢复他们的购买，如恢复购买按钮。&#8221;</p>



<p>接下来的步骤</p>



<p>为了恢复以前购买的应用内产品，应该提供一个 &#8220;恢复 &#8220;按钮，并在用户点击 &#8220;恢复 &#8220;按钮时启动恢复程序。请注意，启动时自动恢复购买的产品不会解决这个问题。</p>
</blockquote>



<p>意思就是，我提供了一个应用内购买功能（付费用户），但是没有提供恢复购买按钮。</p>



<p>我当时就很奇怪，因为我用的是StoreKit2，我记得学习这套新API的原因有两个大点，第一个就是这套新API更简洁，更好用。第二就是，不需要恢复购买的流程了，自动会保持与AppStore购买记录的同步。</p>



<p>我找来当时让我选择了Storekit2的WWDC官方视频“<a href="https://www.youtube.com/watch?v=E5Vz11NyR2g">Meet StoreKit 2 | 10114 | WWDC2021”</a>，里面明确的说了，</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>So, all of this means&nbsp;that users won&#8217;t need to restore completed transactions&nbsp;when your app is reinstalled or downloaded on a new device.&nbsp;Everything should automatically be fetched by StoreKit&nbsp;and stay up to date.&nbsp;</p>



<p>因此，所有这些都意味着，当你的应用程序被重新安装或下载到新设备上时，用户将不需要恢复已完成的交易。&nbsp;一切都应该由StoreKit自动获取，并保持最新状态。&nbsp;</p>
</blockquote>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="516" src="https://codechina.org/wp-content/uploads/2023/01/截屏2023-01-04-12.20.26-1024x516.png" alt="" class="wp-image-26852" srcset="https://codechina.org/wp-content/uploads/2023/01/截屏2023-01-04-12.20.26-1024x516.png 1024w, https://codechina.org/wp-content/uploads/2023/01/截屏2023-01-04-12.20.26-300x151.png 300w, https://codechina.org/wp-content/uploads/2023/01/截屏2023-01-04-12.20.26-768x387.png 768w, https://codechina.org/wp-content/uploads/2023/01/截屏2023-01-04-12.20.26-1536x773.png 1536w, https://codechina.org/wp-content/uploads/2023/01/截屏2023-01-04-12.20.26-1200x604.png 1200w, https://codechina.org/wp-content/uploads/2023/01/截屏2023-01-04-12.20.26.png 1748w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>结果，我没注意的是，这句以后，他还说了一句，</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>But people use their Apple devices in millions of ways in millions of places.&nbsp;In the rare case that a user thinks&nbsp;they should have a transaction but you don&#8217;t see it,&nbsp;you can use the App Store sync API.&nbsp;This immediately resynchronizes all StoreKit 2 transactions.&nbsp;This is a replacement for the&nbsp;restoreCompletedTransactions API,and you should provide UI in your app that allows users to initiate the sync.&nbsp;However, thanks to StoreKit 2&#8217;s automatic synchronization,&nbsp;it should be very rare&nbsp;that a user needs to initiate a sync manually.&nbsp;</p>



<p>但人们在数百万个地方以数百万种方式使用他们的苹果设备。&nbsp;在罕见的情况下，如果用户认为他们应该有一个交易，但你没有看到它，你可以使用App Store的sync API。&nbsp;这将立即重新同步所有StoreKit 2交易。&nbsp;这是对 restoreCompletedTransactions API 的替代，你应该在你的应用程序中提供允许用户启动同步的用户界面。&nbsp;然而，由于StoreKit 2的自动同步功能，用户需要手动启动同步的情况应该非常少。&nbsp;</p>
</blockquote>



<p>也就是说，虽然，基本上用不上恢复购买按钮，但是我们还是需要提供一个恢复购买按钮，来同步Appstore的购买记录。</p>



<p>而且，审核Guideline也没变，还是要求提供恢复购买按钮。</p>



<p>那能怎么办呢？那就加吧。</p>



<p>在UI的底部加上一段代码，倒是不复杂：</p>



<pre class="wp-block-code"><code lang="swift" class="language-swift">Button {
    Task {
        do {
            try await AppStore.sync()
        } catch {
            print(error)
        }
    }
} label: {
    Text("Restore Purchases")
}
</code></pre>



<p>我本来觉得这个按钮就是蠢的要死。你在别的网络服务买个账号，需要有个按钮明确的恢复购买么？不都是网络化的，有信号就自动更新的东西么。唉，本以为StoreKit2以后就不用放这个愚蠢的按钮，看来还是需要，放就放吧。</p>



<p>我也能理解苹果遇到的问题，总有网络问题，或者用户觉得自己买过，也许是糊涂了，给他一个按钮，让他可以手动恢复，可能会让用户更安心吧。唉。</p>
<p><a href="https://codechina.org/2023/01/26850/">使用StoreKit2不再需要恢复购买按钮，但是为了审核你还需要放一个【AppStore审核手记】</a>最先出现在<a href="https://codechina.org">Tinyfool的个人网站</a>。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://codechina.org/2023/01/26850/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			<media:content url="https://codechina.org/wp-content/uploads/2023/01/截屏2023-01-04-12.20.26-1024x516.png" medium="image" />
	</item>
		<item>
		<title>从零开始，使用SwiftUI和PDFKit快速构建完全可定制的PDF阅读器</title>
		<link>https://codechina.org/2023/01/26809/</link>
					<comments>https://codechina.org/2023/01/26809/#respond</comments>
		
		<dc:creator><![CDATA[tinyfool]]></dc:creator>
		<pubDate>Tue, 03 Jan 2023 13:39:05 +0000</pubDate>
				<category><![CDATA[iOS开发]]></category>
		<category><![CDATA[技术]]></category>
		<category><![CDATA[pdf]]></category>
		<category><![CDATA[pdfkit]]></category>
		<category><![CDATA[swift]]></category>
		<category><![CDATA[swiftui]]></category>
		<guid isPermaLink="false">https://codechina.org/?p=26809</guid>

					<description><![CDATA[<p>SwiftUI快速创建UI的能力非常强大，苹果还提供了PDFKit框架，所以，用SwiftUI和PDFKit可 [&#8230;]</p>
<p><a href="https://codechina.org/2023/01/26809/">从零开始，使用SwiftUI和PDFKit快速构建完全可定制的PDF阅读器</a>最先出现在<a href="https://codechina.org">Tinyfool的个人网站</a>。</p>
]]></description>
										<content:encoded><![CDATA[
<p>SwiftUI快速创建UI的能力非常强大，苹果还提供了PDFKit框架，所以，用SwiftUI和PDFKit可以用非常少的代码，非常快速的创建一个完全可定制的PDF阅读器。</p>



<p>我们来从零开始，做一个PDF阅读器。</p>



<span id="more-26809"></span>



<h2 class="wp-block-heading">创建项目</h2>



<p>首先，打开Xcode，创建一个新的iOS App。项目名字可以就叫做PdfReader。Interface选择Swift UI，language选择Swift。</p>



<p>因为PDFKit是一个UIKit库，不是原生的SwiftUI对象，所以，我们先需要做一个UIViewRepresentable类，来作为两者之间的桥梁。我已经帮你准备好了一个。你只需要创建一个SwiftPDFView.swift，把如下代码复制进去即可。</p>



<pre class="wp-block-code"><code lang="swift" class="language-swift">//
//  SwiftPDFView.swift
//  PdfReader
//
//  Created by HaoPeiqiang on 2023/1/3.
//

import SwiftUI
import PDFKit

struct SwiftPDFView: UIViewRepresentable {

    
    let url:URL

    func makeUIView(context: Context) -&gt; PDFView {
        
        let pdfView = PDFView()
        pdfView.document = PDFDocument(url: url)
        pdfView.displayMode = .singlePage
        pdfView.autoScales = true
        pdfView.usePageViewController(true, withViewOptions: nil)
        return pdfView
    }
    
    
    func updateUIView(_ pdfView: PDFView, context: Context) {
        
    }

}

struct SwiftPDFView_Previews: PreviewProvider {
    static var previews: some View {
        
        SwiftPDFView(url:Bundle.main.url(forResource: "sample_pdf", withExtension: "pdf")!)
    }
}
</code></pre>



<p>然后，你可以找到自动生成的ContentView.swift文件，把在body内部自动生成的代码删除，加上<code>SwiftPDFView(url: Bundle.main.url(forResource: "sample_pdf", withExtension: "pdf")!)</code>。好，三分钟不到，你已经成功创建了一个PDF阅读器了。</p>



<p>如果你打开了Xcode代码区域右侧的预览区域，都不用执行App，你已经可以看到你的PDF浏览器已经可以工作了，也可以在PDF页面之间翻页。</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="662" src="https://codechina.org/wp-content/uploads/2023/01/截屏2023-01-03-20.49.53-1024x662.png" alt="" class="wp-image-26819" srcset="https://codechina.org/wp-content/uploads/2023/01/截屏2023-01-03-20.49.53-1024x662.png 1024w, https://codechina.org/wp-content/uploads/2023/01/截屏2023-01-03-20.49.53-300x194.png 300w, https://codechina.org/wp-content/uploads/2023/01/截屏2023-01-03-20.49.53-768x496.png 768w, https://codechina.org/wp-content/uploads/2023/01/截屏2023-01-03-20.49.53-1536x993.png 1536w, https://codechina.org/wp-content/uploads/2023/01/截屏2023-01-03-20.49.53-2048x1324.png 2048w, https://codechina.org/wp-content/uploads/2023/01/截屏2023-01-03-20.49.53-1200x776.png 1200w, https://codechina.org/wp-content/uploads/2023/01/截屏2023-01-03-20.49.53-1980x1280.png 1980w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<h2 class="wp-block-heading">加入缩略图导航栏</h2>



<p>你可能见过有的PDF App，在PDF页面下方有一排缩略图，可以导航也可以预览PDF的文件内容，这个叫做<code>PDFThumbnailView</code>。加入<code>PDFThumbnailView</code>可以让我们的PDF阅读器，看起来更专业。</p>



<p>我们可以回到<code>SwiftPDFView.swift</code>文件，在SwiftPDFView类的代码里面加入如下代码：</p>



<pre class="wp-block-code"><code lang="swift" class="language-swift">    func setThumbnailView(_ pdfView:PDFView) {
        let thumbnailView = PDFThumbnailView()
        thumbnailView.translatesAutoresizingMaskIntoConstraints = false
        pdfView.addSubview(thumbnailView)
        
        thumbnailView.leadingAnchor.constraint(equalTo: pdfView.safeAreaLayoutGuide.leadingAnchor).isActive = true
        thumbnailView.trailingAnchor.constraint(equalTo: pdfView.safeAreaLayoutGuide.trailingAnchor).isActive = true
        thumbnailView.bottomAnchor.constraint(equalTo: pdfView.safeAreaLayoutGuide.bottomAnchor).isActive = true
        thumbnailView.bottomAnchor.constraint(equalTo: pdfView.safeAreaLayoutGuide.bottomAnchor).isActive = true
        
        thumbnailView.heightAnchor.constraint(equalToConstant: 40).isActive = true

        thumbnailView.thumbnailSize = CGSize(width: 20, height: 30)
        thumbnailView.layoutMode = .horizontal
        thumbnailView.pdfView = pdfView
    }
</code></pre>



<p>然后在刚才的<code>makeUIView</code>方法，<code>return pdfView</code>之前加入一句<code><strong>self</strong>.setThumbnailView(pdfView)</code>即可。</p>



<p>然后，查看预览区域，就会发现PDF显示区域下面出现了缩略图导航栏。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="964" height="610" src="https://codechina.org/wp-content/uploads/2023/01/截屏2023-01-03-21.33.40.png" alt="" class="wp-image-26825" srcset="https://codechina.org/wp-content/uploads/2023/01/截屏2023-01-03-21.33.40.png 964w, https://codechina.org/wp-content/uploads/2023/01/截屏2023-01-03-21.33.40-300x190.png 300w, https://codechina.org/wp-content/uploads/2023/01/截屏2023-01-03-21.33.40-768x486.png 768w" sizes="auto, (max-width: 964px) 100vw, 964px" /></figure>



<p>项目代码可从Github下载 <a href="https://github.com/Swift-Cast/PdfReader">https://github.com/Swift-Cast/PdfReader</a></p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p><a href="https://iapp4me.com/pdf-extractor">PDF Extractor &#8211; Extract text/images from PDF</a></p>
<p><a href="https://codechina.org/2023/01/26809/">从零开始，使用SwiftUI和PDFKit快速构建完全可定制的PDF阅读器</a>最先出现在<a href="https://codechina.org">Tinyfool的个人网站</a>。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://codechina.org/2023/01/26809/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			<media:content url="https://codechina.org/wp-content/uploads/2023/01/截屏2023-01-03-20.49.53-1024x662.png" medium="image" />
	</item>
		<item>
		<title>接受现实、持续改进，心怀梦想、永不放弃</title>
		<link>https://codechina.org/2022/11/25602/</link>
					<comments>https://codechina.org/2022/11/25602/#respond</comments>
		
		<dc:creator><![CDATA[tinyfool]]></dc:creator>
		<pubDate>Wed, 16 Nov 2022 01:00:00 +0000</pubDate>
				<category><![CDATA[iOS开发]]></category>
		<category><![CDATA[鸡汤]]></category>
		<guid isPermaLink="false">https://codechina.org/?p=25602</guid>

					<description><![CDATA[<p>最近我的App《英语轻松读》iOS版本连续更新了两个版本。其实上一个版本 1.17 到今天已经有一年多了。必须 [&#8230;]</p>
<p><a href="https://codechina.org/2022/11/25602/">接受现实、持续改进，心怀梦想、永不放弃</a>最先出现在<a href="https://codechina.org">Tinyfool的个人网站</a>。</p>
]]></description>
										<content:encoded><![CDATA[
<p>最近我的App<a href="https://apps.apple.com/cn/app/%E8%8B%B1%E8%AF%AD%E8%BD%BB%E6%9D%BE%E8%AF%BB/id1471605122?l=zh">《英语轻松读》iOS版本</a>连续更新了两个版本。其实上一个版本 1.17 到今天已经有一年多了。必须要升级的原因是，iOS 16带来的一些API和限制的改变，造成 1.17 版有频繁崩溃的问题。</p>



<p>然而从接到用户的抱怨到解决也花了很久，最后其实就改了几行而已。但是这个代码确实好久没碰了，我碰起来有点心慌。但是真的塌下心去研究，其实也没有花多久就解决了问题。然而马上发现还有一个 UI Bug，我也很快解决了，提交了。</p>



<span id="more-25602"></span>



<p>《英语轻松读》其实就是一个目标太大的 APP，目前都已经写了1万多行了，其实才挣了500美金，发布都快3年了。我很难控制我的目标，定得太大，做起来就很痛苦。其实如果谨慎的设置目标的话，《英语轻松读》应该可以做得更好，也不至于经常几个月不更新代码，甚至一年多都不更新代码。因为它太复杂了，有时候，连我自己去改代码的时候都很痛苦。</p>



<p>当然，代码里面有 60% 是 Sycx 老师写的也是原因之一。现在他已经是一个快乐的日本码农，暂时不参与《英语轻松读》了。</p>



<p><strong>我的通病</strong></p>



<p>我的通病就是喜欢定一个特别宏伟的目标，然后默默的努力，但是然后很久也没有一个结果。所以，就很难坚持。</p>



<p>其实，如果可以做好项目分解，那么可以完成。</p>



<p>我们面对的是一个非常复杂的时代。</p>



<p>改开和中国的人口红利，基本上要结束了。互联网和移动互联网的红利在中国也差不多结束了。</p>



<p>我们还经常需要一大早起来去做大筛。</p>



<p>这些都会严重地影响我的心情。</p>



<p>我想过无数的办法，但是最后，能解决的方法，仍旧是一点点地解决问题。</p>



<p>欲速则不达。</p>



<p><strong>解决之道</strong></p>



<p>我能想到的解决之道，只有接受现实、持续改进，心怀梦想、永不放弃。</p>



<p><strong>接受现实</strong></p>



<p>我发现我的问题是，很多时候，我喜欢去想象未来，去计划，去思考。但是，做一切的基础是接受现实。</p>



<p>现实是不完美的，甚至颠沛流离的，很难一切都如我们的心愿。但是，现实是基础。需要先接受现实，先去理解现实，先去彻底地明白现实的逻辑在哪里，我们才能进行下一步。</p>



<p><strong>持续改进</strong></p>



<p>我们经常会注意到，会醉心于那些牛逼的改进。但是，其实很多时候，成就整体提升的是一次次很小的持续改进。分解任务，小步快跑，可以让脚步更坚定，成果更加稳固。</p>



<p>如果接受了现实，然后停在那里也是没有用的。核心是要持续改进，从现实往前推一小步，一步一步地推进。</p>



<p>前几天，我在社交媒体上聊了，Fail fast, fail early and fail often 的理念。</p>



<p>所谓，Fail fast, fail early and fail often 的意思就是不要怕失败，失败得越快，改进得越快；失败得越早，越早可以改进；失败得越频繁，改进得越频繁。</p>



<p>但是这个理念，其实很多人都听说过，也觉得有道理，但是在现实中敢做的，能做好的人很少。这需要强大的内心和执行力。</p>



<p>举个例子，做自媒体也可以 Fail fast, fail early。怎么做，那就是不要想着做想了几年，但是就开始不了，你完全可以先胡乱做一个。一开始没人看你的文章、视频没关系，这叫做 Fail early。你就分析该怎么改进，直到开始有人看。</p>



<p>开始有了几个粉丝，不要害怕出错，大胆的改变风格，大胆的去犯错，去看到人们批评你的风格变得不好，看到流量下降，经常去这么做。然后去分析，哪些改进的方向是错误的，哪些是对的。杜绝错误的改进，稳固下来那些正确的改进。这就是 Fail often。</p>



<p>很多人不经常更新，经常期待憋稿子，憋很久出一个大招。这就违反了 Fail fast的原则。其实应该更频繁的更新，更频繁的出错，只有 Fail 得足够快才能改进的足够快。</p>



<p>但是这里面的逻辑很多人理解不了，所以就会卡在入门这里。</p>



<p>学写程序，学英语也都是一样的。</p>



<p>程序想写好，就要写一堆垃圾程序，不要怕人骂你的代码垃圾，代码有问题就改，有问题就改，问题出的足够多，改的足够多。你就是高手了。</p>



<p>学英语也是，学会一句hello就可以说，多听多说，不要怕人纠正，不要理那些纠结的人，多听多说自然就会了。</p>



<p><strong>心怀梦想、永不放弃</strong></p>



<p>前面说的一切不代表，我们不拥有伟大的梦想。不管这些梦想看起来多么渺茫，多么可笑。我们一方面要脚踏实地地一点点地完成每一个小目标。另外一方面，要永远记得自己的最终目标在哪里。</p>



<p>我们做的第一切都是为了最终目标而行，不要走了太久忘了出发的目的在哪里。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="768" height="384" src="https://codechina.org/wp-content/uploads/2022/11/boyandearth.png" alt="" class="wp-image-25603" srcset="https://codechina.org/wp-content/uploads/2022/11/boyandearth.png 768w, https://codechina.org/wp-content/uploads/2022/11/boyandearth-300x150.png 300w" sizes="auto, (max-width: 768px) 100vw, 768px" /></figure>



<p>欢迎点击<a href="https://apps.apple.com/cn/app/%E8%8B%B1%E8%AF%AD%E8%BD%BB%E6%9D%BE%E8%AF%BB/id1471605122?l=zh">链接</a>，下载《英语轻松读》iOS版（支持iPhone、iPad和M芯片Mac）。</p>
<p><a href="https://codechina.org/2022/11/25602/">接受现实、持续改进，心怀梦想、永不放弃</a>最先出现在<a href="https://codechina.org">Tinyfool的个人网站</a>。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://codechina.org/2022/11/25602/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			<media:content url="https://codechina.org/wp-content/uploads/2022/11/boyandearth.png" medium="image" />
	</item>
		<item>
		<title>苹果iPhone12旗舰机上的黑科技激光雷达到底是什么东西？有什么用处？</title>
		<link>https://codechina.org/2020/11/1785/</link>
					<comments>https://codechina.org/2020/11/1785/#respond</comments>
		
		<dc:creator><![CDATA[tinyfool]]></dc:creator>
		<pubDate>Mon, 23 Nov 2020 13:07:00 +0000</pubDate>
				<category><![CDATA[iOS开发]]></category>
		<category><![CDATA[IT行业]]></category>
		<guid isPermaLink="false">https://codechina.org/?p=1785</guid>

					<description><![CDATA[<p>今年苹果的 iPhone12旗舰机型上面搭载了激光雷达。很多人其实都听说过激光雷达，苹果的发布会上也提了这个东 [&#8230;]</p>
<p><a href="https://codechina.org/2020/11/1785/">苹果iPhone12旗舰机上的黑科技激光雷达到底是什么东西？有什么用处？</a>最先出现在<a href="https://codechina.org">Tinyfool的个人网站</a>。</p>
]]></description>
										<content:encoded><![CDATA[
<p>今年苹果的 iPhone12旗舰机型上面搭载了激光雷达。很多人其实都听说过激光雷达，苹果的发布会上也提了这个东西，但是其实我发现很多人都不了解这个东西到底是怎么回事。</p>



<p>所以，我今天就想从头从原理里，给大家讲清楚激光雷达是什么东西。以及它到底有什么用处。给大家讲明白，为什么苹果会在旗舰机型上放这么一个东西，以及这个东西对我们的未来、对这个世界有什么改变。</p>



<span id="more-1785"></span>



<p>首先来说，我们要聊一聊什么是激光雷达，Wiki上面的介绍是这样的：</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>光学雷达（英语LiDAR，是“light detection and ranging”的缩写），是一种光学遥感技术，它通过向目标照射一束光，通常是一束脉冲激光来测量目标的距离等参数。激光雷达在测绘学、考古学、地理学、地貌、地震、林业、遥感以及大气物理等领域都有应用。此外，这项技术还用于机载激光地图测绘、激光测高、激光雷达等高线绘制等等具体应用中。光学雷达对物体距离的测量与通常所说的雷达类似，都是通过测量发送和接受到的脉冲信号的时间间隔来计算物体的距离。因此，由于原理上的相似性，尽管雷达的准确定义是使用微波或无线电波等波长较长的电磁波进行检测测距的设备，光学雷达这一术语仍然被广泛使用。</p>
<cite>Wiki</cite></blockquote>



<p>这个技术最早就是用在遥感上面，跟我们普通人感觉距离很远，其实Google地图上啊，一些别的地图上的地形图，可以看到地面高低起伏，山峦河流的高低的那种地形图，其实很多就是用激光雷达来测量绘制出来的。</p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="800" height="754" src="https://codechina.org/wp-content/uploads/2020/11/IMG_EB513406EDAF-1.jpeg" alt="" class="wp-image-1788" srcset="https://codechina.org/wp-content/uploads/2020/11/IMG_EB513406EDAF-1.jpeg 800w, https://codechina.org/wp-content/uploads/2020/11/IMG_EB513406EDAF-1-300x283.jpeg 300w, https://codechina.org/wp-content/uploads/2020/11/IMG_EB513406EDAF-1-768x724.jpeg 768w" sizes="auto, (max-width: 800px) 100vw, 800px" /><figcaption class="wp-element-caption">Google地图里面我国西藏部分地区的地形图</figcaption></figure>
</div>


<p>这种是用卫星或者是用飞机、无人机、直升机之类的搭载高功率的激光雷达从天上往下扫描得到的。</p>



<p>更多人听说的激光雷达最早是在各种自动驾驶车辆上。汽车装配了激光雷达以后，就可以获得一些视觉上无法获得信息，得到周围物体的3D模型，更好的帮助自动驾驶，防止出现事故等等。</p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="620" height="465" src="https://codechina.org/wp-content/uploads/2020/11/MjY2ODU2OA.jpeg" alt="" class="wp-image-1789" srcset="https://codechina.org/wp-content/uploads/2020/11/MjY2ODU2OA.jpeg 620w, https://codechina.org/wp-content/uploads/2020/11/MjY2ODU2OA-300x225.jpeg 300w" sizes="auto, (max-width: 620px) 100vw, 620px" /><figcaption class="wp-element-caption">汽车上的激光雷达</figcaption></figure>
</div>


<p>那么手机上的激光雷达是什么样子呢？</p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="576" src="https://codechina.org/wp-content/uploads/2020/11/dims-1024x576.jpeg" alt="" class="wp-image-1790" srcset="https://codechina.org/wp-content/uploads/2020/11/dims-1024x576.jpeg 1024w, https://codechina.org/wp-content/uploads/2020/11/dims-300x169.jpeg 300w, https://codechina.org/wp-content/uploads/2020/11/dims-768x432.jpeg 768w, https://codechina.org/wp-content/uploads/2020/11/dims-1200x675.jpeg 1200w, https://codechina.org/wp-content/uploads/2020/11/dims.jpeg 1320w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">手机上的激光雷达</figcaption></figure>
</div>


<p>iPhone 12 Pro Max三个摄像头下方的这个大黑点，就是激光雷达。</p>



<p>它是怎么工作的呢？</p>



<p>我给大家看一段演示，</p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="640" height="360" src="https://codechina.org/wp-content/uploads/2020/11/v2_8fd2ca05b94a4cf5b07fb93104ff9fd5_img_000.gif" alt="" class="wp-image-1792"/><figcaption class="wp-element-caption">iPad Pro演示的激光雷达的基本原理</figcaption></figure>
</div>


<p>这个是拿着iPad Pro演示的，iPad Pro的激光雷达和iPhone 12 Pro系列的激光雷达是一样的。实际上激光雷达的工作方式就是这个传感器会发射出很多束红外激光（人眼不可见，这种演示是用红外感光的摄像机拍摄的），在平面上，物体表面上形成很多的脉冲光点，摄像头捕捉到这个光点的时间就可以知道这些光点，也就是物体的表面距离这个激光雷达的距离。有了这些距离信息，我们就可以计算物体表面的3D模型。</p>



<p>那么实际上有的人可能知道，现在有很多安卓手机，内置了一种TOF（Time-of-flight）传感器，它也可以做3D建模。那么TOF和激光雷达的区别在哪里呢？</p>



<p>大家可以看一下这个比较，上面仍旧是iPad Pro的激光雷达，下面是三星的TOF传感器：</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="640" height="360" src="https://codechina.org/wp-content/uploads/2020/11/tof-lidar.gif" alt="" class="wp-image-1799"/></figure>



<p>简单的说，TOF传感器发射的是一束扩散的光，所以它可能不是激光，所以 你看到的是一个巨大的光点，而激光雷达，你看到的是一组光点的矩阵。</p>



<p>这两个的主要区别是什么呢？他们都是在算光打到物体表面以后发射回来的时间，这样就得到当前物体的表面各个部分和镜头之间的距离。但是安卓上使用的这种TOF的精度比较低，成本也比较低。因为它只打一束光，而且应该不是激光，因为它可以扩散成一个大光斑。而激光雷达必须是激光，激光才能保证不管多远，它都是直的，不扩散。而且激光雷达需要多束光，具体的技术细节我也没跟踪，但是这么小的部件应该不是靠旋转运动部件来生成多个光电脉冲。应该不包含任何的可动部件。但是总之它的成本就会更高一些。</p>



<p>但是苹果用了更高成本的激光雷达，它也能获得更高的精确度和稳定性。</p>



<p>这就是激光雷达的一个基本原理。</p>



<p>然后我们看激光雷达到底能干什么呢？</p>



<p>我使用了一个，苹果自己的ARKit的3D场景重现的demo，来给大家演示。</p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="160" height="190" src="https://codechina.org/wp-content/uploads/2020/11/output-160.gif" alt="" class="wp-image-1793"/><figcaption class="wp-element-caption">这个Demo下的我家</figcaption></figure>
</div>


<p>这个Demo的名字叫做Visualizing and Interacting with a Reconstructed Scene，你可以在苹果开发者网站<a href="https://developer.apple.com/documentation/arkit/world_tracking/visualizing_and_interacting_with_a_reconstructed_scene">下载这个代码</a>,如果你会iOS开发的话，可以自己下载，在自己的iPhone 12 Pro / Pro max或者iPad Pro上测试，其他没有激光雷达的机器，这个App跑不了。&nbsp;</p>



<p>这个场景就是我家，你可以看得很清楚，在我家的所有家具物品上面，都蒙着一层小网格。这些网格其实就是iPhone通过激光雷达和图像对我家的3D实景实时模型。</p>



<p>如果你会安装这个Demo App到你的手机的话，在玩这个APP的时候，你可以试一试，把用手指把激光雷达遮住，你就会发现马上它的实时建模能力就消失了。原有的模型线框还在，但是新的实时建模就没法做了。</p>



<p>你还可以看看点云的例子，这个例子叫<a href="https://developer.apple.com/documentation/arkit/world_tracking/visualizing_and_interacting_with_a_reconstructed_scene">Visualizing a Point Cloud Using Scene Depth</a>。</p>



<p>这个例子，我就不放视频了。点云是另外一种描述三维空间的方式，原理其实跟上一个Demo是一个意思。但是表达方式不同。下图是透过卧室的窗帘看我的卧室的3D点云。</p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="452" src="https://codechina.org/wp-content/uploads/2020/11/point-cloud-1024x452.png" alt="" class="wp-image-1794" srcset="https://codechina.org/wp-content/uploads/2020/11/point-cloud-1024x452.png 1024w, https://codechina.org/wp-content/uploads/2020/11/point-cloud-300x133.png 300w, https://codechina.org/wp-content/uploads/2020/11/point-cloud-768x339.png 768w, https://codechina.org/wp-content/uploads/2020/11/point-cloud.png 1150w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
</div>


<p>简单的说，如果你想开发一个程序，你需要能感知和对周围环境建模，你就需要激光雷达。</p>



<p>那么激光雷达能干什么呢？</p>



<h2 class="wp-block-heading"><strong>首先是，可以增强拍照的效果。</strong></h2>



<p>其实在苹果的发布会里头，就已经做了说明。激光雷达能提高摄像头的精确度，能减少聚焦的时间。特别是在夜景模式下，激光雷达可以让聚焦时间快6倍。</p>



<p>苹果还演示了一个，拍摄出来的效果：</p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="948" height="796" src="https://codechina.org/wp-content/uploads/2020/11/Screenshot-2020-11-20-19.11.21.png" alt="" class="wp-image-1795" srcset="https://codechina.org/wp-content/uploads/2020/11/Screenshot-2020-11-20-19.11.21.png 948w, https://codechina.org/wp-content/uploads/2020/11/Screenshot-2020-11-20-19.11.21-300x252.png 300w, https://codechina.org/wp-content/uploads/2020/11/Screenshot-2020-11-20-19.11.21-768x645.png 768w" sizes="auto, (max-width: 948px) 100vw, 948px" /></figure>
</div>


<p>我们可以发现虽然明显是夜景，但是看着很明亮，聚焦也很清楚，细节也很清楚，而且背景虚化也非常准确。</p>



<h2 class="wp-block-heading">激光雷达，还可以大大提高AR游戏的效果。</h2>



<p>那么我们首先还是来看一个Demo，我们先不去玩AR游戏。</p>



<p>这个Demo是用iPhone 12 Prox Max和iPhone X对比了一下ARKit老版本就有在实景中寻找平面，比如桌子的一个Demo。一般来说，现在的AR游戏都是先在实景空间里面寻找一个平面比如桌子，然后把游戏场景放在这个平面上，这样就得到了一个身临其境的感觉，比如一场世纪大战发生在你家客厅的餐桌上。</p>



<p>那么这个Demo叫做，<a href="https://developer.apple.com/documentation/arkit/world_tracking/tracking_and_visualizing_planes">Tracking and Visualizing Planes</a>。</p>



<p>下图就是这个Demo，左边是我的iPhone 12 Pro Max，右边是我的iPhone X。</p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="898" height="868" src="https://codechina.org/wp-content/uploads/2020/11/surface.png" alt="" class="wp-image-1796" srcset="https://codechina.org/wp-content/uploads/2020/11/surface.png 898w, https://codechina.org/wp-content/uploads/2020/11/surface-300x290.png 300w, https://codechina.org/wp-content/uploads/2020/11/surface-768x742.png 768w" sizes="auto, (max-width: 898px) 100vw, 898px" /></figure>
</div>


<p>明显看得出来，iPhone 12 Pro Max对周围环境的建模和感知能力比iPhone X强得多。</p>



<p>我们再进入到一个真实的游戏的例子，这个游戏是Angry Bird VR。我觉得这是目前最好玩的一个AR/VR游戏。</p>



<figure class="wp-block-embed aligncenter is-type-video is-provider-vimeo wp-block-embed-vimeo"><div class="wp-block-embed__wrapper">
https://vimeo.com/482604768
</div></figure>



<p>首先我可以把这个游戏场景，布置在我的床上。如果看了刚才的例子会发现，如果你用iPhone X的话，床是有可能不会被识别为平面的。但是用iPhone12 Pro Max，就可以成功识别成平面。</p>



<p>这样的AR游戏的好处是，它有一种很奇特的场景感。就跟你玩积木一样，积木可以在桌子上玩，可以在床上玩，也可以在地上玩，可以跟家里的摆设家具产生互动。但是一般的游戏不行，只能在一个虚拟的背景下玩。而这种AR游戏就可以产生更好的更奇妙的场景感。</p>



<p>而激光雷达不仅仅可以寻找到更多的平面，让你的AR游戏更好布局，其实还可以让游戏更好的理解周围的环境，当然未来可能有更多游戏可以让你感受到有激光雷达和没有激光雷达完全不同的游戏效果。仅就现在的游戏来说，已经有很大的改善了。</p>



<p>再下来，激光雷达可以对物体甚至房屋进行3D扫描。</p>



<p>你扫描你的房屋，也可以扫描小的东西，比如手办。你可以扫描了房屋以后，进行装修的模拟，进行一些改造的预演。你也可以扫描一个现有的手办，再3D打印出来，或者用3D设计软件改造，来打造一个你独一无二的手板设计，然后再打印出来。</p>



<p>今天我只想说说房屋扫描的例子。国内有一家比较著名的房地产网站叫做链家。链家网站上，只要是有带有这个图标的房源，都是有VR实景的房源。</p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="760" height="470" src="https://codechina.org/wp-content/uploads/2020/11/Screenshot-2020-11-20-19.54.25.png" alt="" class="wp-image-1801" srcset="https://codechina.org/wp-content/uploads/2020/11/Screenshot-2020-11-20-19.54.25.png 760w, https://codechina.org/wp-content/uploads/2020/11/Screenshot-2020-11-20-19.54.25-300x186.png 300w" sizes="auto, (max-width: 760px) 100vw, 760px" /></figure>
</div>


<p>大家可以在链家网站和App上试试看，这种带AR实景的房源你可以点进去，随意拖拽，看每个房间每个角落的情况。还可以直接看这个房屋的3D模型。</p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="892" src="https://codechina.org/wp-content/uploads/2020/11/Screenshot-2020-11-20-19.56.27-1024x892.png" alt="" class="wp-image-1802" srcset="https://codechina.org/wp-content/uploads/2020/11/Screenshot-2020-11-20-19.56.27-1024x892.png 1024w, https://codechina.org/wp-content/uploads/2020/11/Screenshot-2020-11-20-19.56.27-300x261.png 300w, https://codechina.org/wp-content/uploads/2020/11/Screenshot-2020-11-20-19.56.27-768x669.png 768w, https://codechina.org/wp-content/uploads/2020/11/Screenshot-2020-11-20-19.56.27.png 1118w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
</div>


<p>非常方便，这就几乎可以完美的代替实地看房，可以传达的信息量远远大于房屋的照片。甚至我一度拿这个当做游戏去看不同的区域上海的房子的内部布局，比如原法租界区域的民国时代的老房子的内部装修现在是什么样子的。一些新的高档公寓的内部是怎么样的，等等。甚至里面还包括一些历史建筑，有些还是住人的，也有出租和买卖的需求。</p>



<p>那么链家是怎么做这种VR房源的呢？链家有一套VR扫描设备，这是一套非常专业的设备。</p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="420" src="https://codechina.org/wp-content/uploads/2020/11/Screenshot-2020-11-19-19.00.25-1024x420.png" alt="" class="wp-image-1803" srcset="https://codechina.org/wp-content/uploads/2020/11/Screenshot-2020-11-19-19.00.25-1024x420.png 1024w, https://codechina.org/wp-content/uploads/2020/11/Screenshot-2020-11-19-19.00.25-300x123.png 300w, https://codechina.org/wp-content/uploads/2020/11/Screenshot-2020-11-19-19.00.25-768x315.png 768w, https://codechina.org/wp-content/uploads/2020/11/Screenshot-2020-11-19-19.00.25-1536x630.png 1536w, https://codechina.org/wp-content/uploads/2020/11/Screenshot-2020-11-19-19.00.25-2048x840.png 2048w, https://codechina.org/wp-content/uploads/2020/11/Screenshot-2020-11-19-19.00.25-1200x492.png 1200w, https://codechina.org/wp-content/uploads/2020/11/Screenshot-2020-11-19-19.00.25-1980x812.png 1980w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
</div>


<p>当然，链家开发了一系列简化的设备。但是，不管是这个比较专业的设备，还是比较轻量级的这些扫描设备。都有一个问题，因为是专业设备，一般人不会用，扫描完了也不知道怎么处理。</p>



<p>所以链家还有一套流程：</p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="482" src="https://codechina.org/wp-content/uploads/2020/11/Screenshot-2020-11-19-19.04.44-1024x482.png" alt="" class="wp-image-1804" srcset="https://codechina.org/wp-content/uploads/2020/11/Screenshot-2020-11-19-19.04.44-1024x482.png 1024w, https://codechina.org/wp-content/uploads/2020/11/Screenshot-2020-11-19-19.04.44-300x141.png 300w, https://codechina.org/wp-content/uploads/2020/11/Screenshot-2020-11-19-19.04.44-768x362.png 768w, https://codechina.org/wp-content/uploads/2020/11/Screenshot-2020-11-19-19.04.44-1200x565.png 1200w, https://codechina.org/wp-content/uploads/2020/11/Screenshot-2020-11-19-19.04.44.png 1316w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
</div>


<p>就是你要现在线上下单，然后约时间，然后专业人士来帮你拍摄，然后生成了结果，然后你想卖的房子才会有VR信息。这个流程就比较复杂了，需要房主或者是房屋中介和链家做很多沟通的工作。</p>



<p>但是现在有了激光雷达，有一些免费App的扫描效果已经相当不错了。比如我就很推荐一个叫做<a href="https://apps.apple.com/us/app/3d-scanner-app/id1419913995">3D scanner App的App</a>。</p>



<p>用它哪怕是普通人也可以把自己的房子给数字化，VR化，3D建模。这个App的好处不仅在于免费，而且它支持各种3D格式的导出，我也听到一些专业做装修、设计的朋友在用这个App，对他们的工作有很大的帮助，下面是我录的一个Demo视频：</p>



<figure class="wp-block-embed is-type-video is-provider-vimeo wp-block-embed-vimeo wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
https://vimeo.com/482605344
</div></figure>



<p>这个App的扫描效果非常好。它的扫描方法也很简单，你开始扫描以后，你看到这种有紫色覆盖的区域就代表这个区域已经被扫描了。你要做的事情只是把房屋中间每一个区域，都让它变成紫色。</p>



<p>你可以从各个角度去扫描，你扫描过的角度就会出现在最后的模型里面。</p>



<p>再也不需要专业设备，一台手机就可以了，也不需要专业的人和软件去做后续的处理。</p>



<p>专业的扫描方式是有专业人员把专业机器架在某个位置，按个按钮，它会自动转圈，然后得到数据。然后专业人员再找另外一个关键的点，架设计器，它在自动扫描。一个房子可能要架设6-7次。</p>



<p>得到这些数据后，需要带回到公司让专业人士去做处理，聚合在一起才形成一个房屋的数据。</p>



<p>而这个App不要你有任何的专业知识，就玩游戏一样，你只要最后把让紫色覆盖屋子的全部区域就可以了。所有的数据处理都是App就可以完成的。</p>



<p>这就可能会催生各种各样的商业模式，以后也许任何卖东西的网站，都可以提供商品的3D模型，不仅仅是照片。房屋中介网站，短租网站Airbnb之类都可以提供房子的3D模型。毕竟只需要商品的提供者，房主自己就可以做3D模型了，不要请专业的人来帮忙扫描了。</p>



<h2 class="wp-block-heading">这绝对不是全部，剩下的其实要看想象力了。</h2>



<p>激光雷达并不仅仅有刚才说的作用。苹果在iPhone 12 Pro系列，iPad Pro上安装了激光雷达，等于突然把一个非常专业的能力，交给了全世界无数的用户。只要你买得起一个iPhone，你就可以拥有这种能力。</p>



<p>更重要的不是前面讲的东西，而是未来会不会有更多的玩法呢？这是我一直在思考的问题，这也是为什么今年我一定要买iPhone 12 Pro Max的一个最主要的原因。</p>



<p>我希望的是给大家一个启发，给开发者，给普通用户，给有想法的一些专业人士一些启发，了解到这个传感器是什么原理，可以做到什么样的效果，以及目前的应用在哪里。</p>



<p>但是我更想看到的更多人找到这么一个黑科技神器的更多用途。</p>



<p>举个例子，我们之前聊过很多特别大的商场下面的停车场就像一个迷宫，怎么都找不到出口。那么有了激光雷达，我们可以在下车以后，打开激光雷达，建立一个模型，然后走出停车场。那么这一路就形成了一个路径图和路径的3D模型。然后从之前的出口到商场以后，在回来的时候，根据这个路径图和3D模型就可以导航回来了。</p>



<p>等等，其实我自己有一个我觉得特别振奋人心的想法正在思考和准备开发，也许很快，我就能做一个Demo出来给大家看。这个东西做出来我可能会开源。</p>



<p>欢迎大家留言讨论。说说你对这个技术怎么看，谢谢。</p>



<p>因为文章体裁限制，一些Demo无法在文章中完美展现，如果想了解更多的信息也可以看我发表在Youtube上的视频。</p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy"  id="_ytid_13057"  width="580" height="326"  data-origwidth="580" data-origheight="326" src="https://www.youtube.com/embed/4sw0ud7Lp0Y?enablejsapi=1&#038;autoplay=0&#038;cc_load_policy=0&#038;cc_lang_pref=&#038;iv_load_policy=1&#038;loop=0&#038;rel=1&#038;fs=1&#038;playsinline=0&#038;autohide=2&#038;theme=dark&#038;color=red&#038;controls=1&#038;disablekb=0&#038;" class="__youtube_prefs__  epyt-is-override  no-lazyload" title="YouTube player"  allow="fullscreen; accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen data-no-lazy="1" data-skipgform_ajax_framebjll=""></iframe>
</div></figure>
<p><a href="https://codechina.org/2020/11/1785/">苹果iPhone12旗舰机上的黑科技激光雷达到底是什么东西？有什么用处？</a>最先出现在<a href="https://codechina.org">Tinyfool的个人网站</a>。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://codechina.org/2020/11/1785/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			<media:content url="https://codechina.org/wp-content/uploads/2020/11/dims-1024x576.jpeg" medium="image" />
	</item>
		<item>
		<title>Xcode 12 比 Xcode 11 有很多改进， 我遇到的一个具体案例</title>
		<link>https://codechina.org/2020/07/1700/</link>
					<comments>https://codechina.org/2020/07/1700/#respond</comments>
		
		<dc:creator><![CDATA[tinyfool]]></dc:creator>
		<pubDate>Fri, 17 Jul 2020 02:00:02 +0000</pubDate>
				<category><![CDATA[iOS开发]]></category>
		<category><![CDATA[技术]]></category>
		<category><![CDATA[if]]></category>
		<category><![CDATA[swift]]></category>
		<category><![CDATA[swiftui]]></category>
		<category><![CDATA[xcode]]></category>
		<guid isPermaLink="false">https://codechina.org/?p=1700</guid>

					<description><![CDATA[<p>编译差异 最近同时使用 Xcode 11 和 Xcode beta (也就是12)，发现，后者性能提升超级明显 [&#8230;]</p>
<p><a href="https://codechina.org/2020/07/1700/">Xcode 12 比 Xcode 11 有很多改进， 我遇到的一个具体案例</a>最先出现在<a href="https://codechina.org">Tinyfool的个人网站</a>。</p>
]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">编译差异</h2>



<p>最近同时使用 Xcode 11 和 Xcode beta (也就是12)，发现，后者性能提升超级明显，而编译器的理解能力也提升很多。</p>



<p>比如，我的一个SwiftUI代码里面，有一个稍微复杂一点的判断逻辑，有三个 if/else 分支，如下：</p>



<pre class="wp-block-code"><code lang="swift" class="language-swift line-numbers">Group {
    if(index>0 &amp;&amp; item.rating>4.0) {
        PoiLargeImageCell(item:item)
    }else if(index==0){
        InvisibleCell(largeHeadView:self.$largeHeadView)
        PoiCell(item: item)
    }else {
        PoiCell(item: item)
    }
}</code></pre>



<p>这个代码在 Xcode 12 可以正常编译，没有任何问题。但是，在 Xcode 11 下就会直接报错，而且是那种完全文不对题的错误信息。错误信息不是在 Swift 5 发布后有改善了么？但是在这个问题下仍旧文不对题，所以，我只能把这个稍微复杂一点的 if/else 语句改为两个 Group  嵌套的做法，如下，这样在 Xcode 11 就可以正常编译了。</p>



<pre class="wp-block-code"><code lang="swift" class="language-swift">Group {
    if(index==0){
        ZStack{
            InvisibleCell(largeHeadView:self.$largeHeadView)
            PoiCell(item: item)
        }
    }else {
        Group {
            if(index>0 &amp;&amp; item.rating>4.0){
                PoiLargeImageCell(item:item)
            }else {
                PoiCell(item: item)
            }
        }
    }
}</code></pre>



<p>为了迁就编译器，代码变啰嗦多了。不过暂时需要这么做，期待 Xcode 12 早日正式发布。这么多年以来，第一次感觉苹果的 Beta 版本这么靠谱，感觉苹果今年果然有点进步。</p>



<h2 class="wp-block-heading">提交上出现的错误信息</h2>



<p>今天我用 Xcode 11 提交一个 app ，遇到了一个以前没见过的错误信息，“Profile doesn&#8217;t include the com.apple.application-identifier entitlement.”。查了下，原来跟 MacOS Big Sur 有关系，跟 Xcode 11 和 Xcode 12 beta 也有关系。解决方法很搞笑，那就是用 Xcode 11来编译打包，用 Xcode 12 beta 来 upload app。详情可以参考<a href="https://developer.apple.com/forums/thread/650438">苹果开发者论坛的相关帖子</a>。</p>
<p><a href="https://codechina.org/2020/07/1700/">Xcode 12 比 Xcode 11 有很多改进， 我遇到的一个具体案例</a>最先出现在<a href="https://codechina.org">Tinyfool的个人网站</a>。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://codechina.org/2020/07/1700/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			<media:content url="https://codechina.org/wp-content/uploads/2020/07/screen-hero-large.jpg" medium="image" />
	</item>
		<item>
		<title>iPad革命：开发者的机遇和挑战</title>
		<link>https://codechina.org/2010/05/1614/</link>
					<comments>https://codechina.org/2010/05/1614/#respond</comments>
		
		<dc:creator><![CDATA[tinyfool]]></dc:creator>
		<pubDate>Tue, 18 May 2010 02:41:07 +0000</pubDate>
				<category><![CDATA[iOS开发]]></category>
		<category><![CDATA[IT行业]]></category>
		<guid isPermaLink="false">https://codechina.org/?p=1614</guid>

					<description><![CDATA[<p>iPad采用了和iPhone一样的底层系统，开放方式基本相同。同时性能大幅提升，屏幕尺寸大幅度提升，以前在iP [&#8230;]</p>
<p><a href="https://codechina.org/2010/05/1614/">iPad革命：开发者的机遇和挑战</a>最先出现在<a href="https://codechina.org">Tinyfool的个人网站</a>。</p>
]]></description>
										<content:encoded><![CDATA[				<div class="wp-block-uagb-table-of-contents uagb-toc__align-left uagb-toc__columns-1  uagb-block-1b2e95ea-77ef-47bc-b971-3eac31a3fa1c      "
					data-scroll= "1"
					data-offset= "30"
					style=""
				>
				<div class="uagb-toc__wrap">
						<div class="uagb-toc__title">
							目录						</div>
																						<div class="uagb-toc__list-wrap ">
						<ol class="uagb-toc__list"><li class="uagb-toc__list"><a href="#一贴心的用户体验" class="uagb-toc-link__trigger">一、贴心的用户体验</a><li class="uagb-toc__list"><a href="#二无所不在的电脑" class="uagb-toc-link__trigger">二、无所不在的电脑</a><li class="uagb-toc__list"><a href="#三阅读的新纪元" class="uagb-toc-link__trigger">三、阅读的新纪元</a><li class="uagb-toc__list"><a href="#四教育和其他商业用途" class="uagb-toc-link__trigger">四、教育和其他商业用途</a><li class="uagb-toc__list"><a href="#机遇和挑战" class="uagb-toc-link__trigger">机遇和挑战</a></ol>					</div>
									</div>
				</div>
			


<p><em>iPad采用了和iPhone一样的底层系统，开放方式基本相同。同时性能大幅提升，屏幕尺寸大幅度提升，以前在iPhone上无法实现，或者难以实现的一些应用的机会来了。所以，现在对每个有志于iPad开发的人来说，唯一的挑战是你的想象力和你的执行能力。</em></p>



<span id="more-1614"></span>



<p>iPad发布的那天晚上，我正和几个朋友吃饭。饭后我们跑到奇遇花园咖啡馆一起通宵看发布会。整个发布会平淡无奇，之前的诸多期待一一落空，大家都并不激动。我也如是，我心态很平和，我认为革命不是天天会有的，iPhone已经革了整个移动产业10年的命，我们怎么能期待苹果公司年年都推出一个革命性的产品呢。</p>



<p>但是，当我看到iPad可以连续使用10个小时，待机一个月的时候；当我知道最低配置只需要499美元的时候，我又开始觉得这显然是一场新的革命。</p>



<p>革命在哪里？</p>



<h2 class="wp-block-heading"><strong>一、贴心的用户体验</strong></h2>



<p>在iPhone出现之前，在手机行业Nokia就是最好的用户体验的代名词。人们习惯了Nokia手机的一切，中规中矩的样子，耐摔的机身，中间的方向键，下面的数字键盘，甚至包括那个每次连wifi都需要点一堆确认的连网界面。也许是正是因为这样，近10年来，Nokia的每款新手机，虽然看着越来越酷，但是操作上用户体验上，几乎没有任何的进步。而且不仅仅是Nokia、整个手机行业都是如此。iPad出现之前的平板电脑、触摸设备、以及电子阅读市场也如是。</p>



<p>所以，当iPhone带来了多点触摸、全功能基于HTML5标准的浏览器、基于iPod的音乐体验、以及重力感应、屏幕自动翻转等等从来没有出现在别的手机中的新体验时，观众们报以一阵阵欢呼。</p>



<p>是时候给平板市场一点震撼了。</p>



<p>不知道有人注意到没有，很多场所的触摸屏电脑上面跑的是Windows，这当然无所谓，但是那些屏幕上赫然还有个鼠标光标，经常你需要点一下，光标才会跑到你的指下，然后你再点那些图标按钮才会起作用。</p>



<p>这何其荒谬？但是这就是行业的现状。</p>



<p>另外一个有趣的例子，就是我们已经相当熟悉的上网本。我见过几个朋友的上网本，虽然轻薄，看上去很可爱，但是作为用户他们无一例外都有诸多抱怨，比如默认字体根本看不清楚，触摸板很难用，挂上鼠标则又丧失了移动性。我也自己尝试过几次，那么小的屏幕，你在标准笔记本上熟练的Windows变得陌生，所有熟悉的软件操作起来都那么的别扭。</p>



<p>这一切的一切，根源何在？</p>



<p>就在于这么多年以来，厂商们虽然不停的推销给我们各种概念，但是从来没有根据各种使用场景，去帮我们认真地打磨用户体验。</p>



<p>鼠标，很好。全键盘，很好。滚动条，很好。……</p>



<p>但是他们真的适合出现在移动设备上么？或者说，他们适合原封不动的出现在移动设备上么？</p>



<p>有一次在地铁上，我看到一个漂亮女孩儿，用一个手写笔，费力的拖动手机界面上的一个滚动条，她正在寻找一个联系人。我当时恨不得对她大喊，“你改悔吧，扔掉这破玩意儿，买个iPhone吧！”</p>



<p>不知道没用过iPhone的读者能不能想象，在iPhone上如果你需要滚动屏幕你该怎么办？不，不是滚动条，也不是热键，你用手直接拖动屏幕上的内容就可以了。</p>



<p>我有很多朋友告诉我，他们一岁两岁的孩子已经可以轻松的玩转iPhone了，知道怎么打开游戏，知道怎么听音乐。甚至有一个4岁的孩子知道怎么给爸爸打电话，虽然他不认识字，但是他可以在通讯录里面轻松的翻到他爸爸的电话。</p>



<p>上个月，我把一台我淘汰下来的PC搬到了我父母家里，用了两三天教我爸爸上网。他小学没有毕业，就做了工人，15岁就去当兵了，但是人非常聪明，写的一手好字。但是我教他使用PC和Windows还是非常的困难，这当然也怪我不够耐心，但是使用一台PC实在是太繁琐了，让年纪大的他记住那些乱七八糟的细节太难了。</p>



<p>那时候，我就急切地想得到一台当时还没有发售的iPad，送给父母。</p>



<p>还有，一段时间以来，我都在考虑未来女儿开始懂事了，该怎么教她学电脑。出现iPad后，我觉得这个问题迎刃而解了。</p>



<p>比尔盖茨曾经有个梦想，希望每个家庭都有台电脑，在全世界的很多地方，在中国相对富裕的地方，这个梦想都已经实现了。</p>



<p>但是，让电脑亲近家里的每个家庭成员，是我的梦想。在iPad出现之前，我不敢奢望，现在马上也要实现了。</p>



<h2 class="wp-block-heading"><strong>二、无所不在的电脑</strong></h2>



<p>当iPad即将诞生的消息还仅仅是个谣言的时候，就有无数的人在讨论，既然我们已经有了无所不在的手机，可以方便携带的笔记本电脑（或上网本），我们还需要iPad这样的东西么？</p>



<p>以前，这也是我心中的一个疑问。</p>



<p>然而，iPad的连续使用时间和待机时间、iPad的轻薄，解决了我的疑问。</p>



<p>以后，我们出门的时候，可以只带iPhone和iPad。只要不是非常正式的场合，或者复杂的工作应用，笔记本可以做到的事情iPad都可以做到，而且它的续航时间更长，更轻薄好带。</p>



<p>你可以带上它去咖啡馆跟朋友聊天，用它上上网，听听歌，看看书，玩玩游戏。你可以出差的时候带上它，你可以在郊游的时候带上它，你甚至可以如厕的时候带上它。</p>



<p>一次跟朋友聊到iPad的时候，他说到，iPad上面要是做个菜谱软件一定会火的。我说，太对了，这东西完全可以带到厨房，放在案板旁边。这时候，你就会明白传统上网本的轻薄对你意义真的不大。</p>



<p>手机照相功能刚刚出现的时候，就曾经有很多质疑，很多人说，谁会用品质这么差的相机去拍照啊。然而，没有多久，到处就充斥了各式各样手机拍出的东西，甚至很多著名的新闻事件，唯一的见证也是一张手机拍的相片。</p>



<p>这是为什么呢？人们放弃了对照片品质的追求了？显然不是，著名战地摄影师罗伯特·卡帕曾说过，“照片不够好，是因为你离的不够近。”，陈冠希同学曾实践过，深知所言非虚。新闻事件发生时，背着沉重高端单反的摄影记者还在出租车里面流汗时，新闻现场旁的路人就已经用普通手机拍下了最珍贵的照片，通过彩信或者网络传到了世界的每个角落。</p>



<p>所以，即便iPad从性能上，键盘手感上，绝无可能超过你的台式机，甚至你的笔记本，也无所谓，它可以在每一个你需要的时候到场，解决你的燃眉之急。</p>



<h2 class="wp-block-heading"><strong>三、阅读的新纪元</strong></h2>



<p>不管从哪里算起，纸张的诞生都已经有数千年了，这无疑是世界上最伟大的发明，它是我们天天在阅读的书的物质基础。它成就了书的辉煌，它承继了几千年的人类文明，记载了所有的悲欢离合，所有伟大的梦想，所有艰苦的努力，所有辉煌……</p>



<p>然而，纸的物理特性也构成了书的全部局限。</p>



<p>它虽然看起来是那么的轻薄，但是有质量，也有体积。这些年在我每次搬家的时候，书都是最沉重的那个几个箱子的主要内容。</p>



<p>从纸到书，需要印刷，装订，一系列复杂的流程。书从工厂到我们手中又需要走过很多流通环节。这些构成了出版一本书需要的时间、艰辛、成本和资源消耗。</p>



<p>所以，Kindle的出现曾让我惊喜万分，搬家的时候，你纵有万卷藏书也可以一手掌握了。更重要的是，你可以在一本书的作者，把它写完以后的瞬间，看到这本书。而随着电子出版的发展，我们应该能更方便廉价地享受世界上所有美好的知识，与此同时作者也有可能获得更为丰厚的收入。</p>



<p>有很多人不能理解，甚至不能接受，他们说，数字化后不再有纸飞墨香，数字化的介质无法像纸一样传递感情。</p>



<p>我理解所有念旧的人们，然而，新的介质总是会在技术成熟后替代旧的介质。现在还有多少人通过买磁带去听流行歌曲？连CD都已经少了。黑胶之类的东西只能在较小的发烧友圈子里继续延续生命。所有新的歌曲都出CD版，甚至直接出网络版。</p>



<p>你可以继续喜欢老的介质，但当你最钟爱的内容和他们的发行者转到新的介质上时，你别无选择，只有前进。</p>



<p>Kindle屏幕使用的电子墨水技术，有很多优点：看上去很舒服，非常接近纸张的感觉；非常省电，不翻页只显示甚至不费电。</p>



<p>但是局限性也非常的明显，目前还不支持彩色（据说即将，但是可靠性，成本等都仍需要考察），屏幕内容切换很慢，不适合用来显示任何动画和交互内容。</p>



<p>所以，Kindle的革命是个半截子革命。</p>



<p>它就像几乎人人家中都曾有过的黑白电视一样，注定是个中间产物。一旦彩电价格下降到一般人可以接受的程度，黑白电视就会被迅速淘汰。70-80年代，在中国的很多城镇家庭都有黑白电视机，而到了10多年后，他们都被换成了彩色电视机。到了现在，即使是在相对落后地区，黑白电视机也是比较少见的了。</p>



<p>喜欢Kindle的人不同意这样观点，他们说，Kindle的屏幕比iPad的屏幕更柔和，不伤眼睛，可以长时间看书。</p>



<p>他们往往都是阅读方面的重度玩家，他们的需求当然也需要尊重。然而，跟任何一个市场一样，重度玩家只是其中一类人，而且相对于轻度玩家来说，他们总是少数。</p>



<p>更多人不是要专门买一个阅读机器，而是要买一个可以听歌，看视频，上网，打游戏，等等，同时可以看书的东西的。而完美解决这些全部需求的就是iPad。</p>



<p>值得强调的是，新介质应该带来新的内容形式，Kindle由于自身介质的限制，实际上只能完美地再现纸质介质的诸多特性，对内容形式的创新没有多大的贡献。</p>



<p>iPad则不同，我们应该试想未来的书是什么样子。</p>



<p>首先，大多应该是彩色的，彩色好过黑白，这毋庸置疑。</p>



<p>可能会有声音，有大量的旁白，或者有自动朗读功能等等。</p>



<p>可能有视频，看一本二战的书，作者提到某战役被某部电影诠释的非常精彩的时候，如果有个可以点击即播放的视频，是不是很酷很舒服呢？</p>



<p>甚至不用那么复杂，当你在看韩寒的新书时，附带一段作者在某车赛夺冠瞬间的视频好不好？</p>



<p>或者书应该充满各种交互，在剧情发展到高潮时，你可以帮助主人公选择下一步如何发展等等等。</p>



<p>或者孩子的书，干脆就是一个小游戏，让孩子在娱乐中了解这个世界。</p>



<p>书是什么？值得我们回到本质去思考。而一切一切内容形式的创新，在有了iPad这个媒介后，触手可及，未来就在手边，就在眼前。</p>



<h2 class="wp-block-heading"><strong>四、教育和其他商业用途</strong></h2>



<p>7、8年前，我就看到过很多种电子书包的设想，有些后来甚至开始实施了。跟这类似的还有“数字化教父”尼古拉斯·尼葛洛庞蒂教授的“100美元笔记本”计划。所有这些计划最大的问题都在于，一个专业的用于教育的设备，太过专门，需要大量的软硬件开发，所以成本反而无法降下来。</p>



<p>iPhone出现以后，美国很多大学都进行了大量的采购，作为学校信息系统的一部分，在之上做了大量的开发。</p>



<p>iPad其实比iPhone更适用于教育领域，它屏幕更大，可以轻松的支持电子书本，各种教学系统，开发难度也不高，价格也很合理。而且iPad很好玩，也会受到学生的欢迎，未来在教育系统，iPad一定会大行其道。</p>



<p>在自主教育和辅助教育方面，iPad也非常有前景，这两天就有朋友想拉着我参与他们做的儿童早期教育的项目。而我自己也正在开发一个基于iPad的儿童自主学习的项目。</p>



<p>很多人也都畅想过，在未来的餐馆，iPad很可能会作为点菜机，基于iPad强大的系统和机能，餐馆可以提供非常诱人友好的点菜系统，可以有每个菜的清晰照片，甚至制作视频，可以有营养能量表格，可以有菜品相关推荐等等。点菜结束后，等候的食客还可以捧着iPad玩游戏看杂志。</p>



<p>在很多很多其他的商业场合，iPad这样媒体丰富功能强大，且易于使用的设备都有可能大放异彩。我们可以想象，未来的医院、餐馆、图书馆、码头，到处都可能是手持iPad进行业务处理的专业人士。</p>



<h2 class="wp-block-heading"><strong>机遇和挑战</strong></h2>



<p>iPhone出现之前，面对萧条的移动平台第三方开发市场，我们曾欺骗自己，说人们用手机就是打电话的，连拍照都不多。而iPhone的出现，证明了用户总是有各种各样的需求，等待我们去满足，关键是你能不能认识到，能不能做出令人满意的产品。</p>



<p>iPad采用了和iPhone一样的底层系统，开放方式基本相同。同时性能大幅提升，屏幕尺寸大幅度提升，以前在iPhone上无法实现，或者难以实现的一些应用的机会来了。</p>



<p>所以，现在对每个有志于iPad开发的人来说，唯一的挑战是你的想象力和你的执行能力。</p>
<p><a href="https://codechina.org/2010/05/1614/">iPad革命：开发者的机遇和挑战</a>最先出现在<a href="https://codechina.org">Tinyfool的个人网站</a>。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://codechina.org/2010/05/1614/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			<media:content url="https://codechina.org/wp-content/uploads/2020/06/roberto-nickson-hLgYtX0rPgw-unsplash.jpg" medium="image" />
	</item>
	</channel>
</rss>
