MOSP之Safari Extension(无证书签名)

Idea

Safari10支持App Extension。于是想做一个在视频页点击ToolbarItem后在MOSP解析播放,如果是电视剧,还将所有集都解析进播放列表。

前提:Safari10只支持10.11.5以上的版本

拒绝Flash,视频搜索播放!支持优酷、爱奇艺、芒果TV、QQ视频、乐视
2016101842228QQ20161018-4.png

实现

本文基于Xcode8.0和OS X EI Capitan 10.11.6

Safari Extension Info需要设置SFSafariContentScript(用于注入Script)、SFSafariToolbarItem(用于设置工具栏点击图标)、SFSafariWebsiteAccess(用于设置哪些网站允许注入使用改Extension)
2016101827497QQ20161018-0.png
要在Safari成功加载该App Extension还有几个需要注意的地方:

Safari浏览器相关设置

Safari浏览器开发菜单需要在Safari设置–>高级–>在菜单栏显示“开发”菜单启用,然后在开发菜单中勾选上允许未签名的扩展

Xcode中相关设置

一、Safari Extension Deployment Target设置

我用于开发的系统10.11.6,默认创建的Safari Extension模版中Deployment Target是10.12,不将Deployment Target设置为10.11的话编译后Safari浏览器扩展列表中始终不会加载。

二、相关Swift文件的Target Membership设置

设置相关Swift文件的Target Membership是为了App与Safari Extension之间代码能直接重用
2016101837561QQ20161018-1.png

三、App Group设置

准确的说,App与Safari Extension属于2个不同的App,所以要分别为App和Safari Extension设置App Group,二者都加入com.zlxdike.MOSP.Data同一个Group。这样才能让2个不同的App共享和交互数据。
2016101895221QQ20161018-2.png
通过上面的设置后,App与Safari Extension就可以共用代码和交互数据了。至于通过Swift如果共用数据简单说下吧。

  • 透过UserDefaults存取和读取需要共用的数据(比如本文中的播放列表)
  • 透过NotificationCenter来Post通知数据更改。App ViewController接获通知,更新页面。

下面是PlayListManage.swift相关代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
//
// PlayListManage.swift
// MOSP
//
// Created by zlxdike on 16/10/17.
// Copyright © 2016年 zlxdike. All rights reserved.
//

import Foundation
import Cocoa

class PlayListManage {
private var playList:[NSArray]


init(){
playList = []
readPlayList()
}


func readPlayList(){
let myShared = UserDefaults(suiteName: "com.zlxdike.MOSP.Data")
myShared?.synchronize()
guard let playListDefults = myShared?.object(forKey: "PlayList") else { return }
playList = playListDefults as! [NSArray]

}

func savePlayList(){
let myShared = UserDefaults(suiteName: "com.zlxdike.MOSP.Data")
myShared?.set(self.playList, forKey:"PlayList")
myShared?.synchronize()
DistributedNotificationCenter.default().post(name: Notification.Name(rawValue: "refreshPlayList"), object: nil)
}

func add(listStr: String){
let arr = listStr.components(separatedBy: "#*#")
for i in arr{
let arrInfo = i.components(separatedBy: "*#*")
playList.append(arrInfo as NSArray)
}
savePlayList()
}

func allPlayList() -> [NSArray]{
readPlayList()
return playList
}



static let shared = PlayListManage()
}

后记

我并没有个人证书来签名应用,所以每次重启Safari10都需要开启允许未签名扩展,于是该Safari Extension使用起来反而没想象中的方便。最后只能不了了之,就权当算是了解Safari Extension开发的相关技术与要求吧。


本文结束感谢您的阅读