在我的游戏中,我想让In App Purchase删除广告。我使用Admob,我的代码适用于广告。我遇到的问题是我的广告代码是在GameViewController.swift中。但我的应用程序内购买是在我的PurchaseScene.swift中。
我找不到在PurchaseScene.swift中生成删除功能的方法。所以我在GameViewController.swift中的代码:
class GameViewController: UIViewController, GADBannerViewDelegate, GADInterstitialDelegate {
@IBOutlet weak var banner: GADBannerView!
var interstital: GADInterstitial!
override func viewDidLoad() {
super.viewDidLoad()
NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(ShowAd(_:)), name: "ShowInterAdKey", object: nil)
if let scene = GameScene(fileNamed:"GameScene") {
// Configure the view.
let skView = self.view as! SKView
skView.showsFPS = false
skView.showsNodeCount = false
/* Sprite Kit applies additional optimizations to improve rendering performance */
skView.ignoresSiblingOrder = true
/* Set the scale mode to scale to fit the window */
scene.scaleMode = .AspectFill
scene.size = self.view.bounds.size
skView.presentScene(scene)
}
self.banner.adUnitID = "myUnitID"
self.banner.rootViewController = self
var request: GADRequest = GADRequest()
self.banner.loadRequest(request)
request.testDevices = [kGADSimulatorID]
interstital = GADInterstitial(adUnitID: "myUnitID")
let req = GADRequest()
interstital.loadRequest(req)
}
func adViewDidReceiveAd(bannerView: GADBannerView!) {
banner.hidden = false
}
func adView(bannerView: GADBannerView!, didFailToReceiveAdWithError error: GADRequestError!) {
banner.hidden = true
}
override func shouldAutorotate() -> Bool {
return true
}
override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
if UIDevice.currentDevice().userInterfaceIdiom == .Phone {
return .AllButUpsideDown
} else {
return .All
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Release any cached data, images, etc that aren't in use.
}
override func prefersStatusBarHidden() -> Bool {
return true
}
func ShowAd(sender: AnyObject) {
if (interstital.isReady) {
interstital.presentFromRootViewController(self)
interstital = CreateAd()
}
}
func CreateAd() -> GADInterstitial {
let interstital = GADInterstitial(adUnitID: "myUnitID")
interstital.loadRequest(GADRequest())
return interstital
}
}
现在我在Utilities.swift中有这段代码。
import Foundation
class Utility {
// Gets a path to your app's local directory where it has permissions to write
static func getFilePathForFile(fileName:String) -> String {
let libraryPath = NSSearchPathForDirectoriesInDomains(.LibraryDirectory, .UserDomainMask, true)[0]
return libraryPath.stringByAppendingString("/").stringByAppendingString(fileName as String)
}
static func writeValueToFile(value:String, fileName:String) {
do {
try value.writeToFile(Utility.getFilePathForFile(fileName), atomically: true, encoding: NSUTF8StringEncoding)
} catch {
print("\(error)")
}
}
static func readValueFromFile(fileName:String) -> String? {
let file = Utility.getFilePathForFile(fileName);
if let value = try? String(contentsOfFile: file) {
return value;
}
return nil;
}
}
调用函数在PurchaseScene.swift中,如下所示:
let file = "IAP_Ads"
func removeADS() {
Utility.writeValueToFile("YES", fileName: file);
if let value = Utility.readValueFromFile(file) {
print("file exists... value = %@" , Utility.readValueFromFile(file) )
let adsRemoved = (value == "YES" ? true : false)
if adsRemoved {
// Code to remove ads, but i don't know what code
print("ads removed")
}
}
}
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
for touch: AnyObject in touches{
let location = touch.locationInNode(self)
var node = self.nodeAtPoint(location)
if removeadsBTN.containsPoint(location){
for product in list {
let prodID = product.productIdentifier
if(prodID == "myProductID") {
p = product
buyProduct()
break;
}
}
}
}
}
第3步:buyProduct()
func buyProduct() {
print("buy " + p.productIdentifier)
let pay = SKPayment(product: p)
SKPaymentQueue.defaultQueue().addTransactionObserver(self)
SKPaymentQueue.defaultQueue().addPayment(pay as SKPayment)
Utility.writeValueToFile("YES", fileName: "IAP_Ads") //new code
}
答案 0 :(得分:1)
首先,我不熟悉Swift,但如果你不了解Objective-C,我可以尝试为你转换它,它会让我多花一点时间
现在,这可能不是理想的解决方案,但它可以帮助您快速启动并运行。一旦了解了正在发生的事情,您就可以修改代码以满足您的需求。例如,您可以选择在单个文件中存储多个值。如果你这样做,你可以使用JSON格式,或者只是制作一个格式:并让换行符分隔值等。
// Gets a path to your app's local directory where it has permissions to write
+ (NSString *)getFilePathForFile:(NSString *)fileName
{
NSString *libraryPath = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) objectAtIndex:0];
return [libraryPath stringByAppendingPathComponent:fileName];
}
// Writes a value to a file. Cast your value to a string before passing it in.
+ (void)writeValue:(NSString *)value toFile:(NSString *)file
{
[value writeToFile:[self getFilePathForFile:file] atomically:YES encoding:NSUTF8StringEncoding error:NULL];
}
// Reads a value from a file. Once you have this value, cast it back to the type you need.
+ (NSString *)readValueFromFile:(NSString *)file
{
NSString *filePath = [self getFilePathForFile:file];
if(![[NSFileManager defaultManager] fileExistsAtPath:filePath])
return nil;
return [NSString stringWithContentsOfFile:filePath
encoding:NSUTF8StringEncoding
error:NULL];
}
将这些方法复制并传递到某个文件中。如果您使用实用程序/辅助文件,请将其放在那里,因为这些可以是静态方法(&#39; +&#39;符号),因此它们可以存在于任何地方。将这些方法中的self
替换为您放置它们的类。
接下来,如下所示调用它。
写:
// User purchased to remove adds, so let's save that now. (IAP stands for In-App Purchase
[self writeValue:@"YES" toFile:@"IAP_RemoveAds"];
阅读:
// Loading my new view, so need to check to see if the removal of ads was purchased...
NSString * sPurchased = [self readValueFromFile:@"IAP_RemoveAds"];
BOOL removeAds = [sPurchased boolValue];
希望这会有所帮助。
Swift代码:
将它放在一个文件中,比如称之为Utilities.swift
:
import Foundation
class Utility {
// Gets a path to your app's local directory where it has permissions to write
static func getFilePathForFile(fileName:String) -> String {
let libraryPath = NSSearchPathForDirectoriesInDomains(.LibraryDirectory, .UserDomainMask, true)[0]
return libraryPath.stringByAppendingString("/").stringByAppendingString(fileName as String)
}
static func writeValueToFile(value:String, fileName:String) {
do {
try value.writeToFile(Utility.getFilePathForFile(fileName), atomically: true, encoding: NSUTF8StringEncoding)
} catch {
print("\(error)")
}
}
static func readValueFromFile(fileName:String) -> String? {
let file = Utility.getFilePathForFile(fileName);
if let value = try? String(contentsOfFile: file) {
return value;
}
return nil;
}
}
这样称呼:
let file = "IAP_Ads"
// Writing to the file
Utility.writeValueToFile("YES", fileName: file);
// Reading from the file
if let value = Utility.readValueFromFile(file) {
print("file exists... value = %@" , Utility.readValueFromFile(file) )
let adsRemoved = (value == "YES" ? true : false)
if adsRemoved {
print("ads removed")
// Remove the ads here
}
}
因为我无法继续描述代码,所以我要修改GameViewController
课程的修改版本&#39;下面的viewDidLoad
方法包含了在将来加载视图时不包括添加的逻辑:
override func viewDidLoad() {
super.viewDidLoad()
NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(ShowAd(_:)), name: "ShowInterAdKey", object: nil)
if let scene = GameScene(fileNamed:"GameScene") {
// Configure the view.
let skView = self.view as! SKView
skView.showsFPS = false
skView.showsNodeCount = false
/* Sprite Kit applies additional optimizations to improve rendering performance */
skView.ignoresSiblingOrder = true
/* Set the scale mode to scale to fit the window */
scene.scaleMode = .AspectFill
scene.size = self.view.bounds.size
skView.presentScene(scene)
}
if let value = Utility.readValueFromFile(file) {
let adsRemoved = (value == "YES" ? true : false)
if !adsRemoved {
// Ads have not been purchased yet, so show the ads
self.banner.adUnitID = "myUnitID"
self.banner.rootViewController = self
var request: GADRequest = GADRequest()
self.banner.loadRequest(request)
request.testDevices = [kGADSimulatorID]
interstital = GADInterstitial(adUnitID: "myUnitID")
let req = GADRequest()
interstital.loadRequest(req)
}
}
}