书史足自悦,安用勤与劬。这篇文章主要讲述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?
推荐阅读
- Cookie不适用于Apple设备上的WebSocket
- Android - 保持会话活动直到关闭(直到用户注销)
- 带有IFrames Chrome 63的Android Cordova应用程序无请求标题Cookie
- 把iframe放在Android应用程序上
- Ionic(无法在Android上的iFrame中显示facebook嵌入式帖子)
- 如何在Spring Boot控制器类中传递参数(app正在使用Spring Security)
- Spring Boot AnnotationConfigEmbeddedWebApplicationContext无法填充动态类中的自动声明的声明字段
- 刷新/重新加载Angular 2 Web App
- Android模型视图控制器实现给出错误