因為你用來做 Code Sign 的 Certificate 是幾個月前產生的,所以你的 App 會 Crash

這篇 blog 就是我在 2015 年四月份台北 Cocoaheads 在台上講的事情。

在過年期間,我把去年 11 月時寫的捷運轉乘這個個人的小 iOS App 改了改,在年假結束的前幾天 submit 一個版本,結果,過了一週,被 reject。

蘋果的 reviewer 說,他們只要一安裝這個 App 的 binary,就會馬上 crash;可是在我自己的開發環境中,完全無法重現這個狀況,由於過完年公司的事情就一件一件接著來,所以也就擱在一邊不管了,我到今天才知道為什麼會 crash,而且理由還頂荒唐的。

這兩天我們把公司產品 code 裡頭的一條新功能的開發分支(講 feature branch 不知道會不會比較好懂)併回主線,然後讓主線的程式進入 Jenkins build,讓公司的 QA 部門做出貨前的測試。狀況很奇妙,原本的 App 也是跑得好好的,在支線開發的過程中,也跑得好好的,但是從 Jenkins 編出來的 build,只要一跑起來,就會 crash。

Continue reading

當秋葉原的女僕轉過頭來跟我說了一句話,我和我的小夥伴們都驚呆了

這是去年八月的事。之所以到了現在才敲鍵盤記下來,主要原因是,這個故事基本上算是人生當中的一段黑歷史,可是這個故事,又充滿啟發,每當你回想起來,就會在心頭泛起一陣陣漣漪。

去年八月參加了公司的員工旅遊,是五天的東京自由行。由於我自己沒有規劃行程,所以就跟著公司安排的室友—另外一位在這個業界也算是有相當名氣的工程師,平常不少人也將這類型的工程師喚做「大神」—一起行動。

這位大神級的同事一年可能會去個十幾趟東京聽演唱會,前兩天先走了他的既定行程,先去獺祭把什麼 Beyond 啦、二割三的吟釀還是大吟釀喝了一輪,又搭了 JR 去趟輕井澤,來趟一天的小鎮單車之旅,吃了燒肉,還在輕井澤的 Outlet 買了一盒星際大戰系列裡頭的 AT-AT 樂高回來。至於吃個什麼一蘭拉麵,也是免不了。而就算在電車上往返的時間,大神也沒有閒著,既然是在東京穿梭,那就順便在 Ingress 裡頭把看到的東京地標也都打了一輪。

第三天,沒什麼其他的規劃,由於剛好是週末,就在網路上聯絡了一位因為軟體開發社群認識,現在在東京工作的朋友,看看東京還有什麼好去處。中午先約在池袋,午餐據說是只有當地人才會知道的道地拉麵,走出來看到對面的百貨公司裡居然有個不錯的畫展,也就進去逛了一圈—像我們這麼有文藝氣息的一群工程師,怎麼有辦法抵抗《攻殼機動隊》原畫展這樣的文藝活動呢?

當我們從士郎正宗的原始漫畫設定,一路看到攻殼機動隊 Arise 的美術之後,又想不到行程了。

「走!去秋葉原。」大神提議。

「來東京這麼多次,還沒有去過女僕咖啡店,我們今天就去—解開成就!」

Continue reading

在 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