November 30, 2016

在Obj-C專案中使用Swift CocoaPod Library

在時代從Obj-C到Swift的過渡期,某些時候我們就是可能需要在專案中引用到Swift的Library。Apple也非常好心的準備了一切,只不過有時候就是沒那麼完美。

官方文件:
Swift and Objective-C in the Same Project

在使用一個SideMenu pod的時候遭遇兩個問題:

1. 出現錯誤:“Use Legacy Swift Language Version” (SWIFT_VERSION) is required to be configured correctly for targets which use Swift. Use the [Edit > Convert > To Current Swift Syntax…] menu to choose a Swift version or use the Build Settings editor to configure the build setting directly.

解法是在PodFile中加入以下
post_install do |installer|
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings['SWIFT_VERSION'] = '3.0'
end
end
end


參考網址:http://stackoverflow.com/questions/38446097/xcode-8-beta-3-use-legacy-swift-issue/38466703#38466703


在整合時遇到第二個問題:
找不到 menuAddScreenEdgePanGesturesToPresent 將無法正確設定螢幕邊緣的PanGesture。
所幸最後在issue中找到解法: https://github.com/jonkykong/SideMenu/pull/82

原來某些swift語法無法正確被轉換為objC的語法,以至於產生的 xxx-swift.h 內容不完全。根據該pull request可以修正ScreenEdgePanGesture的問題,不過另一個menuBlurEffectStyle則得自行修改了。

November 18, 2016

ptt 爬蟲 with Python

即便經過十幾年,世界早已從無名小站經過Facebook,正演進到通訊軟體與chat bot的世界。台大批踢踢仍是台灣網路世界的熱門中樞,什麼最新最快最即時的資訊哪裡找不到,還是到批踢踢問鄉民最快。因應新的世界,也有好多好用的批踢踢手機app可以使用,滿足大家對資訊的需求。

好吧,廢話講太多(下略三千字)。今天要玩的是批踢踢的文章爬蟲。

Github上相關的程式碼很多,根據Readme挑了一個看起來合適的切入點。 https://github.com/jwlin/ptt-web-crawler 嗯,是Python。

在目前的Mac版本(10.12)已有內建Python2.7。直接跑起來卻一直出現error。胡亂安裝一陣相關套件,卻還是一直回報pyOpenssl相關錯誤。才知道原來在本機跑python還需要設定Virtual Environment才行。

根據說明,virtual environment是用來保持各專案的獨立性。解決了A專案需要版本 1.x 但 B專案需要 4.x 的這類問題。

可透過pip安裝。
$ pip install virtualenv


基本使用:
1. 在專案資料夾中建立virtual environment
$ cd my_project_folder
$ virtualenv venv

以上動作會在該資料夾中建立一個 venv 的資料夾。裡面會放Python的相關執行檔與一份用來安裝其他library的pip library。(venv也可使用其他名稱)(這資料夾在mac finder中看不到,是隱藏資料夾。)
也可以指定python interpreter
$ virtualenv -p /usr/bin/python2.7 venv

2. 使用以下指令啟動virtual env
$ source venv/bin/activate

當virtual env啟動時,會出現在提示符號右邊如:
(venv)Your-Computer:your_project UserName$

啟動後,任何使用pip安裝的套件會裝在venv中。
$ pip install requests

3. 如要關閉virtual environment
$ deactivate


接下來就可以開始玩囉~

基本上照說明執行就可以動了。以下依需求fork到我的Github上做了一點小修改。

原本設定參數 -i [起始頁] [終止頁] ,終止頁若設-1代表爬到最後。
不過因為我只需要爬最新幾頁,所以修改參數,若起始頁設定-1,則會往前數n頁再爬出來,參數這樣設 -i -1 n,就會爬該版的最後n頁文章內容。

目前大概這樣,有興趣的朋友可以到Github下載下來玩。

September 21, 2016

xcode 8 卡頓

從xcode 8 GM釋出以來,一直有一個卡頓的問題實在十分惱人。開啟xcode打沒兩個字就開始無限轉圈... @@。沒想到正式釋出之後問題仍然沒有解決。

還好搜尋之後找到解法。

不確定是否為xvim外掛的關係,總之照做之後就順利正常了。

參考文章:https://github.com/XVimProject/XVim/issues/966

解法就是,從"系統偏好設定">"安全性與隱私">"聯絡資訊" 將xcode取消勾選即可!

不知為何xcode需要取用聯絡資訊,不過果然關掉就正常了。

以上,給遇到相同問題的朋友參考~

September 9, 2016

為DEBUG build做不同的info.plist設定

開發專案總會遇到一些情況,比如說某些功能是debug用的,正式版並不要送出去。如果事事都用手動調整,那我們在做Release build時就會有一張落落長的check list。所幸大部分的功能只要設定Propressor Macro,在用#if區隔程式碼就可以自動區別。

但是就是這一個但是,iOS的某些功能是在info.plist中做設定的,不找一下,還真不知道該怎麼在build time讓它自動區分開來。比如說 UIFileSharingEnabled

查找了一下,可以參考這篇:Info.plist preprocessing

雖然Apple關著這扇門,但他也開了那扇窗。只要在Project Target的Build Setting中做以下設定,就可以囉!

1. 把 Preprocess Info.plist設為YES。(預設為NO)
2. 設定一個.h檔案,比如我用的是infoPlist.h,指定為Preprocessor Definitions檔案。這邊可以直接分為兩個檔案,或用#define做區隔,這就看各人喜好囉。
3. 最後在info.plist中再使用定義好的MACRO即可。

August 26, 2016

Xcode 8 beta 5 Comment Selection broken

在寫code的時候,若有什麼快速鍵壞掉實在是十分惱人的事。

最近升級至iOS10 beta版,對應使用Xcode beta,就發現原本的cmd+/功能竟然壞了。

原以為是xvim plugin壞要,一查才知道cmd+/是內建功能,而且在beta版壞掉了。

找了一陣終於找到解法:

參考出處:https://twitter.com/kolpanic/status/763323546814844928


在Terminal中執行以下指令,重開機即可恢復正常。

sudo /usr/libexec/xpccachectl

May 27, 2016

iOS 9.3 Health Data 換機備份

我完全相信,Apple對於保護使用者的隱私真的是不遺餘力。不過安全性與方便性總是難以兼得。

最近為了能夠在不同螢幕大小測試下開發中的App,用模擬器看總是不若握在手中的真實,以及其他種種理由(或藉口),購入了一支新的iPhone 6s。同樣iOS手機,除了從4吋升級為4.7吋這點需要適應,以及變順、變快等等換新機通常會有的感想之外,其實沒有太多新奇。

一如往常的在電腦做完全機備份,回復到新機之後,卻發現,奇怪... Apple是退步了唷?怎麼備份沒有恢復完全!?有些東西少了,有些卻也還在,有點莫名...

復原做了兩次,重複設定了各網站的兩步驗證,Mail、iCloud...等等密碼,折騰許久,最後竟發現,Up24與Apple Watch加起來戴了一年多累積起來的各種健康相關資料竟全都沒有還原回來... !!!??? 

原來詳查之後才知道,Apple將Health資料視為隱私資料,跟密碼、WiFi設定、網站記錄一樣,若備份時未設定備份密碼,則不會一併備份。WTF!!! 如此重大改變我怎麼會沒聽過呢?(或者聽過也忘記了... @@") 官方說明連結

但先前又已經反覆把各種安全設定設到新手機上了,並也不想貿然再重新恢復備份一次。故花了點時間尋找單純備份還原Health Data的方法。

參考了Google的到的各種文章,以及搜尋Store提供相關功能的App。試過以下幾種,幾乎完全沒有作用。

1. Health Importer:吃的是CSV檔。最先找到的文章說,使用內建的Health App即可匯出CSV,再使用Health Importer即可。但現在的9.3版匯出的是內含2個xml檔案的zip檔,Health Importer完全無法作用,是故需要QS Access搭配使用。
2. QS Access:可以讀取Health App內的資料,匯出為CSV檔,但Table很多,我想要的資料不知道屬於哪個Table。最後順利匯出了一點點無關緊要的資料,卻並也無法使用Health Importer匯入。殘念。
3. Health Backup:可匯出自有格式的zip,照說感覺這App比較靠譜,自己匯出匯入的總不會錯了吧。殊不知,大量資料的匯出也經常失敗,需要關閉自動鎖定才比較有機會匯出成功。然而,匯出成功後也無法正常匯入,就算最後僅做少量資料的匯入,都提示完成了,也仍沒有匯入成功。完全是裝心酸的。
4. Health Import:標榜自己可以匯入由Health App匯出的資料,但大量資料時也同樣無法成功匯入。會一直停在App畫面,又不能跳出離開,等待三四個小時,進度條都留在原位,最後只好放棄。

試過所有的匯出匯入App後,實在沒有一個可以解決我的問題,甚至反覆交叉使用這些App,反而把Health App某些資料寫壞。最後只好認命回頭使用iTunes的全機備份,重新加密備份還原,終於取回累積許久的資料。


結論。若非必要,使用iTunes備份還原還是最佳解。如不得已必須嘗試上述的App,請記得先將自動鎖定關閉,以提高成功機率。





April 25, 2016

Server API Security

App端開發到一個程度,最終還是得開始碰Server的部份。雖然紅極一時的Parse.com已經快要關店,但Opensource化後,可以自架Parse也是另外一種選擇。爬文查找用法之際,找到一系列關於資料安全性的設定與調控方式,可能在Server界已是慣例,但對初入門的我來說,可幫助我一探其中奧妙!

系列文章可從這裡開始參考:Parse Security I - Are you the Key Master?

以下節錄摘要給大家參考:

Part I,關於Master Key與各個Client Key的使用方式。
Master Key是一種security mechanism。擁有Master Key的人可以bypass後面提到的各種安全機制,對資料庫進行存取修改的動作。是故,需以保護Root Password的同樣程度來保護Master Key。
然而,Client Key則是一種辨別目前Client平台的方式。可能是iOS或Android終端,或者JavaScript或REST Client。這ClientKey會隨著app或source code進到user手中,便無法防止user反組譯或者用監聽網路傳輸的方式竊取ClientKey。所以,請不要把Client Key當成任何安全機制使用。

Part II,Class-level的權限設定。
在Parse後台上,可針對各別Class設定各種權限。可分別針對以下幾個API設定Public或Private(User/Role) 的read/write權限。
  • Get
  • Find
  • Update
  • Create
  • Delete
  • Add Field
其中比較特別的是AddField。該權限允許Client動態為table增加欄位。這功能在開發階段非常方便,但一旦App正式上架後則不應該經常發生。故上架後應將此權限關閉。
另外還有一個允許Client增加Class的全域權限,也應該在上架前關閉。

Part III - Access Control List
ACL允許為各別object設定不同的存取權限。此時帶入User的概念進來。若存有使用者的個人隱私資料,則應該使用ACL控制,不可允許任何人檢視。若為User Class,Parse預設不允許除了User本人以外的其他人修改,但可以查看內容。如有隱私資料如電話或email,則應另外設計PrivateData class存放,並設為其他User不可查看的權限。原文有相關範例程式碼,可以參考。

Part IV - Cloud Code
Parse允許上傳Javascript的Server side code。由Parse server執行。因若安全性檢查設在Client端則容易被bypass,失去保護作用,建議使用Cloud Code進行驗證資料內容等安全性檢查。
在Cloud Code中也可設定使用 `useMasterKey` 以略過security相關檢查。

Part V - 綜合運用以上功能,設計與朋友共享特定資料的範例。
本篇中解析了如何運用Role、ACL與Cloud Code,設定user的某些特定資料,可以與一群朋友分享。如有需要的朋友可以前往研究

March 22, 2016

新玩具入荷 Apple TV

內心不願承認,但其實就是一個果粉。之所以為果粉,不是對賈伯斯或蘋果公司有什麼盲目的崇拜,而是因為自從開始使用Apple產品之後,所養成那種對細節的要求。若要說蘋果公司帶來的價值,必定有包含這一項,那就是,他向世人展示了何謂「完美」,以及揭示推出一項「產品」應該要以什麼樣的標準為標準。

忍耐許久,終於入手Apple TV。

其實在新一代AppleTV遲遲沒有上市之前,就已經入手使用Chromecast。對於手機/平板即遙控器的客廳生活已相當熟悉。於是新代AppleTV上市之後,除了價格上比Chromecast貴上幾倍,尚看不懂有什麼特別的地方。在加上Chromecast+iPhone的配合其實也已經可以滿足日常需要,所以才有辦法忍耐這麼久才終於入手。

話說AppleTV的主要功能大概就網路上找的到那些,目前也尚無太多特別的app可以安裝使用。對我這種不太玩遊戲的人來說,ATV最主要的用途就是看片了。配合上Netflix進入台灣,再也不需要接什麼第四台,網路上就有無盡的電影,看是要付月費訂閱,還是單片租借,世界已經悄悄進入串流影音的時代了。

底下分享一下我個人被AppleTV驚艷到的地方。

遙控器。大家應該都試過在手機/平板看片,有時候要前後拖曳進度列找到某個特定畫面,但粗大的手指在螢幕點上去,卻之後永遠都拖不到那個想要的位置。

在ATV上看片,不管是手機Airplay上來,或是直接在ATV上播放的影片,遙控器的快轉/倒轉功能真的非常流暢好用。一般人大概會覺得遙控器有什麼了不起的,小小一支還能做成怎樣。Apple就身體力行的讓你知道,遙控器就是要做到這樣!

另外一個令人讚嘆的點是。家裡客廳本來就有一套音響是接在Airport Express上。買了ATV之後,才正思考要怎樣拉線,可以再從電視把聲音輸出到音響上,這樣看電影時的臨場感應該可以更棒,爽度更高。

結果某日在隨意玩轉遙控器時,意外發現,原來看片時直接可以從ATV上設定,把聲音直接輸出到Airplay喇叭上去!

拉線?免!直接輸出去就可以了。當然切換時會有幾秒的轉換空檔,但在看片的過程完全不會發生A/V不同步的問題。

說到這裡就不得不讚嘆一下Apple做產品的細節。這些都不是什麼艱難的技術,但他就是可以考慮到你會/可以怎麼用,然後每樣都幫你照顧的好好的。於是你就會忍不住一樣一樣一直買下去。從一支iPhone到iPad,小全套到大全套,從單件產品使用者,一步一步成為忠實果粉。

所以總之若你問我,ATV值不值得入手?如果已經有好多樣Apple產品了,而且你也常常用手機看片,看到視茫茫,而髮蒼蒼,那就十分推薦拜入一台ATV,相信可以讓你把iPhone/iPad上的完美使用體驗延伸到客廳來。




March 18, 2016

iOS8 AutoLayout

如同Android在發展的一開始就被迫面對多種螢幕大小,而慢慢演化出一套解決方式。即便是Apple也終於在iPhone6 plus推出後,同樣的問題慢慢浮現。於是Apple推了一套自己的解決方式,是為Auto Layout與Size Classes。

一直快樂的用舊方法開發的工程師們(指我),最終也逼不得已必需面對新技術的浪潮。

好啦,對。我就是要抱怨,Auto Layout跟Size Classes實在沒有想像的簡單。光憑自己在xcode上摸索是完全不夠的。無頭蒼蠅摸索嘗試了兩天,在新App的某些複雜UI上,遲遲不能順利的讓所有Constrtraints相安無事。只好再回去抱老師佛腳。


若您跟我一樣摸索半天不著頭緒,建議可以參考以下這節課程。


iTunesU上的 Developing iOS8 Apps with Swift 參考 Lesson 8: ViewController LifeCycle , Auto Layout


全篇只有1小時28分鐘。前段的Life Cycle也很值得參考,已經熟悉的朋友也可以再複習一番。後段的AutoLayout可以看到如何設定Constraints,object之間的關係,Constraints的priority。當然還有神妙的Size Classes該如何使用,相當值得推薦。iTunesU單集沒有星星可以按,不然完全想幫他按個五顆星上去。


(顯示為因bug解決太興奮不吐不快貌)