আপনি কীভাবে কোনও আইওএস অ্যাপ্লিকেশনটিতে একটি অ্যাপ্লিকেশন ক্রয় যুক্ত করবেন? সমস্ত বিবরণ কি এবং কোন নমুনা কোড আছে?
এটি আইওএস অ্যাপ্লিকেশনগুলিতে অ্যাপ্লিকেশন কেনাকাটাগুলি কীভাবে যুক্ত করা যায় তার জন্য এটি সমস্ত ধরণের ক্যাচ-হ'ল
আপনি কীভাবে কোনও আইওএস অ্যাপ্লিকেশনটিতে একটি অ্যাপ্লিকেশন ক্রয় যুক্ত করবেন? সমস্ত বিবরণ কি এবং কোন নমুনা কোড আছে?
এটি আইওএস অ্যাপ্লিকেশনগুলিতে অ্যাপ্লিকেশন কেনাকাটাগুলি কীভাবে যুক্ত করা যায় তার জন্য এটি সমস্ত ধরণের ক্যাচ-হ'ল
উত্তর:
এই প্রশ্নের জন্য সুইফ্ট ব্যবহারকারীরা আমার সুইফ্ট উত্তরটি পরীক্ষা করতে পারেন ।
অথবা, ইয়েদিয়া রিইসের উত্তরটি দেখুন , যা এই উদ্দেশ্য-সি কোডটিকে সুইফটে অনুবাদ করে।
এই উত্তরটির বাকি অংশটি উদ্দেশ্য-সিতে লেখা আছে
My Apps
যে অ্যাপ্লিকেশনটিতে ক্রয়টি যুক্ত করতে চান তার উপর ক্লিক করুনFeatures
শিরোনামটি ক্লিক করুন , এবং তারপরে In-App Purchases
বামে নির্বাচন করুন+
মাঝখানে আইকনটি ক্লিক করুনnon-consumable
। আপনি যদি ব্যবহারকারীর কাছে কোনও শারীরিক আইটেম প্রেরণ করতে যাচ্ছেন বা তাদের এমন কিছু উপহার দিয়েছেন যা তারা একাধিকবার কিনতে পারে, আপনি বেছে নিতে পারেন consumable
।tld.websitename.appname.referencename
এটি সবচেয়ে ভাল কাজ করবে, উদাহরণস্বরূপ, আপনি ব্যবহার করতে পারেনcom.jojodmo.blix.removeads
cleared for sale
1 (99 ¢) হিসাবে দাম স্তর নির্বাচন করুন এবং তারপরে চয়ন করুন । টায়ার 2 হবে $ 1.99, এবং স্তর 3 হবে $ 2.99। সম্পূর্ণ তালিকাটি যদি আপনি ক্লিক করেন তবে ক্লিক করুন যদি আপনি view pricing matrix
স্তর 1 ব্যবহার করার পরামর্শ দেন তবে এটি সর্বাধিক যে কেউ বিজ্ঞাপন সরাতে সবচেয়ে বেশি অর্থ প্রদান করবেন।add language
বোতামটি ক্লিক করুন এবং তথ্য ইনপুট করুন। এটি সমস্ত গ্রাহককে দেখানো হবে, তাই আপনি যা দেখতে চান তা এমন কিছু রাখবেন নাhosting content with Apple
নির্বাচন করুনscreenshot for review
এখন জন্য , সবকিছু আমরা লাফালাফি আমরা ফিরে আসতে হবে।আপনার প্রোডাক্ট আইডিতে নিবন্ধ রাখতে কয়েক ঘন্টা সময় নিতে পারে App Store Connect
, তাই ধৈর্য ধরুন।
এখন আপনি অ্যাপ স্টোর সংযোগে আপনার অ্যাপ্লিকেশন ক্রয়ের তথ্য সেট আপ করেছেন, আপনার এক্সকোড প্রকল্পে যান এবং অ্যাপ্লিকেশন ম্যানেজারে যান (যেখানে আপনার পদ্ধতি এবং শিরোনামের ফাইলগুলি রয়েছে তার শীর্ষে নীল পৃষ্ঠার মতো আইকন) ক্লিক করুন টার্গেটের অধীনে আপনার অ্যাপ্লিকেশন (প্রথমটি হওয়া উচিত) তারপরে সাধারণ যান। নীচে, আপনার linked frameworks and libraries
সামান্য প্লাস প্রতীকটি ক্লিক করা উচিত এবং ফ্রেমওয়ার্ক যুক্ত করা উচিত StoreKit.framework
যদি আপনি এটি না করেন তবে অ্যাপ্লিকেশন কেনা কাজ করবে না !
আপনি যদি আপনার অ্যাপ্লিকেশনটির জন্য ভাষা হিসাবে উদ্দেশ্য-সি ব্যবহার করে থাকেন তবে আপনার এই পাঁচটি পদক্ষেপ এড়ানো উচিত । অন্যথায়, আপনি যদি সুইফ্ট ব্যবহার করছেন তবে আপনি এই প্রশ্নের জন্য আমার সুইফট উত্তরটি অনুসরণ করতে পারেন , বা আপনি যদি অ্যাপ্লিকেশন কেনার কোডের জন্য উদ্দেশ্য-সি ব্যবহার করতে পছন্দ করেন তবে আপনার অ্যাপে সুইফট ব্যবহার করছেন, আপনি নিম্নলিখিতটি করতে পারেন :
একটি নতুন তৈরি করুন .h
এ গিয়ে (হেডার) ফাইল File
> New
> File...
( Command ⌘+ + N)। এই .h
টিউটোরিয়ালটির বাকি অংশগুলিতে এই ফাইলটিকে "আপনার ফাইল" হিসাবে উল্লেখ করা হবে
অনুরোধ করা হলে, ব্রিজিং শিরোনাম তৈরি করুন ক্লিক করুন । এটি আমাদের ব্রিজিং হেডার ফাইল হবে। আপনি যদি না প্রণোদিত করা হয়, বাড়ানো 3. আপনি যদি যেতে হয় প্রণোদিত করা হয়, ধাপ 3 এড়িয়ে যান এবং ধাপ 4 থেকে সরাসরি যান।
মূল প্রকল্প ফোল্ডারে .h
নামের অন্য একটি ফাইল তৈরি করুন Bridge.h
, তারপরে অ্যাপ্লিকেশন ম্যানেজারে যান (নীল পৃষ্ঠার মতো আইকন), তারপরে Targets
বিভাগে আপনার অ্যাপ্লিকেশনটি নির্বাচন করুন এবং ক্লিক করুন Build Settings
। বিকল্প উত্সটি যা সুইফট সংকলক - কোড জেনারেশন বলে তা সন্ধান করুন এবং তারপরে উদ্দেশ্য-সি ব্রিজিং শিরোনাম বিকল্পটি এতে সেট করুনBridge.h
আপনার ব্রিজিং হেডার ফাইলে, লাইনটি যুক্ত করুন #import "MyObjectiveCHeaderFile.h"
, যেখানে MyObjectiveCHeaderFile
আপনি প্রথম ধাপে তৈরি হওয়া শিরোলেখ ফাইলটির নাম। সুতরাং, উদাহরণস্বরূপ, আপনি যদি নিজের শিরোনামের ফাইলটিকে InAppPurchase.h নাম দিয়েছেন , আপনি #import "InAppPurchase.h"
আপনার ব্রিজ শিরোলেখ ফাইলটিতে লাইন যুক্ত করবেন।
একটি নতুন উদ্দেশ্য সি পদ্ধতি (তৈরি করুন .m
এ গিয়ে) ফাইল File
> New
> File...
( Command ⌘+ + N)। আপনি পদক্ষেপ 1 এ তৈরি করা শিরোলেখ ফাইলটির মতোই নাম দিন For উদাহরণস্বরূপ, আপনি যদি পদক্ষেপ 1 InAppPurchase.h এ ফাইলটি কল করেন তবে আপনি এই নতুন ফাইলটিকে InAppPurchase.m কল করবেন । এই .m
টিউটোরিয়ালটির বাকি অংশগুলিতে এই ফাইলটিকে "আপনার ফাইল" হিসাবে উল্লেখ করা হবে ।
এখন আমরা আসল কোডিংয়ে যাব get আপনার .h
ফাইলটিতে নিম্নলিখিত কোড যুক্ত করুন:
BOOL areAdsRemoved;
- (IBAction)restore;
- (IBAction)tapsRemoveAds;
এর পরে, আপনাকে StoreKit
আপনার .m
ফাইলে ফ্রেমওয়ার্কটি আমদানি করতে হবে, পাশাপাশি যুক্ত করার পরে SKProductsRequestDelegate
এবং SKPaymentTransactionObserver
আপনার @interface
ঘোষণার পরে :
#import <StoreKit/StoreKit.h>
//put the name of your view controller in place of MyViewController
@interface MyViewController() <SKProductsRequestDelegate, SKPaymentTransactionObserver>
@end
@implementation MyViewController //the name of your view controller (same as above)
//the code below will be added here
@end
এবং এখন আপনার .m
ফাইলে নিম্নলিখিতগুলি যুক্ত করুন, এই অংশটি জটিল হয়ে যায়, তাই আমি আপনাকে পরামর্শ দিয়েছি যে কোডগুলিতে মন্তব্যগুলি পড়ুন:
//If you have more than one in-app purchase, you can define both of
//of them here. So, for example, you could define both kRemoveAdsProductIdentifier
//and kBuyCurrencyProductIdentifier with their respective product ids
//
//for this example, we will only use one product
#define kRemoveAdsProductIdentifier @"put your product id (the one that we just made in App Store Connect) in here"
- (IBAction)tapsRemoveAds{
NSLog(@"User requests to remove ads");
if([SKPaymentQueue canMakePayments]){
NSLog(@"User can make payments");
//If you have more than one in-app purchase, and would like
//to have the user purchase a different product, simply define
//another function and replace kRemoveAdsProductIdentifier with
//the identifier for the other product
SKProductsRequest *productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:[NSSet setWithObject:kRemoveAdsProductIdentifier]];
productsRequest.delegate = self;
[productsRequest start];
}
else{
NSLog(@"User cannot make payments due to parental controls");
//this is called the user cannot make payments, most likely due to parental controls
}
}
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response{
SKProduct *validProduct = nil;
int count = [response.products count];
if(count > 0){
validProduct = [response.products objectAtIndex:0];
NSLog(@"Products Available!");
[self purchase:validProduct];
}
else if(!validProduct){
NSLog(@"No products available");
//this is called if your product id is not valid, this shouldn't be called unless that happens.
}
}
- (void)purchase:(SKProduct *)product{
SKPayment *payment = [SKPayment paymentWithProduct:product];
[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
[[SKPaymentQueue defaultQueue] addPayment:payment];
}
- (IBAction) restore{
//this is called when the user restores purchases, you should hook this up to a button
[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
[[SKPaymentQueue defaultQueue] restoreCompletedTransactions];
}
- (void) paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue
{
NSLog(@"received restored transactions: %i", queue.transactions.count);
for(SKPaymentTransaction *transaction in queue.transactions){
if(transaction.transactionState == SKPaymentTransactionStateRestored){
//called when the user successfully restores a purchase
NSLog(@"Transaction state -> Restored");
//if you have more than one in-app purchase product,
//you restore the correct product for the identifier.
//For example, you could use
//if(productID == kRemoveAdsProductIdentifier)
//to get the product identifier for the
//restored purchases, you can use
//
//NSString *productID = transaction.payment.productIdentifier;
[self doRemoveAds];
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
break;
}
}
}
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions{
for(SKPaymentTransaction *transaction in transactions){
//if you have multiple in app purchases in your app,
//you can get the product identifier of this transaction
//by using transaction.payment.productIdentifier
//
//then, check the identifier against the product IDs
//that you have defined to check which product the user
//just purchased
switch(transaction.transactionState){
case SKPaymentTransactionStatePurchasing: NSLog(@"Transaction state -> Purchasing");
//called when the user is in the process of purchasing, do not add any of your own code here.
break;
case SKPaymentTransactionStatePurchased:
//this is called when the user has successfully purchased the package (Cha-Ching!)
[self doRemoveAds]; //you can add your code for what you want to happen when the user buys the purchase here, for this tutorial we use removing ads
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
NSLog(@"Transaction state -> Purchased");
break;
case SKPaymentTransactionStateRestored:
NSLog(@"Transaction state -> Restored");
//add the same code as you did from SKPaymentTransactionStatePurchased here
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
break;
case SKPaymentTransactionStateFailed:
//called when the transaction does not finish
if(transaction.error.code == SKErrorPaymentCancelled){
NSLog(@"Transaction state -> Cancelled");
//the user cancelled the payment ;(
}
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
break;
}
}
}
ব্যবহারকারী যখন লেনদেন শেষ করবেন তখন কী হবে তার জন্য আপনি নিজের কোড যুক্ত করতে চান এই টিউটোরিয়ালের জন্য, আমরা অপসারণ ব্যবহারগুলি ব্যবহার করি, ব্যানার দেখার লোড হলে কী ঘটবে তার জন্য আপনাকে নিজের কোডটি যুক্ত করতে হবে।
- (void)doRemoveAds{
ADBannerView *banner;
[banner setAlpha:0];
areAdsRemoved = YES;
removeAdsButton.hidden = YES;
removeAdsButton.enabled = NO;
[[NSUserDefaults standardUserDefaults] setBool:areAdsRemoved forKey:@"areAdsRemoved"];
//use NSUserDefaults so that you can load whether or not they bought it
//it would be better to use KeyChain access, or something more secure
//to store the user data, because NSUserDefaults can be changed.
//You're average downloader won't be able to change it very easily, but
//it's still best to use something more secure than NSUserDefaults.
//For the purpose of this tutorial, though, we're going to use NSUserDefaults
[[NSUserDefaults standardUserDefaults] synchronize];
}
আপনার অ্যাপ্লিকেশনটিতে আপনার বিজ্ঞাপন না থাকলে আপনি চান এমন অন্য কোনও জিনিস ব্যবহার করতে পারেন। উদাহরণস্বরূপ, আমরা পটভূমির রঙটি নীল করতে পারি। এটি করতে আমরা ব্যবহার করতে চাই:
- (void)doRemoveAds{
[self.view setBackgroundColor:[UIColor blueColor]];
areAdsRemoved = YES
//set the bool for whether or not they purchased it to YES, you could use your own boolean here, but you would have to declare it in your .h file
[[NSUserDefaults standardUserDefaults] setBool:areAdsRemoved forKey:@"areAdsRemoved"];
//use NSUserDefaults so that you can load wether or not they bought it
[[NSUserDefaults standardUserDefaults] synchronize];
}
এখন, আপনার viewDidLoad
পদ্ধতিতে কোথাও , আপনি নিম্নলিখিত কোডটি যুক্ত করতে চান:
areAdsRemoved = [[NSUserDefaults standardUserDefaults] boolForKey:@"areAdsRemoved"];
[[NSUserDefaults standardUserDefaults] synchronize];
//this will load wether or not they bought the in-app purchase
if(areAdsRemoved){
[self.view setBackgroundColor:[UIColor blueColor]];
//if they did buy it, set the background to blue, if your using the code above to set the background to blue, if your removing ads, your going to have to make your own code here
}
এখন আপনি সমস্ত কোড যুক্ত করেছেন, আপনার .xib
বা storyboard
ফাইলে যান এবং দুটি বোতাম যুক্ত করুন, একটি বলছে ক্রয় করুন এবং অন্যটি পুনরুদ্ধার করুন। tapsRemoveAds
IBAction
আপনি সবেমাত্র তৈরি ক্রয় বোতামটি এবং restore
IBAction
পুনরুদ্ধার বোতামটিতে হুক আপ করুন । restore
তাহলে ব্যবহারকারী পূর্বে ইন অ্যাপ্লিকেশন ক্রয় কিনেছে কর্ম পরীক্ষা, এবং তাদের বিনামূল্যে জন্য ইন অ্যাপ্লিকেশন ক্রয় দিতে তারা ইতিমধ্যেই এটি না হবে।
এর পরে, অ্যাপ স্টোর সংযোগে যান এবং ক্লিক করুন Users and Access
তারপরে Sandbox Testers
শিরোনামটি ক্লিক করুন এবং তারপরে +
যেখানে বামদিকে এটি বলা হয়েছে সেখানে প্রতীকটি ক্লিক করুন Testers
। আপনি প্রথম এবং শেষ নামের জন্য কেবল এলোমেলো জিনিস রাখতে পারেন, এবং ই-মেইলটি আসল হতে হবে না - আপনাকে কেবল এটি মনে রাখতে সক্ষম হতে হবে। একটি পাসওয়ার্ড রাখুন (যা আপনাকে মনে রাখতে হবে) এবং বাকি তথ্য পূরণ করুন। আমি আপনাকে সুপারিশ করব যে আপনি এমন Date of Birth
একটি তারিখ তৈরি করুন যা ব্যবহারকারীকে 18 বা তার বেশি বয়সী করে তুলবে। App Store Territory
রয়েছে সঠিক দেশে যাবে। এরপরে, আপনার বিদ্যমান আইটিউনস অ্যাকাউন্ট থেকে লগ আউট করুন (আপনি এই টিউটোরিয়ালের পরে লগ ইন করতে পারেন)।
এখন,, এবং আপনার iOS ডিভাইসে আপনার অ্যাপ্লিকেশন চালানোর আপনি কাল্পনিক তে এটি চালানোর চেষ্টা করুন, ক্রয় করবে সবসময় ত্রুটি, আপনি আছে আপনার iOS ডিভাইসে এটি চালানোর জন্য। অ্যাপ্লিকেশনটি চালু হয়ে গেলে, ক্রয়ের বোতামটি আলতো চাপুন। আপনি যখন আপনার আইটিউনস অ্যাকাউন্টে লগ ইন করার অনুরোধ জানানো হবে, আমরা সবে তৈরি করা পরীক্ষার ব্যবহারকারী হিসাবে লগ ইন করুন। এরপরে, যখন এটি আপনাকে 99 of ক্রয় বা আপনার দাম নির্ধারণের জন্য যা যা নিশ্চিত করতে বলেছে , অ্যাপ স্টোর কানেক্টে এটি আপনার স্ক্রিন স্নাপশট নিন is screenshot for review
এখন পেমেন্ট বাতিল করুন।
এখন, এখানে যান App স্টোর বা দোকান কানেক্ট করুন, তারপর যেতে My Apps
> the app you have the In-app purchase on
> In-App Purchases
। তারপরে আপনার অ্যাপ্লিকেশন ক্রয়টি ক্লিক করুন এবং অ্যাপ্লিকেশন কেনার বিশদগুলির অধীনে সম্পাদনা ক্লিক করুন। এটি হয়ে গেলে, আপনার আইফোনে সবে নেওয়া ফটোটি আপনার কম্পিউটারে আমদানি করুন এবং পর্যালোচনার জন্য স্ক্রিনশট হিসাবে আপলোড করুন, তারপরে, পর্যালোচনা নোটগুলিতে, আপনার টেস্ট ব্যবহারকারী ইমেল এবং পাসওয়ার্ডটি রাখুন। এটি পর্যালোচনা প্রক্রিয়ায় আপেলকে সহায়তা করবে।
আপনি এটি করার পরে, আপনার আইওএস ডিভাইসে থাকা অ্যাপ্লিকেশনটিতে ফিরে যান, পরীক্ষার ব্যবহারকারী অ্যাকাউন্ট হিসাবে লগ ইন এবং ক্রয় বোতামটি ক্লিক করুন। এবার, অর্থ প্রদানের বিষয়টি নিশ্চিত করুন উদ্বিগ্ন হবেন না, এটি আপনার অ্যাকাউন্ট থেকে কোনও অর্থ গ্রহণ করবে না, পরীক্ষা ব্যবহারকারী অ্যাকাউন্টগুলি সমস্ত অ্যাপ্লিকেশন ক্রয় বিনামূল্যে পাবেন পেমেন্টটি নিশ্চিত করার পরে, ব্যবহারকারী যখন আপনার পণ্যটি আসলে কিনে তখন তা নিশ্চিত হয়ে নিন ঘটবে। যদি এটি না হয় তবে আপনার doRemoveAds
পদ্ধতিতে কোনও ত্রুটি হতে চলেছে । আবার, আমি অ্যাপ্লিকেশন ক্রয়ের পরীক্ষার জন্য পটভূমিটি নীল রূপে ব্যবহার করার পরামর্শ দিচ্ছি, যদিও এটি আপনার অ্যাপ্লিকেশন অ্যাপ্লিকেশন কেনা উচিত নয়। যদি সবকিছু কাজ করে এবং আপনি যেতে ভাল! আপনি যখন অ্যাপ স্টোর কানেক্টে আপলোড করবেন তখন অ্যাপ্লিকেশন ক্রয়টি আপনার নতুন বাইনারিতে অন্তর্ভুক্ত করার বিষয়টি নিশ্চিত করুন!
লগ: No Products Available
এর অর্থ চারটি জিনিস হতে পারে:
kRemoveAdsProductIdentifier
উপরের কোডটিতে শনাক্তকারীর জন্য)এটি যদি প্রথমবার না কাজ করে তবে হতাশ হবেন না! হাল ছাড়বেন না! আমি এই কাজটি পেতে পারার আগে আমার প্রায় 5 ঘন্টা সময় নিয়েছিল এবং সঠিক কোডের সন্ধান করতে প্রায় 10 ঘন্টা সময় লেগেছে! আপনি যদি উপরে কোডটি ঠিকঠাক ব্যবহার করেন তবে এটি ঠিকঠাক কাজ করা উচিত। যদি আপনার কোন প্রশ্ন থাকে তাহলে মন্তব্য করুন মুক্ত মনে এ সব ।
আমি আশা করি এটি তাদের আইওএস অ্যাপ্লিকেশনটিতে একটি অ্যাপ-ক্রয় যুক্ত করার প্রত্যাশী সকলকেই সহায়তা করবে helps চিয়ার্স!
জোজডমো কোডটি কেবল সুইফটে অনুবাদ করুন:
class InAppPurchaseManager: NSObject , SKProductsRequestDelegate, SKPaymentTransactionObserver{
//If you have more than one in-app purchase, you can define both of
//of them here. So, for example, you could define both kRemoveAdsProductIdentifier
//and kBuyCurrencyProductIdentifier with their respective product ids
//
//for this example, we will only use one product
let kRemoveAdsProductIdentifier = "put your product id (the one that we just made in iTunesConnect) in here"
@IBAction func tapsRemoveAds() {
NSLog("User requests to remove ads")
if SKPaymentQueue.canMakePayments() {
NSLog("User can make payments")
//If you have more than one in-app purchase, and would like
//to have the user purchase a different product, simply define
//another function and replace kRemoveAdsProductIdentifier with
//the identifier for the other product
let set : Set<String> = [kRemoveAdsProductIdentifier]
let productsRequest = SKProductsRequest(productIdentifiers: set)
productsRequest.delegate = self
productsRequest.start()
}
else {
NSLog("User cannot make payments due to parental controls")
//this is called the user cannot make payments, most likely due to parental controls
}
}
func purchase(product : SKProduct) {
let payment = SKPayment(product: product)
SKPaymentQueue.defaultQueue().addTransactionObserver(self)
SKPaymentQueue.defaultQueue().addPayment(payment)
}
func restore() {
//this is called when the user restores purchases, you should hook this up to a button
SKPaymentQueue.defaultQueue().addTransactionObserver(self)
SKPaymentQueue.defaultQueue().restoreCompletedTransactions()
}
func doRemoveAds() {
//TODO: implement
}
/////////////////////////////////////////////////
//////////////// store delegate /////////////////
/////////////////////////////////////////////////
// MARK: - store delegate -
func productsRequest(request: SKProductsRequest, didReceiveResponse response: SKProductsResponse) {
if let validProduct = response.products.first {
NSLog("Products Available!")
self.purchase(validProduct)
}
else {
NSLog("No products available")
//this is called if your product id is not valid, this shouldn't be called unless that happens.
}
}
func paymentQueueRestoreCompletedTransactionsFinished(queue: SKPaymentQueue) {
NSLog("received restored transactions: \(queue.transactions.count)")
for transaction in queue.transactions {
if transaction.transactionState == .Restored {
//called when the user successfully restores a purchase
NSLog("Transaction state -> Restored")
//if you have more than one in-app purchase product,
//you restore the correct product for the identifier.
//For example, you could use
//if(productID == kRemoveAdsProductIdentifier)
//to get the product identifier for the
//restored purchases, you can use
//
//NSString *productID = transaction.payment.productIdentifier;
self.doRemoveAds()
SKPaymentQueue.defaultQueue().finishTransaction(transaction)
break;
}
}
}
func paymentQueue(queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
for transaction in transactions {
switch transaction.transactionState {
case .Purchasing: NSLog("Transaction state -> Purchasing")
//called when the user is in the process of purchasing, do not add any of your own code here.
case .Purchased:
//this is called when the user has successfully purchased the package (Cha-Ching!)
self.doRemoveAds() //you can add your code for what you want to happen when the user buys the purchase here, for this tutorial we use removing ads
SKPaymentQueue.defaultQueue().finishTransaction(transaction)
NSLog("Transaction state -> Purchased")
case .Restored:
NSLog("Transaction state -> Restored")
//add the same code as you did from SKPaymentTransactionStatePurchased here
SKPaymentQueue.defaultQueue().finishTransaction(transaction)
case .Failed:
//called when the transaction does not finish
if transaction.error?.code == SKErrorPaymentCancelled {
NSLog("Transaction state -> Cancelled")
//the user cancelled the payment ;(
}
SKPaymentQueue.defaultQueue().finishTransaction(transaction)
case .Deferred:
// The transaction is in the queue, but its final status is pending external action.
NSLog("Transaction state -> Deferred")
}
}
}
}
এটি আমার উদ্দেশ্য-সি উত্তর পরিপূরক বোঝাতে সুইফ্ট ব্যবহারকারীদের জন্য , উদ্দেশ্য-সি উত্তরটি খুব বড় হওয়া থেকে রক্ষা করা।
প্রথমে appstoreconnect.apple.com এ অ্যাপ্লিকেশন কেনা সেট আপ করুন । এটি করার নির্দেশাবলীর জন্য আমার অবজেক্টিভ-সি উত্তরের প্রথম অংশটি অনুসরণ করুন ( অ্যাপ স্টোর কানেক্ট হেডারের অধীনে 1-13 পদক্ষেপ )।
অ্যাপ স্টোর কানেক্টে আপনার পণ্যের আইডি নিবন্ধিত হতে কয়েক ঘন্টা সময় নিতে পারে, তাই ধৈর্য ধরুন।
আপনি এখন অ্যাপ স্টোর কানেক্টে অ্যাপ্লিকেশন কেনার তথ্য সেট আপ করেছেন, অ্যাপ্লিকেশনটিতে অ্যাপ্লিকেশানের ক্রিয়াকলাপের জন্য আমাদের অ্যাপলের ফ্রেমওয়ার্কটি যুক্ত StoreKit
করতে হবে।
আপনার এক্সকোড প্রকল্পে যান এবং অ্যাপ্লিকেশন ম্যানেজারে যান (আপনার অ্যাপ্লিকেশনটির ফাইলগুলি যেখানে বাম বারের শীর্ষে নীল পৃষ্ঠার মতো আইকন)। বাম দিকে লক্ষ্যগুলির অধীনে আপনার অ্যাপ্লিকেশনটিতে ক্লিক করুন (এটি প্রথম বিকল্প হওয়া উচিত), তারপরে উপরের "সক্ষমতা" এ যান। তালিকায় আপনার "বিকল্প অ্যাপ্লিকেশন ক্রয়" বিকল্পটি দেখতে হবে। এই ক্ষমতাটি চালু করুন, এবং এক্সকোড যুক্ত হবেStoreKit
আপনার প্রকল্পে ।
এখন, আমরা কোডিং শুরু করতে যাচ্ছি!
প্রথমে একটি নতুন সুইফ্ট ফাইল তৈরি করুন যা আপনার অ্যাপ্লিকেশন-ক্রয়ের সমস্ত পরিচালনা করবে। আমি এটি কল করতে যাচ্ছিIAPManager.swift
।
এই ফাইলের মধ্যে, আমরা একটি নতুন বর্গ, নামক তৈরি করতে যাচ্ছেন IAPManager
যে একটি SKProductsRequestDelegate
এবং SKPaymentTransactionObserver
। শীর্ষে, নিশ্চিত করুন যে আপনি আমদানি করেন Foundation
এবংStoreKit
import Foundation
import StoreKit
public class IAPManager: NSObject, SKProductsRequestDelegate,
SKPaymentTransactionObserver {
}
এরপরে, আমরা আমাদের অ্যাপ্লিকেশন ক্রয়ের জন্য সনাক্তকারীকে সংজ্ঞায়িত করতে একটি ভেরিয়েবল যুক্ত করতে যাচ্ছি (আপনি এমন কোনও ব্যবহার করতে পারেন enum
যা আপনার একাধিক আইএপি রাখলে এটি বজায় রাখা আরও সহজ হবে)।
// This should the ID of the in-app-purchase you made on AppStore Connect.
// if you have multiple IAPs, you'll need to store their identifiers in
// other variables, too (or, preferably in an enum).
let removeAdsID = "com.skiplit.removeAds"
আসুন পরবর্তী ক্লাসের জন্য একটি ইনিশিয়ালাইজার যুক্ত করুন:
// This is the initializer for your IAPManager class
//
// A better, and more scaleable way of doing this
// is to also accept a callback in the initializer, and call
// that callback in places like the paymentQueue function, and
// in all functions in this class, in place of calls to functions
// in RemoveAdsManager (you'll see those calls in the code below).
let productID: String
init(productID: String){
self.productID = productID
}
এখন, আমরা SKProductsRequestDelegate
এবং এর জন্য প্রয়োজনীয় ফাংশন যুক্ত করতে যাচ্ছিSKPaymentTransactionObserver
কাজ করার :
আমরা RemoveAdsManager
ক্লাসটি পরে যুক্ত করব
// This is called when a SKProductsRequest receives a response
public func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse){
// Let's try to get the first product from the response
// to the request
if let product = response.products.first{
// We were able to get the product! Make a new payment
// using this product
let payment = SKPayment(product: product)
// add the new payment to the queue
SKPaymentQueue.default().add(self)
SKPaymentQueue.default().add(payment)
}
else{
// Something went wrong! It is likely that either
// the user doesn't have internet connection, or
// your product ID is wrong!
//
// Tell the user in requestFailed() by sending an alert,
// or something of the sort
RemoveAdsManager.removeAdsFailure()
}
}
// This is called when the user restores their IAP sucessfully
private func paymentQueueRestoreCompletedTransactionsFinished(_ queue: SKPaymentQueue){
// For every transaction in the transaction queue...
for transaction in queue.transactions{
// If that transaction was restored
if transaction.transactionState == .restored{
// get the producted ID from the transaction
let productID = transaction.payment.productIdentifier
// In this case, we have only one IAP, so we don't need to check
// what IAP it is. However, this is useful if you have multiple IAPs!
// You'll need to figure out which one was restored
if(productID.lowercased() == IAPManager.removeAdsID.lowercased()){
// Restore the user's purchases
RemoveAdsManager.restoreRemoveAdsSuccess()
}
// finish the payment
SKPaymentQueue.default().finishTransaction(transaction)
}
}
}
// This is called when the state of the IAP changes -- from purchasing to purchased, for example.
// This is where the magic happens :)
public func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]){
for transaction in transactions{
// get the producted ID from the transaction
let productID = transaction.payment.productIdentifier
// In this case, we have only one IAP, so we don't need to check
// what IAP it is.
// However, if you have multiple IAPs, you'll need to use productID
// to check what functions you should run here!
switch transaction.transactionState{
case .purchasing:
// if the user is currently purchasing the IAP,
// we don't need to do anything.
//
// You could use this to show the user
// an activity indicator, or something like that
break
case .purchased:
// the user successfully purchased the IAP!
RemoveAdsManager.removeAdsSuccess()
SKPaymentQueue.default().finishTransaction(transaction)
case .restored:
// the user restored their IAP!
IAPTestingHandler.restoreRemoveAdsSuccess()
SKPaymentQueue.default().finishTransaction(transaction)
case .failed:
// The transaction failed!
RemoveAdsManager.removeAdsFailure()
// finish the transaction
SKPaymentQueue.default().finishTransaction(transaction)
case .deferred:
// This happens when the IAP needs an external action
// in order to proceeded, like Ask to Buy
RemoveAdsManager.removeAdsDeferred()
break
}
}
}
এখন আসুন এমন কয়েকটি ফাংশন যুক্ত করুন যা ক্রয় শুরু করতে বা পুনরুদ্ধার করা ক্রয় শুরু করতে ব্যবহৃত হতে পারে:
// Call this when you want to begin a purchase
// for the productID you gave to the initializer
public func beginPurchase(){
// If the user can make payments
if SKPaymentQueue.canMakePayments(){
// Create a new request
let request = SKProductsRequest(productIdentifiers: [productID])
// Set the request delegate to self, so we receive a response
request.delegate = self
// start the request
request.start()
}
else{
// Otherwise, tell the user that
// they are not authorized to make payments,
// due to parental controls, etc
}
}
// Call this when you want to restore all purchases
// regardless of the productID you gave to the initializer
public func beginRestorePurchases(){
// restore purchases, and give responses to self
SKPaymentQueue.default().add(self)
SKPaymentQueue.default().restoreCompletedTransactions()
}
এর পরে, আমাদের আইএপিগুলি পরিচালনা করতে একটি নতুন ইউটিলিটি ক্লাস যুক্ত করা যাক। এই কোডটি সমস্তই একটি শ্রেণিতে থাকতে পারে, তবে এটির একাধিক হওয়া এটিকে একটু পরিষ্কার করে তোলে। আমি একটি নতুন ক্লাস তৈরি করতে যাচ্ছি RemoveAdsManager
, এবং এটিতে কয়েকটি ফাংশন রেখেছি
public class RemoveAdsManager{
class func removeAds()
class func restoreRemoveAds()
class func areAdsRemoved() -> Bool
class func removeAdsSuccess()
class func restoreRemoveAdsSuccess()
class func removeAdsDeferred()
class func removeAdsFailure()
}
প্রথম তিনটি ফাংশন, removeAds
, restoreRemoveAds
, এবং areAdsRemoved
, ফাংশন যে আপনি নির্দিষ্ট কর্ম করতে ডাকবো হয়। শেষ চারটি এক দ্বারা ডাকা হবে IAPManager
।
প্রথম দুটি ফাংশনে কিছু কোড যুক্ত করা যাক removeAds
এবং restoreRemoveAds
:
// Call this when the user wants
// to remove ads, like when they
// press a "remove ads" button
class func removeAds(){
// Before starting the purchase, you could tell the
// user that their purchase is happening, maybe with
// an activity indicator
let iap = IAPManager(productID: IAPManager.removeAdsID)
iap.beginPurchase()
}
// Call this when the user wants
// to restore their IAP purchases,
// like when they press a "restore
// purchases" button.
class func restoreRemoveAds(){
// Before starting the purchase, you could tell the
// user that the restore action is happening, maybe with
// an activity indicator
let iap = IAPManager(productID: IAPManager.removeAdsID)
iap.beginRestorePurchases()
}
এবং সর্বশেষে, আসুন শেষ পাঁচটি ফাংশনে কিছু কোড যুক্ত করব।
// Call this to check whether or not
// ads are removed. You can use the
// result of this to hide or show
// ads
class func areAdsRemoved() -> Bool{
// This is the code that is run to check
// if the user has the IAP.
return UserDefaults.standard.bool(forKey: "RemoveAdsPurchased")
}
// This will be called by IAPManager
// when the user sucessfully purchases
// the IAP
class func removeAdsSuccess(){
// This is the code that is run to actually
// give the IAP to the user!
//
// I'm using UserDefaults in this example,
// but you may want to use Keychain,
// or some other method, as UserDefaults
// can be modified by users using their
// computer, if they know how to, more
// easily than Keychain
UserDefaults.standard.set(true, forKey: "RemoveAdsPurchased")
UserDefaults.standard.synchronize()
}
// This will be called by IAPManager
// when the user sucessfully restores
// their purchases
class func restoreRemoveAdsSuccess(){
// Give the user their IAP back! Likely all you'll need to
// do is call the same function you call when a user
// sucessfully completes their purchase. In this case, removeAdsSuccess()
removeAdsSuccess()
}
// This will be called by IAPManager
// when the IAP failed
class func removeAdsFailure(){
// Send the user a message explaining that the IAP
// failed for some reason, and to try again later
}
// This will be called by IAPManager
// when the IAP gets deferred.
class func removeAdsDeferred(){
// Send the user a message explaining that the IAP
// was deferred, and pending an external action, like
// Ask to Buy.
}
সব কিছু একসাথে রাখলে আমরা এরকম কিছু পাই:
import Foundation
import StoreKit
public class RemoveAdsManager{
// Call this when the user wants
// to remove ads, like when they
// press a "remove ads" button
class func removeAds(){
// Before starting the purchase, you could tell the
// user that their purchase is happening, maybe with
// an activity indicator
let iap = IAPManager(productID: IAPManager.removeAdsID)
iap.beginPurchase()
}
// Call this when the user wants
// to restore their IAP purchases,
// like when they press a "restore
// purchases" button.
class func restoreRemoveAds(){
// Before starting the purchase, you could tell the
// user that the restore action is happening, maybe with
// an activity indicator
let iap = IAPManager(productID: IAPManager.removeAdsID)
iap.beginRestorePurchases()
}
// Call this to check whether or not
// ads are removed. You can use the
// result of this to hide or show
// ads
class func areAdsRemoved() -> Bool{
// This is the code that is run to check
// if the user has the IAP.
return UserDefaults.standard.bool(forKey: "RemoveAdsPurchased")
}
// This will be called by IAPManager
// when the user sucessfully purchases
// the IAP
class func removeAdsSuccess(){
// This is the code that is run to actually
// give the IAP to the user!
//
// I'm using UserDefaults in this example,
// but you may want to use Keychain,
// or some other method, as UserDefaults
// can be modified by users using their
// computer, if they know how to, more
// easily than Keychain
UserDefaults.standard.set(true, forKey: "RemoveAdsPurchased")
UserDefaults.standard.synchronize()
}
// This will be called by IAPManager
// when the user sucessfully restores
// their purchases
class func restoreRemoveAdsSuccess(){
// Give the user their IAP back! Likely all you'll need to
// do is call the same function you call when a user
// sucessfully completes their purchase. In this case, removeAdsSuccess()
removeAdsSuccess()
}
// This will be called by IAPManager
// when the IAP failed
class func removeAdsFailure(){
// Send the user a message explaining that the IAP
// failed for some reason, and to try again later
}
// This will be called by IAPManager
// when the IAP gets deferred.
class func removeAdsDeferred(){
// Send the user a message explaining that the IAP
// was deferred, and pending an external action, like
// Ask to Buy.
}
}
public class IAPManager: NSObject, SKProductsRequestDelegate, SKPaymentTransactionObserver{
// This should the ID of the in-app-purchase you made on AppStore Connect.
// if you have multiple IAPs, you'll need to store their identifiers in
// other variables, too (or, preferably in an enum).
static let removeAdsID = "com.skiplit.removeAds"
// This is the initializer for your IAPManager class
//
// An alternative, and more scaleable way of doing this
// is to also accept a callback in the initializer, and call
// that callback in places like the paymentQueue function, and
// in all functions in this class, in place of calls to functions
// in RemoveAdsManager.
let productID: String
init(productID: String){
self.productID = productID
}
// Call this when you want to begin a purchase
// for the productID you gave to the initializer
public func beginPurchase(){
// If the user can make payments
if SKPaymentQueue.canMakePayments(){
// Create a new request
let request = SKProductsRequest(productIdentifiers: [productID])
request.delegate = self
request.start()
}
else{
// Otherwise, tell the user that
// they are not authorized to make payments,
// due to parental controls, etc
}
}
// Call this when you want to restore all purchases
// regardless of the productID you gave to the initializer
public func beginRestorePurchases(){
SKPaymentQueue.default().add(self)
SKPaymentQueue.default().restoreCompletedTransactions()
}
// This is called when a SKProductsRequest receives a response
public func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse){
// Let's try to get the first product from the response
// to the request
if let product = response.products.first{
// We were able to get the product! Make a new payment
// using this product
let payment = SKPayment(product: product)
// add the new payment to the queue
SKPaymentQueue.default().add(self)
SKPaymentQueue.default().add(payment)
}
else{
// Something went wrong! It is likely that either
// the user doesn't have internet connection, or
// your product ID is wrong!
//
// Tell the user in requestFailed() by sending an alert,
// or something of the sort
RemoveAdsManager.removeAdsFailure()
}
}
// This is called when the user restores their IAP sucessfully
private func paymentQueueRestoreCompletedTransactionsFinished(_ queue: SKPaymentQueue){
// For every transaction in the transaction queue...
for transaction in queue.transactions{
// If that transaction was restored
if transaction.transactionState == .restored{
// get the producted ID from the transaction
let productID = transaction.payment.productIdentifier
// In this case, we have only one IAP, so we don't need to check
// what IAP it is. However, this is useful if you have multiple IAPs!
// You'll need to figure out which one was restored
if(productID.lowercased() == IAPManager.removeAdsID.lowercased()){
// Restore the user's purchases
RemoveAdsManager.restoreRemoveAdsSuccess()
}
// finish the payment
SKPaymentQueue.default().finishTransaction(transaction)
}
}
}
// This is called when the state of the IAP changes -- from purchasing to purchased, for example.
// This is where the magic happens :)
public func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]){
for transaction in transactions{
// get the producted ID from the transaction
let productID = transaction.payment.productIdentifier
// In this case, we have only one IAP, so we don't need to check
// what IAP it is.
// However, if you have multiple IAPs, you'll need to use productID
// to check what functions you should run here!
switch transaction.transactionState{
case .purchasing:
// if the user is currently purchasing the IAP,
// we don't need to do anything.
//
// You could use this to show the user
// an activity indicator, or something like that
break
case .purchased:
// the user sucessfully purchased the IAP!
RemoveAdsManager.removeAdsSuccess()
SKPaymentQueue.default().finishTransaction(transaction)
case .restored:
// the user restored their IAP!
RemoveAdsManager.restoreRemoveAdsSuccess()
SKPaymentQueue.default().finishTransaction(transaction)
case .failed:
// The transaction failed!
RemoveAdsManager.removeAdsFailure()
// finish the transaction
SKPaymentQueue.default().finishTransaction(transaction)
case .deferred:
// This happens when the IAP needs an external action
// in order to proceeded, like Ask to Buy
RemoveAdsManager.removeAdsDeferred()
break
}
}
}
}
শেষ অবধি, ব্যবহারকারীর ক্রয় শুরু করতে এবং কল করতে RemoveAdsManager.removeAds()
এবং পুনরুদ্ধার এবং কল শুরু করার জন্য কোনও উপায় যুক্ত করতে হবে RemoveAdsManager.restoreRemoveAds()
, কোথাও একটি বোতামের মতো! মনে রাখবেন যে অ্যাপ স্টোর নির্দেশিকা অনুসারে আপনার কোথাও কেনাকাটা পুনরুদ্ধার করার জন্য একটি বোতাম সরবরাহ করতে হবে।
করণীয় শেষ জিনিসটি অ্যাপ স্টোর কানেক্টে পর্যালোচনার জন্য আপনার আইএপি জমা দিন! এটি করার বিষয়ে বিস্তারিত নির্দেশাবলীর জন্য, আপনি পর্যালোচনা শিরোনাম জমা দেওয়ার অধীনে আমার উদ্দেশ্য-সি উত্তরের শেষ অংশটি অনুসরণ করতে পারেন ।
আরএমএসটোরটি অ্যাপ্লিকেশন কেনার জন্য হালকা আইওএস লাইব্রেরি। এটি স্টোরকিট এপিআই মোড়ানো এবং অ্যাসিঙ্ক্রোনাস অনুরোধগুলির জন্য আপনাকে হ্যান্ড ব্লক সরবরাহ করে। একটি পণ্য ক্রয় করা একক পদ্ধতিতে কল করার মতোই সহজ।
উন্নত ব্যবহারকারীদের জন্য, এই গ্রন্থাগারটি প্রাপ্তি যাচাইকরণ, সামগ্রী ডাউনলোড এবং লেনদেনের জেদও সরবরাহ করে।
আমি জানি আমি এটি পোস্ট করতে বেশ দেরি করেছি, তবে আমি যখন আইএপি মডেলের দড়ি শিখি তখন একই অভিজ্ঞতা ভাগ করি।
অ্যাপ্লিকেশন ক্রয় হ'ল স্টোরকিট ফ্রেমওয়ার্ক দ্বারা প্রয়োগ করা আইওএসের মধ্যে একটি বিস্তৃত ওয়ার্কফ্লো। সমগ্র ডকুমেন্টেশন বেশ স্পষ্ট হয় যদি আপনি ধৈর্য এটা পড়তে, কিন্তু কিছুটা পরিভাষা প্রকৃতি উন্নত করা হয়।
সংক্ষেপ:
1 - পণ্যগুলির জন্য অনুরোধ করুন - পণ্য আইডির জন্য অনুরোধ জারি করতে এবং আপনার নিজস্ব আইটোন সংযোগের স্টোর থেকে তা ফেরত পাওয়ার জন্য এসকেপ্রডাক্টরউইকস্ট এবং এসকেপ্রড্রাক্টগ্রিক্যুটডেলিগেট ক্লাস ব্যবহার করুন।
এই এসকে প্রডাক্টগুলি আপনার স্টোর ইউআইকে জনপ্রিয় করতে ব্যবহার করা উচিত যা ব্যবহারকারী নির্দিষ্ট পণ্য কিনতে ব্যবহার করতে পারেন।
2 - অর্থ প্রদানের অনুরোধ জারি করুন - লেনদেনের সারিতে পেমেন্ট যুক্ত করতে এসকেপেমেন্ট এবং এসকেপেমেন্টকিউ ব্যবহার করুন।
3 - স্থিতি আপডেটের জন্য লেনদেনের সারি পর্যবেক্ষণ করুন - স্থিতি পর্যবেক্ষণ করতে এসকেপমেন্ট ট্রান্সজিশনঅবেসভার প্রোটোকলের আপডেট হওয়া লেনদেন পদ্ধতিটি ব্যবহার করুন:
SKPaymentTransactionStatePurchasing - don't do anything
SKPaymentTransactionStatePurchased - unlock product, finish the transaction
SKPaymentTransactionStateFailed - show error, finish the transaction
SKPaymentTransactionStateRestored - unlock product, finish the transaction
4 - পুনরুদ্ধার বোতামের প্রবাহ - এটি সম্পাদন করতে এসকেপয়েন্টমেন্ট কিউয়ের পুনরুদ্ধার সংযুক্ত ট্রানজেকশনগুলি ব্যবহার করুন - 3 পদক্ষেপটি এসকেপমেন্ট ট্রান্সজিশনঅবেজারের নিম্নলিখিত পদ্ধতিগুলি সহ বাকী যত্ন নেবে:
paymentQueueRestoreCompletedTransactionsFinished
restoreCompletedTransactionsFailedWithError
এখানে একটি ধাপে ধাপে টিউটোরিয়াল রয়েছে (এটি বোঝার নিজস্ব প্রচেষ্টার ফলস্বরূপ আমার দ্বারা রচিত) এটি ব্যাখ্যা করে। শেষে এটি কোডের নমুনাও সরবরাহ করে যা আপনি সরাসরি ব্যবহার করতে পারেন।
এখানে এমন আরও কিছু নির্দিষ্ট জিনিস রয়েছে যা কেবলমাত্র পাঠ্যটি আরও ভাল পদ্ধতিতে বর্ণনা করতে পারে explain