diff --git a/Classes/DYFStore.swift b/Classes/DYFStore.swift index c5c1bed..19ee4cc 100755 --- a/Classes/DYFStore.swift +++ b/Classes/DYFStore.swift @@ -1,8 +1,8 @@ // // DYFStore.swift // -// Created by Teng Fei on 2016/11/28. ( https://github.com/chenxing640/DYFStore ) -// Copyright © 2016 Teng Fei. All rights reserved. +// Created by Tenfay on 2016/11/28. ( https://github.com/itenfay/DYFStore ) +// Copyright © 2016 Tenfay. All rights reserved. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Classes/DYFStoreConverter.swift b/Classes/DYFStoreConverter.swift index d4166be..9f82b14 100755 --- a/Classes/DYFStoreConverter.swift +++ b/Classes/DYFStoreConverter.swift @@ -1,8 +1,8 @@ // // DYFStoreTransaction.swift // -// Created by Teng Fei on 2016/11/28. ( https://github.com/chenxing640/DYFStore ) -// Copyright © 2016 Teng Fei. All rights reserved. +// Created by Tenfay on 2016/11/28. ( https://github.com/itenfay/DYFStore ) +// Copyright © 2016 Tenfay. All rights reserved. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Classes/DYFStoreKeychainPersistence.swift b/Classes/DYFStoreKeychainPersistence.swift index 8315f5e..8f95d80 100755 --- a/Classes/DYFStoreKeychainPersistence.swift +++ b/Classes/DYFStoreKeychainPersistence.swift @@ -1,8 +1,8 @@ // // DYFStoreKeychainPersistence.swift // -// Created by Teng Fei on 2016/11/28. ( https://github.com/chenxing640/DYFStore ) -// Copyright © 2016 Teng Fei. All rights reserved. +// Created by Tenfay on 2016/11/28. ( https://github.com/itenfay/DYFStore ) +// Copyright © 2016 Tenfay. All rights reserved. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Classes/DYFStoreTransaction.swift b/Classes/DYFStoreTransaction.swift index 3d565d5..abc1c8f 100755 --- a/Classes/DYFStoreTransaction.swift +++ b/Classes/DYFStoreTransaction.swift @@ -1,8 +1,8 @@ // // DYFStoreTransaction.swift // -// Created by Teng Fei on 2016/11/28. ( https://github.com/chenxing640/DYFStore ) -// Copyright © 2016 Teng Fei. All rights reserved. +// Created by Tenfay on 2016/11/28. ( https://github.com/itenfay/DYFStore ) +// Copyright © 2016 Tenfay. All rights reserved. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/Classes/DYFStoreUserDefaultsPersistence.swift b/Classes/DYFStoreUserDefaultsPersistence.swift index 8a17f15..a1d6c61 100755 --- a/Classes/DYFStoreUserDefaultsPersistence.swift +++ b/Classes/DYFStoreUserDefaultsPersistence.swift @@ -1,8 +1,8 @@ // // DYFStoreUserDefaultsPersistence.swift // -// Created by Teng Fei on 2016/11/28. ( https://github.com/chenxing640/DYFStore ) -// Copyright © 2016 Teng Fei. All rights reserved. +// Created by Tenfay on 2016/11/28. ( https://github.com/itenfay/DYFStore ) +// Copyright © 2016 Tenfay. All rights reserved. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/DYFStore.podspec b/DYFStore.podspec index a3414d6..eda34a7 100644 --- a/DYFStore.podspec +++ b/DYFStore.podspec @@ -1,23 +1,23 @@ Pod::Spec.new do |s| s.name = "DYFStore" - s.version = "2.1.0" - s.summary = "A lightweight and easy-to-use iOS library for In-App Purchases. (Swift)" + s.version = "2.2.0" + s.summary = "[Swift] A lightweight and easy-to-use iOS library for In-App Purchases." s.description = <<-DESC - TODU: A lightweight and easy-to-use iOS library for In-App Purchases. DYFStore uses blocks and notifications to wrap StoreKit, provides receipt verification and transaction persistence. + TODU: [Swift] A lightweight and easy-to-use iOS library for In-App Purchases. DYFStore uses blocks and notifications to wrap StoreKit, provides receipt verification and transaction persistence. DESC - s.homepage = "https://github.com/chenxing640/DYFStore" + s.homepage = "https://github.com/itenfay/DYFStore" # s.screenshots = "www.example.com/screenshots_1.gif", "www.example.com/screenshots_2.gif" - s.source = { :git => "https://github.com/chenxing640/DYFStore.git", :tag => s.version.to_s } + s.source = { :git => "https://github.com/itenfay/DYFStore.git", :tag => s.version.to_s } # s.license = "MIT (example)" s.license = { :type => "MIT", :file => "LICENSE" } - s.author = { "Teng Fei" => "hansen981@126.com" } - # Or just: s.author = "Teng Fei" - # s.authors = { "Teng Fei" => "hansen981@126.com" } - # s.social_media_url = "https://twitter.com/tengfei" + s.author = { "Tenfay" => "itenfay@163.com" } + # Or just: s.author = "Tenfay" + # s.authors = { "Tenfay" => "itenfay@163.com" } + # s.social_media_url = "https://twitter.com/Tenfay" s.platform = :ios # s.platform = :ios, "5.0" @@ -26,8 +26,8 @@ Pod::Spec.new do |s| # s.watchos.deployment_target = "3.0" # s.tvos.deployment_target = "9.0" - s.swift_versions = ['4.2', '5.0'] - + #s.swift_versions = ['4.2', '5.0'] + s.swift_version = '5.0' s.requires_arc = true s.source_files = "Classes/*.swift" @@ -48,5 +48,4 @@ Pod::Spec.new do |s| # s.dependency "JSONKit", "~> 1.4" # s.dependency 'DYFStoreReceiptVerifier_Swift' s.dependency 'DYFSwiftRuntimeProvider' - end diff --git a/DYFStore.xcodeproj/project.pbxproj b/DYFStore.xcodeproj/project.pbxproj index 90f41e4..5e5fc91 100644 --- a/DYFStore.xcodeproj/project.pbxproj +++ b/DYFStore.xcodeproj/project.pbxproj @@ -57,13 +57,13 @@ 149E56B0235EF74D0011F030 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 149E56B2235EF75A0011F030 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; 35E710337D1F354156C45AC4 /* Pods-DYFStore.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-DYFStore.debug.xcconfig"; path = "Target Support Files/Pods-DYFStore/Pods-DYFStore.debug.xcconfig"; sourceTree = ""; }; + 492441422C28232400AAA998 /* README-en.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = "README-en.md"; sourceTree = SOURCE_ROOT; }; + 492441432C28232400AAA998 /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = SOURCE_ROOT; }; 49785A232BD533B600E367F0 /* SKExtensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SKExtensions.swift; sourceTree = ""; }; 49785A242BD533B600E367F0 /* SKIndefiniteAnimatedSpinner.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SKIndefiniteAnimatedSpinner.swift; sourceTree = ""; }; 49785A252BD533B600E367F0 /* SKLoadingView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SKLoadingView.swift; sourceTree = ""; }; 49785A262BD533B600E367F0 /* SKIAPManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SKIAPManager.swift; sourceTree = ""; }; 49785A2C2BD533C800E367F0 /* DYFStore.podspec */ = {isa = PBXFileReference; lastKnownFileType = text; path = DYFStore.podspec; sourceTree = SOURCE_ROOT; }; - 497B36582BD438A600733FE8 /* README-zh.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = "README-zh.md"; sourceTree = SOURCE_ROOT; }; - 497B36592BD438A600733FE8 /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = SOURCE_ROOT; }; 497B365A2BD438A600733FE8 /* LICENSE */ = {isa = PBXFileReference; lastKnownFileType = text; path = LICENSE; sourceTree = SOURCE_ROOT; }; A2381EE5D31812C8BFC40A09 /* Pods_DYFStore.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_DYFStore.framework; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ @@ -163,8 +163,8 @@ children = ( 49785A2C2BD533C800E367F0 /* DYFStore.podspec */, 497B365A2BD438A600733FE8 /* LICENSE */, - 497B36582BD438A600733FE8 /* README-zh.md */, - 497B36592BD438A600733FE8 /* README.md */, + 492441422C28232400AAA998 /* README-en.md */, + 492441432C28232400AAA998 /* README.md */, ); path = "Podspec Metadata"; sourceTree = ""; @@ -458,7 +458,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_IDENTITY = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 10; + CURRENT_PROJECT_VERSION = 2; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = KCBQ48PTUV; INFOPLIST_FILE = "$(SRCROOT)/DYFStoreDemo/Info.plist"; @@ -468,7 +468,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 2.1.0; + MARKETING_VERSION = 2.2.0; PRODUCT_BUNDLE_IDENTIFIER = com.hncs.szj; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -484,7 +484,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_IDENTITY = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 10; + CURRENT_PROJECT_VERSION = 2; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = KCBQ48PTUV; INFOPLIST_FILE = "$(SRCROOT)/DYFStoreDemo/Info.plist"; @@ -494,7 +494,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 2.1.0; + MARKETING_VERSION = 2.2.0; PRODUCT_BUNDLE_IDENTIFIER = com.hncs.szj; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; diff --git a/DYFStoreDemo/AppDelegate.swift b/DYFStoreDemo/AppDelegate.swift index 023e40c..b950438 100644 --- a/DYFStoreDemo/AppDelegate.swift +++ b/DYFStoreDemo/AppDelegate.swift @@ -1,8 +1,8 @@ // // AppDelegate.swift // -// Created by Teng Fei on 2016/11/28. -// Copyright © 2016 Teng Fei. All rights reserved. +// Created by Tenfay on 2016/11/28. +// Copyright © 2016 Tenfay. All rights reserved. // import UIKit diff --git a/DYFStoreDemo/SKStoreProduct.swift b/DYFStoreDemo/SKStoreProduct.swift index 4641b0a..578febd 100755 --- a/DYFStoreDemo/SKStoreProduct.swift +++ b/DYFStoreDemo/SKStoreProduct.swift @@ -1,8 +1,8 @@ // // SKStoreProduct.swift // -// Created by Teng Fei on 2016/11/28. -// Copyright © 2016 Teng Fei. All rights reserved. +// Created by Tenfay on 2016/11/28. +// Copyright © 2016 Tenfay. All rights reserved. // import Foundation diff --git a/DYFStoreDemo/SKStoreTableViewCell.swift b/DYFStoreDemo/SKStoreTableViewCell.swift index a9c0070..eec69b0 100755 --- a/DYFStoreDemo/SKStoreTableViewCell.swift +++ b/DYFStoreDemo/SKStoreTableViewCell.swift @@ -1,8 +1,8 @@ // // SKStoreTableViewCell.swift // -// Created by Teng Fei on 2016/11/28. -// Copyright © 2016 Teng Fei. All rights reserved. +// Created by Tenfay on 2016/11/28. +// Copyright © 2016 Tenfay. All rights reserved. // import UIKit diff --git a/DYFStoreDemo/SKStoreViewController.swift b/DYFStoreDemo/SKStoreViewController.swift index 1c050d7..479874d 100755 --- a/DYFStoreDemo/SKStoreViewController.swift +++ b/DYFStoreDemo/SKStoreViewController.swift @@ -1,8 +1,8 @@ // // SKStoreViewController.swift // -// Created by Teng Fei on 2016/11/28. -// Copyright © 2016 Teng Fei. All rights reserved. +// Created by Tenfay on 2016/11/28. +// Copyright © 2016 Tenfay. All rights reserved. // import UIKit diff --git a/DYFStoreDemo/Sample/SKExtensions.swift b/DYFStoreDemo/Sample/SKExtensions.swift index 4ff6095..f7986df 100755 --- a/DYFStoreDemo/Sample/SKExtensions.swift +++ b/DYFStoreDemo/Sample/SKExtensions.swift @@ -1,8 +1,8 @@ // // SKExtensions.swift // -// Created by Teng Fei on 2016/11/28. -// Copyright © 2016 Teng Fei. All rights reserved. +// Created by Tenfay on 2016/11/28. +// Copyright © 2016 Tenfay. All rights reserved. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/DYFStoreDemo/Sample/SKIAPManager.swift b/DYFStoreDemo/Sample/SKIAPManager.swift index 1c3125a..3be8bfd 100755 --- a/DYFStoreDemo/Sample/SKIAPManager.swift +++ b/DYFStoreDemo/Sample/SKIAPManager.swift @@ -1,8 +1,8 @@ // // SKIAPManager.swift // -// Created by Teng Fei on 2016/11/28. -// Copyright © 2016 Teng Fei. All rights reserved. +// Created by Tenfay on 2016/11/28. +// Copyright © 2016 Tenfay. All rights reserved. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/DYFStoreDemo/Sample/SKIndefiniteAnimatedSpinner.swift b/DYFStoreDemo/Sample/SKIndefiniteAnimatedSpinner.swift index f27051d..6227bc7 100755 --- a/DYFStoreDemo/Sample/SKIndefiniteAnimatedSpinner.swift +++ b/DYFStoreDemo/Sample/SKIndefiniteAnimatedSpinner.swift @@ -1,8 +1,8 @@ // // SKIndefiniteAnimatedSpinner.swift // -// Created by Teng Fei on 2016/11/28. -// Copyright © 2016 Teng Fei. All rights reserved. +// Created by Tenfay on 2016/11/28. +// Copyright © 2016 Tenfay. All rights reserved. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/DYFStoreDemo/Sample/SKLoadingView.swift b/DYFStoreDemo/Sample/SKLoadingView.swift index ba28c9d..50fc73e 100755 --- a/DYFStoreDemo/Sample/SKLoadingView.swift +++ b/DYFStoreDemo/Sample/SKLoadingView.swift @@ -1,8 +1,8 @@ // // SKLoadingView.swift // -// Created by Teng Fei on 2016/11/28. -// Copyright © 2016 Teng Fei. All rights reserved. +// Created by Tenfay on 2016/11/28. +// Copyright © 2016 Tenfay. All rights reserved. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal diff --git a/DYFStoreDemo/ViewController.swift b/DYFStoreDemo/ViewController.swift index 08a74f3..4d25cc1 100644 --- a/DYFStoreDemo/ViewController.swift +++ b/DYFStoreDemo/ViewController.swift @@ -1,8 +1,8 @@ // // ViewController.swift // -// Created by Teng Fei on 2016/11/28. -// Copyright © 2016 Teng Fei. All rights reserved. +// Created by Tenfay on 2016/11/28. +// Copyright © 2016 Tenfay. All rights reserved. // import UIKit diff --git a/LICENSE b/LICENSE index 4b1e92b..f62c06c 100644 --- a/LICENSE +++ b/LICENSE @@ -1,7 +1,7 @@ MIT License -Created by Teng Fei on 2016/11/28. ( https://github.com/chenxing640/DYFStore ) -Copyright © 2016 Teng Fei. All rights reserved. +Created by Tenfay on 2016/11/28. ( https://github.com/itenfay/DYFStore ) +Copyright © 2016 Tenfay. All rights reserved. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/Podfile b/Podfile index 2784d39..dc87f6b 100644 --- a/Podfile +++ b/Podfile @@ -9,6 +9,7 @@ target 'DYFStore' do # Pods for DYFStore pod 'DYFSwiftRuntimeProvider' + # The receipt verifier(Optional). pod 'DYFStoreReceiptVerifier_Swift' end diff --git a/README-zh.md b/README-en.md similarity index 66% rename from README-zh.md rename to README-en.md index 006c33f..bbc7881 100644 --- a/README-zh.md +++ b/README-en.md @@ -1,69 +1,71 @@ -[English Vision](README.md) | 中文版 +[中文版](README.md) | **English Version** + ## DYFStore -一个轻量级且易于使用的iOS应用内购库([Objective-C Version](https://github.com/chenxing640/DYFStoreKit))。 +A lightweight and easy-to-use iOS library for In-App Purchases ([Objective-C Version](https://github.com/itenfay/DYFStoreKit)). -`DYFStore`使用代码块和[通知](#通知)包装`StoreKit`,提供[收据验证](#收据验证)和[交易持久化](#交易持久化)。 +`DYFStore` uses blocks and [notifications](#Notifications) to wrap `StoreKit`, provides [receipt verification](#Receipt-verification) and [transaction persistence](#Transaction-persistence). [![License MIT](https://img.shields.io/badge/license-MIT-green.svg?style=flat)](LICENSE)  [![CocoaPods](http://img.shields.io/cocoapods/v/DYFStore.svg?style=flat)](http://cocoapods.org/pods/DYFStore)  ![CocoaPods](http://img.shields.io/cocoapods/p/DYFStore.svg?style=flat)  -## 相关连接 +## Related Links -- [DYFSwiftRuntimeProvider](https://github.com/chenxing640/DYFSwiftRuntimeProvider/) -- [DYFSwiftKeychain](https://github.com/chenxing640/DYFSwiftKeychain/) -- [DYFStoreReceiptVerifier_Swift](https://github.com/chenxing640/DYFStoreReceiptVerifier_Swift/) -- [Unity-iOS-InAppPurchase](https://github.com/chenxing640/Unity-iOS-InAppPurchase/) -- [in-app-purchase-complete-programming-guide-for-iOS](https://chenxing640.github.io/2016/10/16/in-app-purchase-complete-programming-guide-for-iOS/) -- [how-to-easily-complete-in-app-purchase-configuration-for-iOS](https://chenxing640.github.io/2016/10/12/how-to-easily-complete-in-app-purchase-configuration-for-iOS/) +- [DYFSwiftRuntimeProvider](https://github.com/itenfay/DYFSwiftRuntimeProvider/) +- [DYFSwiftKeychain](https://github.com/itenfay/DYFSwiftKeychain/) +- [DYFStoreReceiptVerifier_Swift](https://github.com/itenfay/DYFStoreReceiptVerifier_Swift/) +- [Unity-iOS-InAppPurchase](https://github.com/itenfay/Unity-iOS-InAppPurchase/) +- [in-app-purchase-complete-programming-guide-for-iOS](https://itenfay.github.io/2016/10/16/in-app-purchase-complete-programming-guide-for-iOS/) +- [how-to-easily-complete-in-app-purchase-configuration-for-iOS](https://itenfay.github.io/2016/10/12/how-to-easily-complete-in-app-purchase-configuration-for-iOS/) -## 特点 +## Features -- 超级简单的应用内购买 -- 内置支持记住您的购买 -- 内置收据验证(远程) -- 内置托管内容下载和通知 +- Super simple in-app purchases. +- Built-in support for remembering your purchases. +- Built-in receipt validation (remote). +- Built-in hosted content downloads and notifications. -## QQ群 (ID:614799921) +## Group (ID:614799921)
-  + 
-## 安装 +## Installation -使用 [CocoaPods](https://cocoapods.org): +Using [CocoaPods](https://cocoapods.org): ``` pod 'DYFStore' ``` -`OR` + +Or ``` -pod 'DYFStore', '~> 2.1.0' +pod 'DYFStore', '~> 2.2.0' ``` -查看 [wiki](https://github.com/chenxing640/DYFStore/wiki/Installation) 以获取更多选项。 +Check out the [wiki](https://github.com/itenfay/DYFStore/wiki/Installation) for more options. -## 使用 +## Usage -接下来我会教你如何使用 `DYFStore`。 +Next I'll show you how to use `DYFStore`. -### 初始化 +### Initialization -初始化如下所示。 +The initialization is as follows. -- 是否允许将日志输出到控制台,在 Debug 模式下设置 `true`,查看内购整个过程的日志,在 Release 模式下发布 App 时将 enableLog 设置 `false`。 -- 添加交易的观察者,监听交易的变化。 -- 实例化数据持久,存储交易的相关信息。 -- 遵守协议 `DYFStoreAppStorePaymentDelegate`,处理从 App Store 购买产品的付款。 +- Whether to allow the logs output to the console, set 'true' in debug mode, view the logs of the whole process of in-app purchase, and set 'false' when publishing app in release mode. +- Adds the observer of transactions and monitors the change of transactions. +- Instantiates data persistent object and stores the related information of transactions. +- Follows the agreement `DYFStoreAppStorePaymentDelegate` and processes payments for products purchased from the App Store. ``` func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { @@ -89,7 +91,7 @@ func initIAPSDK() { } ``` -你可以处理用户从应用商店发起的购买,并使用 `DYFStoreAppStorePaymentDelegate` 协议提供自己的实现: +You can process the purchase which was initiated by user from the App Store and provide your own implementation using the `DYFStoreAppStorePaymentDelegate` protocol: ``` // Processes the purchase which was initiated by user from the App Store. @@ -108,10 +110,9 @@ func didReceiveAppStorePurchaseRequest(_ queue: SKPaymentQueue, payment: SKPayme } ``` +### Request products -### 创建商品查询的请求 - -在创建商品查询的请求前,你需要检查设备是否能够或者被允许付款。 +You need to check whether the device is not able or allowed to make payments before requesting products. ``` if !DYFStore.canMakePayments() { @@ -120,9 +121,9 @@ if !DYFStore.canMakePayments() { } ``` -在开始购买过程,首先必须清楚有哪些产品标识符。有两种策略可用于从应用程序商店获取有关产品的信息。 +To begin the purchase process, your app must know its product identifiers. There are two strategies for retrieving information about the products from the App Store. -**策略1:** App 可以使用其中一个产品标识符来获取应用程序商店中可供销售的产品的信息,并直接提交付款请求。 +**Strategy 1:** Your app can uses a product identifier to fetch information about product available for sale in the App Store and to submit payment request directly. ``` @IBAction func fetchesProductAndSubmitsPayment(_ sender: Any) { @@ -160,7 +161,7 @@ private func addPayment(_ productId: String) { } ``` -**策略2:** App 从应用程序商店获取有关产品的信息,并向用户显示其商店用户界面。App 中销售的每个产品都有唯一的产品标识符。App 使用这些产品标识符获取有关应用程序商店中可供销售的产品的信息,例如定价,并在用户购买这些产品时提交付款请求。 +**Strategy 2:** It can retrieve information about the products from the App Store and present its store UI to the user. Every product sold in your app has a unique product identifier. Your app uses these product identifiers to fetch information about products available for sale in the App Store, such as pricing, and to submit payment requests when users purchase those products. ``` func fetchProductIdentifiersFromServer() -> [String] { @@ -224,18 +225,17 @@ private func displayStoreUI(_ dataArray: [SKStoreProduct]) { } ``` +### Add payment -### 创建购买产品的付款请求 - -使用给定的产品标识符请求产品付款。 +Requests payment of the product with the given product identifier. ``` DYFStore.default.purchaseProduct("com.hncs.szj.coin210") ``` -如果需要系统上用户帐户的不透明标识符来添加付款,可以使用用户帐户名的单向哈希来计算此属性的值。 +If you need an opaque identifier for the user’s account on your system to add payment, you can use a one-way hash of the user’s account name to calculate the value for this property. -计算 SHA256 哈希值函数: +Calculates the SHA256 hash function: ``` public func DYFStoreCryptoSHA256(_ s: String) -> String? { @@ -269,33 +269,29 @@ public func DYFStoreCryptoSHA256(_ s: String) -> String? { } ``` -使用给定的产品标识符和系统中用户帐户的不透明标识符请求产品付款。 +Requests payment of the product with the given product identifier, an opaque identifier for the user’s account on your system. ``` DYFStore.default.purchaseProduct("com.hncs.szj.coin210", userIdentifier: "A43512564ACBEF687924646CAFEFBDCAEDF4155125657") ``` +### Restore transactions -### 恢复已购买的付款交易 - -在某些场景(如切换设备),App 需要提供恢复购买按钮,用来恢复之前购买的非消耗型的产品。 - -- 无绑定用户帐户 ID 的恢复 +- Restores transactions without the user account identifier. ``` DYFStore.default.restoreTransactions() ``` -- 绑定用户帐户 ID 的恢复 +- Restores transactions with the user account identifier. ``` DYFStore.default.restoreTransactions(userIdentifier: "A43512564ACBEF687924646CAFEFBDCAEDF4155125657") ``` +### Refresh receipt -### 创建刷新收据请求 - -如果 `Bundle.main.appStoreReceiptURL` 为空,就需要创建刷新收据请求,获取付款交易的收据。 +If `Bundle.main.appStoreReceiptURL` is null, you need to create a refresh receipt request to obtain a receipt for a payment transaction. ``` DYFStore.default.refreshReceipt(onSuccess: { @@ -305,12 +301,11 @@ DYFStore.default.refreshReceipt(onSuccess: { } ``` +### Notifications -### 通知 - -`DYFStore`发送与`StoreKit`相关事件的通知,并扩展`NSNotification`以提供相关信息。要接收它们,请将观察者添加到`DYFStore`管理员。 +`DYFStore` sends notifications of `StoreKit` related events and extends `NSNotification` to provide relevant information. To receive them, add the observer to a `DYFStore` manager. -#### 添加商店观察者,监听购买和下载通知 +#### Add the store observer ``` func addStoreObserver() { @@ -319,7 +314,9 @@ func addStoreObserver() { } ``` -#### 在适当的时候,移除商店观察者 +#### Remove the store observer + +When the application exits, you need to remove the store observer. ``` func removeStoreObserver() { @@ -328,9 +325,9 @@ func removeStoreObserver() { } ``` -#### 付款交易的通知处理 +#### Payment transaction notifications -付款交易的通知是在请求付款后发送的,或是为每个恢复的交易发送的。 +Payment transaction notifications are sent after a payment has been requested or for each restored transaction. ``` @objc private func processPurchaseNotification(_ notification: Notification) { @@ -359,7 +356,7 @@ func removeStoreObserver() { } ``` -#### 下载的通知处理 +#### Download notifications ``` @objc private func processDownloadNotification(_ notification: Notification) { @@ -384,16 +381,15 @@ func removeStoreObserver() { } ``` +### Receipt verification -### 收据验证 +`DYFStore` doesn't perform receipt verification by default, but provides reference implementations. You can implement your own custom verification or use the reference verifier provided by the library. -`DYFStore`默认情况下不执行收据验证,但提供引用实现。您可以实现自己的自定义验证或使用库提供的引用验证程序。 +The reference verifier is outlined below. For more info, check out the [wiki](https://github.com/itenfay/DYFStore/wiki/Receipt-verification). -引用验证程序概述如下。有关更多信息,请查看 [wiki](https://github.com/chenxing640/DYFStore/wiki/Receipt-verification)。 +#### Reference verifier -#### 引用验证器 - -通过使用延迟加载创建并返回收据验证器(`DYFStoreReceiptVerifier`)。 +You create and return a receipt verifier(`DYFStoreReceiptVerifier`) by using lazy loading. ``` lazy var receiptVerifier: DYFStoreReceiptVerifier = { @@ -403,7 +399,7 @@ lazy var receiptVerifier: DYFStoreReceiptVerifier = { }() ``` -收据验证程序委托收据验证,使您能够使用`DYFStoreReceiptVerifierDelegate`协议提供自己的实现: +The receipt verifier delegates receipt verification, enabling you to provide your own implementation using the `DYFStoreReceiptVerifierDelegate` protocol: ``` public func verifyReceiptDidFinish(_ verifier: DYFStoreReceiptVerifier, didReceiveData data: [String : Any]) {} @@ -411,7 +407,7 @@ public func verifyReceiptDidFinish(_ verifier: DYFStoreReceiptVerifier, didRecei public func verifyReceipt(_ verifier: DYFStoreReceiptVerifier, didFailWithError error: NSError) {} ``` -你可以开始验证应用内购买收据。 +You can start verifying the in-app purchase receipt. ``` // Fetches the data of the bundle’s App Store receipt. @@ -425,27 +421,26 @@ self.receiptVerifier.verifyReceipt(data) //self.receiptVerifier.verifyReceipt(data, sharedSecret: "A43512564ACBEF687924646CAFEFBDCAEDF4155125657") ``` -如果担心安全性,你可能希望避免使用开源验证逻辑,提供自己的自定义验证程序。 - -最好使用你自己的服务器获取从客户端上传的参数,以验证来自App Store服务器的收据的响应信息(C -> 上传的参数 -> S -> App Store S -> S -> 接收并解析数据 -> C,C:客户端,S:服务器)。 +If security is a concern you might want to avoid using an open source verification logic, and provide your own custom verifier instead. +It is better to use your own server to obtain the parameters uploaded from the client to verify the receipt from the app store server (C -> Uploaded Parameters -> S -> App Store S -> S -> Receive And Parse Data -> C, C: client, S: server). -### 完成交易 +### Finish transactions -只有客户机与服务器采用安全通信和数据加密并且收据验证通过后,才能完成交易。这样,我们可以避免刷新订单和破解应用内购买。如果我们无法完成验证,我们希望`StoreKit`不断提醒我们还有未完成的交易。 +The transaction can be finished only after the client and server adopt secure communication and data encryption and the receipt verification is passed. In this way, we can avoid refreshing orders and cracking in-app purchase. If we were unable to complete the verification, we want `StoreKit` to keep reminding us that there are still outstanding transactions. ``` DYFStore.default.finishTransaction(transaction) ``` -## 交易持久化 +## Transaction persistence -`DYFStore`提供了一个可选的引用实现,用于将交易信息存储在 NSUserDefaults(`DYFStoreUserDefaultsPersistence`)中。 +`DYFStore` provides an optional reference implementation for storing transactions in `NSUserDefaults`(`DYFStoreUserDefaultsPersistence`). -当客户端在付款过程中发生崩溃,导致 App 闪退,这时存储交易信息尤为重要。当 StoreKit 再次通知未完成的付款时,直接从文件中取出数据,进行收据验证,直至完成交易。 +When the client crashes during the payment process, it is particularly important to store transaction information. When storekit notifies the uncompleted payment again, it takes the data directly from keychain and performs the receipt verification until the transaction is completed. -### 存储交易信息 +### Store transaction ``` func storeReceipt() { @@ -484,7 +479,7 @@ func storeReceipt() { } ``` -### 移除交易信息 +### Remove transaction ``` let info = self.purchaseInfo! @@ -509,16 +504,16 @@ if let id = info.originalTransactionIdentifier { ``` -## 要求 +## Requirements -`DYFStore`需要`iOS 8.0`或更高版本和ARC。 +`DYFStore` requires `iOS 8.0` or above and `ARC`. -## 演示 +## Demo -如需了解更多,请克隆此项目(`git clone https://github.com/chenxing640/DYFStore.git`)到本地目录。 +To learn more, please clone this project (`git clone https://github.com/itenfay/DYFStore.git`) to the local directory. -## 欢迎反馈 +## Feedback is welcome -如果你注意到任何问题被卡住,请创建一个问题。我很乐意帮助你。 +If you notice any issue to create an issue. I will be happy to help you. diff --git a/README.md b/README.md index 491ad79..b94185f 100644 --- a/README.md +++ b/README.md @@ -1,43 +1,45 @@ -English Vision | [中文版](README-zh.md) +**中文版** | [English Version](README-en.md) + ## DYFStore -A lightweight and easy-to-use iOS library for In-App Purchases ([Objective-C Version](https://github.com/chenxing640/DYFStoreKit)). +一个轻量级且易于使用的iOS应用内购库([Objective-C Version](https://github.com/itenfay/DYFStoreKit))。 -`DYFStore` uses blocks and [notifications](#Notifications) to wrap `StoreKit`, provides [receipt verification](#Receipt-verification) and [transaction persistence](#Transaction-persistence). +`DYFStore`使用代码块和[通知](#通知)包装`StoreKit`,提供[收据验证](#收据验证)和[交易持久化](#交易持久化)。 [![License MIT](https://img.shields.io/badge/license-MIT-green.svg?style=flat)](LICENSE)  [![CocoaPods](http://img.shields.io/cocoapods/v/DYFStore.svg?style=flat)](http://cocoapods.org/pods/DYFStore)  ![CocoaPods](http://img.shields.io/cocoapods/p/DYFStore.svg?style=flat)  -## Related Links -- [DYFSwiftRuntimeProvider](https://github.com/chenxing640/DYFSwiftRuntimeProvider/) -- [DYFSwiftKeychain](https://github.com/chenxing640/DYFSwiftKeychain/) -- [DYFStoreReceiptVerifier_Swift](https://github.com/chenxing640/DYFStoreReceiptVerifier_Swift/) -- [Unity-iOS-InAppPurchase](https://github.com/chenxing640/Unity-iOS-InAppPurchase/) -- [in-app-purchase-complete-programming-guide-for-iOS](https://chenxing640.github.io/2016/10/16/in-app-purchase-complete-programming-guide-for-iOS/) -- [how-to-easily-complete-in-app-purchase-configuration-for-iOS](https://chenxing640.github.io/2016/10/12/how-to-easily-complete-in-app-purchase-configuration-for-iOS/) +## 相关连接 + +- [DYFSwiftRuntimeProvider](https://github.com/itenfay/DYFSwiftRuntimeProvider/) +- [DYFSwiftKeychain](https://github.com/itenfay/DYFSwiftKeychain/) +- [DYFStoreReceiptVerifier_Swift](https://github.com/itenfay/DYFStoreReceiptVerifier_Swift/) +- [Unity-iOS-InAppPurchase](https://github.com/itenfay/Unity-iOS-InAppPurchase/) +- [in-app-purchase-complete-programming-guide-for-iOS](https://itenfay.github.io/2016/10/16/in-app-purchase-complete-programming-guide-for-iOS/) +- [how-to-easily-complete-in-app-purchase-configuration-for-iOS](https://itenfay.github.io/2016/10/12/how-to-easily-complete-in-app-purchase-configuration-for-iOS/) -## Features +## 特点 -- Super simple in-app purchases. -- Built-in support for remembering your purchases. -- Built-in receipt validation (remote). -- Built-in hosted content downloads and notifications. +- 超级简单的应用内购买 +- 内置支持记住您的购买 +- 内置收据验证(远程) +- 内置托管内容下载和通知 -## Group (ID:614799921) +## QQ群 (ID:614799921)
-  + 
-## Installation +## 安装 -Using [CocoaPods](https://cocoapods.org): +使用 [CocoaPods](https://cocoapods.org): ``` pod 'DYFStore' @@ -48,21 +50,21 @@ pod 'DYFStore' pod 'DYFStore', '~> 2.1.0' ``` -Check out the [wiki](https://github.com/chenxing640/DYFStore/wiki/Installation) for more options. +查看 [wiki](https://github.com/itenfay/DYFStore/wiki/Installation) 以获取更多选项。 -## Usage +## 使用 -Next I'll show you how to use `DYFStore`. +接下来我会教你如何使用 `DYFStore`。 -### Initialization +### 初始化 -The initialization is as follows. +初始化如下所示。 -- Whether to allow the logs output to the console, set 'true' in debug mode, view the logs of the whole process of in-app purchase, and set 'false' when publishing app in release mode. -- Adds the observer of transactions and monitors the change of transactions. -- Instantiates data persistent object and stores the related information of transactions. -- Follows the agreement `DYFStoreAppStorePaymentDelegate` and processes payments for products purchased from the App Store. +- 是否允许将日志输出到控制台,在 Debug 模式下设置 `true`,查看内购整个过程的日志,在 Release 模式下发布 App 时将 enableLog 设置 `false`。 +- 添加交易的观察者,监听交易的变化。 +- 实例化数据持久,存储交易的相关信息。 +- 遵守协议 `DYFStoreAppStorePaymentDelegate`,处理从 App Store 购买产品的付款。 ``` func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { @@ -88,7 +90,7 @@ func initIAPSDK() { } ``` -You can process the purchase which was initiated by user from the App Store and provide your own implementation using the `DYFStoreAppStorePaymentDelegate` protocol: +你可以处理用户从应用商店发起的购买,并使用 `DYFStoreAppStorePaymentDelegate` 协议提供自己的实现: ``` // Processes the purchase which was initiated by user from the App Store. @@ -107,10 +109,9 @@ func didReceiveAppStorePurchaseRequest(_ queue: SKPaymentQueue, payment: SKPayme } ``` +### 创建商品查询的请求 -### Request products - -You need to check whether the device is not able or allowed to make payments before requesting products. +在创建商品查询的请求前,你需要检查设备是否能够或者被允许付款。 ``` if !DYFStore.canMakePayments() { @@ -119,9 +120,9 @@ if !DYFStore.canMakePayments() { } ``` -To begin the purchase process, your app must know its product identifiers. There are two strategies for retrieving information about the products from the App Store. +在开始购买过程,首先必须清楚有哪些产品标识符。有两种策略可用于从应用程序商店获取有关产品的信息。 -**Strategy 1:** Your app can uses a product identifier to fetch information about product available for sale in the App Store and to submit payment request directly. +**策略1:** App 可以使用其中一个产品标识符来获取应用程序商店中可供销售的产品的信息,并直接提交付款请求。 ``` @IBAction func fetchesProductAndSubmitsPayment(_ sender: Any) { @@ -159,7 +160,7 @@ private func addPayment(_ productId: String) { } ``` -**Strategy 2:** It can retrieve information about the products from the App Store and present its store UI to the user. Every product sold in your app has a unique product identifier. Your app uses these product identifiers to fetch information about products available for sale in the App Store, such as pricing, and to submit payment requests when users purchase those products. +**策略2:** App 从应用程序商店获取有关产品的信息,并向用户显示其商店用户界面。App 中销售的每个产品都有唯一的产品标识符。App 使用这些产品标识符获取有关应用程序商店中可供销售的产品的信息,例如定价,并在用户购买这些产品时提交付款请求。 ``` func fetchProductIdentifiersFromServer() -> [String] { @@ -223,18 +224,17 @@ private func displayStoreUI(_ dataArray: [SKStoreProduct]) { } ``` +### 创建购买产品的付款请求 -### Add payment - -Requests payment of the product with the given product identifier. +使用给定的产品标识符请求产品付款。 ``` DYFStore.default.purchaseProduct("com.hncs.szj.coin210") ``` -If you need an opaque identifier for the user’s account on your system to add payment, you can use a one-way hash of the user’s account name to calculate the value for this property. +如果需要系统上用户帐户的不透明标识符来添加付款,可以使用用户帐户名的单向哈希来计算此属性的值。 -Calculates the SHA256 hash function: +计算 SHA256 哈希值函数: ``` public func DYFStoreCryptoSHA256(_ s: String) -> String? { @@ -268,31 +268,31 @@ public func DYFStoreCryptoSHA256(_ s: String) -> String? { } ``` -Requests payment of the product with the given product identifier, an opaque identifier for the user’s account on your system. +使用给定的产品标识符和系统中用户帐户的不透明标识符请求产品付款。 ``` DYFStore.default.purchaseProduct("com.hncs.szj.coin210", userIdentifier: "A43512564ACBEF687924646CAFEFBDCAEDF4155125657") ``` +### 恢复已购买的付款交易 -### Restore transactions +在某些场景(如切换设备),App 需要提供恢复购买按钮,用来恢复之前购买的非消耗型的产品。 -- Restores transactions without the user account identifier. +- 无绑定用户帐户 ID 的恢复 ``` DYFStore.default.restoreTransactions() ``` -- Restores transactions with the user account identifier. +- 绑定用户帐户 ID 的恢复 ``` DYFStore.default.restoreTransactions(userIdentifier: "A43512564ACBEF687924646CAFEFBDCAEDF4155125657") ``` +### 创建刷新收据请求 -### Refresh receipt - -If `Bundle.main.appStoreReceiptURL` is null, you need to create a refresh receipt request to obtain a receipt for a payment transaction. +如果 `Bundle.main.appStoreReceiptURL` 为空,就需要创建刷新收据请求,获取付款交易的收据。 ``` DYFStore.default.refreshReceipt(onSuccess: { @@ -302,12 +302,11 @@ DYFStore.default.refreshReceipt(onSuccess: { } ``` +### 通知 -### Notifications +`DYFStore`发送与`StoreKit`相关事件的通知,并扩展`NSNotification`以提供相关信息。要接收它们,请将观察者添加到`DYFStore`管理员。 -`DYFStore` sends notifications of `StoreKit` related events and extends `NSNotification` to provide relevant information. To receive them, add the observer to a `DYFStore` manager. - -#### Add the store observer +#### 添加商店观察者,监听购买和下载通知 ``` func addStoreObserver() { @@ -316,9 +315,7 @@ func addStoreObserver() { } ``` -#### Remove the store observer - -When the application exits, you need to remove the store observer. +#### 在适当的时候,移除商店观察者 ``` func removeStoreObserver() { @@ -327,9 +324,9 @@ func removeStoreObserver() { } ``` -#### Payment transaction notifications +#### 付款交易的通知处理 -Payment transaction notifications are sent after a payment has been requested or for each restored transaction. +付款交易的通知是在请求付款后发送的,或是为每个恢复的交易发送的。 ``` @objc private func processPurchaseNotification(_ notification: Notification) { @@ -358,7 +355,7 @@ Payment transaction notifications are sent after a payment has been requested or } ``` -#### Download notifications +#### 下载的通知处理 ``` @objc private func processDownloadNotification(_ notification: Notification) { @@ -383,16 +380,15 @@ Payment transaction notifications are sent after a payment has been requested or } ``` +### 收据验证 -### Receipt verification - -`DYFStore` doesn't perform receipt verification by default, but provides reference implementations. You can implement your own custom verification or use the reference verifier provided by the library. +`DYFStore`默认情况下不执行收据验证,但提供引用实现。您可以实现自己的自定义验证或使用库提供的引用验证程序。 -The reference verifier is outlined below. For more info, check out the [wiki](https://github.com/chenxing640/DYFStore/wiki/Receipt-verification). +引用验证程序概述如下。有关更多信息,请查看 [wiki](https://github.com/itenfay/DYFStore/wiki/Receipt-verification)。 -#### Reference verifier +#### 引用验证器 -You create and return a receipt verifier(`DYFStoreReceiptVerifier`) by using lazy loading. +通过使用延迟加载创建并返回收据验证器(`DYFStoreReceiptVerifier`)。 ``` lazy var receiptVerifier: DYFStoreReceiptVerifier = { @@ -402,15 +398,14 @@ lazy var receiptVerifier: DYFStoreReceiptVerifier = { }() ``` -The receipt verifier delegates receipt verification, enabling you to provide your own implementation using the `DYFStoreReceiptVerifierDelegate` protocol: +收据验证程序委托收据验证,使您能够使用`DYFStoreReceiptVerifierDelegate`协议提供自己的实现: ``` public func verifyReceiptDidFinish(_ verifier: DYFStoreReceiptVerifier, didReceiveData data: [String : Any]) {} - public func verifyReceipt(_ verifier: DYFStoreReceiptVerifier, didFailWithError error: NSError) {} ``` -You can start verifying the in-app purchase receipt. +你可以开始验证应用内购买收据。 ``` // Fetches the data of the bundle’s App Store receipt. @@ -421,30 +416,29 @@ let data = try? Data(contentsOf: DYFStore.receiptURL()) self.receiptVerifier.verifyReceipt(data) // Only used for receipts that contain auto-renewable subscriptions. -//self.receiptVerifier.verifyReceipt(data, sharedSecret: "A43512564ACBEF687924646CAFEFBDCAEDF4155125657") +self.receiptVerifier.verifyReceipt(data, sharedSecret: "A43512564ACBEF687924646CAFEFBDCAEDF4155125657") ``` -If security is a concern you might want to avoid using an open source verification logic, and provide your own custom verifier instead. - -It is better to use your own server to obtain the parameters uploaded from the client to verify the receipt from the app store server (C -> Uploaded Parameters -> S -> App Store S -> S -> Receive And Parse Data -> C, C: client, S: server). +如果担心安全性,你可能希望避免使用开源验证逻辑,提供自己的自定义验证程序。 +最好使用你自己的服务器获取从客户端上传的参数,以验证来自App Store服务器的收据的响应信息(C -> 上传的参数 -> S -> App Store S -> S -> 接收并解析数据 -> C,C:客户端,S:服务器)。 -### Finish transactions +### 完成交易 -The transaction can be finished only after the client and server adopt secure communication and data encryption and the receipt verification is passed. In this way, we can avoid refreshing orders and cracking in-app purchase. If we were unable to complete the verification, we want `StoreKit` to keep reminding us that there are still outstanding transactions. +只有客户机与服务器采用安全通信和数据加密并且收据验证通过后,才能完成交易。这样,我们可以避免刷新订单和破解应用内购买。如果我们无法完成验证,我们希望`StoreKit`不断提醒我们还有未完成的交易。 ``` DYFStore.default.finishTransaction(transaction) ``` -## Transaction persistence +## 交易持久化 -`DYFStore` provides an optional reference implementation for storing transactions in `NSUserDefaults`(`DYFStoreUserDefaultsPersistence`). +`DYFStore`提供了一个可选的引用实现,用于将交易信息存储在 NSUserDefaults(`DYFStoreUserDefaultsPersistence`)中。 -When the client crashes during the payment process, it is particularly important to store transaction information. When storekit notifies the uncompleted payment again, it takes the data directly from keychain and performs the receipt verification until the transaction is completed. +当客户端在付款过程中发生崩溃,导致 App 闪退,这时存储交易信息尤为重要。当 StoreKit 再次通知未完成的付款时,直接从文件中取出数据,进行收据验证,直至完成交易。 -### Store transaction +### 存储交易信息 ``` func storeReceipt() { @@ -483,7 +477,7 @@ func storeReceipt() { } ``` -### Remove transaction +### 移除交易信息 ``` let info = self.purchaseInfo! @@ -508,16 +502,16 @@ if let id = info.originalTransactionIdentifier { ``` -## Requirements +## 要求 -`DYFStore` requires `iOS 8.0` or above and `ARC`. +`DYFStore`需要`iOS 8.0`或更高版本和ARC。 -## Demo +## 演示 -To learn more, please clone this project (`git clone https://github.com/chenxing640/DYFStore.git`) to the local directory. +如需了解更多,请克隆此项目(`git clone https://github.com/itenfay/DYFStore.git`)到本地目录。 -## Feedback is welcome +## 欢迎反馈 -If you notice any issue, got stuck to create an issue. I will be happy to help you. +如果您发现任何问题,请创建问题。我很乐意帮助你。