2015年5月25日 星期一

[教學] 用小程式協助 Windows 8.1 斷線自動重播

買了電視後,把 GB-BXI3H-4010 這部沒有接螢幕的小電腦移至客廳,由於家裡網路佈線的問題,我只能將 GB-BXI3H-4010 直接接到中華的光世代小烏龜上,所以就只能使用撥接上網了!

但問題才剛剛開始,不像過去的版本,Windows 8.1 的系統沒有預設的功能支援開機就自動撥接上網,只好上網求助 Google 大神!問的人不少,所以這方面的問題微軟也有官方的解決方法提供!在實際操作之後發現微軟提供的解決方案比較可靠並可行!其他的方法不是有問題就是不直覺,有興趣的請拜讀「如何才能在 Windows 8 啟動時,自動撥號上網且不需手動關閉視窗呢?(一點通系列)」。

微軟的解決辦法大概就是寫個撥接的批次檔,設定在作業系統「開始」的時候執行該撥接批次檔,藉以解決開機自動撥接上網的問題!算是很直覺的解決方法!

解決了第一個問題後,第二個問題就是怎麼在斷線後自動撥接,再次請教 Google 大神發現,原來在 Windows 8.1 之後,微軟把以前系統支援的斷線後重播的功能拿掉了!

怎麼辦?中文的討論串有很奇怪的解決方法,而且很少資料,看來只好轉戰國外的搜尋結果!把關鍵字換成英文搜尋,在用我緩慢的腦袋翻譯過濾資訊後,找到了一篇文章解決了斷線重播的問題!想看原文的可以點過去看看!

網路上最常看到的方法不外乎就是寫一個批次檔來偵測網路狀況來重新撥接,而我找到的文章裡面它的方法是「使用第三方撥接程式 Reconnect 1.5」。既然都要寫小程式來偵測了,那灌個程式也是剛好而已!
這個程式雖然介面是英文的,但是其實很好理解而且也很方便!
一、它會自動抓到已經設定完成的寬頻連線,帳號密碼自動帶入程式!
二、支援自動斷線重播,可以設定重播間隔和重試次數!
三、可以設定開機後自動執行,開機後自動撥接(這部份我沒使用也沒測試,因為我已經先套用了微軟的解決方案)。
四、可以記錄連線狀況。
五、連線後自動最小化,總是在最上層視窗顯示。
六、可以設定自動斷線時間或自動關機時間!(這應該不太實用)

另外我發現這個程式已經找不到原始開發網站了,估計這也是以前寫給舊的作業系統用的程式!所以既然新的作業系統也可以使用,那當然就可以回頭找其它的舊的撥接程式來給 Windows 8.1 使用!

我現在怎麼使用?當然就是拿找到的這個程式先用囉!畢竟安裝了之後就可以自動解決我的問題!讓我管理家裡六部電腦的生活更簡單囉!

檔案下載位址:ReConnect 1.5

2015年5月20日 星期三

[筆記] Mac 一定要知道的顯示隱藏檔案的小技巧


由於預設 Mac 會隱藏不少檔案,尤其是以小數點開頭的目錄或是檔案也一律不會顯示,在給客戶檔案的時候,這些檔案都會困擾客戶,那難道我們就沒辦法讓它顯示出來嗎?

其實方法是有的,只是非常的不友善!
使用下列兩個指令在終端機上就可以達成:
$ defaults write com.apple.finder AppleShowAllFiles YES;
$ killall Finder /System/Library/CoreServices/Finder.app

第一個指令變更 Finder 控制顯示檔案的隱藏設定設定為顯示。
第二個指令砍掉 Finder 讓它自動重啟並套用剛剛做的變更。

參考資料裡面有教你怎麼少打一些字做到這件事,但是我覺得...反正複製貼上也很方便,我就先記錄到這樣就可以了!

參考資料:
Quickly Show/Hide Hidden Files on Mac OS X Mavericks & Yosemite

2015年5月15日 星期五

[筆記] 34 個好用的 iOS 應用程式設定擋 info.plist 設定

我想最早的文章應該就是:應用程式的設定檔info.plist
這裡再分享一次並針對這些鍵值做一些整理!一定要看到後面啊!
1.
鍵名:UIApplicationExistsOnSuspend
顯示的名稱:Application does not run in background
說明:
當你在應用程式執行的時候按下 Home 鍵,應用程式並不會中斷目前的執行,而是躲到背景去了。因此希望使用者在按下 Home 鍵之後就要中斷目前程式的執行,請設定這個選項。

2.
鍵名:LSRequiresIPhoneOS
顯示的名稱:Application requires iPhone environment
說明:
iOS 的家族主要包含了 iPhone、iPad、iPod Touch 這三種設備。因此如果你的應用程式只能在 iPhone 環境下使用的話,請設定這個選項。

3.
鍵名:UIFileSharingEnabled
顯示的名稱:Application supports iTunes file sharing
說明:
在 iTunes 9.1 之後的版本增加了一個檔案共享的功能,只要打開這個選項,然後把你要共享的檔案儲存在 Documents 目錄裡面,就可以在 iTunes 裡面的應用程式標籤頁看到這份文件。反之亦可從 iTunes 上傳檔案至裝置上!

4.
鍵名:UIRequiresPersistentWiFi
顯示的名稱:Application uses Wi-Fi
說明:
如果你的應用程式需要使用的 WiFi 來連線的話,那麼你可以開啓這個功能。當使用者在執行這個應用程式的時候並未開啓 WiFi,那麼在畫面上會自動跳出對話框要求開啓 WiFi。

5.
鍵名:CFBundleSignature
顯示的名稱:Bundle creator OS Type code
說明:
CFBundleSignature 是一個四個字母長度的字串,用以表示開發者對於應用程式的標識。例如:在一個文字編輯的應用程式,你可以標識為 ”ttext”。

6.
鍵名:CFBundleDisplayName
顯示的名稱:Bundle display name
說明:
應用程式本土化的顯示名稱,預設值為 ${PRODUCT_NAME}。這個變數可以在雙敲擊Targets後出現的專案設定畫面中修改,找到”Product Name”後修改為你的產品名稱就可以了,編譯後的 .app 也會以這個名稱命名。

7.
鍵名:CFBundleIdentifier
顯示的名稱:Bundle identifier
說明:
用來標示應用程式的唯一 ID,通常是以反向的 DNS 方式命名的,例如:com.myCompany.myApp,這個名稱應該在 iTunes Connect 裡面新增的應用程式 ID 一致。

8.
鍵名:CFBundleName
顯示的名稱:Bundle name
說明:
應用程式的短名稱,通常就是你的應用程式名稱。

9.
鍵名:CFBundlePackageType
顯示的名稱:Bundle OS Type code
說明:
用來標識整個封包的(bundle)的類型。在 Mac 裡面,一個封包可能是一個檔案或目錄,其目的在於將軟體使用到的資源包在一起。例如應用程式應標識為 APPL。

10.
鍵名:CFBundleVersion
顯示的名稱:Bundle version
說明:
用以標識編譯版本(Bundle number),你可以使用任何字串格式來表示這個版本。例如使用一個數字來表示編譯次數。

11.
鍵名:CFBundleShortVersionString
顯示的名稱:Bundle version string, short
說明:
應用程式的版本,通常是以三個數字來表示版本號,例如:1.0.1。

12.
鍵名:LSExcutableArchitectures
顯示的名稱:Executable architectures
說明:
為一個陣列形態的設定值。為一個陣列形態的設定值。用以設定執行擋可以運行的架構環境,例:i386,ppc,ppc64,x86_64

13.
鍵名:CFBundleExecutable
顯示的名稱:Executable file
說明:
執行檔的名稱。

14.
鍵名:UIAppFonts
顯示的名稱:Fonts provide by application
說明:
為一個陣列形態的設定值。用來指定應用程式所使用的外部字型。你可以在應用程式內使用自己的字型檔,只要將字型檔案加入到專案內,在設定值指定字型檔名稱就可以在程式碼裡面使用到這些字型了。如果字形是使用免費的,把它加在這裡是最好的選擇了!

15.
鍵名:CFBundleGetInfoString
顯示的名稱:Get Info string
說明:
用於 Mac 的 Finder 上的應用程式的描述。

16.
鍵名:UIPrerenderedIcon
顯示的名稱:Icon already includes gloss effects
說明:
指定應用程式的圖示是否加上光暈效果,如果不希望加上光暈效果,那麼勾選此選項。

17.
鍵名:CFBundleIconFile
顯示的名稱:Icon file
說明:
用來設定應用程式的圖示檔,如果沒有指定的話,則使用預設值 Default.png,依照 Apple 的規定,這個圖是必須是 57x57 的圖形檔。

18.
鍵名:CFBundleIconFiles
顯示的名稱:Icon files
說明:
由於 iPhone 與 iPad 的開發工具以及 SDK 都是相同的,因此同一個應用程式也可以同時在兩個設備上使用,只不過兩著的圖是不太一樣。這個鍵值是一個陣列類型的設定值,用來指定 iPhone 與 iPad 的應用程式圖示,你只要給兩個圖示檔名,其中 iPhone 的圖示為 57x57 pixel,iPad 則為 72x72 pixel,系統會自動依照圖示大小判斷該圖示是使用在哪種設備上。

19.
鍵名:CFBundleInfoDictionaryVersion
顯示的名稱:Info dictionary version
說明:
info.plist格式的版本。一般來說,我們不會變動這個數值。

20.
鍵名:UIInterfaceOrientation
顯示的名稱:Initial interface orientateon
說明:
指定應用程式初始時的方向。

21.
鍵名:UILaunchImageFile
顯示的名稱:Launch image
說明:
用以指定應用程式啓動時的圖檔。

22.
鍵名:CFBundleDevelopmentRegion
顯示的名稱:Localization native development region
說明:
應用程式原始的語系版本。

23.
鍵名:CFBundleLocalizations
顯示的名稱:Localizations
說明:
用以指定應用程式所支援的語系。

24.
鍵名:CFBundleAllowedMimxedLocalizations
顯示的名稱:Localized resources can be mixed
說明:
是否允許應用程式可以取得框架庫內的語系檔。

25.
鍵名:NSMainNibFile
顯示的名稱:Main nib file base name
說明:
主要的Nib檔案名稱,預設值為MainWindow。

26.
鍵名:UIViewEdgeAntialiasing
顯示的名稱:Renders with edge antialisasing
說明:
設定core animation的圖層是否開啓抗鋸齒功能。

27.
鍵名:UIViewGroupOpacity
顯示的名稱:Renders with group opacity
說明:
設定core animation的圖層使否繼承上一層透明度。

28.
鍵名:UIBackgroundModes
顯示的名稱:Required background modes
說明:
設定當應用程式進入背景執行後,哪些動作要繼續在背景執行。這個鍵值是一個陣列類型的設定,可設定動作包括:audio,location,voip。

29.
鍵名:UIRequiredDeviceCapabilities
顯示的名稱:Required device capabilities
說明:
設定應用程式需要使用到的硬體,如此可以確定應用程式在該設備上執行時不會發生錯誤。

30.
鍵名:UIStatusBarHidden
顯示的名稱:Status bar is initially hidden
說明:
設定狀態列是否一開始隱藏。

31.
鍵名:UIStatusBarStyle
顯示的名稱:Status bar style
說明:
設定狀態列的顯示類型。

32.
鍵名:UISupportedExternalAccessoryProtocols
顯示的名稱:Supported external accessory protocols
說明:
指定應用程式與外界硬體配件間支援的通訊協定,這個鍵值是一個陣列設定,可以指定多個通訊協定。

33.
鍵名:UISupportedInterfaceOrientations
顯示的名稱:Supported interface orientateons
說明:
設定應用程式所支援的顯示模式(肖像模式或風景模式),這個鍵值是一個陣列,可以支援多個不同的顯示模式。

34.
鍵名:UIUpgradeOtherBundleIdentifier
顯示的名稱:Supported interface orientations
說明:
設定應用程式所支援的顯示模式(肖像或是風景模式),這個鍵值可以支援多個不同的顯示模式。

貼了之後才發現,33 和 34 是甚麼鬼東西, 看起來不是一樣的東西嗎?請出 Google 大神問了一下,發現一堆人也是直接就貼來參考用,根本就沒仔細看的感覺!
根據 Apple Developer 的討論串,某位 Apple 員工說「它不會照你想像的運作」、「請不要使用它了!」有興趣的可以進 Apple Developer 看看這篇討論!

所以...其實只有 33 個好用的設定列在這裡啦!

Apple Reference:
iOS Keys

2015年5月12日 星期二

[筆記] 自動遞增 iOS App 版本號碼

圖檔來源:TechOrange
由於公司 iOS 程式已經開發進入尾聲,所以需要開始定義版本號碼的演進,上網看了一下大家對於 iOS 的版本號討論和 Apple 的文件,目前 iOS App 關於版號有兩個欄位可以更改:
1. CFBundleShortVersionString:
此版號預設為 1.0,依據 Apple 文件,可以分成三個欄位,Major version、reversion 和 maintenance release。
依據這個規則,在下面的 script 中,它用來協助我更新 maintenance release,每次 build 都會自動加一。如果有其它需求的話,因為我已經把三個欄位分開了,相信應該不難再修改成其它需求才是!

2. CFBundleVersion:
依據 Apple 文件,此欄位應該只允許數字和小數點組成的字串,第一位數字必須大於 0,如果以 0 作為開頭的話,該 0 會被系統忽略!
但是實務上我發現其實限制好像沒那麼嚴苛,所以我目前先用 Build 的日期時間當做它的值,並且把它以 16 進位儲存。

網路上也看到文章說 CFBundleShortVersionString 主要是給使用者看的,所以我覺得這只要讓使用者知道有在改進就好了,而 CFBundleVersion 比較傾向於給內部使用,讓 QA 和 RD 主要用它來溝通,而不依據 CFBundleShortVersionString 來聯繫,我覺得也還不錯!

所以下面就是我目前最後用的 script,也分享給大家囉!

#!/bin/bash

bundleShortVersion=$(/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" $INFOPLIST_FILE)
bundleVersion=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" $INFOPLIST_FILE)
major_id=$(echo $bundleShortVersion | grep -o '^[0-9]')
revision_id=$(echo $bundleShortVersion | grep -o '[0-9]\+.[0-9]' | grep -o '[0-9]\+$')
maintenance_id=$(echo $bundleShortVersion | grep -o '[0-9]\+$')
maintenance_id=`expr $maintenance_id + 1`
bundleShortVersion=$major_id"."$revision_id"."$maintenance_id
bundleVersion=$(date +"%y%m%d%H%M")
bundleVersion=$(printf "%X" $bundleVersion)
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $bundleVersion" "$INFOPLIST_FILE"
/usr/libexec/PlistBuddy -c "Set :CFBundleShortVersionString $bundleShortVersion" "$INFOPLIST_FILE"

Reference:
Information Property List Key Reference