ios - 如何让用户通过使用 iOS 应用设置中的开关来更改他们的广告同意(个性化或非个性化)?
问题描述
使用 AdMob 和 Firebase Analytics,我试图让用户在应用程序的设置中更改他们的 AdMob 同意类型,方法是让他们打开/关闭个性化广告的开关(如果用户打开开关“打开”,他们将获得个性化广告,如果他们将其“关闭”,他们将获得非个性化广告)。我写了一个代码,但它给了我错误并且它也循环了。这样做的正确方法/代码是什么?
这是我目前正在做的事情: 1- 在 Settings.bundle>Root.plist 中添加了一个带有标识符“GooglePersonalizedAds”的切换开关项,让用户在应用程序的设置中打开/关闭开关
2- 在我的应用程序的“info.plist”中添加“FIREBASE_ANALYTICS_COLLECTION_ENABLED”和“GOOGLE_ANALYTICS_DEFAULT_ALLOW_AD_PERSONALIZATION_SIGNALS”作为“布尔”属性,并将它们的值设置为“NO”。
3-要初始化 FireBase,我在 AppDelegate 中添加了:
FirebaseConfiguration.shared.setLoggerLevel(.min)
FirebaseApp.configure()
4- 在 ViewController.swift 的 viewDidLoad() 中,我添加了:
registerSettingsBundle()
NotificationCenter.default.addObserver(self, selector: #selector(ViewController.defaultsChanged), name: UserDefaults.didChangeNotification, object: nil)
defaultsChanged()
5- 在 ViewController.swift 中,我添加了:
@objc func defaultsChanged(){
let userDefault = UserDefaults.standard //Fetch value from Settings.bundle
if !purchasedUser {
if userDefault.bool(forKey: "GooglePersonalizedAds") {
print("GooglePersonalizedAds changed to: \(userDefault.bool(forKey: "GooglePersonalizedAds"))")
Analytics.setUserProperty("true", forName: AnalyticsUserPropertyAllowAdPersonalizationSignals)
self.view.backgroundColor = UIColor.red // To Test the implementation of personalized/non-personalized ads switch in App's settings
Analytics.setAnalyticsCollectionEnabled(true)
PACConsentInformation.sharedInstance.consentStatus = .personalized
let request = GADRequest()
let extras = GADExtras()
extras.additionalParameters = ["npa": "0"]
request.testDevices = [testDeviceString]
request.register(extras)
}
else if !userDefault.bool(forKey: "GooglePersonalizedAds") {
print("GooglePersonalizedAds changed to: \(userDefault.bool(forKey: "GooglePersonalizedAds"))")
Analytics.setUserProperty("false", forName: AnalyticsUserPropertyAllowAdPersonalizationSignals)
self.view.backgroundColor = UIColor.green // To Test the implementation of personalized/non-personalized ads switch in App's settings
Analytics.setAnalyticsCollectionEnabled(false)
PACConsentInformation.sharedInstance.consentStatus = .nonPersonalized
let request = DFPRequest()
let extras = GADExtras()
extras.additionalParameters = ["npa": "1"]
request.testDevices = [testDeviceString]
request.register(extras)
}
} else if purchasedUser {
print("GooglePersonalizedAds changed to: \(userDefault.bool(forKey: "GooglePersonalizedAds"))")
Analytics.setUserProperty("false", forName: AnalyticsUserPropertyAllowAdPersonalizationSignals)
self.view.backgroundColor = UIColor.green
Analytics.setAnalyticsCollectionEnabled(false)PACConsentInformation.sharedInstance.consentStatus = .nonPersonalized
}
registerSettingsBundle()
}
func registerSettingsBundle(){
let appDefaults = [String:AnyObject]()
UserDefaults.standard.register(defaults: appDefaults)
}
当我运行该应用程序时,我在控制台中打印了许多“GooglePersonalizedAds 更改为:false”,最后应用程序因错误而崩溃。崩溃后我遇到的一个错误是:“NSUserDefaults.standardUserDefaults setObject:personalizedAdStatus forKey:PACUserDefaultsRootKey]”的“线程 1:EXC_BAD_ACCESS (code=2, address=0x7ffeeb86ffd8)”错误
我认为错误来自:“Analytics.setAnalyticsCollectionEnabled(false)PACConsentInformation.sharedInstance.consentStatus = .nonPersonalized”或“PACConsentInformation.sharedInstance.consentStatus = .personalized”这会改变 UserDefaults,因此调用观察者和 defaultsChanged() 等等,创建一个循环。
如何使用开关将 Analytics.setAnalyticsCollectionEnabled(false)PACConsentInformation.sharedInstance.consentStatus 设置为 .personalized 或 .nonPersonalized (标识符:应用程序设置中的 GooglePersonalizedAds,如我的问题中所尝试的那样?
解决方案
推荐阅读
- python - 正则表达式分步解析
- android - Kotlin 中的可变阴影
- mongodb - docker-entrypoint-initdb.d 中带有初始化脚本的 Mongodb 副本集
- python-3.x - python 3.x tqdm:完成百分比超过总百分比进度条
- python - 在 Anaconda 环境下导入 Selenium 的问题
- python - Python Flask 有序字典转换为字符串
- sql - 更新表,将字段的值设置为查询的结果
- r - 需要将 0 添加到具有特定字符长度的所有元素的特定位置
- javascript - 获取对象数组的未定义值
- python - 更改后如何更新firebase服务器?