前言
AppleScript,顾名思义是Apple公司推出的一门脚本语言。它的作用十分巨大。在Mac上可以在多个程序中进行操作,实现一系列自动化或者流程化的操作。同样的在Mac上的许多程序都对它有很好的支持。另一方面,AppleScript接近自然语言的语法使得它简单易用,在日常工作中是提升工作效率的利器。
AppleScript 基本语法
开始之前,我们需要一个编辑器来书写AppleScript相关的脚本代码。在Mac中自带的脚本编辑器就能够实现。顺便吐槽一下这个编辑器真的不太好用,在代码提示补全还有注释上都不是特别友好。如果有更好的编辑器欢迎大家交流。
变量
如何初始化一个变量,并且设定变量的值呢,其实很简单。使用set xxx to xxx
语法。 例如,我们设置一个变量timeCount
并将它的值设置为10
set timeCount to 10
复制代码
Tell语法
我们希望通过编写脚本实现一些操作,这些操作是对于一些特定的App或者是系统的程序,这个时候我们就需要用的Tell
语法,其实可以很形象的将它想象成告诉应用程序区做如何如何。
tell application "Finder"
empty the trash
end tell
复制代码
这段代码的作用是,告诉finder将垃圾桶清空。可以看到语法真的十分简洁易读。 同样的,每个程序支持做什么,做特定的事需要的API是什么,都可以通过 打开资源库来查询(shift + command + L)。每一个通过资源库可以了解到每一个App对外开放的操作接口,以及接口的使用方法。
判断 & 循环
在Applescript中,判断依然是用熟悉的if
语法,同时末尾需要带上end if
。 另外在Applescript中,注释的写法是--
后面跟上注释的内容。
if timeCount == 20 then
-- doing something
else
end if
复制代码
值得一提的是判断语句十分口语化,如
is equal to
is greater than
is greater than or equal to
is less than or equal to
-- 或者
begins with (or, starts with) ends with
is equal to
comes before
comes after is in
-- 或者
does not start with
does not contain
is not in
复制代码
这时候你可以试着想象一下循环的写法?相信你一定能够有点思路。
set timeCount to 10
repeat timeCount times
-- doing something
end repeat
复制代码
Crash文件分析
在iOS应用程序中,每次的Crash都会生成相应的Crash文件,这个文件里面记录了Crash时最后的线程信息,内存信息,以及系统环境等等许多有价值的信息。通过这个Crash文件开发者可以十分方便的去debug,发现崩溃的问题从而解决它。
一般获取Crash文件可以从Apple提供的iTunes Connect线上管理工具获取线上用户的崩溃日志,另外就是从机器中读取。 如果你手头有刚获取的Crash文件,打开它你会发现崩溃的线程信息方法调用等这些内容都是内存地址。面对一堆的0x00000相信你是一脸懵逼的。 这个时候我们需要对Crash文件进行符号化处理。
Crash文件符号化
在我们进行Crash文件符号化之前需要了解一个概念,每一次打包生成ipa文件,Xcode都会生成一个dSYM文件,需要注意的一点是,Crash文件和ipa文件还有dSYM文件都是一一对应的。也就是说每个Crash文件对应的是具体的ipa包(可以理解为具体某个版本的包,如果存在重复打包还需要去区别某次的包),而在打包生成ipa时候又会有一个dSYM文件与ipa对应生成。所以这三者是一一对应的关系。要想符号化Crash文件,我们必须找出这个Crash文件对应的ipa和dSYM文件。
那我们找到了这三个文件,如何确定他们就是一一对应的呢,答案就是UUID,这三个文件都有UUID,如果UUID相同,则代表这三个文件是一一对应的。
另外,每个文件其实有两个UUID,对应的是armV7和arm64,在不同平台下一一对应就行了。
查看UUID
Crash文件的UUID在 Binary Images:
下第一行和第二行的尖括号中。
ipa的UUID需要我们解压ipa,然后通过终端打开: dwarfdump --uuid Example.app/Example
同样的dSYM文件也是通过dwarfdump
命令获取。dwarfdump --uuid /Users/wusuowei/Desktop/Example.dSYM
符号化
符号化方法可以参考这篇文章:符号化的三种方法。
在这里我们采用命令行运行symbolicatecrash工具来实现。
实现
我们需要实现的效果是,将ipa内部的app文件,dSYM文件,Crash文件放在同一个文件夹中,运行脚本选取文件夹,自动输出符号化后的文件在当前的文件夹中。
选取文件夹
set filePath to choose folder
复制代码
通过choose folder
可以调出选取文件夹的对话窗口。并且将文件路径赋值给filePath
变量。
判断文件夹内文件
判断文件夹内存在dSYM,app,Crash文件存在,并且是唯一的。
tell application "Finder"
set dsymFiles to (files in filePath whose name ends with ".dSYM")
if (count of dsymFiles) = 0 then
display dialog "错误:'.dSYM'文件不存在"
return
else if (count of dsymFiles) > 1 then
display dialog "错误:存在多个'.dSYM'"
return
end if
set crashFiles to (files in filePath whose name ends with ".crash")
if (count of crashFiles) = 0 then
display dialog "错误:'.crash'文件不存在"
return
else if (count of crashFiles) > 1 then
display dialog "错误:存在多个'.crash'文件"
return
end if
set appNames to (files in filePath whose name ends with ".app")
if (count of appNames) = 0 then
display dialog "错误:'.app'文件不存在"
return
else if (count of appNames) > 1 then
display dialog "错误:存在多个'.app'文件"
return
end if
set sym to (files in filePath whose name is "symbolicatecrash")
if (count of sym) = 0 then
display dialog "错误:'symbolicatecrash'文件不存在"
return
end if
set dsymfile to first item of dsymFiles
set crashfile to first item of crashFiles
set appfile to first item of appNames
set filePath to POSIX path of filePath
end tell
复制代码
最后一个方法POSIX path of
作用是将文件地址转换成终端能够识别的UNIX格式的地址。 AppleScript and POSIX paths
下一步就是符号化Crash文件了
tell application "Terminal"
set currentTab to do script
do script "cd " & filePath in currentTab
do script "export DEVELOPER_DIR=/Applications/Xcode.app/Contents/Developer" in currentTab
do script "./symbolicatecrash " & filePath & name of crashfile & " " & filePath & name of dsymfile & " > " & filePath & "crashLog.crash" in currentTab
end tell
复制代码
总结
本文只是通过一个十分简单的例子来演示AppleScript并用它来做了一些事。同样的你可以用它来做其他更棒的事。毫无疑问的是用好AppleScript能够极大提升我们的效率。 最后推荐一本书《AppleScript for Absolute Starters》,这本书讲解了一些Applescript的基础语法,作为入门书籍是最好不过了。