2015-07-31 13 views
15

Aufgrund der bevorstehenden Google-Richtlinienänderungen müssen wir einen Dialog implementieren, um EU-Nutzer über die Verwendung von Cookies/Geräten für Werbung und Analysen zu informieren. Ich möchte diesen Dialog nur EU-Benutzern zeigen. Ich möchte keine zusätzlichen Berechtigungen verwenden (z. B. android.permission.ACCESS_COARSE_LOCATION). Deshalb habe ich eine Funktion erstellt für die EU-Benutzer zu testen:Android - EU-Cookie-Gesetz

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

Ist meine Funktion genug EU-Mitglieder zu erkennen?

Dank

Ronald

+0

Auf Android finden Sie zusätzliche Erlaubnis benötigen: android.permission.READ_PHONE_STATE – DzungPV

+2

[getNetworkCountryIso] (http://developer.android.com/reference/android/telephony/TelephonyManager.html#getNetworkCountryIso ()) und [getSimCountryIso] (http://developer.android.com/reference/android/telephony/TelephonyManager.html#getSimCountryIso()) benötigt diese Berechtigung nicht (zB [getDeviceId] (http://developer.android .com/reference/android/telephony/TelephonyManager.html # getDeviceId()) benötigt diese Berechtigung) –

+0

Anstelle einer Liste können Sie einfach einen Schalter verwenden (wenn Sie mit Java 1.7 kompilieren) oder eine if-else-Leiter verwenden haben einen geringeren Initialisierungsaufwand. Andere Erkennungsmethoden, die Sie möglicherweise verwenden möchten, sind eine IP-Suche und das Überprüfen der Gebietsschemaeinstellung des Benutzers. Die Überprüfung der Zeitzone ist sehr ungenau. –

Antwort

3

Im Folgenden etwas verbesserten Android Code basiert auf Mr. Betatester Antwort ENUM verwenden. Ich habe festgestellt, dass Finnland vermisst wurde und dass Spanien zweimal falsch gemeldet wurde. Ich habe auch die Duplizierung des Codes unter /* is eu time zone id */ entfernt.

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

Ich denke, das ist die richtige Antwort –

+0

Dieser Code ist großartig. Ich habe es in einer Bibliothek verwendet, die ich gemacht habe, um den Cookie-Dialog in meinen Projekten einfach zu zeigen. Sie können es auf [Cookies für Android] (https://github.com/Carlosph/CookiesConsent) überprüfen. Credits zu sowohl der Frage als auch der Antwort wurden gegeben, ich hoffe, dass das in Ordnung ist. Grüße. – Carlosph

0

Die gleiche Funktion aber in Swift. Der einzige Unterschied ist, dass ich Parse User statt NSUserDefaults benutze.

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

Der obige Code ist der beste Ansatz. Es ist auch erwähnenswert, dass:

mTelephonyManager.getSimCountryIso() 

soll nicht als diese verwendet wird, würde das Heimatland der SIM-Provider (zB A Vodaphone UK SIM zurückkehren würde bedeuten, „gb“, A Vodaphone Deutschland SIM zurückkehren würde „de“) und nicht den aktuellen Standort (Land) des Geräts. Dieser Unterschied ist signifikant, wenn der Benutzer roamt.

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