關於iOS App Programming

1、App Design Basics
2、Core App Objects
html

 
1)UIApplication對象:管理應用事件loop和協調行爲。你在appDelegate中能夠用到它,或者經過[UIApplication sharedAppliation]獲得。
2)App Delegate 對象: 在建立應用時候建立的自定義對象,通常經過UIApplicationMain函數建立。這個對象的主要任務是處理應用狀態的改變。
3)Document和data模型對象: document對象是UIDocument的子類來管理數據模型對象(至關於數據庫吧)。Document對象不是必須的,可是提供了一種便利的方法,讓你在一個單獨的文件或文件包中管理數據。(本人用的數據庫較多,對UIDocument研究甚少)
4)View Controller對象:
5)UIWindow對象:
6)視圖、control和layer對象:

一、數據模型:
NSString、NSAttributedString
NSNumber、NSDecimalNumber、NSIndexPath
NSData、NSValue
NSDate、NSDateComponents
NSURL
NSArray、NSDictionary、NSIndexSet、NSOrderedSet、NSSet

NSInteger/NSUInteger
NSRange
NSTimeInterval
CGPoint
CGSize
CGRect

二、用戶界面
三、App Bundle包括:
1)App執行文件
2)Info.plist
3)App Icons: icon.png、icon@2x.png、icon-small.png、icon-small@2x.png
4)Launch images:Default.png、Default-portrait.png、Default-Landscape.png
5)storyboard files(或者nib files): Mainboard.storyboard(經過NSMainStoryboardFile指定)或mainWindow.xib(經過NSMainNibFile指定)
6)Ad hoc distribution icon:文件名必須爲iTunesArtwork,且不能包含擴展名: 512*512pixel,對於ad hoc發佈來講是必須的,可是對於其餘來講是可選的
7)Setting Bundle:Settings.bundle:若是你想在Settings App中設置你的應用的自定義設置,你必須提供一個setting bundle。
8)非本地化的資源文件:
9)本地化資源:例如en.lproj、fr.lproj

使用[NSBundle mainBundle]得到bundle資源,使用pathForResource:ofType:查找資源路徑

3、App狀態和多任務
對於iOS應用來講,知道應用運行於前臺仍是後臺是相當重要的。由於資源和性能。
在你實現你的應用時,遵循下面的指導:
1)(必須) 正確響應狀態變化。
2)(必須)當進入到後臺,確保你的應用正確地調整了行爲。
3)(推薦)註冊系統通知來響應狀態變化。
4)(可選)若是你的應用須要在後臺作一些實際的工做,請求系統合適的權限來繼續運行。

一、管理狀態變化:
1)Not Running
2)Inactive:在前臺,可是不接收事件。一個應用通常只會在狀態發生改變時纔會通過這個狀態。
3)Active
4)Background:在後臺並執行代碼中。通常只會在應用轉到Suspended狀態過程當中通過這個狀態。然而,應用能夠請求額外的執行時間,這可能會讓應用在這個狀態保留一段時間。另外,一個正在加載的應用直接進入到這個狀態而不是Inactive狀態。
5)Suspended:在後臺而且不執行代碼。
ios

 
二、應用加載週期:
git

 
要肯定你的應用在前臺仍是後臺,能夠請求[UIApplication sharedApplication]的applicationState屬性。當你的應用被加載到前臺時,其狀態是UIApplicationStateInactive(中間狀態),當你的應用被加載到後臺時,屬性爲UIApplicationStateBackground。你可使用這個差異來調整加載時的行爲----在application:didFinishLaunchingWithOptions:方法中。

三、進入到後臺:
你的代理applicationDidEnterBackground:有5秒的事件來結束任務並返回。實際上,這個方法應該儘快的返回。若是在規定時間內沒有返回,你的應用會被kill掉並清除出內存。若是你須要更多的時間來執行任務,調用 beginBackgroundTaskWithExpirationHandler:方法來請求後臺執行時間,並在另外一個線程中執行長時間的耗時任務
四、在Wakeup時處理Queued Notifications:
在Suspended狀態的應用必須準備好處理任何queued通知---當其返回到前臺或後臺執行狀態。Suspended狀態的app不執行任何代碼,所以不能處理通知,包括設備方向更改、Preferences更改,和其餘可能影響應用界面或狀態的通知。爲了確保這些更改不丟失,系統queue了儘量多的這些通知,並在應用返回前臺時通知應用。
你能夠註冊不少通知,包括:
1)配件鏈接了或斷開了:EAAccessoryDidConnectNotification、EAAccessoryDidDisconnectNotification
2)設備方向更改: UIDeviceOrientationDidChangeNotification
3)顯著的時間更改:UIApplicationSignificantTimeChangeNotification
4)電池電量狀態更改:UIDeviceBatteryLevelDidChangeNotification、UIDeviceBatteryStateDidChangeNotification
5)The proximity state changes:UIDeviceProximityStatDidChangeNotification
6)受保護的文件狀態更改:UIApplicationProtectedDataWillBecomeUnavailable、UIApplicationProtectedDataDidBecomeAvailable
7)外部顯示器鏈接或斷開:UIScreenDidConnectNotification、UIScreenDidDisconnectNotification
8)屏幕顯示模式更改:UIScreenModeDidChangeNotification
9)Preference更改:NSUserDefaultsDidChangeNotification
10)當前語言更改:NSCurrentLocaleDidChangeNotification

五、在應用進入到Suspended狀態後,若是下面的某一項爲真,那麼程序會退出:
1)應用linked against iOS 4.0之前。
2)應用發佈到iOS4.0之前的設備上。
3)當前設備不支持多任務(multitasking)
4)應用在info.plist中包括鍵UIApplicationExitsOnSuspend。

六、Main Run Loop:
七、後臺執行和Multitasking:
八、肯定Mulititasking是否可用:
UIDevice* device = [UIDevice currentDevice];
BOOL backgroundSupported = NO;
if ([device respondsToSelector:@selector(isMultitaskingSupported)])
   backgroundSupported = device.multitaskingSupported;

九、在後臺執行一個有限長度的任務(Finite-Length Task):
beginBackgroundTaskWithExpirationHandler: ,還必須相應地調用endBackgroundTask:方法來標識任務結束(好吧,不調用endBackgroundTask:也能夠,只須要調用beginBackgroundTaskWithExpirationHandler就可讓系統給你10分鐘免費的後臺時間)。(系統給額外的10分鐘讓你執行任務!!!)
例子:
- (void)applicationDidEnterBackground:(UIApplication *)application
{
    bgTask = [application beginBackgroundTaskWithExpirationHandler:^{
        // Clean up any unfinished task business by marking where you.
        // stopped or ending the task outright.
        [application endBackgroundTask:bgTask];
        bgTask = UIBackgroundTaskInvalid;
    }];
 
    // Start the long-running task and return immediately.
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
 
        // Do the work associated with the task, preferably in chunks.
 
        [application endBackgroundTask:bgTask];
        bgTask = UIBackgroundTaskInvalid;
    });
}

十、安排本地通知
十一、實現長時間的耗時後臺任務:
對於須要更多執行時間的任務來講,你必須請求特定的權限來在後臺執行他們。在IOS中,只有特定的應用類型才容許在後臺運行:
1)應用播放音頻內容
2)應用實時保持通知他們的位置,例如導航應用。
3)應用支持Voice over Internet Protocol (VoIP)
4) Newsstand apps that need to download and process new content
5) Apps that receive regular updates from external accessories

十二、聲明你的應用支持的後臺任務:
使用info.plist文件。添加UIBackgroundModes鍵並設置其值爲一個數組,包含一個或多個字符串:
1)audio
2) location
3) voip

4) newsstand-content
5) external-accessory
6) bluetooth-central

1三、跟蹤用戶的位置
有幾種辦法跟蹤用戶位置,大多數不須要你的應用在後臺持續運行:
1)(推薦)顯著的位置更改服務
2)只在前臺運行的位置服務
3)後臺位置服務
在你不須要高精度定位時,第一個方法是極力被推薦的。在第一個方法中,若是應用被掛起了,而後更新發生了,系統會喚醒其到後臺狀態並處理更新。若是應用開啓了服務而後被結束掉了,系統會自動從新啓動應用。
第二個方法和第三個方法都是用標準的Location Core Service來獲取位置數據。惟一的區別是隻在前臺運行的位置服務在應用掛起時會中止投遞更新,通常發生於應用不支持其餘後臺服務或任務。
經過前面介紹的UIBackgroundModes鍵指定location,就可讓應用在後臺接收更新。注意這個鍵並不阻止系統掛起應用,可是它確實告訴系統它應該被喚醒。可是這個比較費電。

1四、在後臺播放音樂
1五、實現一個VoIP應用:
1)UIBackgroundModes鍵指定數組中包含voip字符串。
2)配置app爲voip而使用的socket
3)在進入到後臺時,調用setKeepAliveTimeout:handler:
4)配置audio session來處理實際使用的轉換。
5)爲了確保一個好的用戶體驗,使用Core Telephony框架,在有電話時調整應用的行爲
6)爲了確保一個好的性能,使用SystemConfiguration框架來檢測網絡狀態的變化,而且容許應用盡量地睡眠。

配置了UIBackgroundModes爲voip以後,不用再指定audio 也能夠在後臺播放音樂。
指定了voip以後的應用也會在系統啓動後當即加載到後臺

配置socket:
對於NSInputStream和NSOutputStream:使用setProperty:forKey:方法來添加NSStreamNetworkServiceType屬性爲NSStreamNetworkServiceTypeVoIP。
對於NSURLRequest:使用NSMutableURLRequest類實例的setNetworkServiceType:方法,參數爲NSURLNetworkServiceTypeVoIP
對於CFReadStreamRef和CFWriteStreamRef:使用CFReadStreamSetProperty或 CFWriteStreamSetProperty函數來添加kCFStreamNetworkServiceType屬性,這個屬性的值應該是kCFStreamNetworkServiceTypeVoIP。

由於VoIP應用須要保持運行,以便接收來電,若是他以一個非0值退出,系統會自動將其從新載入。

使用[UIApplication sharedApplication] setKeepAliveTimeout:handler:來爲應用添加一個Keep-Alive Handler,通常在applicationDidEnterBackground:方法中添加它。通常安裝了Handler,系統會在timeout以前至少調用一次handler,handler有10s的運行時間,不然系統會掛起應用。
指定timeout的時候,通常指定爲實際容許的最大值,雖然系統承諾在timeout以前調用你的handler塊,但他不保證精確的調用時間。爲了提升電池壽命,系統通常把你的handler塊執行代碼和其餘週期性的系統任務放到一個組裏,而後一次性處理全部的任務。所以,您的Handler代碼必須準備好運行早於實際的你指定的Timeout。(也就是若是你須要10s的timeout值,那麼你就指定5s就OK了)


5、App相關的資源
一、App Store必須的資源:
1) Info.plist文件。
2) Info.plist文件必須包含 UIRequiredDeviceCapabilities鍵。App商店使用這個鍵來肯定一個用戶是否能夠在設備上運行你的應用。
3)你的應用必須包含一個或多個icons。
4)你的應用必須包含一個default.png。

二、Info.plist文件
1)UIRequiredDeviceCapabilities 鍵
2)CFbundleIcons:
3) UISupportedInterfaceOrientations

4)UIBackgroundModes:
5)UIFileSharingEnabled:
6) UIRequiresPersistentWifi
7)UINewsstandApp:

三、聲明UIRequiredDeviceCapabilities :
這個鍵對應一個字典的數組
http://developer.apple.com/library/ios/#documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/App-RelatedResources/App-RelatedResources.html

6、高級App 技巧:
一、建立一個Universal應用:
1)更新Info.plist設置:
key_root-<platform>~<device>
device有
    iphone—The key applies to iPhone devices.
    ipod—The key applies to iPod touch devices.
    ipad—The key applies to iPad devices.
例如:
UIInterfaceOrientation~ipad

2)實現你的試圖控制器和視圖:
3)爲新的Symbols添加Runtime檢查:
4)使用Runtime檢查來建立條件的代碼路徑:
5)更新你的Resource文件:

二、保留應用用戶界面的狀態:
三、在Landscape模式下加載應用:
四、在第一次加載時安裝應用特定的數據文件
五、保護數據使用On-Disk加密
六、開發VoIP App的技巧:
七、使用Reachability界面來改善用戶體驗:
Reachability interface容許應用在網絡狀態更改時獲得通知。例如,一個VoIP應用能夠在網絡變得不可用時關閉網絡連接而且在其變得可用時恢復網絡連接。
要使用Reachability interface,你必須使用該框架註冊一個回調函數並使用它來追蹤網絡變化。要註冊一個回調函數:
1)爲你的目標遠程主機建立一個SCNetworkReachabilityRef結構。
2)指定一個回調函數到你的結構(使用 SCNetworkReachabilitySetCallback函數)來處理可達狀態的變化。
3)添加那個目標到你的應用的一個active run loop(例如Main Run Loop),使用 SCNetworkReachabilityScheduleWithRunLoop函數。
這也提高了電池的壽命。

八、與其餘應用交互:
支持自定義URL scheme的應用可使用這些schemes來接收消息。一些應用使用URL Scheme來初始化特定的請求。例如,一個應用想在地圖應用中顯示一個地址,可使用一個URL來加載那個應用並顯示地址。你能夠在你的應用中實現你本身的URL Scheme來促進相似的通訊類型。
Apple提供了一些內建的URL Scheme支持,如http,mailto,tel和sms URL Schemes。它還支持針對地圖的基於http的URL、YouTube和iPod Apps。這些Schemes的handler被固定而且不能更改。若是你的URL type包含apple提供的url scheme,Apple提供的應用會加載而不是你的應用。
注意:若是不僅一個第三方app註冊了相同的URL scheme,當前沒有辦法來決定哪一個app會收到scheme。
要與一個使用自定義URL的app通訊,要使用正確的格式內容建立一個NSURL對象,並傳遞這個對象給shared UIApplication的openURL:方法,來加載註冊接收該URL類型的應用。那時,控制也交給了新的app。
下面的代碼片斷例示了一個應用如何請求另外一個應用的服務。(例子中的"todolist"是另外一個app的一個假設的自定義的url scheme):
NSURL *myURL=[NSURL URLWithString:@"todolist://www.acme.com?Quartery%20Report#200806231300"];
[[UIApplication sharedApplication] openURL:myURL];
若是你的應用定義了一個自定義的URL Scheme,你須要實現一個handler來處理scheme。

九、實現自定義的URL Schemes:
1)註冊自定義的URL Schemes:在Info.plist文件中指定CFBundleURLTypes鍵。它是一個字典的數組,每一個字典定義了一個URL scheme。
CFBundleURLTypes(在info.plist中爲URL types)屬性包含的字典的鍵和值
鍵 CFBundleURLName(在info.plist中爲URL identifier)   爲:一個包含URL scheme抽象名字的字符串。爲了確保惟一性,推薦你指定一個反向DNS風格的標識符,例如:com.acme.myscheme。
鍵 CFBundleURLSchemes(在Info.plist中爲URL scheles)  爲:一組字符串,包含URL schemes的名字,例如:http、mailto、tel和sms等
數據庫

 
上面圖中的例子就是該應用支持 todolist://com.acme.ToDoList 格式的URL。

2)處理URL Requests:
全部的URLs被傳遞給你的應用Delegate,或者在加載時,或者你的應用已經運行或在後臺時。要處理傳進的URLs,你的應用代理應該實現下面的方法:
a)使用application:didFinishLaunchingWithOptions:方法來檢索關於URL的信息並決定如何打開它。這個方法只在你的應用被加載時調用。
b)在iOS 4.2之後,使用application:openURL:sourceApplication:annotation:方法來打開文件。
c)在iOS 4.1之前,使用application:handleOpenURL:方法來打開文件。

若是URL請求到來時,你的應用沒有運行,它被加載並移動到前臺來使其可以打開URL。你的application:didFinishLaunchingWithOptions:實現方法應該從options字典中檢索URL並決定應用是否可以打開它。若是能夠打開,返回YES並使你的application:openURL:sourceApplication:annotation:(或application:handleOpenURL:)方法來處理實際的打開URL的操做。
下圖顯示了若是應用打開一個URL時 修改後的加載順序:
數組

 
注意:支持自定義URL scheme的應用能夠指定不一樣的Launch圖像,在加載時處理URL時顯示。

例子:
-(BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {
  if ([[url scheme] isEqualToString:@"todolist"]){
   ToDoItem *item=[[ToDoItem alloc]init];
   NSString *taskName=[url query];
   if (!taskName || ![self isValidTaskString:taskName]){  //必需要有一個TaskName
       [item release];
       return NO;
   }
   taskName=[taskName stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

   item.toDoTask=taskName;
   NSString *dateString=[url fragment];
   if (!dateString || [dateString isEqualToString:@"today"]){
     item.dateDue=[NSDate date];
   } else {
     if (![self isValildDateString:dateString]){
       [item release];
       return NO;
    }
           NSString *curStr = [dateString substringWithRange:NSMakeRange(0, 4)];
            NSInteger yeardigit = [curStr integerValue];
            curStr = [dateString substringWithRange:NSMakeRange(4, 2)];
            NSInteger monthdigit = [curStr integerValue];
            curStr = [dateString substringWithRange:NSMakeRange(6, 2)];
            NSInteger daydigit = [curStr integerValue];
            curStr = [dateString substringWithRange:NSMakeRange(8, 2)];
            NSInteger hourdigit = [curStr integerValue];
            curStr = [dateString substringWithRange:NSMakeRange(10, 2)];
            NSInteger minutedigit = [curStr integerValue];
 
            NSDateComponents *dateComps = [[NSDateComponents alloc] init];
            [dateComps setYear:yeardigit];
            [dateComps setMonth:monthdigit];
            [dateComps setDay:daydigit];
            [dateComps setHour:hourdigit];
            [dateComps setMinute:minutedigit];
            NSCalendar *calendar = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
            NSDate *itemDate = [calendar dateFromComponents:dateComps];
            if (!itemDate) {
                [dateComps release];
                [item release];
                return NO;
            }
            item.dateDue = itemDate;
            [dateComps release];
        }
 
        [(NSMutableArray *)self.list addObject:item];
        [item release];
        return YES;
    }
    return NO;
}

十、顯示和隱藏鍵盤
在UIKit中,只有支持文本輸入的視圖才能成爲第一響應者。其它視圖若是想能夠成爲第一響應者並顯示鍵盤,那麼它必須重載canBecomeFirstResponder方法並返回YES。
當一個視圖變成第一響應者時,會默認顯示鍵盤,可是你能夠爲支持自定義輸入的視圖替換鍵盤。每一個responder都有一個inputView屬性,它包含響應者成爲第一響應者時顯示的view。當這個屬性爲nil時,系統顯示標準鍵盤。若是這個屬性不爲nil,系統顯示你提供的視圖。

通常,用戶的輕擊命令哪一個視圖變成第一響應者,可是你能夠強制一個視圖變成第一響應者。使用becomeFirstResponder方法。

十一、取消屏幕鎖定
設置shared Application的idleTimerDisabled屬性爲YES,讓屏幕不鎖定。爲NO,則不阻止屏幕鎖定。

7、提高性能:
http://developer.apple.com/library/ios/#documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/PerformanceTuning/PerformanceTuning.html

8、iOS環境
一、特定的系統行爲:
1)虛擬的內存系統
2)自動的睡眠Timer
3)多任務支持

二、安全
1)App Sandbox
2)Keychain Data安全

相關文章
相關標籤/搜索