【關(guān)于IAP內(nèi)購詳細流程】

為一名iOS開發(fā),蘋果已經(jīng)在強制推行內(nèi)購了待侵,所以丢早,你不得不了解一下啦。可能還有些人不知道哪種情況下一定要用到內(nèi)購怨酝,簡單說明一下傀缩,如果你購買的商品,是在本app中使用和消耗的农猬,就一定要用內(nèi)購赡艰,否則會被拒絕上線,例如:游戲幣斤葱,在線書籍慷垮,app中使用的道具等

- 1. 向appStore提交帳戶資料

- 1.1 第一步

圖片.png

- 1.2 第二步

圖片.png

- 1.3 第三步

圖片.png

操作完第三步然后記得保存!

- 1.4 第四步

圖片.png

- 1.5 第五步

圖片.png

先點擊Contact Info 的Set Up

- 1.6 第六步

圖片.png

- 1.7 第七步

圖片.png

都填寫完記得保存,然后回到上一個頁面

- 1.8 第八步

圖片.png

- 1.9 第九步

圖片.png

- 1.10 第十步

圖片.png

- 1.11 第十一步

圖片.png

- 1.12 第十二步

進行十二步的時候可能有些銀行通過蘋果這個方法查不到揍堕,就需要借助百度了料身,一定要準確查詢,否則會有問題衩茸。我這里推薦一個地址https://e.czbank.com/CORPORBANK/query_unionBank_index.jsp

圖片.png

- 1.13 第十三步

這一步需要注意的是惯驼,貨幣類型可能有歧義,看你是想收美元還是人民幣了递瑰,都說美元合適祟牲。不過,我做的時候為了避免事情抖部,還是選擇了CNY说贝,支持國產(chǎn)脆炎。還有一點厢漩,銀行賬號如果是對公的賬號,需要填寫公司的英文名稱尔觉,如果沒有的話俯萎,上拼音傲宜!然后點擊保存銀行信息就算ok了,然后退回到最開始的頁面!

圖片.png

- 1.14 第十四步

圖片.png

- 1.15 第十五步

圖片.png

- 1.16 第十六步

圖片.png

- 1.17 第十七步

圖片.png

- 1.18 第十八步

圖片.png

- 1.19 第十九步

這里要注意的是夫啊,雖然這個頁面看起來要填寫的信息很多函卒,其實很多都沒有什么卵用,都是對于美國那邊什么法律需要配合的那些撇眯,一般咱們都不用报嵌,只需要把該勾選的地方勾選,然后提交就好了


圖片.png

- 1.20 第二十步

圖片.png

- 1.21 第二十一步

圖片.png

- 1.22 第二十二步

圖片.png


第二部分 熊榛,創(chuàng)建內(nèi)購項目

- 2.1 第一步

圖片.png

- 2.2 第二步

圖片.png

- 2.3 第三步

圖片.png

- 2.4 第四步

圖片.png

- 2.5 第五步

圖片.png

- 2.6 第六步

圖片.png

到這里內(nèi)購商品添加完成【新版界面可能有所不同锚国,但功能是一致的】

第三部分 添加內(nèi)購測試帳號

- 3.1 第一步

圖片.png

- 3.2 第二步

記住不能是用戶使用過的的AppleID帳號!不然無效···


圖片.png

第四部分玄坦,客戶端代碼集成部分血筑!

在工程中添加 storeKit 庫

圖片.png
#import <StoreKit/StoreKit.h>
enum
{
    IAP0p20=20,
    IAP1p100,
    IAP4p600,
    IAP9p1000,
    IAP24p6000,
}buyCoinsTag;

//代理
@interface RechargeVC : UIViewController <SKPaymentTransactionObserver,SKProductsRequestDelegate >
{
         int buyType;
}
- (void) requestProUpgradeProductData;
- (void) RequestProductData;-(void)buy:(int)type;
- (void) paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions;
- (void) PurchasedTransaction: (SKPaymentTransaction *)transaction;
- (void) completeTransaction: (SKPaymentTransaction *)transaction;
- (void) failedTransaction: (SKPaymentTransaction *)transaction;
- (void) paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentTransaction *)transaction;
- (void) paymentQueue:(SKPaymentQueue *) paymentQueue restoreCompletedTransactionsFailedWithError:(NSError *)error;
- (void) restoreTransaction: (SKPaymentTransaction *)transaction;
- (void) provideContent:(NSString *)product;
- (void) recordTransaction:(NSString *)product;
@end

然后看.m文件
#import "RechargeVC.h"http://在內(nèi)購項目中創(chuàng)的商品單號
#define ProductID_IAP0p20 @"Nada.JPYF01"http://20
#define ProductID_IAP1p100 @"Nada.JPYF02" //100
#define ProductID_IAP4p600 @"Nada.JPYF03" //600
#define ProductID_IAP9p1000 @"Nada.JPYF04" //1000
#define ProductID_IAP24p6000 @"Nada.JPYF05" //6000
@interface RechargeVC ()
@end@implementation RechargeVC
- (void)viewDidLoad
 { 
     [super viewDidLoad];
     [[SKPaymentQueue defaultQueue] addTransactionObserver:self];
     [self buy:IAP0p20];
}
-(void)buy:(int)type
{
     buyType = type; 
     if ([SKPaymentQueue canMakePayments]) 
     { 
            [self RequestProductData]; 
            NSLog(@"允許程序內(nèi)付費購買");
      }
      else
      { 
             NSLog(@"不允許程序內(nèi)付費購買"); 
             UIAlertView *alerView = [[UIAlertView alloc] initWithTitle:@"提示" message:@"您的手機沒有打開程序內(nèi)付費購買" delegate:nil cancelButtonTitle:NSLocalizedString(@"關(guān)閉",nil) otherButtonTitles:nil];
             [alerView show];
        }
}
-(void)RequestProductData
{ 
      NSLog(@"---------請求對應的產(chǎn)品信息------------");
      NSArray *product = nil; 
      switch (buyType) 
      { 
            case IAP0p20: product=[[NSArray alloc]  initWithObjects:ProductID_IAP0p20,nil];
            break; 
     
            case IAP1p100: product=[[NSArray alloc] initWithObjects:ProductID_IAP1p100,nil];
            break; 

            case IAP4p600: product=[[NSArray alloc] initWithObjects:ProductID_IAP4p600,nil]; 
            break; 

            case IAP9p1000: product=[[NSArray alloc] initWithObjects:ProductID_IAP9p1000,nil]; 
            break; 

            case IAP24p6000: product=[[NSArray alloc] initWithObjects:ProductID_IAP24p6000,nil];
            break; 

            default: break;
       } 
     NSSet *nsset = [NSSet setWithArray:product]; SKProductsRequest *request=[[SKProductsRequest alloc] initWithProductIdentifiers: nsset]; 
     request.delegate=self; 
[request start];}
//<SKProductsRequestDelegate> 請求協(xié)議//收到的產(chǎn)品信息

- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response
{ 
        NSLog(@"-----------收到產(chǎn)品反饋信息--------------"); 

        NSArray *myProduct = response.products; 
        NSLog(@"產(chǎn)品Product ID:%@",response.invalidProductIdentifiers); 
        NSLog(@"產(chǎn)品付費數(shù)量: %d", (int)[myProduct count]); 
       // populate UI 

        for(SKProduct *product in myProduct)
        {  
             NSLog(@"product info"); 
             NSLog(@"SKProduct 描述信息%@", [product description]);        
             NSLog(@"產(chǎn)品標題 %@" , product.localizedTitle); 
             NSLog(@"產(chǎn)品描述信息: %@" , product.localizedDescription); 
             NSLog(@"價格: %@" , product.price); 
             NSLog(@"Product id: %@" , product.productIdentifier);
         } 
        SKPayment *payment = nil; 
        switch (buyType) 
        { 
              case IAP0p20: payment = [SKPayment paymentWithProductIdentifier:ProductID_IAP0p20]; 
              //支付20        
              break;  
              
              case IAP1p100: payment = [SKPayment paymentWithProductIdentifier:ProductID_IAP1p100]; 
             //支付108           
              break; 
          
             case IAP4p600: payment = [SKPayment paymentWithProductIdentifier:ProductID_IAP4p600]; 
             //支付618 
             break; 
          
             case IAP9p1000: payment = [SKPayment paymentWithProductIdentifier:ProductID_IAP9p1000]; 
            //支付1048 
            break; 

            case IAP24p6000: payment = [SKPayment paymentWithProductIdentifier:ProductID_IAP24p6000]; 
             //支付5898 
             break; 
           
             default: break;
           } 
          NSLog(@"---------發(fā)送購買請求------------");   

          [[SKPaymentQueue defaultQueue] addPayment:payment];
}


- (void)requestProUpgradeProductData
{ 
       NSLog(@"------請求升級數(shù)據(jù)---------");
       NSSet *productIdentifiers = [NSSet setWithObject:@"com.productid"]; 
       SKProductsRequest* productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:productIdentifiers];   
       productsRequest.delegate = self;  
       [productsRequest start];
}

//彈出錯誤信息
- (void)request:(SKRequest *)request didFailWithError:(NSError *)error
{ 
         NSLog(@"-------彈出錯誤信息----------"); 
         UIAlertView *alerView = [[UIAlertView alloc]initWithTitle:NSLocalizedString(@"Alert",NULL) message:[error localizedDescription] delegate:nil cancelButtonTitle:NSLocalizedString(@"Close",nil) otherButtonTitles:nil];
         [alerView show];
}

-(void) requestDidFinish:(SKRequest *)request
{ 
        NSLog(@"----------反饋信息結(jié)束--------------");
}

-(void) PurchasedTransaction: (SKPaymentTransaction *)transaction
{  
        NSLog(@"-----PurchasedTransaction----");
        NSArray *transactions =[[NSArray alloc] initWithObjects:transaction, nil];
       [self paymentQueue:[SKPaymentQueue defaultQueue] updatedTransactions:transactions];
}
//<SKPaymentTransactionObserver>千萬不要忘記綁定,代碼如下://----監(jiān)聽購買結(jié)果
//[[SKPaymentQueue defaultQueue] addTransactionObserver:self];

//交易結(jié)果
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
{
         NSLog(@"-----paymentQueue--------"); 
          for (SKPaymentTransaction *transaction in transactions) 
         { 
               switch (transaction.transactionState)
              {  
                     case SKPaymentTransactionStatePurchased:
                     {
                           //交易完成 
                           [self completeTransaction:transaction];       

                           NSLog(@"-----交易完成 --------"); 
                           UIAlertView *alerView = [[UIAlertView alloc] initWithTitle:@"" message:@"購買成功" delegate:nil cancelButtonTitle:NSLocalizedString(@"關(guān)閉",nil) otherButtonTitles:nil]; [alerView show];
                       }
                      break; 
           
                     case SKPaymentTransactionStateFailed://交易失敗 
                     {
                           [self failedTransaction:transaction]; 
                           NSLog(@"-----交易失敗 --------"); 
                           UIAlertView *alerView2 = [[UIAlertView alloc] initWithTitle:@"提示" message:@"購買失敗,請重新嘗試購買" delegate:nil cancelButtonTitle:NSLocalizedString(@"關(guān)閉",nil) otherButtonTitles:nil];
                            [alerView2 show];
                      }
                      break;
 
                     case SKPaymentTransactionStateRestored:
                     {
                              //已經(jīng)購買過該商品 
                              [self restoreTransaction:transaction];
                              NSLog(@"-----已經(jīng)購買過該商品 --------");
                     }
                  
                   case SKPaymentTransactionStatePurchasing: 
                  {
                            //商品添加進列表 NSLog(@"-----商品添加進列表 --------");
                   }
                   break; 
                  
                   default: 
                    break; 

                } 
         }
}

- (void) completeTransaction: (SKPaymentTransaction *)transaction
{ 
          NSLog(@"-----completeTransaction--------"); // Your application should implement these two methods. 
          NSString *product = transaction.payment.productIdentifier;  
          if ([product length] > 0)
           { 
                  NSArray *tt = [product componentsSeparatedByString:@"."]; 
                  NSString *bookid = [tt lastObject]; 
                   if ([bookid length] > 0) 
                   {
                          [self recordTransaction:bookid]; 
                          [self provideContent:bookid];
                    }
            } 
// Remove the transaction from the payment queue. 

         [[SKPaymentQueue defaultQueue] finishTransaction: transaction];
}

//記錄交易
-(void)recordTransaction:(NSString *)product
{ 
               NSLog(@"-----記錄交易--------");
}

//處理下載內(nèi)容
-(void)provideContent:(NSString *)product
{ 
          NSLog(@"-----下載--------");
}

- (void) failedTransaction: (SKPaymentTransaction *)transaction
{ 
            NSLog(@"失敗"); 
           if (transaction.error.code != SKErrorPaymentCancelled) 
           { } 
            [[SKPaymentQueue defaultQueue] finishTransaction: transaction];
}

-(void) paymentQueueRestoreCompletedTransactionsFinished: (SKPaymentTransaction *)transaction{
} 

- (void) restoreTransaction: (SKPaymentTransaction *)transaction
{ 
           NSLog(@" 交易恢復處理");
}


-(void) paymentQueue:(SKPaymentQueue *) paymentQueue restoreCompletedTransactionsFailedWithError:(NSError *)error
{ 
              NSLog(@"-------paymentQueue----");
}

#pragma mark connection delegate

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{ 
              NSLog(@"%@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection{
}

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{  
          switch([(NSHTTPURLResponse *)response statusCode])
          { 
                   case 200: 
                   case 206: break; 
                   case 304: break; 
                   case 400: break; 
                   case 404: break;
                   case 416: break; 
                   case 403: break; 
                   case 401: 
                   case 500: break; 
                   default: break; 
         }
}


- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
 { 
          NSLog(@"test");
}

-(void)dealloc
{
           //解除監(jiān)聽
           [[SKPaymentQueue defaultQueue] removeTransactionObserver:self]; 


}

@end



最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末豺总,一起剝皮案震驚了整個濱河市梆砸,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌园欣,老刑警劉巖帖世,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異沸枯,居然都是意外死亡日矫,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門绑榴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來哪轿,“玉大人,你說我怎么就攤上這事翔怎∏运撸” “怎么了?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵赤套,是天一觀的道長飘痛。 經(jīng)常有香客問我,道長容握,這世上最難降的妖魔是什么宣脉? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮剔氏,結(jié)果婚禮上塑猖,老公的妹妹穿的比我還像新娘。我一直安慰自己谈跛,他們只是感情好羊苟,可當我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著感憾,像睡著了一般蜡励。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上吹菱,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天巍虫,我揣著相機與錄音彭则,去河邊找鬼鳍刷。 笑死,一個胖子當著我的面吹牛俯抖,可吹牛的內(nèi)容都是我干的输瓜。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼尤揣!你這毒婦竟也來了搔啊?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤北戏,失蹤者是張志新(化名)和其女友劉穎负芋,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嗜愈,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡旧蛾,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了蠕嫁。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片锨天。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖剃毒,靈堂內(nèi)的尸體忽然破棺而出病袄,到底是詐尸還是另有隱情,我是刑警寧澤赘阀,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布益缠,位于F島的核電站,受9級特大地震影響基公,放射性物質(zhì)發(fā)生泄漏左刽。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一酌媒、第九天 我趴在偏房一處隱蔽的房頂上張望欠痴。 院中可真熱鬧,春花似錦秒咨、人聲如沸喇辽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽菩咨。三九已至,卻和暖如春陡厘,著一層夾襖步出監(jiān)牢的瞬間抽米,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工糙置, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留云茸,地道東北人。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓谤饭,卻偏偏與公主長得像标捺,于是被迫代替她去往敵國和親懊纳。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 陳氏太極拳老架一路講義 前言 寫給喜愛太極拳的武術(shù)朋友們 中華武術(shù)亡容,源遠流長嗤疯,今雖門派繁多,實一脈相承闺兢。太極拳以它...
    阿德樂閱讀 5,585評論 0 12
  • 做了很多電商的項目了茂缚,都在用各大第三方支付,作為一名iOS開發(fā)屋谭,蘋果已經(jīng)在強制推行內(nèi)購了阱佛,所以,你不得不了解一下啦...
    Xcode_6閱讀 1,182評論 0 0
  • 最全的內(nèi)購圖文教程戴而,首先是填各種資料凑术,最后是代碼,廢話不多說所意,直接上圖 =====================...
    Kean_Qi閱讀 625評論 0 2
  • 花了38小時扶踊,我終于把字練好了泄鹏! 我就是看到這則廣告,才進了某練字中心秧耗。 經(jīng)一再確認38小時無誤后我抱著速成的態(tài)度...
    陪娃跑馬拉松閱讀 11,590評論 0 0
  • [語音交互] Crazy推薦理由:現(xiàn)在關(guān)注語音交互的企業(yè)越來越多分井,雖說語音基本已經(jīng)成為下一個流量的風口车猬,但是在技術(shù)...
    CoverUER閱讀 274評論 0 2