iOS開發中常見bug!(內附解答方法)
序言
你是否曾經修復了一個 bug ,隨后又發現了一個跟剛修復bug有關的bug,又或是修復bug的方式引起了另一個bug?
然而這些問題是絕佳的學習機會。所以我們怎樣盡可能多地從修復的問題中吸取經驗?小編用的方法就是寫下這個問題的簡單描述、修復方法以及吸取的經驗。使用這個方法了,讓這個方法幫助自己成為一個更出色的程序員。
每當修復一個特別棘手或有趣的問題,總會花幾分鐘寫下一些這個問題的信息。這有一些典型記錄的例子小編接下來就分享一些問題和解決方法。
1、iOS在app切換到后臺后如何繼續進行下載?
NSURLSession已經支持app按下home鍵之后,仍讓能夠進行下載的任務。但是app退出之后不能進行下載。對于NSURLSession添加如下的屬性即可進行后臺下載。
- - (NSURLSession *)session {
- static dispatch_once_t onceToken;
- dispatch_once(&onceToken, ^{
- NSURLSessionConfiguration *config = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:@"com.wj.demo.BackgroundSession"];
- _queue = [NSOperationQueue new];
- _queue.maxConcurrentOperationCount = 1;//同時支持的最多下載次數
- _session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:_queue];
- });
- return _session;
- }
但是當用戶在按鈕home鍵的時候,這個下載還能繼續進行。
如果用戶在后臺按鈕home鍵之后,上滑將app殺死之后,我們應該在appdidregiestActive的方法里面先將所有的下載任務暫停。
2、IAP內購中虛擬貨幣導致審核無法通過的問題?
有的時候我們需要在app中使用虛擬貨幣,在我們的app中可以使用虛擬貨幣進行購買道具等,比如直播中的禮物,游戲中的道具等。
蘋果對于虛擬貨幣是需要提成的,提成的額度為30%。所以對于這塊的審核比較嚴格。首先你們的購買的道具在ios端和安卓端是需要分開的。如果大家玩游戲的就會發現游戲的數據在兩端是分開的。
用戶在安卓手機上購買的道具在iOS上是不能使用的。因為這樣也間接的影響了蘋果的收入。
另外就是在審核期間不能有可以兌換在appStore可購買的商品,的任意活動或者兌換碼,這個也是蘋果不允許的。因為這個也會影響蘋果的收入。
另外就是可能有的同學會在蘋果審核之后隱藏ipa支付,此處提醒下,蘋果會掃描你的app代碼中是否有支付寶,微信等關于支付的字段。使用開關加h5的方式可以通過審核,但是此處也有風險,風險就是一旦被發現,可能的結果就是蘋果直接封掉賬號。app無法使用。
3、如何用dispatch_Group監聽afn 下載完成
用dispatch_Group只能控制網絡請求的先后順序,但是要監聽是否下載完成好像不行;但是可以用其他的方式來監聽;例如:
可以在每個網絡請求的成功或失敗回調里面設置一個bool標識符為YES,并發送一個通知,在當前頁面監聽通知,并在監聽的通知方法里面,對所有網絡請求涉及到的bool標識符進行判斷,如果都為YES,就可以認為是所有網絡請求都請求完成,就可以執行自己想要進行的操作
4、iOS原生端如何使用JSCore進行原生和iOS的交互
在 - (void)webViewDidFinishLoad:(UIWebView *)webView 方法中
- [webView stringByEvaluatingJavaScriptFromString:@"editReady2();”];
調用此方法即可調用js中的方法。
此處有的時候可能會調用不到js中的方法,原因有可能是js的代碼和html的代碼是分開放置的,通過此時不一定能夠拿到js中的代碼。解決的方法是,先獲取整個html的代碼。在html代碼的后面拼接js的路徑,然后使用 webView loadHtml的方法去執行網頁上的數據。
JS調用oc中的方法
在 - (void)webViewDidFinishLoad:(UIWebView *)webView 方法中
- JSContext *context = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext”];
- ange2 前后端約定的字符串
- context[@"change2"] = ^(){ NSArray *params = [JSContext currentArguments];
- 點擊js端的方法,會傳遞對應的參數給OC端,OC端根據約定的參數規則即可相應的對應的操作。
- NSLog(@“%@“,params);
- };
5、用戶信息是保存在沙盒還是userdefault比較好
首先NSUserDefaults就是在沙盒中。一般用戶的屬性不會很多,所以采用 加密+偏好的方式或者是歸檔的方式可以保存。但是現在屬性這么多,建議使用歸檔,使用歸檔的時候,json轉model等等都有第三方輔助,很方便。
至于登錄保存用戶信息,方式很有很多種:
- 單例模式,登陸后把用戶數據存儲在單例對象
- NSUserDefaults .數據存儲后可以關閉app后依然存在,只有卸載App或者手動刪除,數據才會消失
- 鑰匙串,數據可以刪除app后依然存在,鑰匙串由操作系統保護并且存儲后的數據是比較安全的,長用來存儲一些密碼,私鑰
6、開發中試圖通過kvo來監聽uiwebview.scrollview contentSize來動態改變uiwebview的frame以達到uiwebview剛好填充contentSize的效果, 實際上效果會導致一個死循環,讓scrollview.frame越來越大
scrollView 的 contentSize 和 bound 有著密切的關系,而bound 與frame有著密切的關系,因此這樣做是不合理的
解決方法
- // 在y方向給足contentsize足夠的空間
- _webView.scrollView.contentSize=CGSizeMake(self.view.bounds.size.width,MAXFLOAT);
- [_webView loadHTMLString:html baseURL:nil];
- // 加載完畢后再調整y方向的contentSize
- - (void)webViewDidFinishLoad:(UIWebView*)webView
- {
- //在加載完畢之后獲取webview內容所需要的空間
- CGSizesize = [webViewsizeThatFits:CGSizeMake(self.view.bounds.size.width,MAXFLOAT)];
- CGRectframe =CGRectMake(0,0, size.width, size.height);
- webView.frame= frame;
- //調整好frame之后再調整contentsize
- webView.scrollView.contentSize=CGSizeMake(0,0);
- }
7、在做代駕項目,用戶下單之后司機的狀態是極光推送到用戶的 如果用戶禁止app的推送功能 我應該怎么實現我的實時查看司機/訂單信息的需求。
解決這個問題的方式有兩種方式:
- app和服務器建立長連接,將數據實時傳遞app。此方式可能需要和服務器人員討論,可能對服務器的要求比較高。
- 另一種方式是定時發送請求,類似前端使用的心跳包的方式,當然用戶也可以在信息展示界面進行手動刷新。此方式的好處是后臺的壓力會比較小。
8、如何實現在app中打開淘寶,并且跳轉到指定的應用?比如優惠券頁面
找到淘寶的URLScheme并且在URLScheme添加指定的參數,如果你的本機安裝了淘寶app客戶端,可以跳轉到淘寶的指定頁面。
比如如下URLScheme
- taobao://item.taobao.com/item.hem?spm=a1z10.3-c.w4002-14141359151.28.m8vuq0$id=533219732078.
如何找到這樣的URLSCheme。
在模擬器寫一個appDemo,和淘寶的包名一致,然后找到一個你需要的鏈接,比如優惠卷,點擊跳轉的按鈕,然后在
- -(BOOL)application:(UIApplication *)application handleOPenURL:(NSURL *)url{}
此方法中打印出來即可。
9、App上架后,如何修改app上顯示的公司名稱
解答方式:
- 先修改開發者賬號中填寫的公司名稱。
- 再提交更新版本。
如何修改開發者賬號中的公司名稱:
登陸到Apple developer上面,在people里面的開發者列表中找到agent,讓agent的這個人直接撥打蘋果開發部咨詢電話:400-670-1855,修改開發者賬號上的公司名或者用你注冊的賬號的郵箱直接寫郵件:“我需要更改公司名稱”到chinadev@asia.apple.com,讓蘋果開發部客服來處理。
10、iOS打包成功之后,運行在iPhone上會閃退,黑屏?
關于打包之后無法安裝,或者安裝之后閃退的情況。只有可能是兩種情況,一種是證書錯誤,另一種就是當前的設備并不在開發者對應的賬號里面。
我們來看一下怎么檢測當前的設備是否在開發者的證書里呢,如果你有開發者賬號,當然登錄app即可獲得。但是沒有開發者賬號的情況我們該怎么辦呢?
我們以下面的ipa包為例,必須是hoc或者dev的包

ipa其實就是一個壓縮文件,我們可以對齊解壓。得到一個payload文件夾。

解壓后,點擊進入文件夾,然后顯示包內容,可以看到里面的文件列表

我們找到對應的證書embedded.mobileprovision 這個就是你的ipa包里面使用的簽名證書。
然后mac上開啟終端。并cd到證書所在的路徑
并且在終端輸入
- //查看dev.hoc包中的已經添加的設備號
- security cms -D -i embedded.mobileprovision > entitlements_full.plist
在證書對應的路徑會生成一個文件

用xcode打開這個文件

這里面就是你的證書里面對應的所有的設備號。
最后
我發現為每個有趣的 問題 記錄下來,可以讓我輕易學習到很多。在記錄的行為中我會對發生的事情思考得更深刻。同樣,一旦記錄下來,我可以在之后檢查發生的事情。偶爾,我也會瀏覽文件,只閱讀教訓部分,對我認為是從問題中學到的最有價值的經驗加強記憶。
今天給大家的分享就到這吧!有收獲,或者喜歡小編的可以關注小編同時也歡迎大家加入小編的iOS交流群656315826,小編會分享小編記錄的全部問題,大家一起交流成長!!