[ WWDC2018 ] - 創(chuàng)建屬于你自己的 Swift Playgrounds 訂閱

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 電子書頁面的一張截圖呜袁,感受一下:

swift_playground_preview.jpeg

圖的左邊是源代碼編輯器敌买,右邊是“所見即所得”的實(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)格式脱货,其中包括所有資源文件。

playground_book_package_structure.png

我們根據(jù)目錄結(jié)構(gòu)主要把它區(qū)分三個(gè)層次:

  • ContentsPlayground 電子書根目錄律姨,包含所有資源文件蹭劈,屬于最高層級,其中包含 Chapters 文件夾以及一個(gè)配置文件 Manifest.plist线召。

  • Chapters:總章節(jié)文件夾铺韧,包含所有章節(jié)文件夾。每個(gè)章節(jié)文件夾都帶有 .playgroundchapter 后綴缓淹,并且其目錄下都包含 Pages 文件夾以及一個(gè)配置文件 Manifest.plist给僵。

  • Pages: 總頁面文件夾匹耕,包含所有頁面文件夾,每個(gè)頁面文件夾都帶有 .playgroundpage 后綴,其目錄下都包含著自己運(yùn)行所需要的所有資源以及一個(gè)配置文件 Manifest.plist梦鉴。

package_structure_folder_names.png

上述的三個(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è)非常有幫助的組件摩窃,我們可以利用該組件在 PlaygroundLiveView 之間進(jìn)行交互,如:

  • 共享和訪問持久化數(shù)據(jù)

  • 訪問 Playground 并對其進(jìn)行管理

  • 操作 LiveView 顯示或者隱藏

  • PlaygroundLiveView 之間進(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 電子書:

swift_playground_template_target.png

PlaygroundBook Target

這個(gè) Target 主要用于自動(dòng)生成 Playground 電子書龙致,解決了上述所說的第一個(gè)痛點(diǎn)荆残。

playground_book_target.png

通過 Xcode 目錄可知,這個(gè) Target 所有文件都在 PlaygroundBook 文件夾下净当,其中包含文章前所說的 Sources 和 PrivateResources(Resources) 文件夾内斯,還有默認(rèn)包含一個(gè)章節(jié)以及一個(gè)頁面。

Book_Sources Target

book_sources_target.png

這個(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

live_view_test_app_target.png

這個(gè) Target 目的已經(jīng)很明確了僧诚,就是針對 LiveView 進(jìn)行調(diào)試的遮婶,解決了上述所說的第二個(gè)痛點(diǎn)蝗碎。此處不再詳述。

模板使用

我們先簡單剖析模板的源碼旗扑,上述已經(jīng)解釋了三個(gè) Target 的作用蹦骑,下面我們來看下,它們之間是怎么交互的臀防。

在 Sources 文件夾中有兩個(gè)源文件:

  • LiveViewController.swift
sources_code_review_liveviewcontoller.png

這里需要注意的是 Swift 類被起了個(gè)別名
@objc(Book_Sources_LiveViewController) 暴露給 Objective-C眠菇。

  • LiveViewSupport.swift
sources_code_review_liveviewsupport.png

這個(gè)源文件僅僅聲明了一個(gè) public 方法,并返回 Storyboard 中的一個(gè)控制器實(shí)例袱衷。

初學(xué)者可能會(huì)覺得疑惑捎废,LiveViewController 貌似沒有遵循 PlaygroundLiveViewable 協(xié)議,怎么沒有報(bào)編譯錯(cuò)誤致燥?原因是在 PlaygroundSupport 組件中就給 UIViewController 加了個(gè)擴(kuò)展登疗,并遵循其協(xié)議。

下面我們來看看是如何在 Pages 中的 LiveView 引用的:

pages_code_liveview.png

有些童鞋這此處又會(huì)有一個(gè)疑惑嫌蚤,那就是 instantiateLiveView 在 Pages 是怎么識別的谜叹?回顧上文,你會(huì)找出答案搬葬。(Sources 文件夾中的源文件屬于 Global files荷腊,并且該方法還是 public

我們再來看看 LiveViewTestApp Target 中的 AppDelegate.swift:

liveview_test_app_code_review.png

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)題
subscription_title.png
  • publisherName:訂閱發(fā)布者的名稱
subscription_publisher_name.png
  • feedIdentifier:訂閱 Feed 的唯一ID饼暑,一般直接用翻轉(zhuǎn)域名來標(biāo)識

2.document:即電子書相關(guān)信息

  • title:電子書的標(biāo)題

  • overviewSubtitle:電子書概覽標(biāo)題

subscription_document_title.png
  • detailSubtitle:電子書更加具體的標(biāo)題
subscription_document_subtitle.png
  • description:電子書相關(guān)信息的一些描述
subscription_document_description.png
  • contentIdentifier: 電子書的唯一ID,一般是在 feedIdentifier 的基礎(chǔ)上拼接電子書的名稱

  • contentVersion:電子書發(fā)布版本號

  • thumbnailURL:電子書 icon

subscription_document_thumbnail1.png
subscription_document_thumbnail2.png
  • bannerImageURL:電子書 banner,用于展示及推廣相關(guān)視覺圖
subscription_document_banner.png
  • additionalInformation:額外信息弓叛,采用 Key-Value 的方式

  • previewImageURLs:電子書預(yù)覽圖

subscription_document_preview.png

字段比較多彰居,建議刷下官方文檔有點(diǎn)印象

托管你的訂閱源

了解了訂閱 Feeds JSON 數(shù)據(jù)格式后,那么如何托管自己的訂閱源并分享給他人撰筷,我們可以把一系列 Playground 電子書的所有資源托管至第三方陈惰,創(chuàng)建自己的 JSON 文件,生成自己的訂閱鏈接闭专,然后再通過 Safari 進(jìn)行訂閱。

下面我們以 GitHub Page 為例旧烧,來展示如果托管自己的訂閱源:

subscription_web_hosts.png

1.首先創(chuàng)建一個(gè)屬于自己的 GitHub Page影钉。不知道創(chuàng)建 GitHub Page 的童鞋請移步至官方文檔

subscription_create_own_repo (1).png

2.然后在倉庫設(shè)置中配置好 GitHub Page。

subscription_create_own_repo_github_pages.png

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)用奴愉。
subscription_create_own_repo_github_pages_link.png
  • 直接在 Swift Playgrounds 應(yīng)用內(nèi)進(jìn)行收到添加訂閱鏈接的方式進(jìn)行訂閱琅摩。
manual_subscription_indicator.jpg

小結(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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末锭硼,一起剝皮案震驚了整個(gè)濱河市房资,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌檀头,老刑警劉巖轰异,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異暑始,居然都是意外死亡溉浙,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進(jìn)店門蒋荚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來戳稽,“玉大人,你說我怎么就攤上這事【妫” “怎么了互躬?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長颂郎。 經(jīng)常有香客問我吼渡,道長,這世上最難降的妖魔是什么乓序? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任寺酪,我火速辦了婚禮,結(jié)果婚禮上替劈,老公的妹妹穿的比我還像新娘寄雀。我一直安慰自己,他們只是感情好陨献,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布盒犹。 她就那樣靜靜地躺著,像睡著了一般眨业。 火紅的嫁衣襯著肌膚如雪急膀。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天龄捡,我揣著相機(jī)與錄音卓嫂,去河邊找鬼。 笑死聘殖,一個(gè)胖子當(dāng)著我的面吹牛命黔,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播就斤,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼悍募,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了洋机?” 一聲冷哼從身側(cè)響起坠宴,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎绷旗,沒想到半個(gè)月后喜鼓,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡衔肢,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年庄岖,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片角骤。...
    茶點(diǎn)故事閱讀 40,561評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡隅忿,死狀恐怖心剥,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情背桐,我是刑警寧澤优烧,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站链峭,受9級特大地震影響畦娄,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜弊仪,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一熙卡、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧励饵,春花似錦驳癌、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽不瓶。三九已至禾嫉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蚊丐,已是汗流浹背熙参。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留麦备,地道東北人孽椰。 一個(gè)月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像凛篙,于是被迫代替她去往敵國和親黍匾。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,573評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 1呛梆、通過CocoaPods安裝項(xiàng)目名稱項(xiàng)目信息 AFNetworking網(wǎng)絡(luò)請求組件 FMDB本地?cái)?shù)據(jù)庫組件 SD...
    陽明先生_X自主閱讀 15,988評論 3 119
  • 比特幣產(chǎn)業(yè)分為:上/中/下游 通常講锐涯,上游是指比特幣的產(chǎn)出,即挖礦和礦廠填物。終有指交易和存儲(chǔ)纹腌。下游指比特幣的相關(guān)應(yīng)用...
    法明_52d3閱讀 472評論 0 0
  • 哈哈,題目很噱頭吧滞磺!但我保證內(nèi)容很樸實(shí)升薯,樸實(shí)、樸實(shí)击困! 專欄留言上頭條這樣的事涎劈,對于高手來說可能只是小菜一碟。但對于...
    慧說早安閱讀 361評論 5 3
  • 四月,空氣里彌漫著一種香氣责语,微微弱弱若有若無炮障,柳絮飄飛間,有股子超凡脫俗的韻味坤候。院子里的白楊吐出嫩葉胁赢,風(fēng)起時(shí)已不再...
    笨阿三閱讀 194評論 0 1
  • 病態(tài)共生、全能自戀白筹、偏執(zhí)分裂 無法分清想象也現(xiàn)實(shí)的區(qū)別智末,認(rèn)為想象的應(yīng)該就是現(xiàn)實(shí),不符合想象的就會(huì)無法理解無法接受徒河,...
    阿中2016閱讀 589評論 0 0