Android - 欧盟Cookie法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 Ireland

    boolean 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;
}

我的功能是否足以检测到欧盟用户?

谢谢

罗纳德

答案

以下是基于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 countries

    public 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?

以上是关于Android - 欧盟Cookie法的主要内容,如果未能解决你的问题,请参考以下文章

翻译: 欧盟除了GDPR, 再出人工智能法Artificial Intelligence Act

翻译: 欧盟除了GDPR, 再出人工智能法Artificial Intelligence Act

js代码片段: utils/lcoalStorage/cookie

是否可以阻止使用 Javascript 或 PHP 设置 cookie?

谷歌欧盟收费策略出炉;PostgreSQL 11 发布

C#-WebForm-★内置对象简介★Request-获取请求对象Response相应请求对象Session全局变量(私有)Cookie全局变量(私有)Application全局公共变量Vi(代码片段