מידע מורחב

  • תאריך
  • שעה 23:54
  • ע"י
  • צפיות 2499
  • תגובות 2
  • דירוג 5 /5

in-app purchase מה צריך לעשות כדי לאפשר למכור מתוך האפליקציה

May26
אז מה צריך לעשות על מנת לאפשר למכור את האפליקצייה מתוך האפליקצייה ולא ישירות.

קודם אני אתן דוגמא לצורך יש לי משחק שמכיל 250 שלבים כל 25 שלבים מוגדרים כמשחק חדש.
אז אני לא רוצה למכור את המשחק כולו כיחידה אחת אלא כל 25 שלבים כיחידה אז אני רוצה שהמשתמש יוריד חינם את המשחק ואחרי 3 שלבים ראשונים יופיע לו אופציה לקנות את המשחק ולאחרי זה כל יחידה נוספת.

אז מה עושים?

אז יש תהליך מסודר שבו אנו יכולים לבצע רכישה מתוך האפלקציה, היום נלמד איך.

תהליך הרכישה מתוך האפליקציה

הקישור עם AppStore מתבצע בעזרת StoreKit framework כחלק מה SDK הקיים.

אז נתחיל מזה שדבר ראשון אנו ניגשים לאתר של אפל אחרי תהליך הכניסה אנו בוחרים באופציה:

iTunes Connect

אחרי זה אנו נבחר

Manage Your Applications

אנחנו נוסיף אפלקציה חדשה על ידי לחיצת כפתור Add New App

נעבור את תהליך הרישום כמובן עדיין לא סיימנו את הצד של הקוד אבל אפשר לרשום מראש את האפלקציה בלי לעלות את האפלקציה עצמה.

אחרי שסימנו את התהליך אנחנו נראה את התמונה של האפליקציה החדשה שלנו, אנחנו נלחץ עליה ונכנס לדף ההגדרות של האפליקצייה.

שם נוכל לראות מספר אפשריות כגון:

אחת האפשריות היא

Manage In-App Purchases

נבחר באופציה הזאת מייד יופיע לנו כפתור בצד השמאלי העליון של הדף בשם

Create New

נלחץ עליו

ויופיע לנו דף חדש עם מספר אופציות:

1.Consumable

אופציה ראשונה מדברת על זה האפשרות של רכישה לשימוש חד פעמי (נגיד עיתון יומי).

2. Non-Consumable

אופציה שנייה מדברת על רכישה נגיד של שלבים במשחק לשימוש תמידי זאת אומרת אחרי שרכשנו השלבים האלו פתוחים לנו כל הזמן

3. Auto-Renewable Subscriptions

אופציה שלישית מדברת על אפלקציה שפתוחה לזמן מסוים, נגיד מנוי חודשי לראות CNBC.

4. Non-Renewing Subscription

אופציה רבעית הייתה בשימוש בעבר אך היום מומלץ להשתמש באופציה מספר שלוש שלמעשה מחליפה אותה,והיא בעלת מספר יתרונות.

טוב אז במקרה שלי שאני רוצה שייקנו שלבים חדשים במשחק אני אבחר באופציה השנייה Non-Consumable

מופיע לנו דף חדש אנחנו ניתן שמות:

Stage01 בתור Reference Name

Stage01 בתור Product ID

נוסיף שפה, במקרה שלי אנגלית.

Stage01 בתור Display Name

ונוסיף מספר מילים בתוך תיאור של המוצר.

נבחר סכום של כסף

ונוסיף תמונה שמסמלת את המוצר, או במקרה שלי סבביבת משחק חדשה(כל 25 שלבים)

נשמור את הדף וככה נוסיף עוד ועוד אפליקציות .

שסיימנו נבחר בכפתור

View or generate a shared secret

נייצר shared secret לשימוש עתידי נצטרך אותו בהמשך.


הנה דוגמא של מבנה של In App Purchase




InAppPurchaseDelegate.h



// ----------------------------------------------------------
// Do not use this example project as is. In order for it to 
// run on your connected test device via Xcode, you must first 
// customize the code with your own In-App Purchase Product IDs
// and other related app info. .
// ----------------------------------------------------------
// 

#import <UIKit/UIKit.h>

@class InAppPurchaseViewController;

@interface InAppPurchaseAppDelegate : NSObject <UIApplicationDelegate> {
    UIWindow *window;
    InAppPurchaseViewController *viewController;
}

@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet InAppPurchaseViewController *viewController;

@end





InAppPurchaseAppDelegate.m


// ----------------------------------------------------------
// Do not use this example project as is. In order for it to 
// run on your connected test device via Xcode, you must first 
// customize the code with your own In-App Purchase Product IDs
// and other related app info. .
// ----------------------------------------------------------
// 

#import "InAppPurchaseAppDelegate.h"
#import "InAppPurchaseViewController.h"

@implementation InAppPurchaseAppDelegate

@synthesize window;
@synthesize viewController;


- (void)applicationDidFinishLaunching:(UIApplication *)application {    
    
    [window addSubview:viewController.view];
    [window makeKeyAndVisible];
}


- (void)dealloc {
    [viewController release];
    [window release];
    [super dealloc];
}


@end




InAppPurchaseViewController.h



// ----------------------------------------------------------
// Do not use this example project as is. In order for it to 
// run on your connected test device via Xcode, you must first 
// customize the code with your own In-App Purchase Product IDs
// and other related app info. .
// ----------------------------------------------------------
// 

#import <UIKit/UIKit.h>
#import <StoreKit/StoreKit.h>
#import "InAppPurchaseObserver.h"

@interface InAppPurchaseViewController : UIViewController <SKProductsRequestDelegate> {
	InAppPurchaseObserver *inappObserver;	
	UIButton *inappButton;
}

@property (nonatomic, retain) InAppPurchaseObserver *inappObserver;
@property (nonatomic, retain) IBOutlet UIButton *inappButton;
-(IBAction)buyInApp:(id)sender;

@end





InAppPurchaseViewController.m



// ----------------------------------------------------------
// Do not use this example project as is. In order for it to 
// run on your connected test device via Xcode, you must first 
// customize the code with your own In-App Purchase Product IDs
// and other related app info. .
// ----------------------------------------------------------
// 

#import "InAppPurchaseViewController.h"

@implementation InAppPurchaseViewController
@synthesize inappObserver;
@synthesize inappButton;


// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
	
	inappObserver = [[InAppPurchaseObserver alloc] init];

	if ([SKPaymentQueue canMakePayments]) {
		// Yes, In-App Purchase is enabled on this device!
		// Proceed to fetch available In-App Purchase items.
		
		// Replace "Your IAP Product ID" with your actual In-App Purchase Product ID,
		// fetched from either a remote server or stored locally within your app. 
		SKProductsRequest *prodRequest= [[SKProductsRequest alloc] initWithProductIdentifiers: [NSSet setWithObject: @"Your IAP Product ID"]];
		prodRequest.delegate = self;
		[prodRequest start];
		
	} else {
		// Notify user that In-App Purchase is disabled via button text.
		[inappButton setTitle:@"In-App Purchase is Disabled" forState:UIControlStateNormal];
		inappButton.enabled = NO;
	}	
	
    [super viewDidLoad];
}

// Store Kit returns a response from an SKProductsRequest.
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response {

	// Populate the inappBuy button with the received product info.
	SKProduct *validProduct = nil;
	int count = [response.products count];
	if (count>0) {
		validProduct = [response.products objectAtIndex:0];
	}
	if (!validProduct) {
		[inappButton setTitle:@"No Products Available" forState:UIControlStateNormal];
		inappButton.enabled = NO;
		return;
	}
	
	NSString *buttonText = [[NSString alloc] initWithFormat:@"%@ - Buy %@", validProduct.localizedTitle, validProduct.price];
	[inappButton setTitle:buttonText forState:UIControlStateNormal];
	inappButton.enabled = YES;
	[buttonText release];
}

// When the buy button is clicked, start In-App Purchase process.
-(IBAction)buyInApp:(id)sender {
	
	// Replace "Your IAP Product ID" with your actual In-App Purchase Product ID.
	SKPayment *paymentRequest = [SKPayment paymentWithProductIdentifier: @"Your IAP Product ID"]; 

	// Assign an Observer class to the SKPaymentTransactionObserver,
	// so that it can monitor the transaction status.
	[[SKPaymentQueue defaultQueue] addTransactionObserver:inappObserver];
	
	// Request a purchase of the selected item.
	[[SKPaymentQueue defaultQueue] addPayment:paymentRequest];

}

- (void)didReceiveMemoryWarning {

    [super didReceiveMemoryWarning];
}

- (void)viewDidUnload {
	// Release any retained subviews of the main view.
	// e.g. self.myOutlet = nil;
}


- (void)dealloc {
	[inappButton release];
	[inappObserver release];
    [super dealloc];
}

@end




InAppPurchaseObserver.h



// ----------------------------------------------------------
// Do not use this example project as is. In order for it to 
// run on your connected test device via Xcode, you must first 
// customize the code with your own In-App Purchase Product IDs
// and other related app info. .
// ----------------------------------------------------------
//

#import <Foundation/Foundation.h>
#import <StoreKit/StoreKit.h>


@interface InAppPurchaseObserver : NSObject <SKPaymentTransactionObserver> {

}

- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions;

@end



InAppPurchaseObserver.m



// ----------------------------------------------------------
// Do not use this example project as is. In order for it to 
// run on your connected test device via Xcode, you must first 
// customize the code with your own In-App Purchase Product IDs
// and other related app info. .
// ----------------------------------------------------------
//

#import "InAppPurchaseObserver.h"
#import "InAppPurchaseViewController.h"

@implementation InAppPurchaseObserver

// The transaction status of the SKPaymentQueue is sent here.
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions {
	for(SKPaymentTransaction *transaction in transactions) {
		switch (transaction.transactionState) {
				
			case SKPaymentTransactionStatePurchasing:
				// Item is still in the process of being purchased
				break;
				
			case SKPaymentTransactionStatePurchased:
				// Item was successfully purchased!
				
				// --- UNLOCK FEATURE OR DOWNLOAD CONTENT HERE ---
				// The purchased item ID is accessible via 
				// transaction.payment.productIdentifier
				
				// After customer has successfully received purchased content,
				// remove the finished transaction from the payment queue.
				[[SKPaymentQueue defaultQueue] finishTransaction: transaction];
				break;
				
			case SKPaymentTransactionStateRestored:
				// Verified that user has already paid for this item.
				// Ideal for restoring item across all devices of this customer.
				
				// --- UNLOCK FEATURE OR DOWNLOAD CONTENT HERE ---
				// The purchased item ID is accessible via 
				// transaction.payment.productIdentifier
				
				// After customer has restored purchased content on this device,
				// remove the finished transaction from the payment queue.
				[[SKPaymentQueue defaultQueue] finishTransaction: transaction];
				break;
				
			case SKPaymentTransactionStateFailed:
				// Purchase was either cancelled by user or an error occurred.
				
				if (transaction.error.code != SKErrorPaymentCancelled) {
					// A transaction error occurred, so notify user.
				}
				// Finished transactions should be removed from the payment queue.
				[[SKPaymentQueue defaultQueue] finishTransaction: transaction];
				break;
		}
	}
}

@end





תיהנו
ערן גרוס
עדיין לא נרשמת לאתר ? לחץ כאן להרשמה מהירה
נא המתן...
דירוג
  1. אחלה מדריך כל הכבוד תודה רבה ;)
  2. תודה ערן :)
    אתה יודע אם יש תמיכה בישראל ל - Auto-Renewable Subscriptions ?


עליך להתחבר כדי להגיב. לחץ כאן להתחברות.