相信大家都有過做自己APP的想法,我把以前踩過的坑記錄一下俐东,大家多多少少也可以參考一下跌穗,受見識的局限可能會比較淺薄,請大家多多諒解虏辫。
??下面是介紹蚌吸,也可以直接下載源碼
準(zhǔn)備:
首先需要一個自己的開發(fā)者賬號(因為我沒有有國際支付功能的銀行卡,所以找淘寶代充的乒裆,但是最后去銀行辦個visa卡套利,不然其他賬號違規(guī),容易被關(guān)聯(lián))(如果有賬號的可以跳過準(zhǔn)備鹤耍,看下面)
iOS的開發(fā)者賬號分為3種。
個人賬號:每年688RMB验辞,容易申請稿黄,在上架App Store后,開發(fā)者直接顯示申請人姓名跌造,個人使用杆怕,每一種Apple產(chǎn)品,均有各類設(shè)備各100臺測試權(quán)限壳贪。iPhone陵珍、iPad、Mac等违施。
公司賬號:每年688RMB互纯,需要鄧白氏編碼才能申請,上架App Store的App開發(fā)者顯示公司磕蒲,公司賬號下留潦,可以添加多個測試子賬號只盹,支持Xcode在真機(jī)測試,但是子賬號沒有上傳App Store權(quán)限兔院。與個人賬號權(quán)限類似殖卑,均有各類設(shè)備各100臺測試機(jī)權(quán)限,iPhone坊萝、iPad孵稽、Mac等。
企業(yè)賬號: 每年299美元十偶,自行換算因為就這個我沒買過菩鲜。申請相對負(fù)責(zé),審核比較嚴(yán)格扯键,與公司賬號不同處在于睦袖,測試設(shè)備無限,可以不將開發(fā)的App上架App Store荣刑,而僅供內(nèi)部公司人員使用馅笙。
我用的是第一種,個人賬號
然后登陸蘋果后臺厉亏,創(chuàng)建證書
然后創(chuàng)建應(yīng)用董习,填寫資料
第一步 先說怎么賺錢吧:
基本上個人開發(fā)者做應(yīng)用,賺錢的方式就那么幾種:
1.應(yīng)用做好了爱只,有人買你的應(yīng)用
這個有很大的風(fēng)險皿淋,現(xiàn)在好多買應(yīng)用的,都是做馬甲號的恬试,容易被封號窝趣;當(dāng)然不排除你做的很好,被公司看上了的情況训柴,但是幾率很小
.2.應(yīng)用收費下載
就是下載要錢哑舒,大部分都是游戲類,工具類或者是筆記類的APP
首先在蘋果后臺選擇價格幻馁,然后保存洗鸵,價格都是固定的,按照蘋果價格表來的仗嗦。
3.蘋果內(nèi)支付,增值收費
比如說購買會員稀拐,或者是禮物打賞的禮物之類的火邓,要使用蘋果內(nèi)支付需要給蘋果30%的分成,只有超過150刀才會給你打錢,而且具體使用中還有好多坑贡翘,等等慢慢吐槽蹈矮。
需要付費的虛擬物品必須使用蘋果內(nèi)支付(比如直播打賞的道具),當(dāng)然你也可以隱藏一個用于支付的H5頁面(不過被發(fā)現(xiàn)了下場會很慘)
具體的過程簡書作者Bison說得很清楚了鸣驱,我就不細(xì)說了泛鸟;
首先是類型的選擇
然后是審核最好詳細(xì)點,最好有圖片踊东,千萬不要高估審核人員的智商北滥,不要高估,不要高估(重要的事情說三遍闸翅,說多了都是淚啊再芋,有可能在哪購買他都找不到)
最后只能被迫錄視頻給他們,
最后提醒大家一下
如果是企業(yè)開發(fā)的話一定要和后臺說清楚坚冀,不要只和蘋果服務(wù)器校驗是否成功济赎,要把例如產(chǎn)品ID,價格都校驗一下记某,而且要把訂單標(biāo)記為已購買(因為蘋果服務(wù)器訂單校驗成功是沒有時間限制的司训,如果一個人花一塊錢買個東西把數(shù)據(jù)抓到以后,用這個訂單再買別的東西液南,你只校驗成不成功的話會出問題的)
4.應(yīng)用內(nèi)加廣告
雖然在App中加入廣告來盈利是比較低級的商業(yè)化方式壳猜,但對于個人開發(fā)者或者小團(tuán)隊開發(fā)者來說也是個不錯的選擇,
基本上應(yīng)用的廣告收入都是按展示和點擊計算的滑凉,各種廣告聯(lián)盟都有自己的SDK统扳,直接引用就行了。
如果用戶有好多是國外的畅姊,可以使用谷歌GoogleAdMob,但是訪問得要梯子咒钟,而且是用美金結(jié)算的,只有超過100刀才會給你若未。
如果只是國內(nèi)的話可以用騰訊廣告,結(jié)算屬于比較快的盯腌,一月一結(jié)沒有金額限制。
騰訊廣告后臺詳情陨瘩,基本上是沒有怎么理會過
廣告形式主要有:
開屏廣告,原生廣告级乍,橫幅廣告舌劳,插頁廣告,視頻廣告玫荣;
開屏廣告和原生廣告用戶體驗好甚淡,大廠用的比較多,其它的用戶體驗都比較差
第二步 數(shù)據(jù)接口:
因為沒有服務(wù)器(當(dāng)然會搭服務(wù)器的小哥可以跳過)捅厂,網(wǎng)上有好多免費的API數(shù)據(jù)接口贯卦,大家可以找一下看看有沒有需要的资柔。
當(dāng)然也可以使用各種的云服務(wù),最穩(wěn)定的應(yīng)該屬于騰訊云和阿里云了撵割,但是比較貴贿堰。
免費的也有,像是bmob后端云或者是LeanCloud(不過免費版有很多限制)
我現(xiàn)在用的bmob后端云啡彬,控制臺效果:
具體實現(xiàn)代碼奉上
//注冊key
[Bmob registerWithAppKey:BmobAppkey];
//登錄
[BmobUser loginWithUsernameInBackground:@"用戶名" password:@"登錄密碼" block:^(BmobUser *user, NSError *error) {
if (user) {
登錄成功
} else {
登錄失敗
}
}];
BmobUser *bUser = [[BmobUser alloc] init];
bUser.username=views.username.textField.text;//名字
bUser.password=views.password.textField.text;//密碼
[bUser signUpInBackgroundWithBlock:^ (BOOL isSuccessful, NSError *error){
@"注冊成功"
} else {
@"注冊失敗"
}
}];
具體數(shù)據(jù)的增刪改查羹与,看文檔吧這里就不細(xì)講了
實在不行的話可以使用抓包工具來尋找自己需要的數(shù)據(jù),工具下載奉上
第三步 用戶第三方登錄分享:
用戶第三方登錄分享(不需要的可以跳過去)
新浪開發(fā)平臺地址
騰訊開放平臺地址
微信開發(fā)平臺地址
注冊提交資料就行庶灿,注意微信提交審核的官網(wǎng)要正規(guī)點纵搁,不然審核不過崇堵,隨便搭個好看點的靜態(tài)頁面吧傅瞻。
SDK可以單獨集成泡孩,也可以使用第三方随静,推薦使用友盟摸柄,使用簡單點而且加入友盟統(tǒng)計的時候方便點
第四步 應(yīng)用統(tǒng)計:
集成友盟統(tǒng)計(不需要的可以跳過)
集成友盟統(tǒng)計可以分析流量來源糜烹、內(nèi)容使用春瞬、用戶屬性和行為數(shù)據(jù)惫确,可以知道用戶干了什么
//初始化SDK
//設(shè)置友盟Appkey
[UMSocialData setAppKey:UmengAppkey];
//使用友盟統(tǒng)計
UMConfigInstance.appKey = UmengAppkey;
UMConfigInstance.channelId = @"App Store";//來源
[MobClick startWithConfigure:UMConfigInstance];
設(shè)置用戶的屬性山上,這樣用戶做的事件就可以攜帶著這些屬性眼耀,傳的樣式是字典
//設(shè)置超級屬性
NSMutableDictionary *dic = [NSMutableDictionary dictionaryWithObjectsAndKeys:user.idString, @"uid",user.nickName,@"name",user.gender, @"sex", nil];
[DplusMobClick registerSuperProperty:dic];
統(tǒng)計頁面
- (void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
[MobClick beginLogPageView:@"首頁"];
}
- (void)viewWillDisappear:(BOOL)animated{
[super viewWillDisappear:animated];
[MobClick endLogPageView:@"首頁"];
}
自定義事件,數(shù)量統(tǒng)計,比如可以統(tǒng)計充值按鈕被點擊的多少下
@param eventId 網(wǎng)站上注冊的事件Id.
@param label 分類標(biāo)簽佩憾。不同的標(biāo)簽會分別進(jìn)行統(tǒng)計哮伟,方便同一事件的不同標(biāo)簽的對比,為nil或空字符串時后臺會生成和eventId同名的標(biāo)簽.
@param accumulation 累加值。為減少網(wǎng)絡(luò)交互妄帘,可以自行對某一事件ID的某一分類標(biāo)簽進(jìn)行累加楞黄,再傳入次數(shù)作為參數(shù)。
[MobClick event:@"kaola_props"];//傳定義的ID
第五步:bug收集
用過的感覺騰訊bugly界面好看點抡驼,友盟方便點直接友盟統(tǒng)計就可以收集到鬼廓。其實也沒啥好說的,騰訊bugly也可以統(tǒng)計致盟,友盟統(tǒng)計也可以收集bug碎税,感覺都差不多。
第六步:消息推送
現(xiàn)狀推送的第三方SDK很多馏锡,像友盟推送雷蹂,極光推送,信鴿消息推送等等杯道,個人感覺極光推送是最快的(也有可能是自己的錯覺匪煌,個人看法)
1.創(chuàng)建推送證書
2.導(dǎo)入SDK將SDK包解壓
在Xcode中選擇“Add files to 'Your project name'...”,將解壓后的lib子文件夾(包含JPUSHService.h、jpush-ios-x.x.x.a萎庭,jcore-ios-x.x.x.a)添加到你的工程目錄中霜医。
3.使用
極光推送可以設(shè)置標(biāo)簽和別名達(dá)到個性化單獨推送的效果,比如單獨推送某人驳规,或者按地區(qū)推送肴敛。 具體實現(xiàn)自己看極光開發(fā)者文檔吧太多了,不細(xì)寫了达舒,
4.點擊推送控制跳轉(zhuǎn)的頁面
在networkDidReceiveMessage函數(shù)里處理得到的參數(shù)值朋,
來確定跳轉(zhuǎn)的頁面
注意設(shè)置角標(biāo),不過好像第一次點進(jìn)角標(biāo)不會消失巩搏,再點才會昨登,好像簡書的也是這樣(不知道是不是錯覺)
- (void)application:(UIApplication *)application
didReceiveRemoteNotification:(NSDictionary *)userInfo {
if (userInfos==nil) {
userInfos =userInfo ;
// 通知方法回調(diào):接受自定義消息
[self networkDidReceiveMessage:userInfos];
}
[JPUSHService handleRemoteNotification:userInfo];
[JPUSHService setBadge:0];// 設(shè)置角標(biāo)(到服務(wù)器)
}
第六步:應(yīng)用內(nèi)用到的圖標(biāo)
做應(yīng)用需要這樣的圖標(biāo)怎么辦
做應(yīng)用的話,需要用到好多圖標(biāo)(作為連畫畫都不會的人來說贯底,能愁死丰辣。當(dāng)然如果有好的UI朋友的話可以跳過)
矢量圖的話推薦用阿里矢量圖庫圖標(biāo)算是最全的了,基本上搜的都有禽捆,
下載的話可以設(shè)置格式笙什,顏色,大小
應(yīng)用圖標(biāo)尺寸
App Icons的尺寸大信呦搿(里面有iPhone和iPad的尺寸琐凭,可以自己刪除不需要的)
啟動圖片尺寸輸出列表:
640x960
640x1136
750x1334
1242x2208
第七步:應(yīng)用國際化
說實話這可是個體力活(不然不就白叫碼農(nóng)了嗎),英語分個美國英國等等浊服,現(xiàn)在連繁體字也分香港和臺灣(兄弟們準(zhǔn)備好翻譯軟件了嗎)
介紹宣傳國際化(也可以叫本地化)
代碼國際化
首先點擊項目->PROJECT->Info->Localizations中添加要支持的語言
然后就會多出兩個文件來
InfoPlist.strings是應(yīng)用名稱國際化
例如:
CFBundleDisplayName="XWstarNote";
CFBundleDisplayName="曉文星球筆記";
Localizable.strings是應(yīng)用內(nèi)容國際化
例如:
//首頁列表
(中)
"HomeTite1" = "金星(衣)";
"HomeTite2" = "木星(食)";
"HomeTite3" = "水星(住)";
"HomeTite4" = "火星(行)";
"HomeTite5" = "土星(其它)";
"HomeTite6" = "創(chuàng)建自己的星球";
(英)
//首頁列表
"HomeTite1" = "Venus(dressing)";
"HomeTite2" = "Jupiter(eat)";
"HomeTite3" = "Mercury(live)";
"HomeTite4" = "Mars(motion)";
"HomeTite5" = "Saturn(other)";
"HomeTite6" = "Create your own planet";
宏定義
/** 代碼切換語言 **/
#define Localized(key) NSLocalizedString(key, nil)
使用
titearray=[NSMutableArray arrayWithObjects:Localized(@"HomeTite1"),Localized(@"HomeTite2"),Localized(@"HomeTite3"),Localized(@"HomeTite4"),Localized(@"HomeTite5"),nil];
切換語言效果
第八步:數(shù)據(jù)持久化(應(yīng)用儲存)
持久存儲是一種非易失性存儲统屈,在重啟設(shè)備時也不會丟失數(shù)據(jù)。
NSUserDefaults牙躺,用于存儲配置信息
SQLite愁憔,用于存儲查詢需求較多的數(shù)據(jù)
CoreData,用于規(guī)劃應(yīng)用中的對象
使用基本對象類型定制的個性化緩存方案
最常用和簡單的應(yīng)該就屬于NSUserDefaults了
比如儲存一些用戶的信息或者設(shè)置的信息
最好封裝一下節(jié)省代碼
修改直接把key傳過去就行會覆蓋原來的數(shù)據(jù)
刪除的話把key傳過去個“”空也行
//獲取數(shù)據(jù)
+(id)getData:(NSString*)key{
return [NSKeyedUnarchiver unarchiveObjectWithData:[[NSUserDefaults standardUserDefaults] objectForKey:key]];
}
//設(shè)置數(shù)據(jù)
+(void)setData:(NSString *)key data:(id)data{
[[NSUserDefaults standardUserDefaults] setObject:[NSKeyedArchiver archivedDataWithRootObject:data] forKey:key];
[[NSUserDefaults standardUserDefaults] synchronize];
}
//清空
[[NSUserDefaults standardUserDefaults] removeObjectForKey:key];
[[NSUserDefaults standardUserDefaults] synchronize];
那么問題來了 NSUserDefaults只適合存儲輕量級的本地數(shù)據(jù)孽拷,一些簡單的數(shù)據(jù)(如NSString類型的)吨掌,但是如果我們自定義了一個對象,對象保存的是一些信息脓恕,這時候就不能直接存儲到NSUserDefaults了怎么辦
可以將自定義類型轉(zhuǎn)換為NSData類型
我們先建立一個叫UserInfo 的類膜宋,這個類里有各種屬性來儲存用戶的信息,這里要實現(xiàn) 在.h 文件中申明 NSCoding 協(xié)議炼幔,再 在 .m 中實現(xiàn) encodeWithCoder 方法 和 initWithCoder 方法就可以了
@interface ModelUser : UserInfo<NSCoding>
-(void)encodeWithCoder:(NSCoder *)encoder{
[encoder encodeObject:self.usersecurityMoel forKey:@"usersecurityMoel"];
[encoder encodeObject:self.followIds forKey:@"followIds"];
[encoder encodeObject:[NSString stringWithFormat:@"%d",self.isLoginS] forKey:@"isLoginS"];
}
- (id)initWithCoder:(NSCoder *)decoder {
if (self = [super init]) {
self.usersecurityMoel = [decoder decodeObjectForKey:@"usersecurityMoel"];
self.followIds = [decoder decodeObjectForKey:@"followIds"];
self.isLoginS =((NSNumber*) [decoder decodeObjectForKey:@"isLoginS"]).boolValue;
}
return self;
}
最后轉(zhuǎn)換儲存就行了
//存儲
NSData *securityObject = [NSKeyedArchiver archivedDataWithRootObject:model];
[user setObject:securityObject
forKey:@"UserInfo"];
[user synchronize];
//讀取
NSData* data = [[NSUserDefaults standardUserDefaults] objectForKey:@"UserInfo"];
UserInfo *userInfo = [NSKeyedUnarchiver unarchiveObjectWithData:data];
第九步:IM聊天消息( 單聊激蹲,群聊,聊天室)
應(yīng)用有時候需要用戶單聊江掩,或者群聊,也有可能需要客服聊天,不管怎么說也可以增進(jìn)用戶的黏貼性环形。
市面上提供IM SDK服務(wù)的最大的應(yīng)該就是環(huán)信了吧(個人感覺)策泣,但是自從騰訊把它的IM放出來之后感覺有點變化。
之前說騰訊的信鴿推送用得不太好抬吟,但是感覺騰訊云IM對并發(fā)的處理更好一些萨咕,而且功能多(雖然給的demo有點爛),支持創(chuàng)建超級大群(可以超過一萬人 上限多少沒說)像如果做直播聊天室的話還是挺方便的火本,而且騰訊云IM有自己的用戶管理系統(tǒng)可以幫自己省很多事危队。
第十步:JSPatch(熱更新)
原因
由于Apple嚴(yán)格的審核標(biāo)準(zhǔn)和低效率,iOS應(yīng)用的發(fā)版速度極慢,稍微大型的app發(fā)版基本上都在一個月以上,所以代碼需要熱更新。
介紹
JSPatch 是一個 iOS 動態(tài)更新框架钙畔,只需在項目中引入極小的引擎茫陆,就可以使用 JavaScript 調(diào)用任何 Objective-C 原生接口,獲得腳本語言的優(yōu)勢:為項目動態(tài)添加模塊擎析,或替換項目原生代碼動態(tài)修復(fù) bug簿盅。
基礎(chǔ)原理
Objective-C是動態(tài)語言,具有運行時特性揍魂,該特性可通過類名稱和方法名的字符串獲取該類和該方法桨醋,并實例化和調(diào)用。
我們可以通過類名/方法名反射得到相應(yīng)的類和方法现斋,
也可以替換某個類的方法為新的實現(xiàn)喜最,
還可以新注冊一個類,為類添加方法庄蹋。
具體的方法可以看它的官網(wǎng)
現(xiàn)在只說一下工程應(yīng)用的步驟(因為后臺不太想管理熱補丁瞬内,所以整個流程都是客戶端完成的)
1.先導(dǎo)入JSPatch SDK到工程里(很小的,只有幾個文件)
2.根據(jù)JSPatch語法寫好熱補丁蔓肯,然后MD5加密上傳到七牛遂鹊,因為要自己管理七牛文件命名 開頭一個字母來判斷是否是正式環(huán)境,后面加上版本號蔗包。
3.每次進(jìn)入應(yīng)用判斷有沒有熱補丁就行了秉扑。。
4.蘋果爸爸說以后熱更新调限,熱修復(fù)不讓用了舟陆,恭喜熱修復(fù)不用看(??? ?? ???)
未完待續(xù)。耻矮。秦躯。。裆装。最近在找工作 有時間更新東西了踱承,想到什么寫什么吧倡缠!