Why·Liam·Blog

人生若如初見

网络上已经有一些关于探讨如何导出 IOS 版微信聊天记录的导出,比如 WeBack 和 iTools ,但这两类工具主导针对的都是小白用户,并没有给出如何获取完整数据库的方案,尽管实际原理相差无几,但想要程序更好地进行操作数据,还是所有差别,特此记录。

目前最新的 IOS 版本为 10.1.1,据观察该版本的备份文件存储格式与 IOS9 略有不同,因此部分没有及时更新的导出工具暂时无法使用。

想要获取到应用的具体数据,就先要将数据以备份的形式先存储在电脑上,本文以 Mac 系统为例。

首先,使用数据线将手机连接上电脑,如果是首次连接,需要选择 信任该电脑。

然后打开 iTunes,找到正在连接的手机:

阅读全文 »

大约四年前,我有了一个暗恋对象,所以想要把微信的聊天记录保存起来。那时在网上只有一种要付费的类似软件,所以我想,写一个开源的工具好了。于是这件事 很快就完成了(对应微信 6.0;那时的代码质量很低我知道)。

后来我没有了暗恋对象,也就不再关心这件事。最近,因为有不少人认为这样的功能仍然很有用,并且据我搜索到的情况,仍然没有能让每个人拿来直接用的工具。因为在几年之间文件结构发生了一些变化,我在这里记录下来,方便其他的开发者(对应现在的版本 6.3.25;虽然我没想到还能有什么用)。

过去,我可以提示用户在越狱之后用软件自行把微信 App 所在文件夹复制出来。然而自从某个版本的 iOS 开始,在不越狱的情况下,我们只能看到 /User/Media 这里的文件,而需要的本地数据在 /User/Containers/Data/Application/ 微信的 UID。强迫用户为了这么一件事前去越狱显然不太友好,而对「聊天记录迁移」抓包也不方便,所以我想到另一种途径。

这就是 iTunes 备份。从经验判断,恢复备份之后微信里的聊天记录都还在,说明肯定这些文件在备份的时候保存到了电脑上。它们在哪里?苹果官方给了答案。简单地说,Windows 下在 \用户\(用户名)\AppData\Roaming\Apple Computer\MobileSync\Backup\,然后我不喜欢用 Mac OS。

不过,iTunes 备份的文件夹结构不是很友好,似乎每个手机上的文件名都变成了一串序号,当然打开相关的 plist 然后看出规律也不难。好消息是,已经有很多人做了类似的事情,例如 iphonebackupbrowser,它也是用 C# 写的,用起来比较方便。

阅读全文 »

2016 年,我回了一趟中国。中国的手机支付环境犹如春后的竹笋遍地生长。在支付宝和微信的推动之下,中国人几乎可以出门不用带钱包了。没想到这一步走得比美国还快。

在美国,最流行的支付方式还是信用卡,信用卡的先天优势显著限制了手机支付方式的发展。

回美国后一个问题就困扰着我,如何在美国推行支付宝和微信支付。

这是一个「广泛接受」的问题,如何使人们在现有的支付环境中跳出来,去接受一个新的支付方式。

其中一个核心的问题是商家是不是有意愿使用你的服务。就个例子,在美国,人们的付款习惯是,吃完饭出来一张账单,用户看一眼账单后给服务员银行卡,服务员刷完卡后上写下小费,并签名。就可以离去了。但是使用手机支付后的步骤大大减少,用户吃完饭后,掏出手机,付完账单后就自行离去。

阅读全文 »

一个优秀的技术人员,通常已经具备了产品经理所需要的基本素质:「抽象思维能力」,「逻辑推理能力」,以及「数据分析能力」,这是一个很好的起点。

但是仅仅有好的起点是远远不够的,技术人员在思考产品的时候,很容易遇到一些误区,如果陷在误区里面出不来,那么会变成一个很糟糕的产品经理。

下面我们看看技术人员和产品经理之间需要跨越的误区:

优秀的技术人员做产品设计,总是假设用户和自己一样的聪明,自然而然就会把产品界面和交互设计得非常复杂,让一般的小白用户难以上手。

阅读全文 »

遇到的问题

用 Xcode8 打开工程后,比较明显的就是下图了,这个是苹果的新特性,可以帮助我们自动管理证书。建议大家勾选这个 Automatically manage signing

阅读全文 »

前几天川叔才过了 37 周岁的生日。37 岁这一年我做了两个重要的决定:

一个就是,我打算用半年的时间去做 50 个一对一的职场咨询,目前不但已经达标,还超额完成了;

另外一个就是,我想要去读个书,不是为了混个文凭或是打开人脉,而是希望系统化的梳理一下自己的所学,希望能有一个提升。

系统化是我写了三本书之后萌生出来的一个念头。

现在是一个碎片化的时代,太多东西都是零碎的,甚至是重复的。我们每天都在被动接收大量的信息,光是分拣、拆解都很困难,更何谈吸收。

阅读全文 »

Swift 有许多种存储数据方式,你可以用枚举 (enums),元组 (tuples),结构体 (structs),类 (classes),在这篇文章中我们将比较枚举、元组、结构体之间区别,首先从最简单的开始 - 元组 (tuples)。

元组是多个值组成的复合值类型,例如,你可以定义一个含有整形和字符串的 tuple

当你函数需要返回多个值时,元组这个时候非常有用,你可以使用下标方式来访问元组中的值,如。0,.1 以此类推,如下:

阅读全文 »

这是一条 Ruby 语句,它会打印 hello world 三次,意图清晰,语法简洁。

如果你是 C 或者 Java 等语言的使用者,而从未接触过 Ruby,此时是不是有种打开了新世界的大门的感觉^_^。反正当初我刚接触 Ruby 那会儿时常会感叹,啊原来代码还可以这么写。。。Ruby 的灵活与优雅当然远不仅于此,这里就不展开了。今天的重点是,Swift 也可以这么写。

首先我们要明确,Ruby 之所以可以这么写是因为它是一个纯面向对象的语言,在 Ruby 的世界中,一切皆对象,所有的事物都有一个共同的祖先——Object。3 的类型是 Fixnum,当然也是一个对象,所以它有自己的方法。times 就是一个方法,可以看出应该是接收一个代码块(本例中为 {puts 'hello world'}),然后调用它 self(本例中 self 即为 3)次。

而在 Swift 中,Int 是一个 struct(结构体),并不是个 class。但是 Swift 中的 struct 与别的语言中的 struct 不同的是,struct 内部也可以定义方法。所以条件满足了,现在就差个 times 方法了。

阅读全文 »

Objective-C 中当某个变量或表达式没有任何内容时,可以使用 nil 来表示。nilObjective-C 中 void 指针指向数字 0,本质上来讲 nil 就是一个数字。比如这个例子:

因为 nil 指向数字 0,确切的说 nil 就是 Int 类型数据,所以上述的代码不仅可以通过编译,而且得到的结果是 20。显然,Objective-C 编译器对 nil 的处理方式非常简单粗暴,直接将 nil 当作是数字对待了。这样做表面看起来平安无事,但在某些特定的情境下,却可能造成歧义。既然 nil 不能表示「纯粹无」,的确需要表示「这个变量没有任何值」该怎么办?看来,Objective-C 对此是无解了。

或许是因为上述例子中提到的问题,在某些特定的场景下的确需要表示「无」的存在,因此 Swift 中引入了 Optional 类型。

在深入讨论之前,先看看 Optional 是什么吧!

阅读全文 »

消息来源主要是贴吧,Reddit,pokemon 一个数据网站,以及我自己的一点经验。

Reddit 已经有人把游戏数据解包,解包结果:https://gist.github.com/anonymous/077d6dea82d58b8febde54ae9729b1bf

贴吧翻译结果:【重要消息】Reddit已经有人解包了游戏数据,一大波信息来袭_pokemongo吧

pokemon 网站:Pokemon Go Database

1.当使用熏香时,站立不动的刷新频率为 5 分钟,如果处于移动状态并且位移超过 200m,刷新频率为 1 分钟。

阅读全文 »
0%