Xamarin.iOS'ta İşlemler ve Doğrulama
Geçmiş İşlemleri Geri Yükleme
Uygulamanız geri yüklenebilir ürün türlerini destekliyorsa, kullanıcıların bu satın almaları geri yüklemesine izin vermek için bazı kullanıcı arabirimi öğeleri eklemeniz gerekir. Bu işlevsellik, müşterinin ürünü ek cihazlara eklemesine veya silindikten veya uygulamayı kaldırıp yeniden yükledikten sonra ürünü aynı cihaza geri yüklemesine olanak tanır. Aşağıdaki ürün türleri geri yüklenebilir:
- Tüketilemez ürünler
- Otomatik yenilenebilir abonelikler
- Ücretsiz abonelikler
Geri yükleme işlemi, ürünlerinizi yerine getirmek için cihazda tuttuğunuz kayıtları güncelleştirmelidir. Müşteri istediği zaman, herhangi bir cihazına geri yüklemeyi seçebilir. Geri yükleme işlemi, bu kullanıcı için önceki tüm işlemleri yeniden gönderir; uygulama kodu daha sonra bu bilgilerle hangi eylemin gerçekleştirileceğini belirlemelidir (örneğin, cihazda söz konusu satın alma işleminin zaten bir kaydı olup olmadığını denetleme ve değilse, satın alma kaydını oluşturma ve ürünü kullanıcı için etkinleştirme).
Geri Yükleme Uygulama
Kullanıcı arabirimi Geri Yükle düğmesi, üzerinde SKPaymentQueue
RestoreCompletedTransactions'ı tetikleyen aşağıdaki yöntemi çağırır.
public void Restore()
{
// theObserver will be notified of when the restored transactions start arriving <- AppStore
SKPaymentQueue.DefaultQueue.RestoreCompletedTransactions();
}
StoreKit geri yükleme isteğini Apple'ın sunucularına zaman uyumsuz olarak gönderir.
bir işlem gözlemcisi CustomPaymentObserver
olarak kaydedildiğinden, Apple sunucuları yanıtladığında iletiler alır. Yanıt, bu kullanıcının bu uygulamada (tüm cihazlarında) gerçekleştirdiği tüm işlemleri içerir. Kod, her işlemde döngüye geçer, Geri Yüklenen durumunu algılar ve aşağıda gösterildiği gibi işlemek için yöntemini çağırır UpdatedTransactions
:
// called when the transaction status is updated
public override void UpdatedTransactions (SKPaymentQueue queue, SKPaymentTransaction[] transactions)
{
foreach (SKPaymentTransaction transaction in transactions)
{
switch (transaction.TransactionState)
{
case SKPaymentTransactionState.Purchased:
theManager.CompleteTransaction(transaction);
break;
case SKPaymentTransactionState.Failed:
theManager.FailedTransaction(transaction);
break;
case SKPaymentTransactionState.Restored:
theManager.RestoreTransaction(transaction);
break;
default:
break;
}
}
}
Kullanıcı UpdatedTransactions
için geri yüklenebilen ürün yoksa çağrılmaz.
Örnekteki belirli bir işlemi geri yüklemek için mümkün olan en basit kod, ürün kimliğine erişmek için özelliğinin OriginalTransaction
kullanılması dışında satın alma işlemiyle aynı eylemleri gerçekleştirir:
public void RestoreTransaction (SKPaymentTransaction transaction)
{
// Restored Transactions always have an 'original transaction' attached
var productId = transaction.OriginalTransaction.Payment.ProductIdentifier;
// Register the purchase, so it is remembered for next time
PhotoFilterManager.Purchase(productId); // it's as though it was purchased again
FinishTransaction(transaction, true);
}
Daha karmaşık bir uygulama, özgün tarih ve makbuz numarası gibi diğer transaction.OriginalTransaction
özellikleri denetleyebilir. Bu bilgiler bazı ürün türleri (abonelikler gibi) için yararlı olacaktır.
Geri Yükleme Tamamlama
CustomPaymentObserver
, geri yükleme işlemi tamamlandığında StoreKit tarafından çağrılacak iki ek yönteme sahiptir (başarıyla veya hatayla), aşağıda gösterilmiştir:
public override void PaymentQueueRestoreCompletedTransactionsFinished (SKPaymentQueue queue)
{
Console.WriteLine(" ** RESTORE Finished ");
}
public override void RestoreCompletedTransactionsFailedWithError (SKPaymentQueue queue, NSError error)
{
Console.WriteLine(" ** RESTORE FailedWithError " + error.LocalizedDescription);
}
Örnekte bu yöntemler hiçbir şey yapmaz, ancak gerçek bir uygulama kullanıcıya veya başka bir işleve ileti uygulamayı seçebilir.
Satın Almaların Güvenliğini Sağlama
Bu belgedeki iki örnek satın almaları izlemek için kullanılır NSUserDefaults
:
Sarf malzemeleri : Kredi satın almalarının 'bakiyesi', her satın alma işlemiyle birlikte artırılan basit NSUserDefaults
bir tamsayı değeridir.
Tüketilmeyenler – her fotoğraf filtresi satın alma işlemi içinde NSUserDefaults
anahtar-değer çifti olarak depolanır.
Kullanmak NSUserDefaults
örnek kodu basit tutar, ancak teknik açıdan fikirli kullanıcıların ayarları güncelleştirmeleri (ödeme mekanizmasını atlayarak) mümkün olabileceğinden çok güvenli bir çözüm sunmaz.
Not: Gerçek dünya uygulamaları, kullanıcı üzerinde oynanmaya tabi olmayan satın alınan içerikleri depolamak için güvenli bir mekanizma benimsemelidir. Bu, şifrelemeyi ve/veya uzak sunucu kimlik doğrulaması dahil olmak üzere diğer teknikleri içerebilir.
Mekanizma ayrıca iOS, iTunes ve iCloud'un yerleşik yedekleme ve kurtarma özelliklerinden yararlanmak için tasarlanmalıdır. Bu, bir kullanıcı yedeklemeyi geri yükledikten sonra önceki satın alma işlemlerinin hemen kullanılabilir olmasını sağlar.
iOS'a özgü daha fazla yönerge için Apple'ın Güvenli Kodlama Kılavuzu'na bakın.
Makbuz Doğrulama ve Sunucu Tarafından Teslim Edilen Ürünler
Bu belgedeki örnekler şu ana kadar yalnızca app Store sunucularıyla doğrudan iletişim kurarak satın alma işlemleri gerçekleştirmek ve uygulamada önceden kodlanmış özelliklerin veya özelliklerin kilidini açmak için uygulamadan oluşuyordu.
Apple, satın alma makbuzlarının başka bir sunucu tarafından bağımsız olarak doğrulanması için ek bir satın alma güvenliği sağlar. Bu, bir satın alma işleminin parçası olarak dijital içerik teslim etmeden önce (dijital kitap veya dergi gibi) bir isteği doğrulamak için yararlı olabilir.
Yerleşik Ürünler – Bu belgedeki örneklerde olduğu gibi, satın alınan ürün uygulamayla birlikte gönderilen işlevsellik olarak mevcuttur. Uygulama içi satın alma, kullanıcının işlevlere erişmesini sağlar. Ürün kimlikleri sabit kodlanmıştır.
Sunucu Teslim Edilen Ürünler – Başarılı bir işlem içeriğin indirilmesine neden olana kadar ürün, uzak sunucuda depolanan indirilebilir içeriklerden oluşur. Kitaplar veya dergi sorunları örnek olarak verilebilir. Ürün kimlikleri genellikle bir dış sunucudan (ürün içeriğinin de barındırıldığı) kaynaklanır. Uygulamalar, bir işlem tamamlandığında sağlam bir kayıt yöntemi uygulamalıdır, böylece içerik indirme başarısız olursa kullanıcının kafasını karıştırmadan yeniden denenebilir.
Sunucu Tarafından Teslim Edilen Ürünler
Satın alma işlemi sırasında kitap ve dergiler (hatta oyun düzeyi) gibi bazı ürünlerin içeriğinin uzak bir sunucudan indirilmesi gerekir. Bu, ürün içeriğini satın aldıktan sonra depolamak ve teslim etmek için ek bir sunucu gerektiği anlamına gelir.
Sunucu Tarafından Teslim Edilen Ürünlerin Fiyatlarını Alma
Ürünler uzaktan teslim edildiğinden, zaman içinde (uygulama kodunu güncelleştirmeden) daha fazla kitap veya derginin yeni sorunları ekleme gibi daha fazla ürün eklemek de mümkündür. Uygulamanın bu haber ürünlerini bulabilmesi ve kullanıcıya görüntüleyebilmesi için ek sunucunun bu bilgileri depolaması ve teslim etmesi gerekir.
Ürün bilgileri birden çok yerde depolanmalıdır: sunucunuzda ve iTunes Bağlan. Ayrıca, her ürünle ilişkilendirilmiş içerik dosyaları olacaktır. Bu dosyalar başarılı bir satın alma işlemi sonrasında teslim edilecek.
Kullanıcı bir ürün satın almak istediğinde, uygulamanın hangi ürünlerin kullanılabilir olduğunu belirlemesi gerekir. Bu bilgiler önbelleğe alınabilir, ancak ana ürün listesinin depolandığı uzak bir sunucudan teslim edilmelidir.
Sunucu, uygulamanın ayrıştırmak için ürün kimliklerinin listesini döndürür.
Uygulama daha sonra fiyatları ve açıklamaları almak için bu Ürün Kimliklerinden hangilerinin StoreKit'e gönderileceğini belirler.
StoreKit, Ürün Kimliklerinin listesini Apple'ın sunucularına gönderir.
iTunes sunucuları geçerli ürün bilgileriyle (açıklama ve geçerli fiyat) yanıt verir.
Uygulamanın
SKProductsRequestDelegate
ürün bilgileri kullanıcıya görüntülenmek üzere geçirilir.
Sunucu Tarafından Teslim Edilen Ürünler Satın Alma
Uzak sunucu, bir içerik isteğinin geçerli olduğunu doğrulamanın bir yolunu gerektirdiğinden (örneğin, ödeme yapılmıştır), kimlik doğrulaması için makbuz bilgileri geçirilir. Uzak sunucu bu verileri doğrulama için iTunes'a iletir ve başarılı olursa ürün içeriğini uygulamaya yanıt olarak ekler.
Uygulama kuyruğa bir
SKPayment
ekler. Gerekirse kullanıcıdan Apple kimliği istenir ve ödemeyi onaylaması istenir.StoreKit, isteği işlemek üzere sunucuya gönderir.
İşlem tamamlandığında, sunucu bir işlem alındı bilgisi ile yanıt verir.
Alt
SKPaymentTransactionObserver
sınıf alındı bilgisini alır ve işler. Ürünün bir sunucudan indirilmesi gerektiğinden, uygulama uzak sunucuya bir ağ isteği başlatır.uzak sunucunun içeriğe erişim yetkisi olduğunu doğrulayabilmesi için indirme isteğine alındı verileri eşlik eder. Uygulamanın ağ istemcisi bu isteğe yanıt bekler.
Sunucu içerik isteği aldığında, alındı verilerini ayrıştırıp alındının geçerli bir işlem için olduğunu doğrulamak için doğrudan iTunes sunucularına bir istek gönderir. Sunucu, isteğin üretim veya korumalı alan URL'sine gönderilip gönderilmeyeceğini belirlemek için bir mantık kullanmalıdır. Apple, alma durumunuz 21007 (üretim sunucusuna gönderilen korumalı alan alındı) durumunda her zaman üretim URL'sini kullanmayı ve korumalı alana geçmeyi önerir. Daha fazla bilgi için Apple'ın Makbuz Doğrulama Programlama Kılavuzu'na bakın.
iTunes makbuzu kontrol eder ve geçerliyse sıfır durumunu döndürür.
Sunucu iTunes'un yanıtını bekler. Geçerli bir yanıt alırsa kod, uygulamaya yanıt olarak eklenecek ilişkili ürün içerik dosyasını bulmalıdır.
Uygulama yanıtı alır ve ayrıştırarak ürün içeriğini cihazın dosya sistemine kaydeder.
Uygulama ürünü etkinleştirir ve ardından StoreKit'in
FinishTransaction
öğesini çağırır. Uygulama daha sonra isteğe bağlı olarak satın alınan içeriği görüntüleyebilir (örneğin, satın alınan bir kitap veya dergi sorununun ilk sayfasını gösterir).
Çok büyük ürün içerik dosyaları için alternatif bir uygulama, işlemin hızlı bir şekilde tamamılabilmesi için işlem makbuzunu 9. adımda depolamayı ve kullanıcının gerçek ürün içeriğini daha sonra indirmesi için bir kullanıcı arabirimi sağlamayı içerebilir. Sonraki indirme isteği, gerekli ürün içerik dosyasına erişmek için depolanmış makbuzu yeniden gönderebilir.
Sunucu Tarafı Makbuz Doğrulama Kodu Yazma
Sunucu tarafı kodunda makbuzu doğrulama, iş akışı diyagramında 5 ile #8 arası adımları kapsayan basit bir HTTP POST isteği/yanıtıyla yapılabilir.
Uygulamadaki SKPaymentTansaction.TransactionReceipt
özelliğini ayıklayın. Bu, doğrulama için iTunes'a gönderilmesi gereken verilerdir (5. adım).
Base64-işlem alındı verilerini kodlayın (5. adımda veya #6'da).
Aşağıdaki gibi basit bir JSON yükü oluşturun:
{
"receipt-data" : "(base-64 encoded receipt here)"
}
Üretim veya https://sandbox.itunes.apple.com/verifyReceipt test için JSON'a https://buy.itunes.apple.com/verifyReceipt HTTP POST.
JSON yanıtı aşağıdaki anahtarları içerir:
{
"status" : 0,
"receipt" : { (receipt repeated here) }
}
Sıfır durumu geçerli bir alındı bilgisini gösterir. Sunucunuz satın alınan ürünün içeriğini karşılamaya devam edebilir. Alındı anahtarı, uygulama tarafından alınan nesneyle aynı özelliklere SKPaymentTransaction
sahip bir JSON sözlüğü içerir, böylece sunucu kodu satın alma işleminin product_id ve miktarı gibi bilgileri almak için bu sözlüğü sorgulayabilir.
Ek bilgi için Apple'ın Makbuz Doğrulama Programlama Kılavuzu belgelerine bakın.