解决macOS中某些App需要安装Java 6环境的问题

更新:推荐使用Jar2App打包,更为方便。
https://github.com/Jorl17/jar2app


以下为原本的答案(不推荐,兼容性不好且麻烦)

很多小型的Java应用使用JarBundler打包,这种应用的Contents/MacOS/内通常会有一个JavaApplicationStub的程序。当运行该App时,会弹出需要安装Java 6的通知。然而,如果Mac上装了新版本的Oracle Java,按照指示安装Java 6时会提示磁盘中已安装了更新版本的Java而无法安装。这里采用一个修改plist文件+手写运行jar程序的方式来解决问题。

准备工作

首先在Finder中找到打不开的App,在选单中点击显示包内容,并在包内某处找到.jar文件,记下路径(这里以Logisim为例,是Contents/Resources/Java/logisim.jar)。如果可以直接运行该jar,一般就可以继续使用下面的方法。

修改plist文件

用文本编辑器打开Contents/Info.plist文件。尝试将<key>Java</key>一项中的Java改为其它字串,并启动App。如果仍然无法启动,请继续下面的步骤,或尝试修改其它带有Java字样的key。

编写启动程序

Contents/MacOS中一般会有一个JavaApplicationStub的程序(可在Info.plist中的CFBundleExecutable项查看运行的是哪个程序),这个JarBundler项目已经很旧了,我们需要自己动手做一个运行jar的程序。注意,如果在终端中无法执行java命令,可能需要按照提示安装JDK

运行jar的命令是

java -jar PATH_TO_JAR/xxx.jar

这里使用C++(C)编写可执行文件。jar文件的路径需要按照实际修改。

#include <cstdlib>
#include <stdio.h>
#include <cstring>
#include <mach-o/dyld.h>

int main() {
  char path[1024];
  char cmd[100];
  strcpy(cmd, "java -jar ");
  uint32_t size = sizeof(path);
  if (_NSGetExecutablePath(path, &size) == 0) {
    strcpy(strrchr(path, '/'), "/../Resources/Java/logisim.jar");
    system(strcat(cmd, path));
  } else {
    printf("Error: Buffer too small. Size required: %u.\n", size);
  }  
}

编译后将可执行文件放到Contents/MacOS/下,再回到plist文件中,修改CFBundleExecutable项下方的值为可执行文件的名字(这里是runJar)。

<key>CFBundleExecutable</key>
<string>runJar</string>

保存plist,就可以运行App啦!

使用电脑访问手机微信端网页并模拟位置

很多网页借助微信的open.weixin.qq.com进行登录,那么要想在电脑端打开这些网站,需要进行一些稍稍复杂的操作。注意这个方法仍然需要在手机上登录。需要在电脑端安装Fiddler。

背景:辣鸡教学立方的课堂签到、课堂测验等功能都强制要求用微信端打开,极为不方便。

配置Fiddler

这里采用Fiddler抓手机端发出的包,再将Cookies倒入电脑浏览器的方式进行。首先,在电脑端中允许远程连接,并设置远程连接端口。启用了防火墙的电脑,需要在防火墙中允许该端口的连入。

同时,需要开启解析HTTPS流量(Decrypt HTTPS traffic)的功能。无需在电脑中安装Fiddler的https证书。

在手机上安装HTTPS证书

打开手机浏览器,访问电脑IP地址:远程连接端口(如192.168.1.100:6868,实际IP地址需要使用ipconfig ifconfig等命令或在路由器的管理后台等地查看,远程连接端口按刚刚设置的填写)。如果正常出现了Fiddler的网页,说明防火墙配置正常。点击安装Fiddler的HTTPS证书。iOS需要在设置中点击信任,并在General(通用) -> About(关于本机) -> Certificate Trust Settings中完全信任该证书。

在手机上设置代理

随手机系统不同而不同,一般在手机的Wi-Fi功能中进入当前Wi-Fi的高级选项,设置手动代理,填入IP地址与远程连接端口。注意,若要让Fiddler成功抓包,需要暂时关闭手机上VPN等软件。

在微信中打开要打开的网页

在手机微信中打开目标网页并成功登录以后,在电脑的Fiddler中就应该可以看到数据包了。找一个登录后产生的到该网站的数据包,找到Cookies一栏(可能需要点进Inspectors内)。

录入Cookies

打开要访问的网站链接(可以从包的headers中找到,如教学立方的移动端链接),在浏览器中打开开发者工具(一般为F12或Ctrl + Alt + I或Alt + Command + I),进入Applications选项卡,在侧边栏中展开Cookies(这里是Chrome的方式,其它浏览器同理)。将刚才Fiddler面板的Cookies数据录入(一般SessionID之类的Cookies需要录入,可具体试验需要录入哪些Cookies),只需填写名称和值。

刷新页面,登录成功!

模拟位置

正常赋予网页权限即可进行基于定位的签到操作,若不想提供真实位置,还可以借助各种浏览器插件完成。如Chrome中可以使用Location Guard插件,对目标网页设置成Fixed Location即可。

macOS Automator 自动化操作 PowerPoint(格式转换、生成PDF、文件提取)

利用macOS的Automator,可以在Finder菜单中快速对一个或多个PowerPoint文稿进行格式转换、生成PDF、文件提取等操作。此操作需要macOS中安装较新版本的Microsoft Office PowerPoint。

背景:要从物理课的.ppt文件格式的操作中提取出音频用以加速播放及调整进度条,而.ppt文件无法直接解压缩,需要转换为.pptx格式再解压缩后提取出音频。

开始编写Quick Action流程

打开Automator App(默认位于Launchpad的Other文件夹中),新建Quick Action。Quick Action是可以加入Finder菜单、Services菜单的一类Workflow流程。

在左侧查找Filter Finder Items拖入右侧流程中,对输入文件的后缀名称进行过滤。这里仅接受ppt后缀名的文件,若要对pptx pps ppsx等后缀名的文件进行处理,也可以将其加入过滤器中并将规则All改为Any。

开始编写Apple Script,打开PowerPoint文件

参考资料:https://apple.stackexchange.com/questions/217004/how-do-i-get-automator-actions-for-microsoft-powerpoint-and-word

在左侧寻找Run Apple Script,拖入右侧流程图中。下面的代码将ppt转为pptx并保存在同一文件夹中。若要接受更多格式的后缀名,需要修改makeNewPath部分(这里是将后三位ppt截掉,换成pptx)。

on run {input, parameters}
	set output_list to {}
	tell application "Microsoft PowerPoint"
		launch
		set theDial to start up dialog
		set start up dialog to false
		repeat with i in input
			open i
			set output_path to my makeNewPath(i)
			save active presentation in output_path
			close active presentation saving no
			set end of output_list to output_path as alias
		end repeat
		set start up dialog to theDial
		quit
	end tell
	return output_list
end run

on makeNewPath(f)
	set t to f as string
	return (text 1 thru -4 of t) & "pptx"
end makeNewPath

若要转换为PDF格式,则需将

save active presentation in output_path

一句改为

save active presentation in output_path as save as PDF

并修改makeNewPath的部分:

on makeNewPath(f)
    set t to f as string
    if t ends with ".pptx" then
        return (text 1 thru -5 of t) & "pdf"
    else
        return t & ".pdf"
    end if
end makeNewPath

至此,将ppt转为pptx或将ppt/pptx转为pdf的功能已实现完毕。如不需要文件提取,请向后跳到“调试和使用”一节。

编写Shell Script提取pptx中的文件

使用压缩软件打开.pptx文稿即可读取其内容。若要实现自动化处理,可以使用Automator的Run Shell Script模块。

下面是提取全部音频文件的代码,Run Shell Script设置为将输入传达到参数中。

for f in "$@"
do
  unzip "$f" -d "$f Files/"
  mkdir "$f Audio"
  for file in `ls "$f Files/ppt/media/"`
  do
    if [ "${file##*.}" = "wav" ]; then
      mv -f "$f Files/ppt/media/$file" "$f Audio/"
    fi
  done
  rm -rf "$f Files/"
  rm -f "$f"
done

这段代码将pptx中附着的音频文件拷贝到与pptx相同目录下的*.pptx Audio文件夹中,并将源文件删除。

调试和使用

由于在Automator中测试并没有文件读入,测试时可以在流程开始处拖入Get Specified Finder Items指定输入文件(正式在Automator外使用前要删掉)。

之后,按下Command+S保存脚本,输入一个名字,就可以在Finder右键菜单的Services项或是文件的预览栏中找到刚刚编写的脚本了。

.workflow文件的存储位置在~/Library/Services/下,对其重命名即可改变菜单中的名称。

此处有一个问题:在较高版本的macOS中实际执行时会出现读写磁盘权限不足的问题。这时需要对该脚本赋予Full Disk Access权限。打开System Preferences,在Security & Privacy中找到Full Disk Access,左下角解锁后点击加号,将执行该脚本的Finder加入进去并赋予权限。Finder.app的路径在/System/Library/CoreServices中。

可以用了!