<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Receipt on Chen</title><link>https://hechen.github.io/zh-cn/tags/receipt/</link><description>Recent content in Receipt on Chen</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Fri, 21 Dec 2018 14:30:50 +0000</lastBuildDate><atom:link href="https://hechen.github.io/zh-cn/tags/receipt/index.xml" rel="self" type="application/rss+xml"/><item><title>UserDefaults and Keychain</title><link>https://hechen.github.io/zh-cn/post/userdefaults-and-keychain/</link><pubDate>Fri, 21 Dec 2018 14:30:50 +0000</pubDate><guid>https://hechen.github.io/zh-cn/post/userdefaults-and-keychain/</guid><description>&lt;p&gt;Apple 提供了几种持久化方案，其中 UserDefaults 和 Keychain 是 App 开发过程中使用频率最高的方案，而且从以往和同事的探讨过程中发现对这两个概念中有一些细节还是理解不太透彻，因此本文会针对这二者展开讲一讲。&lt;/p&gt;
&lt;h2 id="userdefaults"&gt;UserDefaults&lt;/h2&gt;
&lt;p&gt;首先，阅读完 Apple 关于 UserDefaults 一节的文档描述之后，我觉得有两个需要注意的点：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;UserDefaults 的构成&lt;/li&gt;
&lt;li&gt;UserDefaults 的目的&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="userdefaults-构成"&gt;UserDefaults 构成&lt;/h3&gt;
&lt;p&gt;我们可以看看具体 UserDefaults 存储的地方，如下图，我们在应用中写入 Demo 数据：&lt;/p&gt;
&lt;p&gt;&lt;img alt="Write Key-Value to UserDefaults" loading="lazy" src="https://i.imgur.com/wq9onOa.png"&gt;&lt;/p&gt;
&lt;p&gt;打印 Library 路径，在 Finder 中打开路径:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Library" loading="lazy" src="https://i.imgur.com/65ybYX6.png"&gt;&lt;/p&gt;
&lt;p&gt;如下展示内容，可以看到在 Preferences 目录中存在某个文件，例如该 App Library 目录下存放的文件为 &lt;code&gt;app.chen.ios.PersistenceDemo.plist&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Cache" loading="lazy" src="https://i.imgur.com/ChqnDJa.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Preferences" loading="lazy" src="https://i.imgur.com/cPvlFdR.png"&gt;&lt;/p&gt;
&lt;p&gt;该 plist 内容如图所示，即为我们之前在 App 中写入的 Key-Value。&lt;/p&gt;
&lt;p&gt;&lt;img alt="plist" loading="lazy" src="https://i.imgur.com/shdXoZN.png"&gt;&lt;/p&gt;
&lt;p&gt;所以这也证明了，我们针对 UserDefaults 的读写实质上是针对 plist 文件的读写。&lt;/p&gt;
&lt;p&gt;iOS 系统会自动帮你做 &lt;code&gt;plist&lt;/code&gt; 文件的读入以及 Cache，根据情况会把你在内存中所做的操作同步到 &lt;code&gt;plist&lt;/code&gt; 文件（UserDefaults 同步到内存是同步的，同步到 Database 是异步的， iOS 8 开始，会有一个常驻进程 &lt;code&gt;cfprefsd&lt;/code&gt; 来负责同步）。&lt;/p&gt;</description></item><item><title>阅读流程</title><link>https://hechen.github.io/zh-cn/post/reading-process/</link><pubDate>Tue, 16 Oct 2018 17:01:44 +0000</pubDate><guid>https://hechen.github.io/zh-cn/post/reading-process/</guid><description>&lt;p&gt;最近统一了一下自己的阅读流程，更新一下，具体用到的工具有&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;DEVONThink Pro&lt;/li&gt;
&lt;li&gt;PDFExpert&lt;/li&gt;
&lt;li&gt;MarginNote&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;其中 1 是输入和归档源，3 是输出源。 大概就是如下所示：&lt;/p&gt;
&lt;p&gt;&lt;img alt="Reading Process" loading="lazy" src="https://i.imgur.com/SrcVtP1.png"&gt;&lt;/p&gt;
&lt;h2 id="采集素材"&gt;采集素材&lt;/h2&gt;
&lt;p&gt;在平时浏览网页的时候，看到自己喜欢的文章之后，想进行一些标记或者做笔记，大概有几个选择：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;印象笔记直接 clip 当前网页，之后在印象笔记里进行阅读或者标记&lt;/li&gt;
&lt;li&gt;放进稍后读服务中，比如 Pocket 或者 Instapaper 等；&lt;/li&gt;
&lt;li&gt;用 Safari 自带的 Save as PDF 之后再用单独的 PDF 工具查看；&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;而最近几个月，因为 MarginNote 3 的发布，由于其提供的大纲脑图的自动生成，给我提供了一种便利的拆书功能，因此会把平时看到的文章都归集到一处来看。&lt;/p&gt;
&lt;p&gt;借助 DEVONthink 的 Clip To DEVONthink 的插件可以很方便的把文章归集到 DEONThink 中，最主要的是因为它能保存 WebArchive，即使后续文章被删除也没关系。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Clip To DEVONthink" loading="lazy" src="https://i.imgur.com/Kw7CoBl.png"&gt;&lt;/p&gt;
&lt;p&gt;当按下 Cmmd + S 进行归档之后，DEVONThink 对应 Group 里就会把该原始页面保存起来。&lt;/p&gt;
&lt;p&gt;&lt;img alt="DEVONthink" loading="lazy" src="https://i.imgur.com/m3jM9kx.png"&gt;&lt;/p&gt;
&lt;p&gt;由于 WebArchive 无法做 Highlight 标记，这时候就用到了 DEVONthink 提供的 OCR 功能，将 WebArchive 提取为 PDF 文件。&lt;/p&gt;</description></item><item><title>那些我恢复 Mac 系统之后要安装的 Apps</title><link>https://hechen.github.io/zh-cn/post/my-favorite-mac-apps/</link><pubDate>Wed, 11 Jul 2018 12:58:37 +0000</pubDate><guid>https://hechen.github.io/zh-cn/post/my-favorite-mac-apps/</guid><description>&lt;p&gt;记录一下自己常用的 Mac Apps，每次重装之后到了用的时候发现忘记安装了(不是每次都用 TimeMachine 恢复)，而且强烈简易大家如果某个 App 有对应的独立安装版本的话，购买其独立安装版本为好，沙盒环境以及和 Apple ID 绑定的特性就使得功能性以及灵活度大减。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;更新时间 2018-10-07
更换图床，更新图片&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;更新时间 2018-08-10
不久前，已经订阅了一年的 Setapp，发现上面好多 App 自己都之前买过了，Sigh！
如果你使用 Ulysses 或者 MoneyWiz 3.0 的话，订阅 Setapp 就会非常的值得！&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img alt="Mac Apps" loading="lazy" src="https://i.imgur.com/q3yToeZ.png"&gt;&lt;/p&gt;
&lt;h2 id="办公工具"&gt;办公工具&lt;/h2&gt;
&lt;p&gt;离开这些工具，貌似无法办公的。&lt;/p&gt;
&lt;h3 id="airmail"&gt;AirMail&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://itunes.apple.com/cn/app/airmail-3/id918858936?l=en&amp;amp;mt=12"&gt;下载地址&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="AirMai" loading="lazy" src="https://i.imgur.com/19ADIxn.jpg"&gt;&lt;/p&gt;
&lt;p&gt;邮箱客户端，看中 AirMail 主要是因为其强大的第三方服务集成。&lt;/p&gt;
&lt;h3 id="slack"&gt;Slack&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://itunes.apple.com/cn/app/slack/id803453959?mt=12"&gt;下载地址&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Slack" loading="lazy" src="https://i.imgur.com/W1wtsje.jpg"&gt;&lt;/p&gt;
&lt;p&gt;公司的日常沟通交流主要战场，其实整个操作体验我是不太适应的，不过它强大在第三方服务的集成上，可以做很多自动化的事情。&lt;/p&gt;
&lt;h3 id="fantastical-2"&gt;Fantastical 2&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://flexibits.com/fantastical"&gt;下载地址&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Fantastical" loading="lazy" src="https://i.imgur.com/1naxpaM.jpg"&gt;&lt;/p&gt;
&lt;p&gt;日历工具，查看满满的一屏幕日程，你会感觉很舒服的。&lt;/p&gt;
&lt;h4 id="tunnelblick"&gt;Tunnelblick&lt;/h4&gt;
&lt;p&gt;&lt;a href="https://tunnelblick.net/downloads.html"&gt;下载地址&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Tunnelblick-menu" loading="lazy" src="https://i.imgur.com/ghIEHNQ.png"&gt;&lt;/p&gt;
&lt;p&gt;公司需要使用该 App 来接入办公室网络。远程办公必备。&lt;/p&gt;
&lt;h4 id="office-三件套"&gt;Office 三件套&lt;/h4&gt;
&lt;p&gt;微软的 Office 三件套，Word，Excel，PowerPoint。 用的频率不高，但是用的时候得有。&lt;/p&gt;
&lt;h2 id="gtd"&gt;GTD&lt;/h2&gt;
&lt;p&gt;日常 GTD 工具，基本就是各家评测常提起的几款 App。&lt;/p&gt;
&lt;h3 id="2do"&gt;2Do&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://www.2doapp.com/"&gt;下载地址&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="2Do on Mac" loading="lazy" src="https://i.imgur.com/st89Smb.jpg"&gt;&lt;/p&gt;
&lt;p&gt;最近才完全转向 2Do，这个 GTD 工具是我最早买入的，但是后来因为其自动化太弱，被打入冷宫。最近几个月又开始捡起来了，吸引我的几个点：&lt;/p&gt;</description></item><item><title>In App Purchase</title><link>https://hechen.github.io/zh-cn/post/in-app-purchase/</link><pubDate>Thu, 24 May 2018 10:40:39 +0000</pubDate><guid>https://hechen.github.io/zh-cn/post/in-app-purchase/</guid><description>&lt;p&gt;对于在 App Store 中上架的应⽤来说，应⽤内购买(In-App Purchase，简称 IAP) 应该是一个避不开的话题，尤其是去年微信打赏和 Apple 之间的争执更让 IAP 火了一把，不仅仅大公司，作为个人开发者来讲，IAP 也是非常重要的，说不定就是你养家糊口的工具呢。&lt;/p&gt;
&lt;p&gt;整个 IAP 的过程，在客户端的实现依赖于 &lt;code&gt;StoreKit&lt;/code&gt; 这个框架，所有的支付相关操作都是交由 StoreKit 来完成的。&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://i.imgur.com/EkBwhM4.png"&gt;&lt;/p&gt;
&lt;p&gt;首先，我们先复习一下 IAP 的整个流程。&lt;/p&gt;
&lt;h2 id="in-app-purchase-的整体流程"&gt;In App Purchase 的整体流程&lt;/h2&gt;
&lt;h3 id="阶段-1"&gt;阶段 1&lt;/h3&gt;
&lt;p&gt;&lt;img alt="In App Purchase 过程" loading="lazy" src="http://7xilk1.com1.z0.glb.clouddn.com/2018-09-03-4DDE8387-EDB1-42CC-B18C-3DC6CA1DC688.png"&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;加载 In-App Identifier&lt;/li&gt;
&lt;li&gt;客户端从 AppStore 中获取本地化的商品信息。&lt;/li&gt;
&lt;li&gt;把 IAP 的购买界⾯面展示给⽤用户，⽤用户可以同意购买并点击购买按钮。&lt;/li&gt;
&lt;li&gt;⽤用户授权购买，客户端向服务器器发送购买请求。&lt;/li&gt;
&lt;li&gt;服务器器处理理购买请求，并把结果返回给 &lt;code&gt;StoreKit&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;如果购买请求验证通过，客户端此时解锁内容或者提供金币。&lt;/li&gt;
&lt;li&gt;至此，整个交易易流程结束。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="阶段-2"&gt;阶段 2&lt;/h3&gt;
&lt;p&gt;具体到和 Apple Store 打交道的话，如下所示：&lt;/p&gt;
&lt;p&gt;&lt;img alt="IAP With App Store" loading="lazy" src="http://7xilk1.com1.z0.glb.clouddn.com/2018-08-27-intro_2x.png"&gt;&lt;/p&gt;
&lt;h3 id="阶段-3"&gt;阶段 3&lt;/h3&gt;
&lt;p&gt;如果涉及到自己 App 端 Server 的参与，基本如下图所示：&lt;/p&gt;
&lt;p&gt;&lt;img alt="IAP With Business Server" loading="lazy" src="http://7xilk1.com1.z0.glb.clouddn.com/2018-08-29-1*MwLeHUGSupbb9j-oYQyflw.png"&gt;&lt;/p&gt;
&lt;p&gt;正常多出的几步：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;获取 Product 标识列表；&lt;/li&gt;
&lt;li&gt;客户端上传 Receipt 数据给 Server，Server 自行校验或者使用 Apple 的接口校验；&lt;/li&gt;
&lt;li&gt;Server 端告知给客户端付费内容&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="注册商品"&gt;注册商品&lt;/h3&gt;
&lt;p&gt;商品注册是通过 iTunes Connect 后台进行的，其中商品类型需要提前明确好。&lt;/p&gt;</description></item></channel></rss>