App項目總結

一、代碼管理工具----分佈式版本控制系統github,在上邊新建一個項目的代碼倉庫,把代碼同步到git服務器上。下邊介紹一個常用的git終端命令:

       git clone "SSH網址"從github上克隆代碼到本地、

       git branch 列出已有的分支、

       git checkout "branchname" 切換分支名稱、

       git add .  添加新文件或者更改新文件、

       git status 查看更新狀態、

       git rm "文件名" 刪除github上文件、

       git commit -m "name"提交更改文件到本地並且添加一個名字、

       git pull /git pull origin "branchname"從服務器上拉取信息、

       git push origin "branchname"提交到服務器上、

       git merge 合併版本、

       git log查看提交修改目錄。

       gitk 打開github自帶圖形用戶界面

       mate "Zhangmengge.xcodeproj" 用textmate打開工程文件

 

二、iphone工程命名規範:

      

進入工程後有四個文件夾:

第一個Resources存放的是第一次美工給的圖片,包含測試圖和座標圖並不是最終要添加到工程裏的文件。

第二個是工程名字的文件夾。

第三個Frameworks裏存放了工程所有用到的框架。

第四個是這個工程的app文件。

      

在工程名的文件夾裏包含有5個文件夾:

第一個config是一個全局的配置文件,裏邊主要放所有用到的宏定義。

第二個App文件夾裏放的是所有的代碼文件。

第三個libs文件夾裏放所有用到的第三方框架。

第四個Resources裏邊存放的是工程中所有用到的圖片素材。

第五個supporting files是一個支持文件,裏邊主要是自動生成文件,例如plist文件、main函數、pch文件,在pch文件裏寫的主要是一些被很多頁面都要引用的框架名稱,寫在這裏邊就會自動引用到所有頁面。 

 

三、  自定義Button形狀的第三方框架OBShapedButton:

圖片素材的其它區域要給成透明的,然後用OBShapedButton初始化創建一個對象,後邊用法跟創建系統Button一樣:

    OBShapedButton * sharebtn = [OBShapedButton buttonWithType:UIButtonTypeCustom];
    sharebtn.frame = CGRectMake(10, 40, 300, 436);
    [sharebtn setImage:[UIImage imageNamed:@"xiepinglun_backgound_cut.png"] forState:UIControlStateNormal];
    [sharebtn addTarget:self action:@selector(onTop) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:sharebtn];

 

四、textview、textfield回收鍵盤方法:

都需要把delegate設成自己:

-(BOOL)textFieldShouldReturn:(UITextField *)textField
{
    [textField resignFirstResponder];
    return YES;
}

-(BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text  
{  
    if ([text isEqualToString:@"\n"]) {  
        [textView resignFirstResponder];  
        return NO;  
    }  
    return YES;  
}  

 

五、字符串替換、數組反向排序:

//字符串替換
self.finalStr = [self.tempStr stringByReplacingOccurrencesOfString:@"</p>" withString:@" "];
//將數組元素反向排列
[self.articleList reverseObjectEnumerator];

 

六、修改編譯文件(Build)位置:

編寫程序時經常會出現一些莫名其妙的錯誤,而且怎麼找都找不到錯誤,這個時候就該考慮一下是不是build的問題,需要clean build一下。在xcode裏Preferences裏的Locations把Derived Data的Default改成Relative,然後把後邊括號裏改成build,這樣每次編譯會在你的工程目錄裏多出一個build文件夾,在出現奇怪錯誤時可以build目錄清理一下。

      

 

七、DLog:

編寫程序時經常需要用NSLog輸出一些數據,當整個程序寫完時可能已經寫了無數個NSLog,不可能一個一個刪了,而且日後如果修改還需要在寫非常麻煩。解決辦法在.pch裏寫這樣一段宏命令

//把NSLog換成DLog,以後就不用一個一個刪除
#ifdef DEBUG
#    define DLog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);
#else
#    define DLog(...)
#endif

// ALog always displays output regardless of the DEBUG setting
#define ALog(fmt, ...) NSLog((@"%s [line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);

然後在程序中需要用NSLog的地方全部換成DLog。編寫程序時把Edit SchemeL裏Build Configuration選項改成Debug(默認就是Debug),程序會正常輸出打印。當上線發佈時把Debug改成Release,所以DLog就不會打印輸出了。

      

 

八、如何判斷設備是iphone5:

在.pch裏添加一段宏命令

//判斷設備是不是iphone5
#define iPhone5 ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(640, 1136), [[UIScreen mainScreen] currentMode].size) : NO)

在程序中只需判斷:

    if (iPhone5) {
        // Initialization code ...
    }

 

九、去掉cell選中時的藍色背景:

在cellForRowAtIndexPath里加上一句話:

    static NSString *CellIdentifier = @"Cell";
    MyCustomCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    
    // Configure the cell...
    if (cell == nil) {
        cell = [[[MyCustomCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier]autorelease];
    }
    //設置選中後cell的背景顏色,有黑色,灰色,藍色,和不顯示顏色四種
    cell.selectionStyle = UITableViewCellAccessoryNone;

 

十、如何判斷程序第一次進入:

在AppDelegate裏開始位置寫

    //判斷程序是否第一次進入
    if (![[NSUserDefaults standardUserDefaults]boolForKey:@"everLaunched"]) {
        [[NSUserDefaults standardUserDefaults]setBool:YES forKey:@"everLaunched"];
        [[NSUserDefaults standardUserDefaults]setBool:YES forKey:@"firstLaunch"];
    }else{
        [[NSUserDefaults standardUserDefaults]setBool:NO forKey:@"firstLaunch"];
    }
    
    // Save changes to disk
    [[NSUserDefaults standardUserDefaults] synchronize];

在需要對第一次進行操作時寫:

-(void)firstLaunch
{
    if ([[NSUserDefaults standardUserDefaults]boolForKey:@"firstLaunch"])
    {
        // Initialization code
    }else
    {
        // Initialization code
    }
}

 

十一、IOS的沙盒機制:

IOS爲每個應用程序都創建了一個文件系統,每個應用程序只能讀取這個文件系統中的文件,不能訪問其他程序的文件系統。此區域就被稱爲沙盒,所有的非代碼文件都保存在這裏。例如圖像、聲音、屬性列表、本地文件等。有兩點需要注意:

1.每個應用程序都有屬於自己的儲存空間。

2.每個應用程序只能訪問自己的空間,不能訪問其他程序的儲存空間。

每臺MAC電腦的用戶名文件夾下都有一個默認隱藏的文件夾,叫資源庫:

1.顯示資源庫的終端命令:chflags nohidden ~/Library/

2.隱藏資源庫的終端命令:chflags hidden ~/Library/

顯示Mac隱藏文件的命令:defaults write com.apple.finder AppleShowAllFiles -bool true

隱藏Mac隱藏文件的命令:defaults write com.apple.finder AppleShowAllFiles -bool false

怎樣找到應用程序的沙河路徑:

每個沙盒中都有3個文件夾:1.Documents 2.Library 3.tmp

     

Documents:程序中建立的或在程序中瀏覽到的文件數據保存在該目錄下,iTunes備份和恢復的時候會包括此目錄

Library:存儲程序的默認設置或其它狀態信息;

Library/Caches:存放緩存文件,iTunes不會備份此目錄,此目錄下文件不會在應用退出刪除

tmp:提供一個即時創建臨時文件的地方。

itunes在與iphone同步時,備份所有的Documents和Library文件。

iphone在重啓時,會丟棄所有的tmp文件。

 

十二、程序多語言支持或者經常程序會丟失Info.Plist.String(Chinese):

在工程裏PROJECT------Localizations下邊有個加號,點擊一下就會出來很多國家的plist.string文件

 

 

十三、檢測網路:

用第三方框架NetworkChecker來判斷,代碼如下,首先引入頭文件

#import "NetworkChecker.h" 

然後在.h裏定義一個實例方法

-(BOOL)checkNetwork;

在.m文件中寫

- (BOOL)checkNetwork {
    
    NetworkChecker *networkchecker = [NetworkChecker sharedNetworkChecker];
    if ([networkchecker networkStatus] == NotReachable) {
        
        return NO;//返回NO是沒網狀態
    } else {
        
        return YES;//返回YES是有網狀態
    }
}

寫完後當要用到判斷網絡的地方,這樣寫

if (![self checkNetwork]) {
     //當沒有網絡時執行的方法             

}else{
     //有網情況下執行方法   
 
}

 

十四、用Blocks寫網絡請求:

 NSString * str = [NSString stringWithFormat:@"http://star.eliteworkltd.com:8002/?json=1&p=1413"];
            NSURL * url = [NSURL URLWithString:str];
            //__block的作用是能在setCompletionBlock的內部訪問外部的方法
            __block ASIHTTPRequest * request = [ASIHTTPRequest requestWithURL:url];
            [request setRequestMethod:@"GET"];
            [request setCompletionBlock:^{
                //相當於ASi的RequestFinished方法

            }];
            [request setFailedBlock:^{
                //相當於ASI的RequestFailed方法

                UIAlertView * alert = [[UIAlertView alloc]initWithTitle:@"" message:@"非常抱歉" delegate:nil cancelButtonTitle:@"您的網絡不給力(︶︿︶)。。。" otherButtonTitles:nil, nil];
                [alert show];
                [alert release];
            }];
            //啓動異步執行
            [request startAsynchronous];

 

十五、SDWebImage:

跟以前的AsycImage用法有些相似,只用給一個圖片的url地址即可,sdweb會自動幫你讀出圖片並且緩存,sdweb和Asy不同之處是sdweb需要給一張佔位圖,在圖片沒加載出來之前會先顯示這張佔位圖。sdweb裏邊有個UIImageView+WebCache類,它是一個繼承imageview的類目,在.m文件中引入頭文件

#import "UIImageView+WebCache.h"

用法

[cell.imageview2 setImageWithURL:[NSURL URLWithString:url] placeholderImage:[UIImage imageNamed:@"57.png"]];

 

十六、截取當前頁面到相冊:

需要添加QuartzCore.framework框架,並且引入頭文件

#import <QuartzCore/QuartzCore.h>
        //保存圖片到相冊
        UIGraphicsBeginImageContext(self.view.bounds.size);//當前視圖
        [self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
        UIImage * viewImage = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        UIImageWriteToSavedPhotosAlbum(viewImage, nil, nil, nil);
        
        UIAlertView * alert = [[UIAlertView alloc]initWithTitle:@"" message:@"圖片已經爲您保存到相冊" delegate:nil cancelButtonTitle:@"確定" otherButtonTitles:nil, nil];
        [alert show];
        [alert release];

 

十七、在程序內發郵件:

在程序內發送Email,需要添加MessageUI.framework框架,import頭文件,加MFMailComposeViewControllerDelegate代理

#import <MessageUI/MFMailComposeViewController.h>

@interface DetailViewController : UIViewController<MFMailComposeViewControllerDelegate>
{
    
}

@end

然後調用方法:

//激活郵件功能
[self sendMailInApp];

然後在下邊寫sendMailInApp方法

#pragma mark ------- Send Email

-(void)sendMailInApp
{
    Class mailClass = (NSClassFromString(@"MFMailComposeViewController"));
    if (mailClass != nil)
    {
        if ([mailClass canSendMail]) {
            [self displayComposerSheet];
        }else {
            [self launchMailAppOnDevice];
        }
    }
    else {
        [self launchMailAppOnDevice];
    }
}

-(void)displayComposerSheet
{
    MFMailComposeViewController * mailPicker = [[[MFMailComposeViewController alloc]init] autorelease];
    mailPicker.mailComposeDelegate = self;
    
    //設置主題
    [mailPicker setSubject:[NSString stringWithFormat:@"%@%@%@%@",@"分享自張夢格APP",@"",self.titleString,@""]];
    
    //添加發送者
    NSArray * toRecipients = [NSArray arrayWithObject:@"[email protected]"];
    [mailPicker setToRecipients:toRecipients];
    
    /*
     //email正文裏添加圖片
     UIImage * addPic = [UIImage imageNamed:@"123.jpg"];
     NSData * imageData = UIImagePNGRepresentation(addPic);
     [mailPicker addAttachmentData:imageData mimeType:@"" fileName:@"123.jpg"];
     */
    
    NSString * emailBody = nil;
    [mailPicker setMessageBody:emailBody isHTML:YES];
    
    [self presentModalViewController:mailPicker animated:YES];   
    
}

-(void)launchMailAppOnDevice
{
    NSString * recipients = @"mailto:[email protected]&subject=my email!";
    NSString * body = @"&body=email body!";
    NSString * email = [NSString stringWithFormat:@"%@%@",recipients,body];
    email = [email stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    
    [[UIApplication sharedApplication]openURL:[NSURL URLWithString:email]];
    
}

-(void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error
{
    NSString * message;
    switch (result) {
        case MFMailComposeResultCancelled://用戶取消編輯郵件
            message = @"郵件發送取消";
            break;
        case MFMailComposeResultSaved:    //用戶成功保存郵件
            message = @"郵件保存成功";
            break;
        case MFMailComposeResultSent:     //用戶點擊發送,將郵件放到隊列中
            message = @"郵件發送成功";
            break;
        case MFMailComposeResultFailed:   //用戶試圖保存或者發送郵件失敗
            message = @"郵件發送失敗";
            break;
            
        default:
            break;
    }
    DLog(@"%@", message);
    [self dismissModalViewControllerAnimated:YES];
} 

 

十八、iphone開發的一些總結(原文出自編程神人老莫):

1.Done is better than perfect(尤其是程序第一次提交,不要想着把東西做的多好多炫多麼天花亂墜之後在上線,一定要以一個簡單又能通過的方式先提交第一版,然後在做第二版更新);

2.優先、儘早的學習蘋果的新技術,因爲你遲早都是要學的;

3.好的平面設計不等於好的iphone設計,web的一套設計在移動設備上並不適用;

4.選擇被證實的成功上線案列走,因爲前人已經爲你走過無數次的reject之路;

5.你的app要值得用戶反覆去用,要區別於同類產品。

 

十九、最後總結幾點蘋果審覈幾個要點(都是經過血淚的教訓才總結出來的經驗),不遵循這些規則你的應用很可能被打回:

1.我的應用第一次被打回來蘋果給了原因是服務器太慢,程序裏的圖片出不來,後來換了服務器,並且在代碼上做了優化;第二次又被駁回,蘋果給你的原因是not very useful,Simply web sites bundled as apps,蘋果認爲程序過於簡單,就跟一個web的應用一樣;don’t provide  any lasting entertainment value(不能提供任何的持續的娛樂價值) ,後來把程序主題框架換成了Path菜單,又加入了用戶留言板功能才通過。

2.bug和崩潰:首先最重要一點提交的程序一定不能有bug和崩潰,如果有必定會被打回。

3.條款違規:不符合國家法律規定的,含有嚴重暴力色情內容的。

4.侵權:也就是說不要有侵權行爲或者是竊取用戶隱私,被發現的化一定會被打回。 

5.功能描述與事實不符,軟件說明上吹的多牛X多牛叉,實際上根本就沒有 。

6.不能用蘋果私有的API

7.山寨:抄襲別人軟件創意,嚴重雷同

8.軟件功能不能影響蘋果自己的產品,搶蘋果生意的,最後都會被pass

 


原文:http://blog.csdn.net/crazyzhang1990/article/details/12503173

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章