2015-09-03 4 views
0

На приложении запуска системы мгновенного обмен сообщений проверок статуса получения автоматической пролонгации в приложении покупке:разворачивание Факультативной ошибки значения - Проверка прочтения Response For В App Purchase

App delgate

let qualityOfServiceClass = QOS_CLASS_BACKGROUND 
     let backgroundQueue = dispatch_get_global_queue(qualityOfServiceClass, 0) 
     dispatch_async(backgroundQueue, { 
      println("Check for receipt on background queue") 

self.CheckReciptStatus() 

} 


func CheckReciptStatus(){ 

    var response: NSURLResponse? 
    var error: NSError? 

    var receiptUrl = NSBundle.mainBundle().appStoreReceiptURL 
    println("reciptUrl: '\(receiptUrl)'") 

    // 
    // Nil error on this line 
    // 
    var receipt: NSData = NSData(contentsOfURL:receiptUrl!, options: nil, error: nil)! 
    // 



    var receiptdata: NSString = receipt.base64EncodedStringWithOptions(NSDataBase64EncodingOptions(rawValue: 0)) 
    println(receiptdata) 


    var request = NSMutableURLRequest(URL: NSURL(string: "http://www.someurl.uk/verifyReceipt.php")!) 

    var session = NSURLSession.sharedSession() 
    request.HTTPMethod = "POST" 

    var err: NSError? 

    request.HTTPBody = receiptdata.dataUsingEncoding(NSASCIIStringEncoding) 


    var task = session.dataTaskWithRequest(request, completionHandler: {data, response, error -> Void in 
     var err: NSError? 
     var json = NSJSONSerialization.JSONObjectWithData(data, options: .MutableLeaves, error: &err) as? NSDictionary 

     if(err != nil) 
     { 
      println(err!.localizedDescription) 
      let jsonStr = NSString(data: data, encoding: NSUTF8StringEncoding) 
      println("Error could not parse JSON: '\(jsonStr)'") 
     } 
     else { 

      // 
      // ---Recipt data --- 
      // 
      if let parseJSON = json { 

       if parseJSON["status"] as? Int == 0 { 
        println("Sucessfully returned purchased receipt data") 
       } 
       else{ 
        println("Receipt error") 
        NSUserDefaults.standardUserDefaults().setBool(false, forKey: "subscribed") 

       } 

       // Get latest expiry date 
       if let receiptInfo: NSArray = parseJSON["latest_receipt_info"] as? NSArray { 
        let lastReceipt = receiptInfo.lastObject as! NSDictionary 

        // Get last recipt 
        println("LAST RECIPT INFORMATION \n",lastReceipt) 

        // Format date 
        var formatter = NSDateFormatter() 
        formatter.dateFormat = "yyyy-MM-dd HH:mm:ss VV" 
        formatter.locale = NSLocale(localeIdentifier: "en_US_POSIX") 

        // Get Expiry date as NSDate 
        let subscriptionExpirationDate: NSDate = formatter.dateFromString(lastReceipt["expires_date"] as! String) as NSDate! 
        println("\n - DATE SUBSCRIPTION EXPIRES = \(subscriptionExpirationDate)") 

        println(" - CURRENT DATE = \(NSDate())") 

        // 
        // --- Subscription Status ---- 
        // 
        if subscriptionExpirationDate.timeIntervalSinceNow < 0.0 { 

         // Date has passed 
         println("\n   -> SUBSCRIPTION EXPIRED \n ") 
         NSUserDefaults.standardUserDefaults().setBool(false, forKey: "subscribed") 
        } 
        else{ 

         println("\n   -> SUBSCRIBED \n") 
         NSUserDefaults.standardUserDefaults().setBool(true, forKey: "subscribed") 
        } 
       } 
      } 
      else { 
       let jsonStr = NSString(data: data, encoding: NSUTF8StringEncoding) 
       println("Receipt Error: \(jsonStr)") 
      } 
     } 
    }) 

    task.resume() 

    } 
} 

Получить квитанцию ​​информации

var receiptUrl = NSBundle.mainBundle().appStoreReceiptURL 

Печать:

reciptUrl: 'Дополнительно (файл: /// частный/вар/мобильный/Контейнеры/Data/Application/D0C4DAF0-952F-4C29-9D94-B68DB1FF036F/StoreKit/sandboxReceipt)'

var receipt: NSData = NSData(contentsOfURL:receiptUrl!, options: nil, error: nil)! 

Выдает ошибку

неожиданно нашли ноль в то время как разворачивание необязательное значение

несмотря на то, что я получаю storekit receipt url. Поэтому это приводит к тому, что это связано с тем, что сила развернулась в var receipt. Итак, когда я затем попытаться изменить строку

var receipt: NSData = NSData(contentsOfURL:receiptUrl?, options: nil, error: nil)? 

Им просто сказали, что NSData не разворачивали did I mean "!" or "??"

ответ

0

Проверка, существует ли получение с помощью

var fileExists = NSFileManager.defaultManager().fileExistsAtPath(receiptUrl!.path!) 
if fileExists { 
    println("Appstore Receipt already exists") 
} 

ОБР.ПОР это

0

Postfix ! вызывает силу разворачивания.

Почтовый адрес ? Используется для опционально цепочки. Это означает, что если результат выражения до ? не равен nil, будет оценено следующее выражение в цепочке. Результат необязательной цепочки всегда равен Optional, потому что любое выражение вдоль цепочки может привести к nil.
Использование постфикса ? оператор в одном выражении поэтому бесполезен, так как он возвращает само выражение.

?? является nil-coalescing operator. Этот оператор является синтаксическим сахаром, заменяя общую модель с тройным оператором:

return myOptional ?? defaultResult 

так же, как:

return (myOptional != nil) ? myOptional! : defaultResult 

который так же, как:

if myOptional != nil { 
    return myOptional! 
} else { 
    return defaultResult 
} 

Если вы хотите для использования этого оператора вам необходимо будет предоставить значение по умолчанию, которое используется, если ваш Optional фактически является nil.

+0

Спасибо за ответ и объяснения, хорошо проверяя это сейчас – JSA986

+0

Im не получают ноль значения, когда я называю 'вара receiptUrl = NSBundle. mainBundle(). appStoreReceiptURL', поэтому я до сих пор не понимаю, почему я получаю нулевую ошибку? – JSA986

+0

Не могли бы вы передать мне весь кусок кода? Это может облегчить понимание. –

 Смежные вопросы

  • Нет связанных вопросов^_^