创建一个简单的Safari扩展

之前做过一个把网址转为二维码的Chrome 扩展,想在 Safari 中也使用这样的扩展,搜索了一下貌似没有同类型的,所以自己打造了一个 Safari 扩展,并且把过程记录下来。 获得开发者证书 要建立一个 Safari 扩展,首先需要生成一个开发者证书。访问Apple 开发者中心,加入 Safari Developer Program,加入开发者计划是免费的。加入开发者计划后就可以生成证书了,访问Certificates, Identifiers & Profiles,点击右上角的加号,生成一个开发者证书。成功后将证书下载到本地并导入 Keychain Access 中。 在 Safari 中创建扩展 打开 Safari,在菜单中选择Safari—Preferences-Advanced,勾选最下方的Show Develop menu in menu bar,如图。 这时在菜单栏中会出现Develop菜单,选择Develope-Show Extension Builder,打开扩展编辑器,点击左下角的*+,选择New Extension*,保存到一个位置(例如 Desktop)。 这时,Desktop 文件夹中会出现一个demo.safariextension文件夹,这个文件夹里的内容就是我们生成的 Safari 扩展的根目录。如果前面的开发者证书已经正确导入,扩展的介绍里会出现 Safari 开发者的 Id。 编辑扩展基本信息 扩展建立后,下面会有一票东西需要填写,首先填写扩展的基本信息。 Display Name: 扩展的显示名称 Author: 作者名字 Description: 插件介绍 Website: 插件网站 Bundle Identifier: 这里需要填写唯一 id Update Manifest: 这里需要填写一个 plist 格式文件的地址,Apple 会定期检查这个地址中的 Version,如果有升级,就会访问插件的下载地址更新插件,当然,如果插件只是自用而不提交 Safari Extensions Gallery 的话,这一栏可以不填,plist 文件格式如下: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>Extension Updates</key> <array> <dict> <key>CFBundleIdentifier</key> <string>com.zangzhiya.url2qrcode</string> <key>Developer Identifier</key> <string>开发者ID</string> <key>CFBundleVersion</key> <string>1</string> <key>CFBundleShortVersionString</key> <string>1.0</string> <key>URL</key> <string>http://simpleapples.com/images/url2qrcode-safari/url2qrcode.safariextz</string> </dict> </array> </dict> </plist> Access Level: 这里需要选择插件对页面访问的权限,比如我们我们要做的 URL 转二维码插件,需要获取当前 Tab 的 URL,那么这里需要选择 ALL ...

十月 23, 2014 · 1 分钟 · Zhiya

iOS8注册推送失败的探究

Apple 在 9 月 18 日正式发布了 iOS8,在收到更新的同时,也发现自己的应用在 iOS8 下无法启动。 并且在 Console 中收到如下提示: 2014-09-19 16:26:20.369 demo[379:30506] registerForRemoteNotificationTypes: is not supported in iOS 8.0 and later. 查询文档可以知道,在 iOS8 中注册推送的方法registerForRemoteNotificationTypes已经被废弃,文档中是这样描述的: 按照文档中的提示,使用registerForRemoteNotifications方法代替,这个方法不接受参数。紧接着问题就来了,程序在安装过这个应用的 iOS8 机器上可以成功注册,而在新安装的 iOS8 机器上则无法注册,application:didRegisterForRemoteNotificationsWithDeviceToken:和application:didFailToRegisterForRemoteNotificationsWithError:都无法响应,并且在成功注册的机器上,收到的推送消息也没有声音提示。再次查看文档后发现这么一段话: If you want your app’s push notifications to display alerts, play sounds, or perform other user-facing actions, you must call the registerUserNotificationSettings: method to request the types of notifications you want to use. 换句话说,如果要使用推送服务,还需要再调用registerUserNotificationSettings方法,而这个方法是和 iOS7 上的registerForRemoteNotificationTypes方法一样接受参数的。为什么 iOS8 下要把一个方法变成两个方法呢?registerForRemoteNotifications方法的文档中有这么一句话: ...

九月 19, 2014 · 1 分钟 · Zhiya

Air SDK和Flex SDK的区别

最近将 AS 开发的 SDK 从 Flex SDK 4.9.1 升级到了 Air SDK 4.0,导致之前写的一个 FLV 播放器不能播放视频了,最后发现 bug 是一个方法内的变量名和类中的一个 get 方法重名了。类似下图中所示情况: 图中变量 time 和 get 方法 time 重名,而编译器对这种重名的处理在 Flex SDK 和 Air SDK 下是不一样的。 Flex SDK 下,会根据上下文将var time:int = time;中的第二个 time 作为 get 方法,而 Air SDK 中,这行两个 time 会被当作同一个变量,也就是自己等于自己,而 int 类型定义时候会被初始化为 0,所以使用 Air SDK 输出结果为 0,使用 Flex SDK 输出结果为 1000。 看来 Air SDK 不如 Flex SDK 智能啊 :)

三月 27, 2014 · 1 分钟 · Zhiya

Eclipse 4.3安装Flash Builder Plugin

Flash Builder 是一个基于 Eclipse 的 IDE,在 Flash Builder 文件夹下的 utilities 目录下,官方已经为我们提供了插件版的安装程序,名为 Adobe Flash Builder 4.7 Plug-in Utility,插件版可以将 Flash Builder 嵌入到已经安装好的 Eclipse 中,作为 Eclipse 的一个视图,这样就可以在 Eclipse 中开发 AS 程序。 执行插件版安装程序后按提示进行,Eclipse 目前的最新版是 4.3,而 Flash Builder 4.7 的插件版只支持 Eclipse 3.7 或 4.2 版,无法安装在 4.3 中。 解决办法是,下载 Eclipse 4.2,现将 Flash Builder 插件版安装到 4.2 版的 Eclipse 中,再拷贝 Eclipse 文件夹下的 dropins 目录覆盖 Eclipse 4.3 的 dropins。启动 Eclipse 4.3,第一次启动速度会很慢,启动后,Flash Builder 插件版就已经安装到 Eclipse 4.3 中了。

二月 27, 2014 · 1 分钟 · Zhiya

Javscript中Object的Key

先来看一段代码: <div id="e1"></div> <div id="e2"></div> <script> var c1 = document.getElementById("e1"); var c2 = document.getElementById("e2"); var obj = {}; obj[c1] = 1; obj[c2] = 2; console.log(obj); </script> 上面这段代码会输出什么结果呢?答案是: Object {[object HTMLDivElement]: 2} 为什么给了 obj 两个元素,输出出来却变成了一个呢?难道 c1 和 c2 指向同一个元素?首先 c1 和 c2 是两个不同的 dom 节点,并且通过输出c1 === c2会发现结果为 false,而输出obj[c1] === obj[c2]的结果却为 true。通过上面结果可以初步推断,c1 和 c2 作为 object 的 key 时,值可能是一样的。object 的 key 所接受的值只有 string 一种,所以当 c1 这个 dom 元素作为 key 时,会被转换为 string 类型,而 c2 和 c1 由于都是 div,所以转换成 string 后,值都是一样的,c2 作为 key 也会覆盖 c1。导致出现只有一个元素的结果。如果 c2 元素变成其他类型的 dom 节点,转换为 string 类型时就会不一样,例如将 c2 改为 ul,还是上面的 js 代码,输出结果为: ...

一月 8, 2014 · 1 分钟 · Zhiya