Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
簡單學會 iOS 開發
Search
Steven Shen
August 16, 2013
Technology
3
360
簡單學會 iOS 開發
這是我離開前公司前做的交接介紹,對象是三個資深的 Android 工程師,所以盡可能用對方可以理解的方式介紹 iOS 開發。
Steven Shen
August 16, 2013
Tweet
Share
More Decks by Steven Shen
See All by Steven Shen
Travis and Fastlane
syshen
3
940
From Taiwan to Silicon Valley
syshen
0
66
Xing's shareing in Evernote Taiwan Meetup
syshen
0
38
A lightning talk about UICollectionView
syshen
1
80
Other Decks in Technology
See All in Technology
失敗しないOpenJDKの非互換調査
tabatad
0
210
Amazon FSx for NetApp ONTAPを利用するにあたっての要件整理と設計のポイント
non97
1
120
Mobbing Practices
kawaguti
PRO
3
320
次は君だ。~Japan AWS Jr. Champions 受賞までの奇跡~
fukuchiiinu
0
210
Why and Why not of enabling swap in Kubernetes
hwchiu
0
450
生成AI、LLMの いまさら聞けないキホンのキ!/ Generative AI and LLM 101
gakumura
1
240
[PyCon Korea 2024] Lightning Talk: PyPI패키지를 의심하세요
studioego
PRO
0
120
AWS Step Functionsのタスク入出力に秩序を与えよう
y_kotani
0
180
TinyMLの技術動向
kyotomon
2
240
入門『状態』#kaigionrails / "state" for beginners with Rails
shinkufencer
2
780
Figma Dev Modeで進化するデザインとエンジニアリングの協働 / figma-with-engineering
cyberagentdevelopers
PRO
1
270
LLMアプリをRagasで評価して、Langfuseで可視化しよう!
minorun365
PRO
2
210
Featured
See All Featured
How STYLIGHT went responsive
nonsquared
95
5.1k
Designing on Purpose - Digital PM Summit 2013
jponch
114
6.9k
Put a Button on it: Removing Barriers to Going Fast.
kastner
59
3.5k
A better future with KSS
kneath
237
17k
4 Signs Your Business is Dying
shpigford
180
21k
Agile that works and the tools we love
rasmusluckow
327
21k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
27
4.1k
What's in a price? How to price your products and services
michaelherold
243
11k
Designing the Hi-DPI Web
ddemaree
280
34k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
26
1.4k
Building Adaptive Systems
keathley
38
2.2k
The Cost Of JavaScript in 2023
addyosmani
45
6k
Transcript
簡單學會 iOS 開發 Tuesday, August 13, 13
前⾔言 • 這是我在離開前公司前辦的 TOI 所作的投影 ⽚片 • 對象是三個專精於 Android 開發的⼯工程師
• 所講的內容涵蓋從⼀一開始的⼊入⾨門,編寫範例 程式,然後到如何上架等等。⽤用的名詞是希 望原先熟悉 Java/C++ 的⼯工程師能夠理解為 主 • 內容基於 iOS6 以上 Tuesday, August 13, 13
上架 開發 註冊 •developer.apple.com •apple ID 開發者帳號 •XCode •Bundle ID
•Provision Profile •XCode •Testflight •⽂文件 •Stackoverflow •XCode •developer.apple.com •iTunes Connect (ITC) Tuesday, August 13, 13
ADN: Apple Developer Network • developer.apple.com • ⽂文件、軟體下載、論壇、問題回報 • ⾦金鑰管理、Certification、Bundle
ID、管 理裝置、Provisioning Tuesday, August 13, 13
XCode • 程式編譯執⾏行、專案管理、版本控管(git) • 裝置管理 • 模擬裝置 (Simulator) • Provision,app
散佈 Tuesday, August 13, 13
什麼是 Objective-C • ⼀一個物件導向式的程式語⾔言 • 是⼀一個有 20 年歷史的程式語⾔言,⼤大概跟 C++ 同⼀一年代
• ⻑⾧長得有點像 C ,但不是 C ,但相容 C+ + / C • 雖然舊,但每年 Apple 仍不斷的改善它 • 有 GC,但是 iOS 沒有實作 GC,⽽而是改 ⽤用效能更好的 ARC Tuesday, August 13, 13
什麼是 Objective-C • 物件導向,幾乎都是由物件構成,也經 常套⽤用常⾒見的⼀一些物件導向的設計模式 • 有封裝、繼承、多型、成員函式、成員 變數、成員覆寫等等物件導向特性 • 但是沒有多重繼承,也沒有
private 、 protected 成員,也沒有 java 中的 interface (virtual class)等東⻄西,也沒有 package 跟 namespace Tuesday, August 13, 13
• .h 跟 .m 檔 • .h 檔宣告物件類別 • .m
檔實作物件 • .xib Interface Builder 檔案 • .storyboard storyboard 檔案 Tuesday, August 13, 13
宣告 類別名稱 繼承類別 成員函式宣告 成員變數宣告 描述⼦子 型別 變數名稱 Tuesday, August
13, 13
實作類別 實作的類別 函式實作 + 代表類別函式 - 代表成員函式 Tuesday, August 13,
13
類別名稱 呼叫類別函式 呼叫成員函式 物件 呼叫函式 (send message) 參數1 參數2 Tuesday,
August 13, 13
幾個關鍵字 • nil : 代表空物件,所有變數在宣告還沒指 定物件之前都是 nil • NSNull 是物件
• YES / NO / True / False • self : 在物件內代表⾃自⼰己。 例如: self.age = 20; 或者 [self callMyFather]; • id : 代表物件型態,通常⽤用來作多型 Tuesday, August 13, 13
還有⼀一些常⾒見的物件 表⽰示 • @”Hello World”; 代表⼀一個 NSString 物件。但 是,“Hello World”
這是⼀一個 c string • @[@”Hello”, @”World”]; 代表⼀一個 NSArray 陣 列物件。 • @{@”key”: @(123)} 代表⼀一個 NSDictionary 雜 湊表物件 • @(23) @(YES), @(NO) 或者 @(32.23) 代表⼀一個 NSNumber 物件 Tuesday, August 13, 13
• NSString *str1 =@”Hello”; • NSString *str2 = @”World”; •
if ([str1 isEqaulWithString:str2]) {} Tuesday, August 13, 13
• NSDictionary *dict = @{@”key”: @”value”}; • NSLog(@”Value is %@”,
dict[@”key”]); • dict.keys; dict.values; • NSMutableDictionary *dict = [NSMutableDictionary dictWithDictionary:@{@”key”: @”value”}]; • dict[@”key2”] = @”Value2”; Tuesday, August 13, 13
物件名稱 傳統表⽰示法 新的表⽰示法 NSArray NSArray * array = [NSArray arrayWithObjects:
@”hello”, @”world”, nil]; [array objectAtIndex:12]; NSArray * array = @[@”hello”, @”world”]; array[12]; NSDictionary NSDictionary *dict = [NSDictionary dictionaryWithObjects: @”value1”, @”value2”, nil forKeys: @”key1”, @”key2”, nil]; [dict objectForKey:@”key2”]; NSDictionary *dict = @{@”key1”: @”value1”, @”key2”: @”value2”}; dict[@”key2”]; NSNumber NSNumber *intNum = [NSNumber numberWithInt:12]; NSNumber *boolNum = [NSNumber numberWithBool: NO]; NSNumber *intNum = @(12); NSNumber *boolNum = @(YES); Tuesday, August 13, 13
ARC • Auto Reference Counting • Obj-C 記憶體管理是採⽤用 Reference Count
原則,當 Reference Count == 0 時,物件就會被釋放 • Before ARC: [obj retain]; [obj release]; • After ARC: [obj retain]; [obj release] • Compile time 技術,Runtime 不卡卡 Tuesday, August 13, 13
ARC • Before ARC: • @property (retain) UITableView *tableView; •
After ARC: • @property (strong) UITableView *tableView • @property (weak) UITableView *tableView; • @property (assign) UIInteger age; Tuesday, August 13, 13
Auto Synthesis • XCode 4.4 之後,不再需要為你的 property 宣告 @synthesize •
所有 property 會⾃自動幫你宣告 setter 跟 getter • @property (strong) UITableView *tbView; • -(UITableView*)tbView; // getter • -(void)setTbView:(UITableView *tbView); // setter • _tbView; // 物件本⾝身 Tuesday, August 13, 13
Block • iOS4 之後新增加的語法 • Block 是⼀一段程式碼 (實際上是⼀一個物件) • 類似其他語⾔言中
closure 的概念 • 所有在 block 裡⽤用到的物件會⾃自動被 retain • Block 在 stack 中被建⽴立,運作於 heap 裡 • 常⽤用來作 Callback 函式 Tuesday, August 13, 13
Block 宣告 Block 實作 呼叫 Block Callback 的⽤用法 Tuesday, August
13, 13
Block 也可以是 property 記得⽤用 copy 描述⼦子 http://blog.refractalize.org/post/10476042560/copy-vs-retain-for- objective-c-blocks 指定 onOpenHandler
的 內容 Tuesday, August 13, 13
Multi-threads • 很少直接 fork thread • ⽐比較常⽤用 Queue 的概念管理 thread
• NSFoundation: NSOperationQueue • GCD (Grand Central Dispatch) • Concurrent / Serial • Main thread 負責所有 UI 的 update Tuesday, August 13, 13
NSOperationQueue • 可以設定 Queue size (Concurrent / Serial) • 可以放⼊入⼀一堆
NSOperation 物件,依序 執⾏行 • 可以 Cancel • 可以知道⺫⽬目前還有多少 Operation 尚未 執⾏行 Tuesday, August 13, 13
NSBlockOperation • ⼀一個簡單的 NSOperation 物件 • 讓你可以在 block 裡編寫你想要執⾏行的程 式碼
Tuesday, August 13, 13
GCD • Grand Central Dispatch (名字來源於紐約中央 ⾞車站) • 系統⽐比較底層的呼叫,讓你可以善⽤用多核 CPU
的好處 • 缺點是,⼀一旦 dispatch 出去,無法取消,你也 無法知道⺫⽬目前有多少 task 尚未執⾏行 • dispatch_async / dispatch_sync • dispatch_get_main_queue() Tuesday, August 13, 13
GCD 最常看的⽤用法 • UI 的變動其實需要在 Main Thread 上執⾏行 • 如果在
background thread ,想要變動 UI 的 話 •經常會⽤用 dispatch_async(dispatch_get_main_queue() ....) Tuesday, August 13, 13
什麼是 Cocoa Framework • Apple 封裝的 SDK Framework Library •
提供各式各樣的 API ,包含 UI、存取裝 置、multithread、資料庫、網路等等 • 除了 Cocoa 外,還有其他許許多多的 Framework • 開發 iOS ⼤大部分都是與 Cocoa 奮戰,但 是很多時候也會⽤用到 OpenSource 或者 3rdParty 的 Library Tuesday, August 13, 13
開發時常⽤用的套件管 理 • cocoapods : 第三⽅方的套件管理程式,⽤用來讓開 發者簡易的引⼊入第三⽅方套件 • 安裝: http://cocoapods.org/
• 使⽤用: • 在⺫⽬目錄下建⽴立跟編輯 Podfile • 執⾏行 pod install 命令安裝想要的套件 • 以後 xcode 都必須開啟 FavClient- iOS.xcworkspace 來修改程式 Tuesday, August 13, 13
IDE 說明 Tuesday, August 13, 13
檔案⺫⽬目 錄結構 Editor Debug Console Symbols Tabs (Command + t)
Breakpoints Editor 模式切換 中斷程式,單步中斷 Tuesday, August 13, 13
Source Control Tuesday, August 13, 13
Tuesday, August 13, 13
Instrument - Debug and Performance Tuning Tuesday, August 13, 13
可疑的 peak ! 兇⼿手 Tuesday, August 13, 13
iOS UI 設計理念 Tuesday, August 13, 13
• MVC: Model / View / Controller • View 絕⼤大多數都是繼承於
UIView • Controller 是控制 UI 的核⼼心,絕⼤大多數 都是繼承於 UIViewController Tuesday, August 13, 13
iOS Cocoa Framwork 內建的 Views Tuesday, August 13, 13
常⽤用的 Controllers • UIViewController • UINavigationController • UITableViewController • UITapBarController
Tuesday, August 13, 13
製作⾃自⼰己的 ViewController • New Cocoa-Touch file • Subclass UIViewController •
Create XIB file Tuesday, August 13, 13
ViewController ⽣生命週 期 • loadView • viewDidLoad • viewWillAppear •
viewDidAppear • viewWillDisappear • viewDidDisappear • dealloc Tuesday, August 13, 13
ViewController ⽣生命週 期 • 通常覆寫 viewDidLoad ,並在這 function 裡初始化你要⽤用到的物件跟 view
• 如果有動畫要顯⽰示,在 viewDidAppear 中作 Tuesday, August 13, 13
• 如何從⼀一個 ViewController 彈出另外⼀一個 ViewController • -(void)presentViewController:(UIViewController*)viewController animated: (BOOL)flag completion:(void
(^)(void))completion; • transition styles: Cover vertical, Flipping, Cross Dissolve, Partial Curl • Dismiss ⺫⽬目前的 ViewController: • -(void)dismissViewControllerAnimated:(BOOL)flag completion:(void (^) (void))completion Tuesday, August 13, 13
Navigation Controller Navigation Bar View Controller 1 View Controller 2
View Controller 3 Tuesday, August 13, 13
Navigation Controller • 設定 rootViewController (initWithRootViewController) • pushViewController:animated: • popViewControllerAnimated:
• popToRootViewControllerAnimated: Tuesday, August 13, 13
Controller 與 View • 通常當你在新增新的 Controller 時, Xcode 會問你要不要順便產⽣生⼀一個 Interface
• 意思就是說你可以透過 Interface Builder 來為你新的 Controller 設計 UI • Controller 會在 loadView 時,⾃自動載⼊入 Interface Builder 中所設計的 UI Tuesday, August 13, 13
Interface Builder • Apple 在 Xcode 裡提供的⼯工具,讓你所 ⾒見及所得去編輯設計 UI •
儲存下來的檔案實際上是⼀一個 XML 描述 檔,附檔名為 xib • 所有 iOS 原⽣生的 UI Control 都可以從 Interface builder 中拖拉,決定屬性,跟 ⼤大⼩小顏⾊色等等 Tuesday, August 13, 13
Interface Builder • IB 幫助你設計 UI ,但是當你要針對 UI 元件去控制時,你必須告訴 Xcode
,在 UI 中這些元件是如何對應到你的程式碼 • 這時候會⽤用到 IBOutlet 跟 IBAction 兩個 預設關鍵字 • ⽤用 IBOutlet 去宣告你要使⽤用的 UI 物件 • ⽤用 IBAction 去宣告你希望使⽤用者按下按 鈕所要觸發的函式 Tuesday, August 13, 13
IBOutlet IBAction Tuesday, August 13, 13
連連看 • 在 Interface Builder 的 connection inspector 中, 會看到
Reference Outlet 是⼀一個空⼼心的圓圈 • 點圓圈,按住左鍵,會拉出⼀一條線拉到 File’s Owner 上,這時候會出現⼀一個選單出現你可以 連結的 IBOutlet,選擇你要的完成連線 • 如果是 Button ,通常我們要 hook “Touch Up Inside” event,這代表使⽤用者按下按鈕。你會在 Connection inspector 的 Touch Up inside 旁看到 ⼀一個空⼼心圓,⼀一樣把它拉到 File’s Owner,這時 候會出現你有宣告的 IBAction ,完成連線 Tuesday, August 13, 13
• 連完之後,Xcode 就知道 Interface Builder 裡,UI 元件跟你程式碼間的關係 了 連線前 連線後
Tuesday, August 13, 13
• storyboard 是在 iOS5 引⼊入的新功能 • 主要的作⽤用是可以讓你在同⼀一個檔案中 編輯多個 ViewController 的介⾯面,並且描
述他們之間的關係 • storyboard 有助於開發者眾觀整個 UI 的 流程 • 附檔名就是 storyboard storyboard Tuesday, August 13, 13
storyboard • storyboard 操作⽅方式跟 Interface Builder ⼀一樣 • 當然,多了⼀一些東⻄西 ...
Tuesday, August 13, 13
Table View • 相當常⾒見的元件 • View 與 Model 設計的標 準範例
• delegate / datasource Tuesday, August 13, 13
⽤用程式加⼊入新的 View - (void) viewDidLoad { [super viewDidLoad]; CGRect newFrame
= CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height); UITableView *tableView = [[UITableView alloc] initWithFrame:newFrame style:UITableViewStylePlain]; tableView.delegate = self; tableView.dataSource = self; [self.view addSubview: tableView]; } Tuesday, August 13, 13
⼀一個簡單的範例 Tuesday, August 13, 13
範例內容 • ⼀一個簡單的 app • 共有三個 View Controllers • 彼此之間⽤用
NavigationController 串起來 • TableView Tuesday, August 13, 13
Localization Tuesday, August 13, 13
字串 • NSLocalizedString(@”Message to show”, @”Comment”); • Build 過⼀一次後,字串會⾃自動加⼊入到 Localizable.strings
Tuesday, August 13, 13
字串 • NSLocalizedString(@”Message to show”, @”Comment”); • Build 過⼀一次後,字串會⾃自動加⼊入到 Localizable.strings
Tuesday, August 13, 13
字串 • NSLocalizedString(@”Message to show”, @”Comment”); • Build 過⼀一次後,字串會⾃自動加⼊入到 Localizable.strings
Tuesday, August 13, 13
字串 • NSLocalizedString(@”Message to show”, @”Comment”); • Build 過⼀一次後,字串會⾃自動加⼊入到 Localizable.strings
翻譯⼈人員要翻 的字串 Tuesday, August 13, 13
xib 怎麼辦? • 三個⽅方法 • 把元件拉出來,在程式裡替換要顯⽰示 的字串 • xib 可以每個語⾔言⼀一份,各⾃自翻譯(缺點
是 maintain 不容易) • ⽤用 3rd party module,例如:https:// github.com/angelolloqui/AGi18n Tuesday, August 13, 13
更改 App Name 跟 Icon Tuesday, August 13, 13
App Name • 變更 InfoPlist.name 檔案,有分不同語 ⾔言,所以不同語⾔言顯⽰示的 app name 可以
不⼀一樣 Tuesday, August 13, 13
App Icon • 要上架的話,請準備 57x57(⾮非 retina) 跟 114x114(retina),1024x1024 尺⼨寸的 icon
• 先把圖檔加⼊入到 project 裡 (圖檔要 copy 進 project 的⺫⽬目錄下) • 然後打開 project 設定 > Summary • 把 icon (⾮非 retina 跟 retina) 拉進 App Icons Tuesday, August 13, 13
TestFlight Tuesday, August 13, 13
增加 Build Number • 打開 terminal • 在 project 的⺫⽬目錄下,例如
iOSFavUploader/ • 執⾏行 agvtool bump 命令 • git add . ; git commit -m bump Tuesday, August 13, 13
Testflight • Apple 對於 app 的散佈態度⽐比較嚴謹 • 單⼀一 app 會限制最多
100 台機器可以安裝 • 但是對於⼀一般⼈人(包含測試者),安裝開發 者開發出來的 beta build ⽐比較不容易 • 所以 Testflight 提供⼀一個⽐比較簡易的環境可 以讓你散佈你的 beta build • 不過在 XCode 5.0,這件事情將有所改變 Tuesday, August 13, 13
1. 登⼊入 ADN (developer.apple.com) 2. 註冊 beta 使⽤用者裝置的 UDID (UDID
取得⽅方 法請看 (http://howto.cnet.com/8301-11310_39-57506702-285/how-to-find-your-ios-devices-udid/ ) 3. 在 Device 新增加⼀一筆 UDID 4. 編輯你的 Provision Profile ,將該裝置涵蓋到 你的 Provisioning Profile 當中 5. 下載 Provisioning Profile 到你的開發電腦上 Tuesday, August 13, 13
1. XCode: Product > Archive 2. XCode 會 clean build
你的 app 3. Organizer 會彈出來,點 Distribute 按鈕 4. 選擇 Save for Enterprise or Ad-Hoc Deployment 5. 選擇⼀一個正確的 Provisioning Profile 6. 你會得到⼀一個 ipa 檔 Archive 你的 App Binary Tuesday, August 13, 13
上傳 Testflight 1. 右上⾓角 + 按鈕,選 Upload Build 2. 上傳
ipa 檔案,填寫 Change logs 3. 選擇要散佈的對象 (如果對⽅方有 testflight 帳號就會直接顯⽰示在上⾯面) 4. 對⽅方會收到信,或者直接上 testflight 網 站就會看到他可以安裝的 build,按 install 即可完成安裝 Tuesday, August 13, 13
App Store 上架⼀一⼆二三 Tuesday, August 13, 13
簽發你的 App Binary 1) 登⼊入 ADN (developer.apple.com) 2) 簽發 Production
Certificate 3) 簽發 App Store Distribution Provisioning Profile 4) 下載 Certificate 跟 Profile Tuesday, August 13, 13
iTunes Connect • iTunes Connect 跟 iTunes 無關 • 專⾨門⽤用來管理
app 的 submission 跟 marketing 資訊 • https://itunesconnect.apple.com/ WebObjects/iTunesConnect.woa • 有個 iTunes Connect 的 app 可以讓你透 過⼿手機管理 Tuesday, August 13, 13
先在 iTC 註冊你的 App Tuesday, August 13, 13
1 2 Tuesday, August 13, 13
3 Tuesday, August 13, 13
準備好你的 App Description, keywords, icons, screenshots(⻑⾧長貓、短貓都要), 測試帳號 (App Reviewer 需要知道怎麼測試你的
app) 基本資料 分級 Tuesday, August 13, 13
Tuesday, August 13, 13
1) XCode: Product > Archive 2) XCode 會 clean build
你的 app 3) Organizer 會彈出來,點 Distribute 按鈕 4) 選擇 Submit to App Store 5) 選擇⼀一個正確的 Provisioning Profile 6) 驗證 app binary 是否合乎規定,如果不合動作 需重來 7) 會直接上傳到 iTunes Connect Archive 你的 App Binary Tuesday, August 13, 13
Tuesday, August 13, 13
怎麼下架?! • 選擇你要下架的 app • 點選 Rights and Pricing •
Deselect 所有國家的 app store • Save Tuesday, August 13, 13
追蹤下載情況 • 點 Sales and Trends • 基本上很陽春, 提供基本功能⽽而已 •
其他 tracking 的 3rd-party ⼯工具 (都可以⽤用 cocoapods 安裝): • Google Analytics • Flurry (http://www.flurry.com) Tuesday, August 13, 13
Crash Report • app 送出去 crash 了怎麼辦? • 可以透過 Crashlytics
的服務來收 crash report ,進⽽而改進程式穩定度 • Crashlytics 現在隸屬於 twitter ,是⼀一個 漂亮好⽤用的 crash report ⼯工具 Tuesday, August 13, 13
其他資源 Tuesday, August 13, 13
• Stanford CS193p 課程 • https://itunes.apple.com/us/course/coding- together-developing/id593208016 • 教學: http://www.raywenderlich.com/tutorials
• 歷年 WWDC 影⽚片: • https://developer.apple.com/wwdc/videos/ • https://developer.apple.com/videos/wwdc/2012/ Tuesday, August 13, 13
• Cocoa Design Patterns: http://www.amazon.com/Cocoa-Design-Patterns- Erik-Buck/dp/0321535022/ref=sr_1_1? ie=UTF8&qid=1376278359&sr=8-1&keywords=cocoa+design+patterns • iOS Programming
- The Big Nerd Ranch Guides: http://www.amazon.com/ iOS-Programming-Ranch-Edition-Guides/dp/0321821521/ref=sr_1_3? ie=UTF8&qid=1376278374&sr=8-3&keywords=cocoa+design+patterns Tuesday, August 13, 13