2015-07-31 23 views
15

Le imminenti modifiche alle norme di Google ci impongono di implementare una finestra di dialogo per informare gli utenti dell'UE sull'uso di cookie/identificativo dispositivo per pubblicità e analisi. Mi piacerebbe mostrare questa finestra solo agli utenti dell'UE. Non voglio utilizzare autorizzazioni aggiuntive (ad esempio android.permission.ACCESS_COARSE_LOCATION). Quindi ho creato una funzione per verificare gli utenti UE:Android - EU Cookie Law

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

è la mia funzione abbastanza per rilevare UE-Users?

Grazie

Ronald

+0

Su Android è necessario il permesso supplementare: android.permission.READ_PHONE_STATE – DzungPV

+2

[getNetworkCountryIso] (http://developer.android.com/reference/android/telephony/TelephonyManager.html#getNetworkCountryIso ()) e [getSimCountryIso] (http://developer.android.com/reference/android/telephony/TelephonyManager.html#getSimCountryIso()) non ha bisogno di questa autorizzazione (ad esempio [getDeviceId] (http://developer.android .com/riferimento/android/telefonia/TelephonyManager.html # getDeviceId()) ha bisogno di questo permesso) –

+0

Invece di una lista, puoi semplicemente usare un interruttore (se si compila con Java 1.7) o usare una scala if-else, che hanno un sovraccarico di inizializzazione più basso. Altri metodi di rilevamento che potresti voler utilizzare sono una ricerca IP e controllare le impostazioni locali dell'utente. Il controllo del fuso orario è estremamente impreciso. –

risposta

3

Qui di seguito è un po 'migliorata codice di Android in base alla risposta del signor Beta Tester utilizzando enum. Ho notato che la Finlandia era dispersa e che la Spagna è stata inserita per sbaglio due volte. Ho anche rimosso la duplicazione del codice sotto /* 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; 
} 
+0

Penso che questa sia la risposta corretta –

+0

Questo codice è ottimo. L'ho usato su una libreria che ho creato per mostrare facilmente la finestra di dialogo dei cookie nei miei progetti. Puoi verificarlo su [CookiesConsent per Android] (https://github.com/Carlosph/CookiesConsent). Sono stati dati dei crediti sia alla domanda sia alla risposta, spero che vada bene. Saluti. – Carlosph

0

La stessa funzione ma in Swift. L'unica differenza è che sto usando l'utente di Parse invece 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 
} 

}

0
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(); 
     } 
    } 

Il codice di cui sopra è l'approccio migliore. E 'anche interessante notare che:

mTelephonyManager.getSimCountryIso() 

non deve essere utilizzato come questo indicherebbe il paese d'origine del fornitore di SIM (ad esempio un Vodafone UK SIM sarebbe tornato "gb", A Vodafone Germania SIM sarebbe tornato "de") e non la posizione corrente (Paese) del dispositivo. Questa differenza è significativa quando l'utente è in roaming.

Rif: Reliable method to get the country the user is in?