在 Swift 裡頭呼叫 CFArray

在寫 Swift 的時候遇到 CFArray 都得要花點時間想一下。雖然當你在使用 Swift 語言的時候,你會盡可能希望只呼叫到 Swift 與 Objective-C API,而不用碰到 Core Foundation 的 C API,可是呢,當你在做某些事情的時候,就還是得遇到這些東西。

在 Swift 裡頭處理 CFArray 之所以不好搞,第一個原因是,當某個 API 希望你傳入 CFArray 的時候,建立 CFArray 的方式跟你在 C/Objective-C code 裡頭差異很大,但似乎也沒有看到多少文件在說明這點。

另外當你從 C/Objective-C code 傳遞了一個 CFArray 到 Swift 裡頭的時候,裡頭可能會有兩種類型的東西:一種是可以 bridge 成 Objective-C 或是 Swift 的物件—通常是 Foundation 或是 Core Foundation 的物件;另外也可能是其他種類的 C 指標,可能是某種另外定義的 C Structure,而在這兩種不同的狀態下,要用不同的方式操作 CFArray。

Continue reading

東森新聞雲捷運車廂廣告賞析

2015-02-23 21.12.42

在東森新聞雲的捷運車廂廣告畫面中,由左至右,我們可以看到以下元素:

  1. 文案:「新聞類網站票選第一名」。
  2. 兩支手機的圖片,看起來像分別是 iPhone 與 Android 手機,一支手機的畫面是有東森新聞雲 Logo 的 Splash 畫面,另外一支手機上,看起來則像是某個 App 的操作畫面。
  3. 看起來像是一對男女正要深情相吻的剪影,在這對男女的身後,則出現像是台北市河濱公園、或是新北市政府廣場上什麼新北歡樂聖誕城之類的活動會出現的大型愛心裝置藝術。
  4. 文案:「車廂裡,每 10 個人,有 8 個正在看…」
  5. 出現「東森新聞雲」字樣的搜尋引擎搜尋框介面。
  6. 兩個 QR Code,下方分別有 iOS 與 Android 字樣。
  7. 文案:「不管巧遇、外遇、豔遇,第一次相遇都在____」

如果這則車廂廣告的意圖是推薦東森新聞雲服務的話,就上面的七項元素來說,光是 1、2、5、6 這四個元素,就可以構成一個完整的故事,雖然這個故事也有點怪:東森新聞雲是票選第一名的新聞類網站,不過,雖然是個第一名的新聞網站,但我們不要去用這個網站,你應該去使用 iOS 與 Android 平台上的專屬 App,只要掃描 QRCode 就可以下載,或是用搜尋引擎找「東森新聞雲」關鍵字。

至於手機 App 的評價如何,從上述的線索中無從得知,不過,既然網站票選第一名會寫出來,如果 App 評價也是第一名,照理說也會寫出來才對,既然沒有寫出來,我們不妨猜測 App 並沒有第一名的評價。

不過,這些都不是畫面中最重要的元素,我們從一整塊粉紅色的背景,看起來就是要凸顯那對熱吻中的男女,加上正中央字體最大的文字是這段「車廂裡,每 10 個人,有 8 個正在看…」推論,這則廣告的重點應該不在於東森新聞雲這項服務,而是有一段更重要的敘事等待廣告的受眾發掘。

「每 10 個人,有 8 個正在看…」顯然是個懸疑式的標題,企圖激發讀到這段文字的人心中的懸念,你不禁猜想,這八個人到底在看什麼呢?另外兩個人在做什麼呢?你看到旁邊激情擁吻的身影,你就豁然開朗了,啊!這就是八個人之外的另外兩個人嘛!他們忙到自顧不暇,眼中只有彼此,當然沒有餘力可以看其他的東西囉。

回到「每 10 個人,有 8 個正在看…」—另外八個人到底在看什麼呢?如果是在看東森新聞雲,對照另外兩個人好一番人生勝利組的舉動,感覺起來,用 App 看新聞似乎是種非常魯蛇的行為;所謂廣告的目的就是希望看到的人購買,廣告想觸發的購買動機,往往就是營造階級可以向上提昇的想像,應該不會強調「別人在享受愛情,你只能看新聞」這種事。

所以我們該從別的方向來想—這幾個元素其實跟東森新聞雲根本無關。這八個人其實在看另外兩個人的精采演出,兩個人在相姦另外八個人在視姦;如此一來,我們也可以輕鬆回答「不管巧遇、外遇、豔遇,第一次相遇都在____」這個填空題,自然就是在捷運車廂嘛。嗯,真是好一幅溫柔繾綣的捷運風情畫。

WatchKit

更新

Xcode 6.2 beta 4 之後,就有「+ openParentApplication:reply:」可以呼叫,可以解決大部分的 Watch App Extension 與 Hosting App 之間的溝通問題。這篇大概是 code 6.2 beta 1 推出時寫的。

另外,Hosting App 要通知 Watch App Extension,大概還是得透過 CFNotificationCenter。

原文如下:

要開始嘗試使用 WatchKit 開發 Apple Watch 的相關應用,首先要安裝 Xcode 6.2 Beta 版本與 iOS 8.2 SDK,然後從 File 選單中,選擇 New Target,再從 Apple Watch 分頁中選擇 Watch App。

Xcode 6.2 Beta 版本有個 Bug,如果你原本的專案檔案中,Build Phases 裡頭包含了 Run Script Phase,那麼再加入了 Watch App 之後,Xcode Beta 就會一直當一直當一直當。

所以,在目前 Apple Watch 還沒有上市,蘋果也只提供 Beta 版本的開發工具,只能夠用模擬器模擬運作,一切都還不穩定的狀況下,我們想要先了解 WatchKit 的架構,必須把 Watch App 加到一個沒有 Run Script Phase 的專案中,或是可以把原本專案的 Run Script Phase 砍了,或是開一個新的測試專案。

Continue reading

iOS 8 一些跟 Audio 相關的改變

iOS 8 裡頭 Audio API 的底層有一些改變,但是蘋果改了這些地方,也沒有在文件裡頭說清楚,一開始也不會注意到這麼微小的改動。所以你原本寫的程式在升到 iOS 8 之後,就會出現一些奇怪的行為。

蘋果改動了 Audio Session 的行為。Audio Session 是一套在 iOS 裝置上用來描述、管理你的 App 使用的是哪一種 Audio 的方式,以及因為使用某種類型(Audio Session Category)的 Audio 所產生的對應行為。

Continue reading

捷運轉乘

前陣子花了點時間寫了一個簡單的免費 iOS App,叫「捷運轉乘」,現在可以直接在 App Store 下載,也可以在 Github 上取得程式碼

這個 App 做的事情很簡單,就是幫你計算兩個台北捷運站之間經過車站最少、或是轉乘次數最少的路徑。由於裡頭包含了松山線的資料,在捷運松山線通車、台北捷運路網變得複雜之後,如果你也開始有不知道應該怎麼轉搭捷運的困擾,希望這個 App 可以有些幫助。

Continue reading