Android - 欧盟Cookie法

书史足自悦,安用勤与劬。这篇文章主要讲述Android - 欧盟Cookie法相关的知识,希望能为你提供帮助。
即将推出的Google政策更改,迫使我们实施一个对话框,通知欧盟用户有关广告和分析的Cookie /设备标识符使用情况。我想只向欧盟用户展示此对话框。我不想使用其他权限(例如android.permission.ACCESS_COARSE_LOCATION)。因此我创建了一个测试欧盟用户的功能:
Android的

boolean showCookieHint() { final SharedPreferences settings = getSharedPreferences("localPreferences", Context.MODE_PRIVATE); if (settings.getBoolean("termsAccepted", true)== false) return false; List< String> list = new ArrayList< String> (); list.add("AT"); //Austria list.add("BE"); //Belgium list.add("BG"); //Bulgaria list.add("HR"); //Croatia list.add("CY"); //Cyprus list.add("CZ"); //Czech Republic list.add("DK"); //Denmark list.add("EE"); //Estonia list.add("FI"); //Finland list.add("FR"); //France list.add("GF"); //French Guiana list.add("PF"); //French Polynesia list.add("TF"); //French Southern Territories list.add("DE"); //Germany list.add("GR"); //Greece list.add("HU"); //Hungary list.add("IE"); //Ireland list.add("IT"); //Italy list.add("LV"); //Latvia list.add("LT"); //Lithuania list.add("LU"); //Luxembourg list.add("MT"); //Malta list.add("NL"); //Netherlands list.add("PL"); //Poland list.add("PT"); //Portugal list.add("RO"); //Romania list.add("SK"); //Slovakia list.add("SI"); //Slovenia list.add("ES"); //Spain list.add("SE"); //Sweden list.add("ES"); //Spain list.add("GB"); //United Kingdom of Great Britain and Northern Irelandboolean error = false; /* is eu sim ? */ try { final TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); String simCountry = tm.getSimCountryIso(); if (simCountry != null & & simCountry.length() == 2) { simCountry = simCountry.toUpperCase(); for (int i = 0; i < list.size(); ++i) { if (list.get(i).equalsIgnoreCase(simCountry) == true) { ASCore.log(TAG, "is EU User (sim)"); return true; } } } } catch (Exception e) { error = true; }/* is eu network */ try { final TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); if (tm.getPhoneType() != TelephonyManager.PHONE_TYPE_CDMA) { String networkCountry = tm.getNetworkCountryIso(); if (networkCountry != null & & networkCountry.length() == 2) { networkCountry = networkCountry.toUpperCase(); for (int i = 0; i < list.size(); ++i) { if (list.get(i).equalsIgnoreCase(networkCountry) == true) { ASCore.log(TAG, "is EU User (net)"); return true; } } } } } catch (Exception e) { error = true; }/* is eu time zone id */ try { String tz = TimeZone.getDefault().getID().toLowerCase(); if (tz.length() < 10) { error = true; } else if (tz.contains("euro") == true) { ASCore.log(TAG, "is EU User (time)"); return true; } } catch (Exception e) { error = true; }/* is eu time zone id */ try { String tz = TimeZone.getDefault().getID().toLowerCase(); if (tz.length() < 10) { error = true; } else if (tz.contains("europe") == true) { ASCore.log(TAG, "is EU User (time) "); return true; } } catch (Exception e) { error = true; }if (error == true) { ASCore.log(TAG, "is EU User (err)"); return true; }return false; }

ios版
-(bool) showCookieHint { NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; if ([defaults boolForKey:@"termsAccepted"]) return false; CTTelephonyNetworkInfo *network_Info = [CTTelephonyNetworkInfo new]; CTCarrier *carrier = network_Info.subscriberCellularProvider; std::vector< NSString*> list; list.push_back(@"AT"); //Austria list.push_back(@"BE"); //Belgium list.push_back(@"BG"); //Bulgaria list.push_back(@"HR"); //Croatia list.push_back(@"CY"); //Cyprus list.push_back(@"CZ"); //Czech Republic list.push_back(@"DK"); //Denmark list.push_back(@"EE"); //Estonia list.push_back(@"FI"); //Finland list.push_back(@"FR"); //France list.push_back(@"GF"); //French Guiana list.push_back(@"PF"); //French Polynesia list.push_back(@"TF"); //French Southern Territories list.push_back(@"DE"); //Germany list.push_back(@"GR"); //Greece list.push_back(@"HU"); //Hungary list.push_back(@"IE"); //Ireland list.push_back(@"IT"); //Italy list.push_back(@"LV"); //Latvia list.push_back(@"LT"); //Lithuania list.push_back(@"LU"); //Luxembourg list.push_back(@"MT"); //Malta list.push_back(@"NL"); //Netherlands list.push_back(@"PL"); //Poland list.push_back(@"PT"); //Portugal list.push_back(@"RO"); //Romania list.push_back(@"SK"); //Slovakia list.push_back(@"SI"); //Slovenia list.push_back(@"ES"); //Spain list.push_back(@"SE"); //Sweden list.push_back(@"ES"); //Spain list.push_back(@"GB"); //United Kingdom of Great Britain and Northern Ireland/* is eu sim ? */ NSString* sim = carrier.isoCountryCode; if (sim != nil) { if ([sim length] == 2) { NSString* simU = [sim uppercaseString]; for (int i = 0; i < list.size(); ++i) { if ([list[i] compare:simU] == 0) { ASCore::log("Core", "is EU User (sim)"); return true; } } } }/* is eu network */ NSString* net = carrier.mobileCountryCode; if (net != nil) { if ([net length] == 2) { NSString* netU = [net uppercaseString]; for (int i = 0; i < list.size(); ++i) { if ([list[i] compare:netU] == 0) { ASCore::log("Core", "is EU User (net)"); return true; } } } }bool error = false; /* is local eu time zone id */ NSTimeZone* timeZoneLocal = [NSTimeZone localTimeZone]; NSString* time1 = [[timeZoneLocal name] lowercaseString]; if ([time1 length] > 10) { if ([time1 containsString:@"europe"]) { ASCore::log("Core", "is EU User (local time)"); return true; } } else error = true; /* is default eu time zone id */ NSTimeZone *timeZoneDefault = [NSTimeZone defaultTimeZone]; NSString *time2 = [[timeZoneDefault name] lowercaseString]; if ([time2 length] > 10) { if ([time2 containsString:@"europe"]) { ASCore::log("Core", "is EU User (default time)"); return true; } } else error = true; if (error == true) { ASCore::log("Core", "is EU User (err)"); return true; }return false; }

我的功能是否足以检测到欧盟用户?
谢谢
罗纳德
答案【Android - 欧盟Cookie法】以下是基于Betatester先生使用枚举回答的Android代码。我注意到芬兰失踪了,西班牙错误地进入了两次。我还删除了/* is eu time zone id */下的代码重复。
private enum EUCountry { AT,BE,BG,HR,CY,CZ,DK,EE,FI,FR,DE,GR,HU,IE,IT,LV,LT,LU,MT,NL,PL,PT,RO,SK,SI,ES,SE,GB, //28 member states GF,PF,TF, //French territories French Guiana,Polynesia,Southern Territories EL,UK,//alternative EU names for GR and GB ME,IS,AL,RS,TR,MK; //candidate countriespublic static boolean contains(String s) { for (EUCountry eucountry:values()) if (eucountry.name().equalsIgnoreCase(s)) return true; return false; }}; public static boolean isEU(Activity activity) { boolean error = false; /* is eu sim */try { final TelephonyManager tm = (TelephonyManager) activity.getSystemService(Context.TELEPHONY_SERVICE); String simCountry = tm.getSimCountryIso(); if (simCountry != null & & simCountry.length() == 2) { simCountry = simCountry.toUpperCase(); if (EUCountry.contains(simCountry)) { Log.v(TAG, "is EU User (sim)"); return true; } } } catch (Exception e) { error = true; }/* is eu network */ try { final TelephonyManager tm = (TelephonyManager) activity.getSystemService(Context.TELEPHONY_SERVICE); if (tm.getPhoneType() != TelephonyManager.PHONE_TYPE_CDMA & & tm.getPhoneType()!=TelephonyManager.PHONE_TYPE_NONE) { String networkCountry = tm.getNetworkCountryIso(); if (networkCountry != null & & networkCountry.length() == 2) { networkCountry = networkCountry.toUpperCase(); if (EUCountry.contains(networkCountry)) { Log.v(TAG, "is EU User (network)"); return true; } } } } catch (Exception e) { error = true; }/* is eu time zone id */ try { String tz = TimeZone.getDefault().getID().toLowerCase(); if (tz.length() < 10) { error = true; } else if (tz.contains("euro")) { Log.v(TAG, "is EU User (time)"); return true; } } catch (Exception e) { error = true; }if (error == true) { Log.v(TAG, "is EU User (err)"); return true; }return false; }

另一答案同样的功能,但在Swift中。唯一的区别是我使用Parse的用户而不是NSUserDefaults。
class CookieHelper {static func show() -> Bool { if PFUser.currentUser().valueForKey("cookieConsent") != nil { return false } let networkInfo: CTTelephonyNetworkInfo = CTTelephonyNetworkInfo.new() if let carrier: CTCarrier = networkInfo.subscriberCellularProvider { var euCountries = [String]() euCountries.append("AT") // Austria euCountries.append("BE") // Belgium euCountries.append("BG") // Bulgary euCountries.append("HR") // Croatia euCountries.append("CY") // Cyprus euCountries.append("CZ") // Czech Republic euCountries.append("DK") // Denmark euCountries.append("EE") // Estonia euCountries.append("FI") // Finland euCountries.append("FR") // France euCountries.append("GF") // French Guiana euCountries.append("PF") // French Polynesia euCountries.append("TF") // French Southern Territories euCountries.append("DE") // Germany euCountries.append("GR") // Greece euCountries.append("HU") // Hungary euCountries.append("IE") // Ireland euCountries.append("IT") // Italy euCountries.append("LV") // Latvia euCountries.append("LT") // Lithuania euCountries.append("LU") // Luxembourg euCountries.append("MT") // Malta euCountries.append("NL") // Netherlands euCountries.append("PL") // Poland euCountries.append("PT") // Portugal euCountries.append("RO") // Romania euCountries.append("SK") // Slovakia euCountries.append("SI") // Slovenia euCountries.append("ES") // Spain euCountries.append("SE") // Sweden euCountries.append("GB") // United Kingdom of Great Britain and Northern Ireland// EU Sim/Network let sim: String? = self.formatCountryCode(carrier.isoCountryCode) let net: String? = self.formatCountryCode(carrier.mobileCountryCode) if sim != nil || net != nil { for country in euCountries { if sim != nil { if country == sim { println("EU User (sim)") return true } } if net != nil { if country == net { println("EU User (net)") return true } } } } }// EU Local time zone if self.timeZoneContainsEurope(NSTimeZone.localTimeZone()) { return true } // EU Default time zone if self.timeZoneContainsEurope(NSTimeZone.defaultTimeZone()) { return true }return false }private static func formatCountryCode(countryCode: String?) -> String? { if countryCode != nil & & count(countryCode!) == 2 { return countryCode!.uppercaseString } else { return nil } }private static func timeZoneContainsEurope(timeZone: NSTimeZone) -> Bool { let time: NSString = timeZone.name.lowercaseString if count(time as! String) > 10 { return time.containsString("europe") } return false }

}
另一答案
String ACCEPTED_COOKIES_KEY = "accepted-cookies"; final List< String> euCountries = new ArrayList< String> () { { addAll(Arrays.asList(new String[] { "be", "bg", "cz", "dk", "de", "ee", "ie", "el", "es", "fr", "hr", "it", "cy", "lv", "lt", "lu", "hu", "mt", "nl", "at", "pl", "pt", "ro", "si", "sk", "fi", "se", "uk" })); } }; TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); String networkCountryIso = null; if(telephonyManager != null) { networkCountryIso = telephonyManager.getNetworkCountryIso(); }if(euCountries.contains(networkCountryIso)) { final SharedPreferences prefs = context.getSharedPreferences(PREFERENCES_FILE, Context.MODE_PRIVATE); if (!prefs.getBoolean(ACCEPTED_COOKIES_KEY, false)) { new AlertDialog.Builder(context) .setTitle("Cookies") .setMessage("Your message for visitors here") .setNeutralButton("Close message", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { prefs.edit().putBoolean(ACCEPTED_COOKIES_KEY, true).commit(); } }).show(); } }

上面的代码是最好的方法。值得注意的是:
mTelephonyManager.getSimCountryIso()

不应该使用,因为这表示SIM提供商的本国(例如,Vodaphone UK SIM将返回“gb”,Vodaphone德国SIM将返回“de”)而不是设备的当前位置(国家)。当用户漫游时,这种差异很显着。
参考:Reliable method to get the country the user is in?

    推荐阅读