2014-10-24 6 views
0

Я вырываю волосы, я потратил полтора дня на это. Я думал, что Свифт должен быть легче, но я считаю это кошмаром по сравнению с Objective-C. Я пытаюсь перенести проект на быстрый в течение месяца, и я серьезно подумываю об утилизации его и просто вернусь к Objective-C. Если кто-то может помочь, это будет очень признательно. Ранее я использовал учебник по raywenderlich.com, который дал хороший многоразовый класс IAP. Однако, пытаясь преобразовать это в Swift, я просто сталкиваюсь с проблемами, которые я не могу найти. Некоторые ошибки Xcode дают просто бессмысленно в их описании, а Google мало помогает.В App Purchase с Swift

Во-первых, это подходящий перевод кода? Swift руководство не поможет здесь:

Objective-C

typedef void (^RequestProductsCompletionHandler)(BOOL success, NSArray * products); 

Swift

typealias RequestProductsCompletionHandler = (success : Bool, products : NSArray) 

Когда я пытаюсь воздействовать на это позже с

_completionHandler(true, skProducts) 

Я получаю ошибку

Невозможно преобразовать тип Выражение в '(BooleanLiteralConvertible, [AnyObject]!)' К типу 'BooleanLiteralConvertible'

У меня также есть проблемы с этим

- (id)initWithProductIdentifiers:(NSSet *)productIdentifiers { 

if ((self = [super init])) { 

    // Store product identifiers 
    _productIdentifiers = productIdentifiers; 

    // Check for previously purchased products 
    _purchasedProductIdentifiers = [NSMutableSet set]; 
    for (NSString * productIdentifier in _productIdentifiers) { 
     BOOL productPurchased = [[NSUserDefaults standardUserDefaults] boolForKey:productIdentifier]; 
     if (productPurchased) { 
      [_purchasedProductIdentifiers addObject:productIdentifier]; 
      NSLog(@"Previously purchased: %@", productIdentifier); 
     } else { 
      NSLog(@"Not purchased: %@", productIdentifier); 
     } 
    } 

} 
return self; 

}

Как это должен быть инициатором, я понятия не имею, как его реализовать. Я пытался изменить его на регулярной функции, которую я мог бы назвать после создания объекта, но даже тогда я бегу в проблемы с этим

for productIdentifier in _productIdentifiers { 
     let productPurchased = NSUserDefaults.standardUserDefaults().boolForKey(productIdentifier) 
     if productPurchased { 
      _purchasedProductIdentifiers.addObject(productIdentifier) 
     } 
    } 

Как утверждает, что NSSet

'NSSet? не имеет члена под названием «Генератор»

Что бы это ни значило. Я также получаю другие случайные ошибки из этой строки о последовательности или что-то в этом роде.

В основном кажется, что слишком много изменилось, и преобразование этого кода в учебник является просто не стартером. На самом деле было бы неплохо увидеть учебник для этого в Swift, но Google не является моим другом. Мне трудно поверить, что ни один пример этого не существует.

Может ли кто-нибудь помочь !? Есть ли учебник для этого? Предпочтительно тот, который устанавливает IAP как отдельный класс многократного использования.

+0

показывают нам, что "skProducts" – CjCoax

+0

функ productsRequest (запрос: SKProductsRequest !, didReceiveResponse ответ: SKProductsResponse) { пусть skProducts = response.products _completionHandler (правда, skProducts) – KelticKoder

+0

для 'NSSet? не имеет члена с именем «Генератор», вам нужно развернуть _productIdentifiers, поэтому вместо «для productIdentifier в _productIdentifiers» вам нужен пользователь «для productIdentifier в _productIdentifiers!». как _productIdentifiers означает нулевую NSSet или NSSet? – CjCoax

ответ

0

Я в середине создания рамки с открытым исходным кодом с бутоном:

https://github.com/Thinkful/iTipJarControl

Мы только неделю, но вы найдете работающий код для покупок здесь.

Наиболее релевантный файл здесь:

https://github.com/Thinkful/iTipJarControl/commit/9b1cbe5f366e42f4cdecedab5e1764b74226bee0

Позвольте мне знать, если у вас есть проблемы с ним. Это займет еще несколько недель, прежде чем все это сблизится.

+ 
+import UIKit 
+import StoreKit 
+ 
+class iTabJarViewController: UIViewController, SKProductsRequestDelegate { 
+ 
+ var product_value = "" 
+ 
+ 
+ 
+ func fetchAvailableProducts() { 
+ var productID:NSMutableSet = NSMutableSet(); 
+ for tag in 1...3 { 
+  println("productID: \(iTipJarConfiguration.storeIdentifer(tag))") 
+  productID.addObject(iTipJarConfiguration.storeIdentifer(tag)) 
+ } 
+ let productsRequest:SKProductsRequest = SKProductsRequest(productIdentifiers: productID) 
+ productsRequest.delegate = self 
+ productsRequest.start() 
+ } 
+ 
+ func productsRequest (request: SKProductsRequest, didReceiveResponse response: SKProductsResponse) { 
+ var count : Int = response.products.count 
+ if (count>0) { 
+  var validProducts = response.products 
+  var validProduct: SKProduct = response.products[0] as SKProduct 
+  if (validProduct.productIdentifier == self.product_value) { 
+  println(validProduct.localizedTitle) 
+ 
+  println(validProduct.localizedDescription) 
+  println(validProduct.price) 
+  purchaseMyProduct(validProduct) 
+  } else { 
+  //println(validProduct.productIdentifier) 
+  } 
+ } else { 
+  println("Nothing found in the store") 
+ } 
+ } 
+ 
+ func canMakePurchases() -> Bool 
+ { 
+ return SKPaymentQueue.canMakePayments() 
+ } 
+ 
+ 
+ func purchaseMyProduct(product: SKProduct) { 
+ if (self.canMakePurchases()) { 
+  println("Purchases are allowed ...") 
+  var payment: SKPayment = SKPayment(product: product) 
+  var defaultQueue: SKPaymentQueue = SKPaymentQueue() 
+ 
+  defaultQueue.addPayment(payment) 
+ } else { 
+  println("Purchases are disabled in your device") 
+ } 
+ } 
+ 
+ 
+ // MARK: - Actions 
+ @IBAction func doneButtonPressed(sender: UIButton) { 
+ self.dismissViewControllerAnimated(true, completion: nil) 
+ } 
+ 
+ @IBAction func tipButtonPressed(sender: UIButton) { 
+ product_value = iTipJarConfiguration.storeIdentifer(sender.tag) 
+ fetchAvailableProducts() 
+ 
+ } 
1

Я создал быструю версию помощника IAP raywenderlich.com.

Вот как выглядит RequestProductsCompletionHandler:

typealias RequestProductsCompletionHandler = (success: Bool, products: NSArray!) ->() 

Вот как класс вары и Инициализационные внешний вид.

class IAPHelper: NSObject,SKProductsRequestDelegate,SKPaymentTransactionObserver { 
    var productsRequest: SKProductsRequest! 
    var completionHandler: RequestProductsCompletionHandler! 
    var nonConsumableProductIDs: NSMutableSet! 
    var purchasedProductIdentifiers: NSMutableSet! 

    init(nonConsumableProductIDs: NSMutableSet) { 
     super.init() 

     // Store non-consumable product identifiers 
     self.nonConsumableProductIDs = nonConsumableProductIDs 

     // check for perviously purchased products 
     purchasedProductIdentifiers = NSMutableSet() 
     for item in nonConsumableProductIDs { 
      let productIdentifier = item as String 
      let productPurcahsed = NSUserDefaults.standardUserDefaults().boolForKey(productIdentifier) 
      if productPurcahsed { 
       println("Previously purchased: \(productIdentifier)") 
       purchasedProductIdentifiers.addObject(productIdentifier) 
      } else { 
       println("Not purchased: \(productIdentifier)") 
      } 
     } 

     SKPaymentQueue.defaultQueue().addTransactionObserver(self) 
    } 

Вот как я звоню его в своем подклассе:

let nonConsumableProductIDs = NSMutableSet(objects: "com.mainstreetcodellc.Smoothie.removeAds") // non-consumable products 
private let _SmoothieIAPHelperSharedInstance = SmoothieIAPHelper(nonConsumableProductIDs: nonConsumableProductIDs) 

class SmoothieIAPHelper: IAPHelper { 

    class var sharedInstance: SmoothieIAPHelper { 
     return _SmoothieIAPHelperSharedInstance 
    } 
} 

Я неохотно опубликовать остальную часть моего кода, потому что есть много, и я не помню, что Я добавил с тех пор, как впервые познакомился с учебником Raywenderlich. Я был бы более чем счастлив опубликовать больше фрагментов, хотя, если есть определенные разделы, дающие вам проблемы. То, что я опубликовал, должно ответить на ваш вопрос.