SlideShare uma empresa Scribd logo
1 de 21
Baixar para ler offline
StoreKit

    2011/10/30
    saku2saku
- (void)viewDidLoad {
! if ([SKPaymentQueue canMakePayments]) {

!   !
!   !  NSSet *itemIdentifiersSet = [NSSet setWithObjects:
!   !  ! ! ! ! ! ! !            ITEM_IDENTIFIER_1,ITEM_IDENTIFIER_2,
!   !  ! ! ! ! ! ! !            ITEM_IDENTIFIER_3,ITEM_IDENTIFIER_4,
!   !  ! ! ! ! ! ! !            ITEM_IDENTIFIER_5,
!   !  ! ! ! ! ! ! !            nil];
!   !  SKProductsRequest *request = [[SKProductsRequest alloc]
                      initWithProductIdentifiers:itemIdentifiersSet];
! !    request.delegate = self;
! !    [request start];
! } else {
! !    UIAlertView *alertView = [[[UIAlertView alloc] init]
autorelease];

! !     [alertView show];
! }
}
#pragma mark -
#pragma mark SKProductsRequestDelegate

-   (void) productsRequest:(SKProductsRequest *)request
!      didReceiveResponse:(SKProductsResponse *)response {
!    for (SKProduct *product in response.products) {
!    !   [itemIdentifiers addObject:product];
!    }
!    [request autorelease];
!    [loadingView removeFromSuperview];
!    [self.tableView reloadData];
}
observer = [[ProductBuyingObserver alloc] init];
! [[SKPaymentQueue defaultQueue] addTransactionObserver:observer];


                                 or
! [[SKPaymentQueue defaultQueue] addTransactionObserver: self];
-   (void) pushBuyButton {
!    LOG_DEBUG(@"buy :%@", itemIdentifier);
!    SKPayment *payment = [SKPayment paymentWithProductIdentifier:itemIdentifier];
!    [[SKPaymentQueue defaultQueue] addPayment:payment];
}
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:
(NSArray *)transactions {
! for (SKPaymentTransaction *transaction in transactions) {
! !    switch (transaction.transactionState) {
! !    ! case SKPaymentTransactionStatePurchasing:
             !//
! !     !   ! break;! ! ! !
! !     !   case SKPaymentTransactionStatePurchased:
               !
               //
! !     !   ! break;
! !     !   case SKPaymentTransactionStateFailed:
               !
               //
! !     !   ! break;
! !     !   case SKPaymentTransactionStateRestored:
               !
               //
!   !   !   ! break;
!   !   !   default:
!   !   !   ! break;
!   !   }
!   }
}
!   !   case 2:
!   !   {
!   !   ! if ([SKPaymentQueue canMakePayments]) {
!   !   ! ! [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
!   !   ! ! [[SKPaymentQueue defaultQueue] restoreCompletedTransactions];
!   !   ! } else {
!   !   ! ! UIAlertView *alertView = [[[UIAlertView alloc] init] autorelease];

! !     !   !   [alertView show];
! !     !   }

! !     !   break;
! !     }
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:
(NSArray *)transactions {
! for (SKPaymentTransaction *transaction in transactions) {
! !    switch (transaction.transactionState) {
! !    ! case SKPaymentTransactionStatePurchasing:
             !//
! !     !   ! break;! ! ! !
! !     !   case SKPaymentTransactionStatePurchased:
               !
               //
! !     !   ! break;
! !     !   case SKPaymentTransactionStateFailed:
               !
               //
! !     !   ! break;
! !     !   case SKPaymentTransactionStateRestored:
               !
               //
!   !   !   ! break;
!   !   !   default:
!   !   !   ! break;
!   !   }
!   }
}
- (void) paymentQueueRestoreCompletedTransactionsFinished: (SKPaymentQueue *) queue {
! [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;

! [alertView show];
! LOG_DEBUG(@"method called!");
}




- (void) paymentQueue:(SKPaymentQueue *)queue
restoreCompletedTransactionsFailedWithError:(NSError *) error {
! [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;

! [alertView show];
! LOG_DEBUG(@"method called!");
}
{
! "signature" = "AkWUo       ";
! "purchase-info" = "ewoJI        ";
! "environment" = "Sandbox";
! "pod" = "100";
! "signing-status" = "0";
}
{
!   "item-id" = "471702051";
!   "original-transaction-id" = "1000000010942512";
!   "purchase-date" = "2011-10-23 07:15:02 Etc/GMT";
!   "product-id" = "com.comitter.sampleapp.sample3";
!   "transaction-id" = "1000000010942512";
!   "quantity" = "1";
!   "original-purchase-date" = "2011-10-23 07:15:02 Etc/GMT";
!   "bid" = "com.comitter.sample2";
!   "bvrs" = "1.0";
}
20111030i phonedeveloperworkshoppublished

Mais conteúdo relacionado

Mais procurados

AngularJS Routing
AngularJS RoutingAngularJS Routing
AngularJS RoutingEyal Vardi
 
Workshop 12: AngularJS Parte I
Workshop 12: AngularJS Parte IWorkshop 12: AngularJS Parte I
Workshop 12: AngularJS Parte IVisual Engineering
 
Performance Optimization In Angular 2
Performance Optimization In Angular 2Performance Optimization In Angular 2
Performance Optimization In Angular 2Eyal Vardi
 
Angular 2.0 forms
Angular 2.0 formsAngular 2.0 forms
Angular 2.0 formsEyal Vardi
 
AngularJS Internal
AngularJS InternalAngularJS Internal
AngularJS InternalEyal Vardi
 
Modules and injector
Modules and injectorModules and injector
Modules and injectorEyal Vardi
 
Template syntax in Angular 2.0
Template syntax in Angular 2.0Template syntax in Angular 2.0
Template syntax in Angular 2.0Eyal Vardi
 
Http Communication in Angular 2.0
Http Communication in Angular 2.0Http Communication in Angular 2.0
Http Communication in Angular 2.0Eyal Vardi
 
Workshop 5: JavaScript testing
Workshop 5: JavaScript testingWorkshop 5: JavaScript testing
Workshop 5: JavaScript testingVisual Engineering
 
AngularJS Animations
AngularJS AnimationsAngularJS Animations
AngularJS AnimationsEyal Vardi
 
AngularJS - $http & $resource Services
AngularJS - $http & $resource ServicesAngularJS - $http & $resource Services
AngularJS - $http & $resource ServicesEyal Vardi
 
Angular 2 - Ahead of-time Compilation
Angular 2 - Ahead of-time CompilationAngular 2 - Ahead of-time Compilation
Angular 2 - Ahead of-time CompilationEyal Vardi
 
Component lifecycle hooks in Angular 2.0
Component lifecycle hooks in Angular 2.0Component lifecycle hooks in Angular 2.0
Component lifecycle hooks in Angular 2.0Eyal Vardi
 
Learn You a Functional JavaScript for Great Good
Learn You a Functional JavaScript for Great GoodLearn You a Functional JavaScript for Great Good
Learn You a Functional JavaScript for Great GoodMike Harris
 
AngularJS Services
AngularJS ServicesAngularJS Services
AngularJS ServicesEyal Vardi
 
정오의 데이트 for iOS 코드 정리
정오의 데이트 for iOS 코드 정리정오의 데이트 for iOS 코드 정리
정오의 데이트 for iOS 코드 정리태준 김
 
Dart and AngularDart
Dart and AngularDartDart and AngularDart
Dart and AngularDartLoc Nguyen
 

Mais procurados (20)

AngularJS Routing
AngularJS RoutingAngularJS Routing
AngularJS Routing
 
Workshop 12: AngularJS Parte I
Workshop 12: AngularJS Parte IWorkshop 12: AngularJS Parte I
Workshop 12: AngularJS Parte I
 
Performance Optimization In Angular 2
Performance Optimization In Angular 2Performance Optimization In Angular 2
Performance Optimization In Angular 2
 
Angular 2.0 forms
Angular 2.0 formsAngular 2.0 forms
Angular 2.0 forms
 
AngularJS Internal
AngularJS InternalAngularJS Internal
AngularJS Internal
 
Modules and injector
Modules and injectorModules and injector
Modules and injector
 
Template syntax in Angular 2.0
Template syntax in Angular 2.0Template syntax in Angular 2.0
Template syntax in Angular 2.0
 
RSpec
RSpecRSpec
RSpec
 
Excellent
ExcellentExcellent
Excellent
 
Http Communication in Angular 2.0
Http Communication in Angular 2.0Http Communication in Angular 2.0
Http Communication in Angular 2.0
 
Rails is not just Ruby
Rails is not just RubyRails is not just Ruby
Rails is not just Ruby
 
Workshop 5: JavaScript testing
Workshop 5: JavaScript testingWorkshop 5: JavaScript testing
Workshop 5: JavaScript testing
 
AngularJS Animations
AngularJS AnimationsAngularJS Animations
AngularJS Animations
 
AngularJS - $http & $resource Services
AngularJS - $http & $resource ServicesAngularJS - $http & $resource Services
AngularJS - $http & $resource Services
 
Angular 2 - Ahead of-time Compilation
Angular 2 - Ahead of-time CompilationAngular 2 - Ahead of-time Compilation
Angular 2 - Ahead of-time Compilation
 
Component lifecycle hooks in Angular 2.0
Component lifecycle hooks in Angular 2.0Component lifecycle hooks in Angular 2.0
Component lifecycle hooks in Angular 2.0
 
Learn You a Functional JavaScript for Great Good
Learn You a Functional JavaScript for Great GoodLearn You a Functional JavaScript for Great Good
Learn You a Functional JavaScript for Great Good
 
AngularJS Services
AngularJS ServicesAngularJS Services
AngularJS Services
 
정오의 데이트 for iOS 코드 정리
정오의 데이트 for iOS 코드 정리정오의 데이트 for iOS 코드 정리
정오의 데이트 for iOS 코드 정리
 
Dart and AngularDart
Dart and AngularDartDart and AngularDart
Dart and AngularDart
 

Destaque

20120616i phonedeveloperworkshop
20120616i phonedeveloperworkshop20120616i phonedeveloperworkshop
20120616i phonedeveloperworkshopYoichiro Sakurai
 
20120219i phonedeveloperworkshoppublished
20120219i phonedeveloperworkshoppublished20120219i phonedeveloperworkshoppublished
20120219i phonedeveloperworkshoppublishedYoichiro Sakurai
 
20120826i phonedeveloperworkshop
20120826i phonedeveloperworkshop20120826i phonedeveloperworkshop
20120826i phonedeveloperworkshopYoichiro Sakurai
 
20120422i phonedeveloperworkshoppublished
20120422i phonedeveloperworkshoppublished20120422i phonedeveloperworkshoppublished
20120422i phonedeveloperworkshoppublishedYoichiro Sakurai
 
CoreDataをバックグラウンドで扱うためのTips
CoreDataをバックグラウンドで扱うためのTipsCoreDataをバックグラウンドで扱うためのTips
CoreDataをバックグラウンドで扱うためのTipsYohei Yamaguchi
 
XcodeのTargetについてのTIPS
XcodeのTargetについてのTIPSXcodeのTargetについてのTIPS
XcodeのTargetについてのTIPSYoichiro Sakurai
 
CoreData 非同期データ処理
CoreData 非同期データ処理CoreData 非同期データ処理
CoreData 非同期データ処理次朗 永島
 
javascript を Xcode でテスト
javascript を Xcode でテストjavascript を Xcode でテスト
javascript を Xcode でテストYoichiro Sakurai
 

Destaque (8)

20120616i phonedeveloperworkshop
20120616i phonedeveloperworkshop20120616i phonedeveloperworkshop
20120616i phonedeveloperworkshop
 
20120219i phonedeveloperworkshoppublished
20120219i phonedeveloperworkshoppublished20120219i phonedeveloperworkshoppublished
20120219i phonedeveloperworkshoppublished
 
20120826i phonedeveloperworkshop
20120826i phonedeveloperworkshop20120826i phonedeveloperworkshop
20120826i phonedeveloperworkshop
 
20120422i phonedeveloperworkshoppublished
20120422i phonedeveloperworkshoppublished20120422i phonedeveloperworkshoppublished
20120422i phonedeveloperworkshoppublished
 
CoreDataをバックグラウンドで扱うためのTips
CoreDataをバックグラウンドで扱うためのTipsCoreDataをバックグラウンドで扱うためのTips
CoreDataをバックグラウンドで扱うためのTips
 
XcodeのTargetについてのTIPS
XcodeのTargetについてのTIPSXcodeのTargetについてのTIPS
XcodeのTargetについてのTIPS
 
CoreData 非同期データ処理
CoreData 非同期データ処理CoreData 非同期データ処理
CoreData 非同期データ処理
 
javascript を Xcode でテスト
javascript を Xcode でテストjavascript を Xcode でテスト
javascript を Xcode でテスト
 

Semelhante a 20111030i phonedeveloperworkshoppublished

关于Iap程序类购买使用说明
关于Iap程序类购买使用说明关于Iap程序类购买使用说明
关于Iap程序类购买使用说明linuxagui
 
Turn your spaghetti code into ravioli with JavaScript modules
Turn your spaghetti code into ravioli with JavaScript modulesTurn your spaghetti code into ravioli with JavaScript modules
Turn your spaghetti code into ravioli with JavaScript modulesjerryorr
 
Working with AFNetworking
Working with AFNetworkingWorking with AFNetworking
Working with AFNetworkingwaynehartman
 
Unit Testing: Special Cases
Unit Testing: Special CasesUnit Testing: Special Cases
Unit Testing: Special CasesCiklum Ukraine
 
Conceitos e prática no desenvolvimento iOS - Mobile Conf 2014
Conceitos e prática no desenvolvimento iOS - Mobile Conf 2014Conceitos e prática no desenvolvimento iOS - Mobile Conf 2014
Conceitos e prática no desenvolvimento iOS - Mobile Conf 2014Fábio Pimentel
 
Leaving Interface Builder Behind
Leaving Interface Builder BehindLeaving Interface Builder Behind
Leaving Interface Builder BehindJohn Wilker
 
Xamarin: Introduction to iOS 8
Xamarin: Introduction to iOS 8Xamarin: Introduction to iOS 8
Xamarin: Introduction to iOS 8Xamarin
 
Formacion en movilidad: Conceptos de desarrollo en iOS (III)
Formacion en movilidad: Conceptos de desarrollo en iOS (III) Formacion en movilidad: Conceptos de desarrollo en iOS (III)
Formacion en movilidad: Conceptos de desarrollo en iOS (III) Mobivery
 
What's new in iOS 7
What's new in iOS 7What's new in iOS 7
What's new in iOS 7barcelonaio
 
iOS for ERREST - alternative version
iOS for ERREST - alternative versioniOS for ERREST - alternative version
iOS for ERREST - alternative versionWO Community
 
FrontInBahia 2014: 10 dicas de desempenho para apps mobile híbridas
FrontInBahia 2014: 10 dicas de desempenho para apps mobile híbridasFrontInBahia 2014: 10 dicas de desempenho para apps mobile híbridas
FrontInBahia 2014: 10 dicas de desempenho para apps mobile híbridasLoiane Groner
 
Javascript MVC & Backbone Tips & Tricks
Javascript MVC & Backbone Tips & TricksJavascript MVC & Backbone Tips & Tricks
Javascript MVC & Backbone Tips & TricksHjörtur Hilmarsson
 
Swift Montevideo Meetup - iPhone, una herramienta medica
Swift Montevideo Meetup - iPhone, una herramienta medicaSwift Montevideo Meetup - iPhone, una herramienta medica
Swift Montevideo Meetup - iPhone, una herramienta medicaWashington Miranda
 
Swift Montevideo Meetup - iPhone, una herramienta medica
Swift Montevideo Meetup - iPhone, una herramienta medicaSwift Montevideo Meetup - iPhone, una herramienta medica
Swift Montevideo Meetup - iPhone, una herramienta medicaWashington Miranda
 
Beginning iphone 4_devlopement_chpter7_tab_b
Beginning iphone 4_devlopement_chpter7_tab_bBeginning iphone 4_devlopement_chpter7_tab_b
Beginning iphone 4_devlopement_chpter7_tab_bJihoon Kong
 

Semelhante a 20111030i phonedeveloperworkshoppublished (20)

关于Iap程序类购买使用说明
关于Iap程序类购买使用说明关于Iap程序类购买使用说明
关于Iap程序类购买使用说明
 
Turn your spaghetti code into ravioli with JavaScript modules
Turn your spaghetti code into ravioli with JavaScript modulesTurn your spaghetti code into ravioli with JavaScript modules
Turn your spaghetti code into ravioli with JavaScript modules
 
I os 11
I os 11I os 11
I os 11
 
JavaScript Promise
JavaScript PromiseJavaScript Promise
JavaScript Promise
 
Working with AFNetworking
Working with AFNetworkingWorking with AFNetworking
Working with AFNetworking
 
Unit Testing: Special Cases
Unit Testing: Special CasesUnit Testing: Special Cases
Unit Testing: Special Cases
 
Conceitos e prática no desenvolvimento iOS - Mobile Conf 2014
Conceitos e prática no desenvolvimento iOS - Mobile Conf 2014Conceitos e prática no desenvolvimento iOS - Mobile Conf 2014
Conceitos e prática no desenvolvimento iOS - Mobile Conf 2014
 
Leaving Interface Builder Behind
Leaving Interface Builder BehindLeaving Interface Builder Behind
Leaving Interface Builder Behind
 
Xamarin: Introduction to iOS 8
Xamarin: Introduction to iOS 8Xamarin: Introduction to iOS 8
Xamarin: Introduction to iOS 8
 
Formacion en movilidad: Conceptos de desarrollo en iOS (III)
Formacion en movilidad: Conceptos de desarrollo en iOS (III) Formacion en movilidad: Conceptos de desarrollo en iOS (III)
Formacion en movilidad: Conceptos de desarrollo en iOS (III)
 
What's new in iOS 7
What's new in iOS 7What's new in iOS 7
What's new in iOS 7
 
iOS for ERREST - alternative version
iOS for ERREST - alternative versioniOS for ERREST - alternative version
iOS for ERREST - alternative version
 
FrontInBahia 2014: 10 dicas de desempenho para apps mobile híbridas
FrontInBahia 2014: 10 dicas de desempenho para apps mobile híbridasFrontInBahia 2014: 10 dicas de desempenho para apps mobile híbridas
FrontInBahia 2014: 10 dicas de desempenho para apps mobile híbridas
 
Borrador del blog
Borrador del blogBorrador del blog
Borrador del blog
 
Javascript MVC & Backbone Tips & Tricks
Javascript MVC & Backbone Tips & TricksJavascript MVC & Backbone Tips & Tricks
Javascript MVC & Backbone Tips & Tricks
 
Swift Montevideo Meetup - iPhone, una herramienta medica
Swift Montevideo Meetup - iPhone, una herramienta medicaSwift Montevideo Meetup - iPhone, una herramienta medica
Swift Montevideo Meetup - iPhone, una herramienta medica
 
Swift Montevideo Meetup - iPhone, una herramienta medica
Swift Montevideo Meetup - iPhone, una herramienta medicaSwift Montevideo Meetup - iPhone, una herramienta medica
Swift Montevideo Meetup - iPhone, una herramienta medica
 
Service Workers
Service WorkersService Workers
Service Workers
 
Tdd iPhone For Dummies
Tdd iPhone For DummiesTdd iPhone For Dummies
Tdd iPhone For Dummies
 
Beginning iphone 4_devlopement_chpter7_tab_b
Beginning iphone 4_devlopement_chpter7_tab_bBeginning iphone 4_devlopement_chpter7_tab_b
Beginning iphone 4_devlopement_chpter7_tab_b
 

Mais de Yoichiro Sakurai

Objective-C/Swift コードの共用
Objective-C/Swift コードの共用Objective-C/Swift コードの共用
Objective-C/Swift コードの共用Yoichiro Sakurai
 
Xcode で gulp を使うお話
Xcode で gulp を使うお話Xcode で gulp を使うお話
Xcode で gulp を使うお話Yoichiro Sakurai
 
開発を加速させるRetty式チーム開発術 Reloaded
開発を加速させるRetty式チーム開発術 Reloaded開発を加速させるRetty式チーム開発術 Reloaded
開発を加速させるRetty式チーム開発術 ReloadedYoichiro Sakurai
 
チームを加速させるRetty式開発術
チームを加速させるRetty式開発術チームを加速させるRetty式開発術
チームを加速させるRetty式開発術Yoichiro Sakurai
 
1人でも頑張れる!Retty式開発環境
1人でも頑張れる!Retty式開発環境1人でも頑張れる!Retty式開発環境
1人でも頑張れる!Retty式開発環境Yoichiro Sakurai
 
NSInvocationの便利さとハマりどころ
NSInvocationの便利さとハマりどころNSInvocationの便利さとハマりどころ
NSInvocationの便利さとハマりどころYoichiro Sakurai
 
Google admobmediationで広告最適化
Google admobmediationで広告最適化Google admobmediationで広告最適化
Google admobmediationで広告最適化Yoichiro Sakurai
 
Crashlyticsでクラッシュ撲滅作戦
Crashlyticsでクラッシュ撲滅作戦Crashlyticsでクラッシュ撲滅作戦
Crashlyticsでクラッシュ撲滅作戦Yoichiro Sakurai
 
TestFlight自動化でらくらくチームテスト
TestFlight自動化でらくらくチームテストTestFlight自動化でらくらくチームテスト
TestFlight自動化でらくらくチームテストYoichiro Sakurai
 
20121028i phonedeveloperworkshop
20121028i phonedeveloperworkshop20121028i phonedeveloperworkshop
20121028i phonedeveloperworkshopYoichiro Sakurai
 
20120413 nestakabaneworkshop
20120413 nestakabaneworkshop20120413 nestakabaneworkshop
20120413 nestakabaneworkshopYoichiro Sakurai
 
20120316 designerworkshoppublished
20120316 designerworkshoppublished20120316 designerworkshoppublished
20120316 designerworkshoppublishedYoichiro Sakurai
 
20110424i phonedeveloperworkshoppublish
20110424i phonedeveloperworkshoppublish20110424i phonedeveloperworkshoppublish
20110424i phonedeveloperworkshoppublishYoichiro Sakurai
 

Mais de Yoichiro Sakurai (14)

Objective-C/Swift コードの共用
Objective-C/Swift コードの共用Objective-C/Swift コードの共用
Objective-C/Swift コードの共用
 
Xcode で gulp を使うお話
Xcode で gulp を使うお話Xcode で gulp を使うお話
Xcode で gulp を使うお話
 
開発を加速させるRetty式チーム開発術 Reloaded
開発を加速させるRetty式チーム開発術 Reloaded開発を加速させるRetty式チーム開発術 Reloaded
開発を加速させるRetty式チーム開発術 Reloaded
 
チームを加速させるRetty式開発術
チームを加速させるRetty式開発術チームを加速させるRetty式開発術
チームを加速させるRetty式開発術
 
1人でも頑張れる!Retty式開発環境
1人でも頑張れる!Retty式開発環境1人でも頑張れる!Retty式開発環境
1人でも頑張れる!Retty式開発環境
 
NSInvocationの便利さとハマりどころ
NSInvocationの便利さとハマりどころNSInvocationの便利さとハマりどころ
NSInvocationの便利さとハマりどころ
 
Google admobmediationで広告最適化
Google admobmediationで広告最適化Google admobmediationで広告最適化
Google admobmediationで広告最適化
 
Crashlyticsでクラッシュ撲滅作戦
Crashlyticsでクラッシュ撲滅作戦Crashlyticsでクラッシュ撲滅作戦
Crashlyticsでクラッシュ撲滅作戦
 
TestFlight自動化でらくらくチームテスト
TestFlight自動化でらくらくチームテストTestFlight自動化でらくらくチームテスト
TestFlight自動化でらくらくチームテスト
 
20130216 workshop
20130216 workshop20130216 workshop
20130216 workshop
 
20121028i phonedeveloperworkshop
20121028i phonedeveloperworkshop20121028i phonedeveloperworkshop
20121028i phonedeveloperworkshop
 
20120413 nestakabaneworkshop
20120413 nestakabaneworkshop20120413 nestakabaneworkshop
20120413 nestakabaneworkshop
 
20120316 designerworkshoppublished
20120316 designerworkshoppublished20120316 designerworkshoppublished
20120316 designerworkshoppublished
 
20110424i phonedeveloperworkshoppublish
20110424i phonedeveloperworkshoppublish20110424i phonedeveloperworkshoppublish
20110424i phonedeveloperworkshoppublish
 

20111030i phonedeveloperworkshoppublished

  • 1. StoreKit 2011/10/30 saku2saku
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10. - (void)viewDidLoad { ! if ([SKPaymentQueue canMakePayments]) { ! ! ! ! NSSet *itemIdentifiersSet = [NSSet setWithObjects: ! ! ! ! ! ! ! ! ! ITEM_IDENTIFIER_1,ITEM_IDENTIFIER_2, ! ! ! ! ! ! ! ! ! ITEM_IDENTIFIER_3,ITEM_IDENTIFIER_4, ! ! ! ! ! ! ! ! ! ITEM_IDENTIFIER_5, ! ! ! ! ! ! ! ! ! nil]; ! ! SKProductsRequest *request = [[SKProductsRequest alloc] initWithProductIdentifiers:itemIdentifiersSet]; ! ! request.delegate = self; ! ! [request start]; ! } else { ! ! UIAlertView *alertView = [[[UIAlertView alloc] init] autorelease]; ! ! [alertView show]; ! } }
  • 11. #pragma mark - #pragma mark SKProductsRequestDelegate - (void) productsRequest:(SKProductsRequest *)request ! didReceiveResponse:(SKProductsResponse *)response { ! for (SKProduct *product in response.products) { ! ! [itemIdentifiers addObject:product]; ! } ! [request autorelease]; ! [loadingView removeFromSuperview]; ! [self.tableView reloadData]; }
  • 12. observer = [[ProductBuyingObserver alloc] init]; ! [[SKPaymentQueue defaultQueue] addTransactionObserver:observer]; or ! [[SKPaymentQueue defaultQueue] addTransactionObserver: self];
  • 13. - (void) pushBuyButton { ! LOG_DEBUG(@"buy :%@", itemIdentifier); ! SKPayment *payment = [SKPayment paymentWithProductIdentifier:itemIdentifier]; ! [[SKPaymentQueue defaultQueue] addPayment:payment]; }
  • 14. - (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions: (NSArray *)transactions { ! for (SKPaymentTransaction *transaction in transactions) { ! ! switch (transaction.transactionState) { ! ! ! case SKPaymentTransactionStatePurchasing: !// ! ! ! ! break;! ! ! ! ! ! ! case SKPaymentTransactionStatePurchased: ! // ! ! ! ! break; ! ! ! case SKPaymentTransactionStateFailed: ! // ! ! ! ! break; ! ! ! case SKPaymentTransactionStateRestored: ! // ! ! ! ! break; ! ! ! default: ! ! ! ! break; ! ! } ! } }
  • 15. ! ! case 2: ! ! { ! ! ! if ([SKPaymentQueue canMakePayments]) { ! ! ! ! [UIApplication sharedApplication].networkActivityIndicatorVisible = YES; ! ! ! ! [[SKPaymentQueue defaultQueue] restoreCompletedTransactions]; ! ! ! } else { ! ! ! ! UIAlertView *alertView = [[[UIAlertView alloc] init] autorelease]; ! ! ! ! [alertView show]; ! ! ! } ! ! ! break; ! ! }
  • 16. - (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions: (NSArray *)transactions { ! for (SKPaymentTransaction *transaction in transactions) { ! ! switch (transaction.transactionState) { ! ! ! case SKPaymentTransactionStatePurchasing: !// ! ! ! ! break;! ! ! ! ! ! ! case SKPaymentTransactionStatePurchased: ! // ! ! ! ! break; ! ! ! case SKPaymentTransactionStateFailed: ! // ! ! ! ! break; ! ! ! case SKPaymentTransactionStateRestored: ! // ! ! ! ! break; ! ! ! default: ! ! ! ! break; ! ! } ! } }
  • 17. - (void) paymentQueueRestoreCompletedTransactionsFinished: (SKPaymentQueue *) queue { ! [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; ! [alertView show]; ! LOG_DEBUG(@"method called!"); } - (void) paymentQueue:(SKPaymentQueue *)queue restoreCompletedTransactionsFailedWithError:(NSError *) error { ! [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; ! [alertView show]; ! LOG_DEBUG(@"method called!"); }
  • 18.
  • 19. { ! "signature" = "AkWUo "; ! "purchase-info" = "ewoJI "; ! "environment" = "Sandbox"; ! "pod" = "100"; ! "signing-status" = "0"; }
  • 20. { ! "item-id" = "471702051"; ! "original-transaction-id" = "1000000010942512"; ! "purchase-date" = "2011-10-23 07:15:02 Etc/GMT"; ! "product-id" = "com.comitter.sampleapp.sample3"; ! "transaction-id" = "1000000010942512"; ! "quantity" = "1"; ! "original-purchase-date" = "2011-10-23 07:15:02 Etc/GMT"; ! "bid" = "com.comitter.sample2"; ! "bvrs" = "1.0"; }