WWDC2018: 創(chuàng)建屬于你自己的 Swift Playgrounds 訂閱
Session 413:Create Your Own Swift Playgrounds Subscription
Swift Playgrounds 是一款革命性的 iPad 應(yīng)用,可以用強(qiáng)大的 Swift 語言進(jìn)行教學(xué)培遵。蘋果推崇在 Swift Playgrounds
上人人都能使用 Swift 編程的原則浙芙,讓所有人都能學(xué)習(xí)、編碼以及教授代碼課程籽腕。
本 Session 主要講如何利用 WWDC2018 新的模板工具制作出屬于自己的 Playground Book以及如何托管自己的訂閱源并分享給他人嗡呼。讓我們帶著這兩個(gè)問題來閱讀本文。
Playground 電子書簡介
蘋果在 Swift Playgrounds
應(yīng)用上提供了很多學(xué)習(xí)編程相關(guān)的 Playground Book皇耗,本文就通俗的稱之為電子書南窗。
Playground
電子書(.playgroundbook),它能夠幫助你管理內(nèi)容郎楼,生成瀏覽目錄万伤,使你更容易找到自己想要學(xué)習(xí)的章節(jié)及頁面,下面是 Playground
電子書頁面的一張截圖呜袁,感受一下:
圖的左邊是源代碼編輯器敌买,右邊是“所見即所得”的實(shí)時(shí)視圖。相比于 Xcode Playgrounds
功能更加強(qiáng)大阶界,感興趣的讀者可以查閱相關(guān)資料虹钮,本文不做詳述聋庵。
WWDC2016 - Session 408 Introducing Swift Playgrounds
目錄格式
在學(xué)習(xí)如何利用新的版本工具前,我們先快速了解下 Playground
電子書的目錄格式芙粱。
Playground
電子書祭玉,是一個(gè)帶有 .playgroundbook 后綴名的文件,可以理解為一個(gè)文件夾資源包春畔,它是一個(gè)嵌套的文件夾結(jié)構(gòu)格式脱货,其中包括所有資源文件。
我們根據(jù)目錄結(jié)構(gòu)主要把它區(qū)分三個(gè)層次:
Contents:
Playground
電子書根目錄律姨,包含所有資源文件蹭劈,屬于最高層級,其中包含 Chapters 文件夾以及一個(gè)配置文件Manifest.plist
线召。Chapters:總章節(jié)文件夾铺韧,包含所有章節(jié)文件夾。每個(gè)章節(jié)文件夾都帶有 .playgroundchapter 后綴缓淹,并且其目錄下都包含 Pages 文件夾以及一個(gè)配置文件
Manifest.plist
给僵。Pages: 總頁面文件夾匹耕,包含所有頁面文件夾,每個(gè)頁面文件夾都帶有 .playgroundpage 后綴,其目錄下都包含著自己運(yùn)行所需要的所有資源以及一個(gè)配置文件
Manifest.plist
梦鉴。
上述的三個(gè)目錄下都有屬于自己 Manifest 配置文件崇渗,有什么作用呢巡通?
分別如下:
描述電子書的信息
描述章節(jié)及目錄信息
描述頁面信息以及其行為(詳述請移步至官方文檔)
至此膛虫,你可能會(huì)有個(gè)小疑惑,為何文件夾會(huì)有后綴躏吊,干啥用的呢氛改?
.playgroundbook
.playgroundpage
.playgroundchapter
這個(gè)設(shè)計(jì)官方給出了一個(gè)解釋:僅僅就是為了表明其類型。(No more thing.)
此外還有兩種文件夾比伏,一般放置與 Contents 目錄下:
Sources:輔助的 Swift 源文件胜卤,如果放置在 Contens 目錄下,意味著所有 Page 都能訪問赁项,屬于全局范疇葛躏。
Resources:電子書的資源文件,一般放置一些圖片悠菜、音頻文件等等舰攒,其他類似于 Sources 文件夾。
PlaygroundSupport
在制作 Playground
電子書時(shí)悔醋,PlaygroundSupport
對于我們來說是一個(gè)非常有幫助的組件摩窃,我們可以利用該組件在 Playground
與 LiveView
之間進(jìn)行交互,如:
共享和訪問持久化數(shù)據(jù)
訪問
Playground
并對其進(jìn)行管理操作
LiveView
顯示或者隱藏在
Playground
與LiveView
之間進(jìn)行消息傳遞保存用戶的學(xué)習(xí)進(jìn)度等等
如果我們想在 LiveView
上顯示一個(gè) View篙顺,利用 PlaygroundSupport
可以這樣寫:
import UIKit
import PlaygroundSupport
let view = UIView(frame: CGRect(x: 0, y:0, width: 200, height: 200)
PlaygroundPage.current.live = view
使用 Swift Playgrounds 模板
了解了上述的一些基本知識后偶芍,再來看看 Swift Playgrounds 模板,這是今年 WWDC2018 新推出的德玫,支持 Xcode 9.3 以上匪蟀,首先我們先拋出一個(gè)問題,為何會(huì)有 Swift Playgrounds 模板這東西宰僧?
回顧
從 WWDC 2016 Swift Playground Books 誕生開始材彪,制作 Playground 電子書是比較麻煩的,筆者認(rèn)為主要原因有兩點(diǎn):
因?yàn)槟阋獓?yán)格按照上述所說的文件目錄結(jié)構(gòu)的格式來整理你的文件琴儿,如果萬一中間某個(gè)處弄錯(cuò)了段化,那么在 iPad 上就無法正常運(yùn)行。像這種操作應(yīng)該實(shí)現(xiàn)自動(dòng)化生成文件目錄結(jié)構(gòu)造成,讓開發(fā)者更加關(guān)注其實(shí)現(xiàn)显熏。
從上面這一條可以看出,調(diào)試起來是個(gè)坑晒屎,很難定位的自己是哪出錯(cuò)了喘蟆。在程序上,調(diào)試只能以打印 Log 的方式進(jìn)行鼓鲁,無法進(jìn)行斷點(diǎn)調(diào)試也是個(gè)痛點(diǎn)蕴轨。
當(dāng)然網(wǎng)上也有人寫過一些工具來解決上述的問題。但今年骇吭,WWDC2018 蘋果自家終于推出專門的模板來解決上述所提到的痛點(diǎn)橙弱。下面我們趕緊來看看如何使用該模板制作 Playground
電子書吧。
模板介紹
Swift Playgrounds
模板是一個(gè)幫助制作者調(diào)試燥狰、快速創(chuàng)建的一個(gè) Xcode 工程棘脐,讓制作者更加關(guān)注于內(nèi)容的創(chuàng)建。
這個(gè) Xcode 工程有三個(gè)不同的 Target 來幫助你創(chuàng)作屬于你的 Playground 電子書:
PlaygroundBook Target
這個(gè) Target 主要用于自動(dòng)生成 Playground 電子書龙致,解決了上述所說的第一個(gè)痛點(diǎn)荆残。
通過 Xcode 目錄可知,這個(gè) Target 所有文件都在 PlaygroundBook 文件夾下净当,其中包含文章前所說的 Sources 和 PrivateResources(Resources) 文件夾内斯,還有默認(rèn)包含一個(gè)章節(jié)以及一個(gè)頁面。
Book_Sources Target
這個(gè) Target 我們可以簡單理解為把 Sources 源文件編譯成一個(gè)靜態(tài)庫像啼,供 LiveViewTestApp Target 使用俘闯,這里有個(gè)點(diǎn)需要注意,如果你創(chuàng)建了多個(gè) Page忽冻,并且需要進(jìn)行調(diào)試的時(shí)候要明確你要調(diào)試那個(gè) LiveView真朗,從而并進(jìn)行 Debug 視圖切換。
LiveViewTestApp Target
這個(gè) Target 目的已經(jīng)很明確了僧诚,就是針對 LiveView 進(jìn)行調(diào)試的遮婶,解決了上述所說的第二個(gè)痛點(diǎn)蝗碎。此處不再詳述。
模板使用
我們先簡單剖析模板的源碼旗扑,上述已經(jīng)解釋了三個(gè) Target 的作用蹦骑,下面我們來看下,它們之間是怎么交互的臀防。
在 Sources 文件夾中有兩個(gè)源文件:
- LiveViewController.swift
這里需要注意的是 Swift 類被起了個(gè)別名
@objc(Book_Sources_LiveViewController) 暴露給 Objective-C眠菇。
- LiveViewSupport.swift
這個(gè)源文件僅僅聲明了一個(gè) public
方法,并返回 Storyboard
中的一個(gè)控制器實(shí)例袱衷。
初學(xué)者可能會(huì)覺得疑惑捎废,LiveViewController
貌似沒有遵循 PlaygroundLiveViewable
協(xié)議,怎么沒有報(bào)編譯錯(cuò)誤致燥?原因是在 PlaygroundSupport
組件中就給 UIViewController
加了個(gè)擴(kuò)展登疗,并遵循其協(xié)議。
下面我們來看看是如何在 Pages 中的 LiveView
引用的:
有些童鞋這此處又會(huì)有一個(gè)疑惑嫌蚤,那就是 instantiateLiveView
在 Pages 是怎么識別的谜叹?回顧上文,你會(huì)找出答案搬葬。(Sources 文件夾中的源文件屬于 Global files荷腊,并且該方法還是 public)
我們再來看看 LiveViewTestApp Target 中的 AppDelegate.swift:
setUpLiveView
方法是直接調(diào)用 Book_Sources Target 生成的靜態(tài)庫調(diào)用其方法實(shí)現(xiàn)的,當(dāng)有多個(gè)不同的 LiveView
進(jìn)行調(diào)試時(shí)急凰,此處要記得更改女仰。
至此,模板的原理及使用應(yīng)該都差不多了抡锈。下面我們再回到這個(gè) Session 的另一個(gè)主題:如何托管自己的訂閱源并分享給他人疾忍?
如何把制作好的 Playground 電子書安裝到 iPad?
這里有兩種較為常用的方法:
AirDrop床三,沒錯(cuò)一罩,直接把 .playgroundbook 文件通過 AirDrop 丟給 iPad。
iCloud Drive(iCloud 云盤)
Swift Playgrounds 訂閱 Feeds 格式
上文已經(jīng)講了很多關(guān)于制作 Playground
電子書的知識撇簿,現(xiàn)在開始我們要關(guān)注聂渊,如果把制作的電子書分享給他人學(xué)習(xí)呢?
我們一般把一系列的 Playground
電子書相關(guān)資源托管至遠(yuǎn)端四瘫,并把其描述成一個(gè) Feeds JSON 文件汉嗽,然后 Swift Playgrounds
再通過解析其內(nèi)容來達(dá)到訂閱的目的。下面我們來了解一下該 JSON 的數(shù)據(jù)格式及結(jié)構(gòu)找蜜。
{
"title": "WWDC Photo Filters",
"publisherName": "Holly and Grace",
"feedIdentifier": "io.github.WWDCPhotoFilters",
"contactURL": "mailto:example@apple.com", // 訂閱發(fā)布者的聯(lián)系方式
"formatVersion": "1.0", //訂閱 Feed 發(fā)布版本號
"documents": [
{
"title": "Image Transitions",
"overviewSubtitle": "CIFilters in the Transition Category.",
"detailSubtitle": "Filters in CICategoryTransition.",
"description": "Learn some ways to use Core Image to transition between images.",
"contentIdentifier": "io.github.WWDCPhotoFilters.imageTransitions",
"contentVersion": "1.0",
"url": "https://WWDCPhotoFilters.github.io/ImageTransitions/ImageTransitions.playgroundbook.zip",
"publishedDate": "2018-05-18T12:00:00+00:00",
"lastUpdatedDate": "2018-05-18T12:00:00+00:00",
"thumbnailURL": "ImageTransitions/thumbnail.png",
"bannerImageURL": "ImageTransitions/bannerImage.png",
"additionalInformation": [
{
"name": "Languages",
"value": "English"
}
],
"previewImageURLs": []
}
]
}
訂閱 Feeds JSON 數(shù)據(jù)分兩部分:
1.訂閱 Feed 相關(guān)信息
- title:訂閱 Feed 的標(biāo)題
- publisherName:訂閱發(fā)布者的名稱
- feedIdentifier:訂閱 Feed 的唯一ID饼暑,一般直接用翻轉(zhuǎn)域名來標(biāo)識
2.document:即電子書相關(guān)信息
title:電子書的標(biāo)題
overviewSubtitle:電子書概覽標(biāo)題
- detailSubtitle:電子書更加具體的標(biāo)題
- description:電子書相關(guān)信息的一些描述
contentIdentifier: 電子書的唯一ID,一般是在 feedIdentifier 的基礎(chǔ)上拼接電子書的名稱
contentVersion:電子書發(fā)布版本號
thumbnailURL:電子書 icon
- bannerImageURL:電子書 banner,用于展示及推廣相關(guān)視覺圖
additionalInformation:額外信息弓叛,采用 Key-Value 的方式
previewImageURLs:電子書預(yù)覽圖
字段比較多彰居,建議刷下官方文檔有點(diǎn)印象
托管你的訂閱源
了解了訂閱 Feeds JSON 數(shù)據(jù)格式后,那么如何托管自己的訂閱源并分享給他人撰筷,我們可以把一系列 Playground
電子書的所有資源托管至第三方陈惰,創(chuàng)建自己的 JSON 文件,生成自己的訂閱鏈接闭专,然后再通過 Safari 進(jìn)行訂閱。
下面我們以 GitHub Page 為例旧烧,來展示如果托管自己的訂閱源:
1.首先創(chuàng)建一個(gè)屬于自己的 GitHub Page影钉。不知道創(chuàng)建 GitHub Page 的童鞋請移步至官方文檔
2.然后在倉庫設(shè)置中配置好 GitHub Page。
4.創(chuàng)建 Feeds JSON 文件掘剪,為了舉例筆者直接用 WWDC 上演示的 JSON 鏈接
5.在倉庫中新建一個(gè) index.html 或 README.md 文件平委,并把自己的訂閱鏈接放入其中。
<a > Subscribe
</a>
6.都配置好后夺谁,我們的訂閱源已經(jīng)托管至GitHub了廉赔,現(xiàn)在可以分享給其他小伙伴了,如何分享呢匾鸥?
訂閱電子書 Feeds 的方式有兩種:
- 通過裝有
Swift Playgrounds
應(yīng)用的 iPad蜡塌,使用 Safari 訪問 GitHub Page,即 http://tingxins.com/Playground.github.io 勿负。 點(diǎn)擊之前已配置好的鏈接進(jìn)行訪問馏艾,即點(diǎn)擊 Subscribe,然后系統(tǒng)會(huì)自動(dòng)調(diào)取Swift Playgrounds
應(yīng)用奴愉。
- 直接在 Swift Playgrounds 應(yīng)用內(nèi)進(jìn)行收到添加訂閱鏈接的方式進(jìn)行訂閱琅摩。
小結(jié)
本文針對 Session 主要總結(jié)了兩個(gè)主要點(diǎn)并通過舉例加深讀者對其印象:
如何利用 WWDC2018 新的模板工具制作出屬于自己的
Playground Book
。如何托管自己的訂閱源并分享給他人
感興趣的童鞋還可以看看往期的 WWDC:
WWDC 2018 - Session 402 Getting the Most out of Playgrounds in Xcode
WWDC 2018 - Session 418 Source Control Workflows in Xcode
WWDC 2017 - Session 410 Localizing Content for Swift Playgrounds
WWDC 2017 - Session 416 Teaching with Swift Playgrounds
WWDC 2017 - Session 408 What’s New in Swift Playgrounds