Just My Life & My Work

Archive for the ‘教學’ Category

[Xcode] 自動更改建置號碼

開發App迭代十分快速,時常要更改版本號碼Version Number建置號碼Build Number,如此容易區隔每個版本,測試員回報問題也能輕易對照。

Version Number制定規則比較直覺,一直都是從1.0.0開始,feature有大更新就變2.0.0,feature只有小變動就改2.1.0,bug偶爾修掉就微調為2.1.1。

Build Number可以怎麼做呢?我習慣將它設定為日期+時間,比如今天日期:160324・時間0111,合起來就是1603240111,當收集到Crash報告bug清單,對照Git版本控制,就能知道當時的問題所在!

過去我們都是手動去更改BN,現在有更聰明的作法,就是在Xcode的Build Phases加入Run Script,接著按編譯(Command + B),就能在General的Build看到自動更換為當時的日期時間。

加入這幾行Run Script就好囉⋯⋯

timestamp() {

    #date +" at %H:%M:%S on %m/%d/%Y"

    date +“%y%m%d%H%M"

}

buildNumber=$(/usr/libexec/PlistBuddy -c “Print CFBundleVersion" “${PROJECT_DIR}/${INFOPLIST_FILE}")

buildNumber=$(timestamp)

/usr/libexec/PlistBuddy -c “Set :CFBundleVersion $buildNumber" “${PROJECT_DIR}/${INFOPLIST_FILE}"

看不太懂沒關係,反正這只設定那麼一次XD~

Xcode Build Number

設定Run Script

Xcode Build Number2

編譯後Build自動變更

參考:Xcode 自動填寫Version Build 腳本

[iOS] 客製化導覽動畫 (Customize Navigation Animation)

我們總以為只能使用內建的導覽動畫,這個功能也就是要進入下一頁面時會出現的行為,從右往左推進來是iOS一直以來預設動畫,而回上一頁則是從左往右推回去。

Navigation Animation.gif

現在我們想要呈現不一樣的效果,此時就要客製化導覽動畫 (Customize Navigation Animation)

(繼續閱讀…)

[iOS] 上傳影像到伺服器 (Upload Image to Server)

下載影像到App中已不是問題,那麼上傳影像到伺服器呢?原本想要使用世界最知名的第三方套件AFNetworking,可是我怎麼嘗試都有錯誤,以為伺服器沒有做好,然而Android工程師我們新的PM測試都可以成功,那麼一定是我這邊出了問題。

marry me cake.jpg

最後打算用原生的方式實作,寫法搞了一會兒,終於回傳成功!

(繼續閱讀…)

[iOS] 正規表達式 (Regular Expression)

我們時常有個需求,就是去判斷數字與字母的規則,比如身份證字號是一個大寫字母+九個數字。判斷方法有很多種,這裡有個非常方便的技巧,就是使用正規表達式 (Regular Expression)

我可以這麼寫⋯⋯

/**
 Theme: Regular Expression
 IDE: Xcode 7
 Language: Objective C
 Date: 105/03/05
 Author: HappyMan
 Blog: https://cg2010studio.wordpress.com/
 */
    NSString *errorMessage;
    // 確認身分證字號格式
    NSString *phoneNumber = @“L123456789";
    NSString *phoneRegex = @"[A-Z][0-9]{9}";
    NSPredicate *test = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", phoneRegex];
    BOOL matches = [test evaluateWithObject:phoneNumber];
    if (!matches) {
        errorMessage = @"身份證字號第一碼英文+後9碼為數字";
    }

看了以上的程式片段,就知道如何使用了吧!

那其實正規表達式還有很多種用法,就拿StackOverFlow高人指點的例子⋯⋯

How to validate a phone number (NSString *) in objective-c? Rules:

  • minimum 7 digits
  • maximum 10 digits
  • the first digit must be 2, 3, 5, 6, 8 or 9

實作解答如下:

NSString *phoneNumber = ...;
NSString *phoneRegex = @"[235689][0-9]{6}([0-9]{3})?";
NSPredicate *test = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", phoneRegex];
BOOL matches = [test evaluateWithObject:phoneNumber];

參考:Objective-c regex to check phone number

[iOS] iBeacon 測試

睽違一年半之久,總算要來開發iBeacon,看來越來越多應用持續出現中!因為最近要出國,所以想到可以將iBeacon放進行李廂,進入範圍或離開範圍時,手機會跳出提示,如此就不用眼睛一直盯著行李箱:)~

一年半前參加「Retail Battle Hackathon 創新零售駭客松活動」,KKLabs給參賽者每人一顆Spot Beacon當作禮物,直到最近我才真正拿出來用XD~

可以先參考之前的文章:初探 IBEACON 技術

(繼續閱讀…)

[iOS] Intercom 客戶溝通平台

我們想要觀察或追蹤使用者,來提供符合其需求的服務,無論使用者登入與否,我們皆能掌握其動態。甚至使用者想要聯繫客服,也變得相當方便簡單。

Intercom Customer Communication Platform.png

可以想像這樣的情境,當使用者對某頁面感到疑惑,我們在後台看到他停留許久,此時就能推送關心提示,讓他能順利完成需求!

(繼續閱讀…)

[iOS] 返回按鈕包含文字與圖片

Navigation Controller原本就有返回按鈕,然而我們想要客製化為包含文字與圖片,可以怎麼做呢?預設是返回圖案和前一視圖的標題,如今我們想換成別的圖案和標題。

backIcon

(繼續閱讀…)

[iOS] 漸層色彩影像 (Gradient Color Image)

近年來App流行漸層色彩影像 (Gradient Color Image),我們不想要美術師出圖,因為有很多螢幕尺寸要考量,所以想由程式碼來個別生成。

漸層色彩影像 Gradient Color Image

結果圖上有三個Image View,上圖為單純藍色,左下為水平漸層黑色alpha值由1到0,右下為垂直漸層黑色alpha值由1到0。

我將所需要的程式碼檔案放在GitHub GistGradient Color Image

[iOS][Swift] 在Swift專案使用Objective C類別

該是好好學習Swift 2.0的時候囉~上週Apple才宣布Swift開源化!趁著棘手的專案告一段落,我要利用時間學習iOS新的開發語言,讓公司的戰力可以延續下去。

首先我們會遇到,以Swift為主的專案想使用Objective C的類別,因為我們可能沒啥時間去重刻,於是想要Objective C直接轉生為Swift來使用。

Swift using Objective C class

在此我們建立一個Swift專案名為HappyTest8,接著新增Cocoa Touch Class語言為Objective C,並名為HTMainViewController。

(繼續閱讀…)

[iOS] 刪除 User Defaults

很多時候我們會把資料儲存在User Defaults,也就是本機端,只要App不被刪掉,那麼每次重新開啟App,就能再從User Defaults取得先前所儲存的資料。

有某時候我們需要把User Defaults給清空,比如要給其它帳號使用,此時登出A就要將A所儲存的User Defaults給清除乾淨,而登入B後又是全新沒有受污染的User Defaults。

該怎麼做呢?以下的code就能刪除所有存在User Defaults中的key,不過卻不會刪掉系統預設的key呢!

/**
 Theme: Delete User Defaults
 IDE: Xcode 7
 Language: Objective C
 Date: 104/12/07
 Author: HappyMan
 Blog: https://cg2010studio.wordpress.com/
 */
#pragma mark - 刪除 UserDefaults
    NSUserDefaults *defs = [NSUserDefaults standardUserDefaults];
    NSDictionary *dict = [defs dictionaryRepresentation];
    for (id key in dict) {
        [defs removeObjectForKey:key];
    }
    [defs synchronize];

清空前的User Defaults之key群:

(
GGUserDefaultsKeyLoginAccount,
AppleKeyboardsExpanded,
GGUserDefaultsKeyLoginPassword,
PCSavePendingUserDefaults,
GGUserDefaultsKeyhasFirstShowMenu,
GGUserDefaultsKeyIsLogin,
INNextHearbeatDate,
com.apple.content-rating.ExplicitBooksAllowed,
GGUserDefaultsKeyLoginPasswordAlternative,
AppleKeyboards,
HasUserRegisteredFonts,
PKEnableStockholmSettings,
GGUserDefaultsKeyRememberPassword,
AppleLanguagesDidMigrate,
com.apple.content-rating.TVShowRating,
com.apple.content-rating.ExplicitMusicPodcastsAllowed,
NSLanguages,
com.apple.content-rating.MovieRating,
GGUserDefaultsKeyQBId,
GGUserDefaultsKeyLoginAccountAlternative,
PreferredLanguages,
AddingEmojiKeybordHandled,
MSVLoggingMasterSwitchEnabledKey,
AppleLocale,
AppleLanguages,
NSInterfaceStyle,
com.apple.content-rating.AppRating,
AppleITunesStoreItemKinds
)

清空後的User Defaults之key群:

(
PKEnableStockholmSettings,
INNextHearbeatDate,
MSVLoggingMasterSwitchEnabledKey,
AppleITunesStoreItemKinds,
AddingEmojiKeybordHandled,
com.apple.content-rating.ExplicitBooksAllowed,
com.apple.content-rating.MovieRating,
HasUserRegisteredFonts,
AppleLanguagesDidMigrate,
com.apple.content-rating.AppRating,
AppleLanguages,
NSLanguages,
NSInterfaceStyle,
com.apple.content-rating.ExplicitMusicPodcastsAllowed,
AppleKeyboardsExpanded,
AppleKeyboards,
PreferredLanguages,
AppleLocale,
com.apple.content-rating.TVShowRating
)

key前綴為PC或GG,就是我在此專案中儲存資料用的key喔~

參考:Delete all keys from a NSUserDefaults dictionary iPhone

標籤雲