文章關鍵詞:dSYM、#if/#ifdef/#ifndef、IAP(In App Purchase)、Analyze
複製代碼
6 月 12 日 - 20 日,一言難盡心酸淚/大哭——提交 6 次,被拒6次,還有誰?/攤手數據庫
項目從 5.2.0 接到手以後,到目前提審中的 6.0.4 以前,前先後後一共提交了 8 個版本,不管是新增功能仍是優化升級,都能順利上架。而此次,從 6.0.4.0 開始提 TestFlight(審覈經過),6.0.4.3 開始提交審覈,如今已經 6.0.4.8 第六次提審了(目前還在審覈中,前五次全軍覆沒)/攤手服務器
最關鍵的!此次是爲了 618 而提交,影響心情不說,iOS 端的 618 活動受到耽誤纔是大事啊/大哭,但願領導不要罰錢錢/可憐。app
「文章內包含未解決/未知問題,各位看官謹慎查看/攤手」ide
Guideline 2.1 - Performance - App Completeness
We were unable to review your app as it crashed on launch. We have attached detailed crash logs to help troubleshoot this issue.
複製代碼
Guideline 2.1 - Performance - App Completeness
We were unable to review your app as it still crashed on launch. We have attached detailed crash logs to help troubleshoot this issue.
複製代碼
三次都在後面附上了 crash log 文件(看得出第三次審覈團隊也很無奈啊)測試
仍是頭一回遇到審覈啓動不了的狀況,平常開發和測試中也並無出現過這個問題。優化
第一次被拒沒注意看日誌,覺得是打包打錯了,檢查一遍選項,肯定沒問題便從新打包上傳了,too young!ui
第二次被拒,分析日誌能夠看到啓動時間過長觸發 watchdog,程序被掛起(啓動失敗),按照日誌中的 Termination Reason: Namespace SPRINGBOARD, Code 0x8badf00d
一番搜索,都是讓符號化,但是並無 dSYM 文件,由於着急提交,便將程序啓動-引導頁-登陸頁-首頁流程捋了一遍,修改了幾處疑似影響啓動的地方,又打包從新提交,然而 too young!this
第三次被拒,心態爆炸心態爆炸心態爆炸!和原來作這個項目的同事溝通一番無果,怎麼辦也得提交啊,索性讓這位同事打包吧!spa
Exception Type: EXC_CRASH (SIGKILL)
Exception Codes: 0x0000000000000000, 0x0000000000000000
Exception Note: EXC_CORPSE_NOTIFY
Termination Reason: Namespace SPRINGBOARD, Code 0x8badf00d
Termination Description: SPRINGBOARD, scene-create watchdog transgression: xxx.xxx.xxx exhausted real (wall clock) time allowance of 18.23 seconds | ProcessVisibility: Foreground | ProcessState: Running | WatchdogEvent: scene-create | WatchdogVisibility: Foreground | WatchdogCPUStatistics: ( | "Elapsed total CPU time (seconds): 27.760 (user 27.760, system 0.000), 46% CPU", | "Elapsed application CPU time (seconds): 1.037, 2% CPU" | )
Triggered by Thread: 0
複製代碼
這是在第四次被退回時纔想到的方法,真的是腦子短路,被幹懵了/攤手!.net
符號化 crash log 的方法再也不贅述,個人問題是打包文件裏 dSYMs
文件夾是空的,並無 dSYM
文件/無奈。
看全部沒有dSYM
文件的文章上都是設置 Build Setting - Debug Information Format
,即 Debug
下是 DWARF
,Release
下是 DWARF with dSYM File
,然而個人本來就是這個選項,Archive
仍舊沒有生成 dSYM
文件/攤手。把 Debug
對應的 DWARF
改成 DWARF with dSYM File
,從 DerivedData
卻是能夠找到 dSYM
文件,然並卵,uuid
對不起來仍是沒法分析/無奈
由於項目比較久遠,Build Setting
改動較大,而且不是對全部的設置選項都瞭解其根源,再加上上線緊迫,一個個去了解時間也不容許,索性新開一個 Demo
項目,默認設置下打包,打包是有 dSYM
文件的,接下來逐一對照項目去修改 Demo
的 Build Setting
並打包,直到沒有 dSYM
。
最終定位到了相關設置選項:除了常規設置 Build Setting - Debug Information Format
,同時要保證 Build Setting - Generate Debug Symbols
爲 YES
。
這個方法解決了沒有生成 dSYM
的問題,然而以後提交被拒卻不是由於沒法啓動了/無奈。因爲每次打包 uuid
都會變化,沒有相對應的 uuid
的 crash log
,沒法符號化,因此以前沒法啓動的緣由如今也無從得知/攤手
特別提醒:若是不是特殊狀況,不要爲了縮小一點 .ipa 體積修改 Build Setting 中 Symbols 相關的設置,一旦審覈出現了平時沒法復現的問題,符號化 Log 解決起來會有跡可循。
何不對 Build Setting 來一次大掃除?
Guideline 2.1 - Performance - App Completeness
We discovered one or more bugs in your app when reviewed on iPad running iOS 12.3.1 on Wi-Fi.
App fails to connect to its server.
複製代碼
越有事越不能慌亂,你看,慌亂中忘記修改服務器地址就打包提交了,因此,此次還有臉分析嗎?
沒臉。
雖然很沒臉提,仍是給本身提了個醒:爲何沒有將服務器分開 Debug
和 Release
? 不僅是服務器地址,還有一些邏輯或者日誌打印區分開頗有必要!這也是開發中的小技巧了。
這裏引入 #ifdef / #ifndef / #if / #elif / #else / #endif
的知識點,具體參考:#if 和 #ifdef的區別 或者 #if 和 #ifdef的區別(轉載),再也不贅述。
Guideline 2.3 - Performance - Accurate Metadata
We noticed that your app's metadata includes the following information, which is not relevant to the app's content and functionality:
Price of IAP is not matching the price of IAP batch.
複製代碼
WTF?內購商品價格顯示不一致?這塊是在接手以前的邏輯基礎上新增了商品,新增以後也提交了幾個版本了,忽然提出這個問題我也很懵😳。經過查看代碼,以前的邏輯是在咱們本身的服務器獲取商品列表,而咱們數據庫中只保存了人民幣的價格。看來仍是不夠了解 Apple 審覈規則/逃
解決起來卻是簡單,在這裏只是提醒你們別犯和我同樣的錯誤/大笑。商品列表修改成從 Apple 服務器(Apple 服務器會根據設備登陸的 AppleID 所屬的區域自動返回相應的價格)獲取便可:
#import <StoreKit/StoreKit.h>
@interface XXXViewController () <SKProductsRequestDelegate>
- (void)productsRequestFromApple
{
// appstoreconnect 商品 ids
NSArray *ids = @[@"id", @"id", ...];
// 根據商品 Ids 請求 appstore 的信息
if ([SKPaymentQueue canMakePayments]) {
NSSet *IDSet = [NSSet setWithArray:ids];
SKProductsRequest *productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:IDSet];
productsRequest.delegate = self;
[productsRequest start];
} else {
NSLog(@"您已禁止應用內付費");
}
}
#pragma mark - SKProductsRequestDelegate
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response
{
// 產品信息
NSArray *products = response.products;
if (products.count == 0) {
NSLog(@"未能獲取產品信息");
} else {
for (SKProduct *product in products) {
NSLog(@"localizedDescription: %@", product.localizedDescription);
NSLog(@"localizedTitle: %@", product.localizedTitle);
NSLog(@"price: %.2f", ([product.price floatValue]));
NSLog(@"NSLocaleCurrencySymbol: %@", [product.priceLocale objectForKey:NSLocaleCurrencySymbol]);
NSLog(@"NSLocaleCurrencyCode: %@", [product.priceLocale objectForKey:NSLocaleCurrencyCode]);
NSLog(@"productIdentifier: %@", [product productIdentifier]);
}
}
}
複製代碼
後面的付費流程再也不贅述。
記得每次關鍵節點如打包等,shift + cmd + B
進行代碼靜態分析(Analyze
)並處理,能夠解決至關一部分潛在隱患。
雖然程序裏設置的活動結束時間 2019.06.20 23:59:59,但仍是但願 21 日審覈能順利經過/無所謂