Travgalax
Travgalax

Reputation: 91

Swift, couldn't get earning details from AdMob and AdSense

I'm working on my app (iOS) to get AdMob and AdSense earnings information. But I've been having trouble getting specifics from them. I've already created the credentials and client ID from my Google account, but I'm not sure where to put them.

I tried carefully following many methods from this link but was never successful.

My first step: During startup, check to see if you are logged in or out.

import FirebaseAuth
import GoogleSignIn

var currentPID = ""

func checkGoogleAccountStatus() {
    GIDSignIn.sharedInstance.restorePreviousSignIn { user, error in
        if error != nil || user == nil {
            print("Signed out")
            self.loginButton()
        } else {
            print("Signed in")
            let userAccess: String = user!.authentication.accessToken
            self.googledSignedInSuccess(googleToken: userAccess, tokenID: user!.authentication.idToken!)
            
            let dateformatter = DateFormatter()
            dateformatter.dateFormat = "MMMM d, yyyy  h:mm:ss a"
            let expiredToken = user?.authentication.accessTokenExpirationDate
            print("Token Expired: \(dateformatter.string(from: expiredToken!))")
        }
    }
}

Successful

My second step: When I tapped the button to log in, an alert controller appeared to see if the log in was successful. It will display the alert controller's profile picture, name, and email address.

@objc func loginTapped() {
    let adMobScope = "https://www.googleapis.com/auth/admob.report"
    let adSenseScope = "https://www.googleapis.com/auth/adsensehost"
    let additionalScopes = [adMobScope,adSenseScope]
    let signInConfig = GIDConfiguration.init(clientID: "<My URL Schemes>")
    
    GIDSignIn.sharedInstance.signIn(with: signInConfig, presenting: self, hint: nil, additionalScopes: additionalScopes) { user, error in
        guard error == nil else { return }
        guard let user = user else { return }
        if let profiledata = user.profile {
            
            let grantedScopes = user.grantedScopes
            if grantedScopes == nil || !grantedScopes!.contains(adMobScope) {
                print("AdMob not Granted...")
            } else {
                print("AdMob Granted!")
            }
            
            if grantedScopes == nil || !grantedScopes!.contains(adSenseScope) {
                print("AdSense not Granted...")
            } else {
                print("AdSense Granted!")
            }
            
            //let userId: String = user.userID ?? ""
            let givenName: String = profiledata.givenName ?? ""
            let familyName: String = profiledata.familyName ?? ""
            let email: String = profiledata.email
            let userToken: String = user.authentication.idToken!
            let userAccess: String = user.authentication.accessToken
            
            let credential = GoogleAuthProvider.credential(withIDToken: userToken, accessToken: userAccess)
            Auth.auth().signIn(with: credential) { result, error in
                if let error = error {
                    print(error.localizedDescription)
                    
                    let alert = UIAlertController(title: "Error", message: "Something went wrong, please try again.", preferredStyle: .alert)
                    let action = UIAlertAction(title: "OK", style: .cancel, handler: {_ in return })
                    
                    alert.addAction(action)
                    self.present(alert, animated: true, completion: nil)
                }
                if let imgurl = user.profile?.imageURL(withDimension: 300) {
                    let absoluteurl: String = imgurl.absoluteString
                    let alert = UIAlertController(title: "\(givenName) \(familyName)", message: "\n\n\n\n\n\n\n\(email)\nLogin Successful", preferredStyle: .alert)
                    let action = UIAlertAction(title: "OK", style: .cancel, handler: {_ in
                        // MARK: Do something to update
                        self.checkGoogleAccountStatus()
                    })
                    
                    let imgViewTitle = UIImageView()
                    imgViewTitle.translatesAutoresizingMaskIntoConstraints = false
                    imgViewTitle.layer.borderColor = UIColor(named: "Font Color")?.cgColor
                    imgViewTitle.layer.borderWidth = 3
                    imgViewTitle.layer.cornerRadius = 50
                    imgViewTitle.clipsToBounds = true
                    alert.view.addSubview(imgViewTitle)
                    imgViewTitle.centerYAnchor.constraint(equalTo: alert.view.centerYAnchor, constant: -28).isActive = true
                    imgViewTitle.centerXAnchor.constraint(equalTo: alert.view.centerXAnchor).isActive = true
                    imgViewTitle.widthAnchor.constraint(equalToConstant: 100).isActive = true
                    imgViewTitle.heightAnchor.constraint(equalToConstant: 100).isActive = true
                    
                    DispatchQueue.global().async {
                        if let data = try? Data(contentsOf: URL(string: absoluteurl)! ) { if let image = UIImage(data: data) { DispatchQueue.main.async { imgViewTitle.image = image } } }
                    }
                    
                    alert.addAction(action)
                    self.present(alert, animated: true, completion: nil)
                    
                } else {
                    let alert = UIAlertController(title: "\(givenName) \(familyName)", message: "\(email)\nLogin Successful", preferredStyle: .alert)
                    let action = UIAlertAction(title: "OK", style: .cancel, handler: {_ in
                        // MARK: Do something to update
                        self.checkGoogleAccountStatus()
                    })
                    
                    alert.addAction(action)
                    self.present(alert, animated: true, completion: nil)
                }
            }
        }
    }
}

When I logged in, it asked for permission to access AdMob and AdSense, followed by a pop-up alert that said I had successfully logged in.

My third step: Getting the PID from Google AdMob / AdSense

import CurlDSL
import Gzip

func googledSignedInSuccess(googleToken: String, tokenID: String) {
    guard let url = URL(string: "https://admob.googleapis.com/v1/accounts/") else { return }
    
    do {
        try CURL(#"curl -H "Authorization: Bearer \#(googleToken)" "\#(url)""#).run { data, response, error in
            if let error = error { print("Error took place \(error)"); return }
            if let response = response as? HTTPURLResponse {
                if response.statusCode != 200 {
                    print("Error: \(response)")
                } else {
                    if let data = data {
                        do {
                            if let rawJSON = try? JSONDecoder().decode(GetAdMobInfo.self, from: data) {
                                currentPID = rawJSON.account[0].publisherID
                                print("Successful: \(currentPID)")
                                self.adMob_gettingReport(pid: currentPID, token: googleToken)
                            }
                        }
                    }
                }
            }
        }
    } catch { print("Failed.") }
}



struct GetAdMobInfo: Codable {
    let account: [Account]
}

struct Account: Codable {
    let name, publisherID, reportingTimeZone, currencyCode: String

    enum CodingKeys: String, CodingKey {
        case name
        case publisherID = "publisherId"
        case reportingTimeZone, currencyCode
    }
}

It was success, I was able to get my PID and writed to currentPID as string.

My final step, which failed:

func adMob_gettingReport(pid: String, token: String) {
    guard let url = URL(string: "https://admob.googleapis.com/v1/accounts/\(pid)/mediationReport:generate") else { return }
    let reportData = "--data @- << EOF {\"report_spec\": {\"date_range\": {\"start_date\": {\"year\": 2020, \"month\": 4, \"day\": 1}, \"end_date\": {\"year\": 2020, \"month\": 4, \"day\": 1} },\"dimensions\": [\"AD_SOURCE\", \"AD_UNIT\", \"PLATFORM\"], \"metrics\": [\"ESTIMATED_EARNINGS\"]}} EOF"
    do {
        try CURL(#"curl -X POST "\#(url)" -H "Authorization: Bearer \#(token)" -H "Content-Type: application/json" \#(reportData)"#).run { data, response, error in
            if let error = error { print("Error took place \(error)"); return }
            if let response = response as? HTTPURLResponse {
                if response.statusCode != 200 {
                    print("Error: \(response)")
                } else {
                    if let data = data {
                        print("Getting AdMob Successful")
                        let decompressedData: Data
                        if data.isGzipped { decompressedData = try! data.gunzipped() }
                        else { decompressedData = data }
                        
                        var getLineFromString: [String] = []
                        getLineFromString += String(data: decompressedData, encoding: .utf8)!.components(separatedBy: "\n")
                        
                        for checkLine in getLineFromString {
                            print("Line: \(checkLine)")
                        }
                    }
                }
            }
        }
    } catch { print("Failed.") }
}

Attempting to obtain earnings information from AdMob and AdSense, but it kept saying failing in print. This is where I've been for nearly two months. What did I overlook?

Upvotes: 0

Views: 186

Answers (0)

Related Questions