在(一)中坑已經說的很多了,但只埋了一半.現在我把我意識到的坑都埋完.
沒看過(一)的出門左轉,這倆要一起看..抱歉篇幅問題
↓防懵逼必看
↑防懵逼必看
回去看了看貌似(一)已經可以解決所有問題了...額
1.還有訂單沒結束的坑
所以要把開始監聽寫在程序入口,在程序掛起時移除監聽.
如果有未完成的訂單他就會直接走
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray<SKPaymentTransaction *> *)transactions
一般情況下都是購買成功后沒有結束訂單的坑,所以他會走驗證方法
if (self.cash != nil)這句話在這就起作用了,所以他會走[self checkUnTestReceipt];//從本地取憑證驗證去 }
2.為什么要存到數組??
因為你可能出現不止一個未驗證的訂單,擦,好慘
- (void)checkUnTestReceipt
{
NSArray *payAry =從本地去取存憑證的數組,我就不告訴你怎么取,咬我
if (!payAry || payAry.count == 0) {
return;
}
for (NSDictionary *dic in payAry) {
[self untestReceiptByTime:dic];//把本地(漏單)的dic(驗證信息)都去驗證了
}
}
untestReceiptByTime:這方法只是多了個失敗后的回傳,和驗證方法有一點不同
- (void)untestReceiptByTime:(NSDictionary *)dic//第一次訪問服務器失敗了又一次請求,多了個定時的請求
{
WEAKSELF;
[[YLBNetWorkManager sharedInstance]postJsonData:dic url: e successBlock:^(id responseBody) {
[weakSelf removeDicFromPayAry:dic];//移除,不懂得看一
} failureBlock:^(NSString *error) {
DLog(@"%@和自己服務器失敗22",error);
[self untestReceiptByTime:dic];//最好一段時間后再驗證,用GCD
}
程序入口監聽開始
[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
DLog(@"我一進來就看看本地漏單");
[[IAPManager sharedInstance]checkUnTestReceipt];//一進程序看看有沒有漏單
雙管齊下,你慢慢漏吧
當然還得在程序入口新建本地數組(只建一次),用NSUserDefaults ,刪除添加都是他,這我就不寫了,你全部都復制粘貼也沒啥成就感..
程序出口移除監聽
[[SKPaymentQueue defaultQueue] removeTransactionObserver:self];
.
3.為什么必須存到本地
為了不往本地存我是沒少費勁,但是我太年輕,還是錯了.
雖然只要不結束訂單憑證就不會消失,但是驗證時還需要其他(用戶Aid,不然你怎么知道誰買的.或者下次登錄換用戶B了,你只用了本地的憑證和B,擦,充錯人)所以必須存本地.
突然有個疑問,這個憑證是怎么和訂單一一對應的?誰知道說下,我沒事也研究下
4.總結
貌似無法解決用戶購買后未驗證但是換手機了的丟單問題,額,你找客服吧.好煩..技術有限,以后再說吧.仔細想想好像還不是很完美.以后再補充吧.也請大神們多指教吧
最后我要感謝所有幫助我的人謝謝你們五四的奉獻
...
寫到這里,算是把內購給寫的略微明白點了.我現在也就能理解到這個水平了,以后有什么會再補充.
記得剛拿到任務一臉懵逼頭大.貌似大部分內購文章里都有我瀏覽的身影吧.我針扎
我在想要不要加密本地的東西,還有唐巧說要禁止越獄的用戶內購(他們問題太多,比如被黑客挾持)
5 更新11.1(驗證)
先去蘋果的正式服務器驗證,返回21007的話再去測試驗證.因為蘋果測試用的是測試服務器