一個完整iOS項目從開發到上架,你需要注意的!

一.一個項目的開始搭建

1.工具類的文件可以直接用之前項目的。



二.Cocopod導入需要的庫。

cd 項目位置

然后添加podfile文件:vim podfile (注:在寫該文件的時候要注意格式??? ' '?? );

進入后按i進入插入模式,進行編輯,安裝官方最新的文檔格式:

platform :ios, '8.0'

target '你的項目名稱' do

pod 'AFNetworking', '~> 3.0'

end

編輯完成后,按ESC退出編輯模式,最后輸入:wq保存并退出文件,此時可以發現在項目目錄下多了一個Podfile的文件,請注意這個文件必須與.xcodeproj在同一目錄下,

最后:pod install進行安裝即可


三.基礎頁面的搭建。

1.基類的viewcontroller,基類的WKWebViewController.


四.與后臺對接接口。

/**

*發送get請求

*

*@param url url

*@param params發送的參數

*@param success成功回調

*@param failure失敗回調

*/

+ (void)get:(NSString*)url params:(nullableNSDictionary*)params showHud:(BOOL)showHudsuccess:(void(^)(id__nullablejson))success failure:(void(^)(NSError*error))failure{

// 1.創建請求管理者}

AFHTTPSessionManager*mgr = [AFHTTPSessionManagermanager];

//mgr.responseSerializer = [AFHTTPResponseSerializer serializer];

mgr.requestSerializer= [AFHTTPRequestSerializerserializer];

//添加證書

[mgrsetSecurityPolicy:[QWAFSecurityPolicycustomSecurityPolicy]];

mgr.requestSerializer.timeoutInterval=30;

mgr.responseSerializer.acceptableContentTypes= [NSSetsetWithObjects:@"application/json",@"text/json",@"text/xml",@"text/plain",@"text/html",@"image/png",nil];

[mgrGET:urlparameters:paramsprogress:^(NSProgress*_NonnulldownloadProgress) {

}success:^(NSURLSessionDataTask*_Nonnulltask,id_NullableresponseObject) {

if(showHud) {

[hudhideAnimated:YES];

}

if(success) {

//NSString *online = [NSString stringWithFormat:@"%@",responseObject[@"online"]];

//[QWAccountModel sharedModel].isOnline = [online boolValue];

success(responseObject);

}

}failure:^(NSURLSessionDataTask*_Nullabletask,NSError*_Nonnullerror) {

if(showHud) {

[hudhideAnimated:YES];

}


//[MBProgressHUD hideHUD];

//[TJShowMessage showMessage:@"網絡異常,請重新加載"];

//[[NSNotificationCenter defaultCenter] postNotificationName:TJReloadDataFailedNotification object:nil];

if(failure) {

failure(error);

}

}];

+ (void)postmanager:(NSString*)url params:(NSDictionary*)params success:(void(^)(idmanager,idjson))success failure:(void(^)(

NSError*error))failure{

AFHTTPSessionManager*mgr = [AFHTTPSessionManagermanager];

mgr.requestSerializer= [AFHTTPRequestSerializerserializer];

//添加證書

[mgrsetSecurityPolicy:[QWAFSecurityPolicycustomSecurityPolicy]];

mgr.requestSerializer.timeoutInterval=30;

mgr.responseSerializer.acceptableContentTypes= [NSSetsetWithObjects:@"application/json",@"text/json",@"text/xml",@"text/plain",@"text/html",nil];

[mgrPOST:urlparameters:paramsprogress:nilsuccess:^(NSURLSessionDataTask*_Nonnulltask,id_NullableresponseObject) {

if(success) {success(task, responseObject);

}

}failure:^(NSURLSessionDataTask*_Nullabletask,NSError*_Nonnullerror) {

if(failure) {failure(error);

}

加密驗簽。

//生成sign

+ (NSString*)getSignAndSignDict:(NSMutableDictionary*)dict

{

NSMutableDictionary*dic = [NSMutableDictionarydictionaryWithDictionary:dict];

[dicsetValue:VersionforKey:@"version"];

[dicsetValue:[CommonFunctime]forKey:@"timeStamp"];

[dicsetValue:PtforKey:@"pt"];

[dicsetValue:ImeiforKey:@"imei"];

NSString*singstr = [selfsortDicToString:dic];

returnsingstr;

}

//排序驗簽

+ (NSString*) sortDicToString:(NSMutableDictionary*)dic{

//排序

NSMutableArray*stringArray = [NSMutableArrayarrayWithArray:dic.allKeys];

[stringArraysortUsingComparator: ^NSComparisonResult(NSString*str1,NSString*str2) {

return[str1compare:str2];

}];

//驗簽

NSString*md5StrPre =@"";

for(inti =0; i < [stringArraycount]; i++) {

NSString*key = [stringArrayobjectAtIndex:i];

md5StrPre = [md5StrPrestringByAppendingString:[dicobjectForKey:key]];

}

NSString*getKey =QWKey;

md5StrPre = [md5StrPrestringByAppendingString:getKey];

NSString*md5Str = [QWCommonFuncmd5:md5StrPre];

returnmd5Str;

}


五.MVC模式搭界面。


六.登錄分享。

1.很多公司都是用H5頁面直接調取登錄注冊。這里主要說一下第三方登錄。

Cocopod導入shareSDK或者直接在官網拖入導入(但是要手動添加一些依賴庫)。


- (instancetype)init

{

if(self= [superinit])

{

self.users= [NSMutableArrayarray];

//將已授權用戶加入列表

[[SSEThirdPartyLoginHelperusers]enumerateKeysAndObjectsUsingBlock:^(idkey,SSEBaseUser*obj,BOOL*stop) {

[self.usersaddObject:obj];

}];

}

returnself;

}


[ShareSDKregisterApp:QWShareKey

activePlatforms:@[

@(SSDKPlatformTypeSinaWeibo),

@(SSDKPlatformTypeWechat),

@(SSDKPlatformTypeQQ),]

onImport:^(SSDKPlatformTypeplatformType)

{

switch(platformType)

{

caseSSDKPlatformTypeWechat:

[ShareSDKConnectorconnectWeChat:[WXApiclass]delegate:self];

break;

//case SSDKPlatformSubTypeQZone:

caseSSDKPlatformTypeQQ:

[ShareSDKConnectorconnectQQ:[QQApiInterfaceclass]tencentOAuthClass:[TencentOAuthclass]];

break;

caseSSDKPlatformTypeSinaWeibo:

[ShareSDKConnectorconnectWeibo:[WeiboSDKclass]];

break;

default:

break;

}

}

onConfiguration:^(SSDKPlatformTypeplatformType,NSMutableDictionary*appInfo)

{

switch(platformType)

{

caseSSDKPlatformTypeSinaWeibo:

//設置新浪微博應用信息,其中authType設置為使用SSO+Web形式授權

[appInfoSSDKSetupSinaWeiboByAppKey:SinaAppid

appSecret:SinaAppsecret

redirectUri:@""

authType:SSDKAuthTypeBoth];

break;

caseSSDKPlatformTypeWechat:

[appInfoSSDKSetupWeChatByAppId:WXAppid

appSecret:WXAppsecret];

break;

caseSSDKPlatformTypeQQ:

[appInfoSSDKSetupQQByAppId:QQAppid

appKey:QQAppsecret

authType:SSDKAuthTypeBoth];

break;

default:

break;

}


以上是分享和登錄的KEY注冊。

[SSEThirdPartyLoginHelper loginByPlatform:SSDKPlatformTypeSinaWeibo

onUserSync:^(SSDKUser*user,SSEUserAssociateHandlerassociateHandler) {

onLoginResult:^(SSDKResponseStatestate,SSEBaseUser*user,NSError*error) {

}];


分享需要注意的是:

微博和微信朋友圈的分享需要特別分清。

NSMutableDictionary*shareParams = [NSMutableDictionarydictionary];

[shareParamsSSDKEnableUseClientShare];

//定制微博的分享內容

[shareParamsSSDKSetupSinaWeiboShareParamsByText:[NSStringstringWithFormat:@"%@%@",[QWStringUtilsconvertNullString:content],[NSURLURLWithString:url]]title:[QWStringUtilsconvertNullString:title]image:imageArrayurl:[NSURLURLWithString:url]latitude:0longitude:0objectID:niltype:SSDKContentTypeAuto];

//定制微信朋友圈的分享內容

[shareParamsSSDKSetupWeChatParamsByText:[NSStringstringWithFormat:@"%@",[QWStringUtilsconvertNullString:content]]title:[QWStringUtilsconvertNullString:title]url:[NSURLURLWithString:url]thumbImage:nilimage:imageArraymusicFileURL:nilextInfo:nilfileData:nilemoticonData:niltype:SSDKContentTypeAutoforPlatformSubType:SSDKPlatformSubTypeWechatTimeline];

[shareParamsSSDKSetupShareParamsByText:[NSStringstringWithFormat:@"%@%@",[QWStringUtilsconvertNullString:content],[NSURLURLWithString:url]]

images:imageArray

url:[NSURLURLWithString:url]

title:[QWStringUtilsconvertNullString:title]

type:SSDKContentTypeAuto];

系統的分享UI界面

[ShareSDKshowShareActionSheet:nil

items:typeArr

shareParams:shareParams

onShareStateChanged:^(SSDKResponseStatestate,SSDKPlatformTypeplatformType,NSDictionary*userData,SSDKContentEntity*contentEntity,NSError*error,BOOLend) {

switch(state) {

caseSSDKResponseStateSuccess:

{

[QWShowMessageshowToastmsg:@"分享成功"toView:controller.view];

break;

}

caseSSDKResponseStateFail:

{

[QWShowMessageshowToastmsg:@"分享失敗"toView:controller.view];break;

}caseSSDKResponseStateCancel: {

[QWShowMessageshowToastmsg:@"分享取消"toView:controller.view];

break;

}

default:

break;

}

}

];

自定義分享界面

這個可以自己寫一個View。(用tableview或者collection)(也可以寫成button的點擊)

__blocktypeof(self)weakSelf =self;

[ShareSDKshare:[dict[@"shareType"]intValue]parameters:shareParamsonStateChanged:^(SSDKResponseStatestate,NSDictionary*userData,SSDKContentEntity*contentEntity,NSError*error) {

switch(state) {

caseSSDKResponseStateSuccess:

{

[weakSelfshareSuccessMsg];

Log(@"分享成功!");

break;

}

caseSSDKResponseStateFail:

{

[TJShowMessageshowToast:self.superViewmsg:@"分享失敗"];

TJLog(@"---%@",error.description);

break;

}

caseSSDKResponseStateCancel: {

break;

}

default:

break;


}];

如何判斷是否登錄成功了呢?

還有如何下次啟動不在輸入密碼,自動登錄呢?

那么我們需要AccountModel單例和LoginTool。

當然我們也需要歸檔和解檔。來判斷是否登錄。記錄是否有賬號和密碼。但是這種有一個缺點,如果我們卸載了該應用然后在安裝,就不會有登錄的記錄。很多程序是記錄的手機UDID,傳給后臺,一一對應。

實現歸檔中的 encodeWithCoder 和 initWithCoder方法

http://www.lxweimin.com/p/98ce827931c7

+ (void)saveAccount:(AccountModel*)model

{

[NSKeyedArchiverarchiveRootObject:modeltoFile:AccountPath];//歸檔

}

+ (AccountModel*)loadAccount

{

AccountModel*model = [NSKeyedUnarchiverunarchiveObjectWithFile:AccountPath];

returnmodel;

}

if(![QWLoginToolisLogin]) {

[selfpresentViewController:[QWLoginToollogin]animated:YEScompletion:nil];

return;

}

判斷是否登錄。



七.支付

1.支付寶支付。

2.微信支付。

3.銀聯支付。

4.京東支付。

5.蘋果內購支付。

關于蘋果內購支付的思路。

1.證書。

五個證書。兩個p12證書(一個development開發者,一個distribution發布者),三個描述文件(一個development開發描述真機測試,一個distribution發布APP描述文件,一個distribution_adhoc打包測試證書)。

2.流程

1、Get Set of Product IDs內購商品信息最好存放到服務器,因為界面的展示都是根據模型顯示(將數據放到一個集合里面:NSSet/Web Service)前提是需要將項目在蘋果內購后臺信息配置好

2、向蘋果請求有效的內購商品信息Request Valid Product IDs (蘋果可能限制某些商品)怎么請求:SKProductsRequest(創建這個請求)。

3、蘋果返回有效的內購商品信息Valid DIs Returned

4、展示購買的選項(展示界面)Display Purchase Options

5、用戶開始購買(User Initiates Purchase):選中某個商品,創建票據(SKPayment),將票據加入到交易隊列里面(User Works Through Dialogs)

6、監聽交易隊列交易成功還是失敗(添加觀察者,遵守協議,實現方法進行回調)。

(代理一對一,觀察者一對多)

八.常用的框架

1.Masonry(布局)

2.github.com/forkingdog(流暢的側滑)

3.WMPageController(好框架)(自己寫的話就有些小麻煩,浪費時間。)

4.SDCycleScrollView(廣告輪播圖)

5.iCarousel-(第一次啟動新手引導)

九.封裝。優化。

十.上架。

十一.與H5頁面交互。

#pragma mark WKUIDelegate

//頁面開始加載時調用

-(void)webView:(WKWebView*)webView didStartProvisionalNavigation:(WKNavigation*)navigation{

NSLog(@"開始加載");

}

//內容開始返回時調用

-(void)webView:(WKWebView*)webView didCommitNavigation:(WKNavigation*)navigation{

NSLog(@"開始返回");

}

//頁面加載完成時調用

-(void)webView:(WKWebView*)webView didFinishNavigation:(WKNavigation*)navigation{

NSLog(@"加載完成");

}

//頁面加載失敗時調用

-(void)webView:(WKWebView*)webView didFailNavigation:(WKNavigation*)navigation withError:(NSError*)error{

NSLog(@"加載失敗");

}

- (void)webView:(WKWebView*)webView decidePolicyForNavigationAction:(WKNavigationAction*)navigationAction decisionHandler:(void(^)(WKNavigationActionPolicy))decisionHandler

{

NSString*requestStr = navigationAction.request.URL.absoluteString;

QWLog(@"requestStr==%@",requestStr);

if([requestStrisEqualToString:@""]) {

QWLog(@"獲取URL失敗");

decisionHandler(WKNavigationActionPolicyCancel);

return;

}

if([requestStrrangeOfString:@"#"].location!=NSNotFound) {

NSArray*arr = [requestStrcomponentsSeparatedByString:@"#"];

requestStr = [arrobjectAtIndex:1];

Log(@"找到帶#號的url");

decisionHandler(WKNavigationActionPolicyCancel);

requestStr = [requestStrstringByRemovingPercentEncoding];

NSData*data = [requestStrdataUsingEncoding:NSUTF8StringEncoding];

NSDictionary*dic = [NSJSONSerializationJSONObjectWithData:dataoptions:NSJSONReadingMutableLeaveserror:nil];

QWLog(@"dic = %@",dic);

if([requestStrrangeOfString:@""].location!=NSNotFound) {

}

decisionHandler(WKNavigationActionPolicyAllow);

if(![requestStrhasPrefix:@"http"])

{

decisionHandler(WKNavigationActionPolicyCancel);

return;

}

}


以后再補充吧!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,763評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,238評論 3 428
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,823評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,604評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,339評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,713評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,712評論 3 445
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,893評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,448評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,201評論 3 357
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,397評論 1 372
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,944評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,631評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,033評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,321評論 1 293
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,128評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,347評論 2 377

推薦閱讀更多精彩內容