Apples Developer-Enrollment frisst Umlaute. So bekommst du deinen Firmennamen trotzdem durch.
Wer eine UG oder GmbH mit Umlaut im Namen anmeldet, scheitert am Abgleich mit Dun & Bradstreet. Das Feld nimmt das Zeichen gar nicht erst an. Der Fix läuft über die Browser-Konsole und dauert eine Minute.
01 Das Problem
Firmenname ins Feld, DUNS-Nummer daneben, absenden. Danach steht da in Rot:
The information you entered did not match your D&B profile. Before submitting your information, check your D&B profile.
Der erste Reflex ist, den Namen noch einmal zu prüfen. Der zweite ist, das D&B-Profil zu öffnen. Beides führt zu nichts, denn im Feld steht gar nicht das, was du getippt hast. Aus BYTEPOTATO UG (haftungsbeschränkt) ist BYTEPOTATO UG (haftungsbeschrnkt) geworden. Das ä fehlt, und zwar ersatzlos.
Wer genauer hinsieht, merkt schnell: Das Zeichen lässt sich nicht einmal eintippen. Die Taste erzeugt nichts. Über die Zwischenablage einfügen funktioniert genauso wenig. Das ist der entscheidende Unterschied zu einem Sanitizer, der beim Absenden aufräumt. Hier greift schon die Eingabe selbst.
02 Warum das nicht dein Fehler ist
Der Abgleich läuft gegen den Datensatz bei Dun & Bradstreet. Steht der Name dort korrekt mit Umlaut, so wie er im Handelsregister eingetragen ist, dann gibt es keine Eingabe, die das Formular akzeptiert und die gleichzeitig zum Profil passt. Das Problem ist strukturell, nicht deins.
03 Was im Formular passiert
Dieses Kapitel erklärt die Ursache und zeigt, wie du sie selbst nachvollziehst. Wenn dich nur der Fix interessiert, spring direkt zu Kapitel 04. Dort steht die vollständige Anleitung noch einmal von vorn, du brauchst nichts von hier.
Das Eingabefeld ansehen
Klick mit der rechten Maustaste mitten in das Eingabefeld unter der Beschriftung Legal Entity Name. Das ist das oberste Textfeld auf der Seite, direkt über D-U-N-S® Number. Im Kontextmenü wählst du „Untersuchen" in Firefox oder „Untersuchen" beziehungsweise „Inspect" in Chrome. Die Entwicklerwerkzeuge öffnen sich im Inspektor und markieren die zugehörige Zeile blau.
In der markierten Zeile muss name="legalEntityName" stehen. Steht dort etwas anderes, hast du danebengeklickt und erwischt einen umgebenden Container. Dann noch einmal genau in die weiße Fläche des Feldes klicken.
<input type="text" name="legalEntityName" autocomplete="off"
ng-model="$ctrl.request.organizationDetails.legalEntityName"
mask-re="nameLegalEntity"
required minlength="2" maxlength="100"
valid-on-change="backend,dunsRecordMismatch">Zwei Attribute sind interessant. ng-model zeigt, wohin der Wert wandert. Und mask-re="nameLegalEntity" ist der Filter. Der Zusatz valid-on-change="backend,dunsRecordMismatch" bestätigt nebenbei, dass der eigentliche Abgleich mit D&B auf dem Server läuft und nicht im Browser.
Den Filter finden
Wechsle oben in den Tab Konsole in Firefox beziehungsweise Console in Chrome. Alle folgenden Befehle tippst oder fügst du dort ein und bestätigst mit Enter. Die Seite läuft auf AngularJS, was sich in einer Zeile bestätigen lässt:
angular.version.full"1.8.3"
Bei AngularJS hängen solche Masken im $parsers-Array des ngModelController. Dort liegt die Kette von Funktionen, die einen Wert aus der Ansicht ins Modell überführt. Damit du das Feld nicht erst im Inspektor auswählen musst, holt das Snippet es selbst über den Namen:
var el = document.querySelector('input[name="legalEntityName"]');
var ctrl = angular.element(el).controller('ngModel');
console.log('Feld:', el.name,
'| parsers:', ctrl.$parsers.length,
'| formatters:', ctrl.$formatters.length);Feld: legalEntityName | parsers: 1 | formatters: 1Ein einziger Parser. Der ist es. Seinen Quelltext bekommst du mit ctrl.$parsers[0].toString(). Aus dem minifizierten Bundle, hier zur Lesbarkeit umgebrochen:
function M(C){
C = r.A.normalize(C);
let E = C;
if (f) {
const L = C.match(f);
if (L ? E = L.join("") : E = "", E !== C && (_.o.setViewValue(i, E), E === i.$modelValue)) {
let T;
T = E.length - (i.$modelValue || "").length;
m.setSelectionRange(c + T, g + T);
}
}
return E;
}C.match(f) sammelt alle Zeichen ein, die der Regex f erlaubt, und join("") setzt sie ohne Trennung wieder zusammen. Alles, was nicht passt, fällt dabei heraus. Kein Ersatzzeichen, keine Meldung, nichts. Genau das Verhalten, das man im Feld sieht.
04 Der Fix
Wir leeren die Parser-Kette und schreiben den Wert direkt in das Modell, an der Maske vorbei. Das Feld musst du dafür nicht im Inspektor auswählen, das Snippet sucht es sich selbst.
Ausgangslage
Du bist mit deiner Apple-ID auf developer.apple.com angemeldet, hast das Enrollment gestartet, als Entity Type Company / Organization gewählt und stehst auf dem Schritt mit der Überschrift Tell us about your organization. Auf dieser Seite findest du von oben nach unten:
- das Textfeld
Legal Entity Name, um das es hier geht - darunter das Textfeld
D-U-N-S® Number - weiter unten ein Captcha mit der Aufforderung
Enter the characters in the image below. - ganz unten den Button, der dich zum nächsten Schritt bringt
Konsole öffnen
| Browser | macOS | Windows und Linux |
|---|---|---|
| Firefox | Cmd+Opt+K | Strg+Shift+K |
| Chrome, Edge | Cmd+Opt+J | Strg+Shift+J |
| Safari | Cmd+Opt+C, das Entwicklermenü muss vorher in den Einstellungen unter „Erweitert" aktiviert sein | nicht verfügbar |
Achte darauf, dass du wirklich im Tab Konsole beziehungsweise Console landest und nicht im Inspektor. Du erkennst ihn an der Eingabezeile am unteren Rand mit dem Zeichen >> oder > davor.
Schritt für Schritt
- Den Namen aus dem D&B-Profil holen. Öffne dein Profil über den Link
check your D&B profilein der roten Fehlermeldung oder über Apples DUNS-Lookup.[1] Notiere die Zeichenkette exakt so, wie sie dort steht, mit Groß- und Kleinschreibung, Klammern und allen Abkürzungen. Genau dagegen prüft Apple. - Alle anderen Felder ausfüllen. Trag die DUNS-Nummer ein und tippe das Captcha ab. Das Feld
Legal Entity Namelässt du leer. Falls dort schon die verstümmelte Version steht, ist das egal, sie wird gleich überschrieben. Klick noch nicht auf den Button. - Konsole öffnen mit dem Tastenkürzel von oben.
- Einfügen freischalten. Beim allerersten Einfügen in die Konsole blockieren Firefox und Chrome aus Sicherheitsgründen und zeigen eine Warnung an. Tippe dann
allow pastingein, genau so, klein geschrieben mit einem Leerzeichen, und drücke Enter. Danach funktioniert Einfügen wie gewohnt. Safari fragt nicht nach. - Den Namen im Snippet eintragen. Kopier den Code unten in einen Texteditor und ersetze
DEINE FIRMA UG (haftungsbeschränkt)durch deinen Namen aus Schritt 01. Die einfachen Anführungszeichen drumherum müssen stehen bleiben. - Snippet in die Konsole einfügen und Enter drücken.
- Die Ausgabe prüfen. Hinter
model:muss der vollständige Name mit Umlaut stehen und hinterinvalid:mussfalsestehen. Zusätzlich zeigt jetzt auch das Feld im Formular den korrekten Namen an. Maßgeblich ist trotzdem die Konsolenausgabe, denn sie zeigt den Wert, der tatsächlich verschickt wird. - Absenden. Klick auf den Button, ohne vorher noch einmal in das Namensfeld zu klicken.
(function () {
// Hier deinen Namen eintragen, exakt wie im D&B-Profil:
var name = 'DEINE FIRMA UG (haftungsbeschränkt)'.normalize('NFC');
var el = document.querySelector('input[name="legalEntityName"]');
if (!el) { console.error('Feld nicht gefunden. Richtige Seite offen?'); return; }
var ng = angular.element(el);
var ctrl = ng.controller('ngModel');
var inj = ng.injector();
ctrl.$parsers.length = 0;
ctrl.$formatters.length = 0;
inj.get('$rootScope').$apply(function () {
ctrl.$setViewValue(name);
ctrl.$render();
});
console.log('model:', ctrl.$modelValue,
'| invalid:', ctrl.$invalid,
'| codes:', [].map.call(ctrl.$modelValue || '', function (c) {
return c.codePointAt(0);
}).join(','));
})();model: DEINE FIRMA UG (haftungsbeschränkt) | invalid: false | codes: 68,69,73,78,69, …,228,110,107,116,41Der Codepoint 228 in der Ausgabe ist das ä als einzelnes Zeichen. Tauchen dort stattdessen 97 und 776 nebeneinander auf, liegt das Zeichen zerlegt vor und du solltest die Normalisierung prüfen.
Warum normalize('NFC') drinsteht
Der ursprüngliche Parser hat den Wert normalisiert, bevor er gefiltert hat. Wenn wir die ganze Kette leeren, fällt dieser Schritt mit weg. Also machen wir ihn selbst, damit der Umlaut als ein einzelner Codepoint rausgeht und nicht als a plus Kombinationszeichen. Für den Vergleich auf Apples Seite kann das den Unterschied machen.
05 Wenn etwas klemmt
Die häufigsten Meldungen und was dahintersteckt:
| In der Konsole steht | Ursache und Abhilfe |
|---|---|
Feld nicht gefunden. Richtige Seite offen? | Entweder bist du nicht auf dem Schritt mit dem Feld, oder das Formular steckt in einem iframe. Oben in der Konsole gibt es eine Auswahl, die auf top steht. Wähle dort den Frame der Enrollment-Seite und führe das Snippet noch einmal aus. |
angular is not defined | Gleiche Ursache wie oben, oder die Seite war noch nicht fertig geladen. Kurz warten und wiederholen. |
Cannot read properties of null | Das Feld existiert, hängt aber nicht mehr an AngularJS. Dann hat Apple das Formular umgebaut und dieser Ansatz greift nicht. Weiter über den Support. |
| Nichts, aber der Fehler bleibt | Der Wert kommt nicht im Request an. Nimm zusätzlich Plan B weiter unten. |
Und wenn du die Seite versehentlich neu geladen hast: Alles zurück auf Anfang, weiter bei Schritt 02.
Plan B, eine Ebene tiefer
Sollte eine spätere Version der Seite den Filter woanders unterbringen, hilft es, den Request-Body direkt vor dem Absenden zu korrigieren. In meinem Fall war das nicht nötig, der Parser-Weg hat gereicht. Schaden kann es trotzdem nicht, denn das Snippet greift nur, wenn es die kaputte Zeichenkette tatsächlich findet. Trag die beiden Varianten deines Namens ein und führe es vor dem Absenden aus:
(function () {
// Links das Wort ohne Umlaut, rechts mit:
var kaputt = 'haftungsbeschrnkt';
var heil = 'haftungsbeschränkt';
var send = XMLHttpRequest.prototype.send;
XMLHttpRequest.prototype.send = function (body) {
if (typeof body === 'string' && body.indexOf(kaputt) !== -1) {
body = body.split(kaputt).join(heil);
console.log('[patch] Request-Body korrigiert');
}
return send.call(this, body);
};
})();Erscheint beim Absenden die Meldung [patch] Request-Body korrigiert, hat diese Ebene gegriffen und der Parser-Fix war wirkungslos. Bleibt die Konsole still, hat schon Kapitel 04 gereicht.
06 Danach prüfen
Dass das Formular den Wert annimmt, ist nicht dasselbe wie ein sauber angelegter Datensatz. Drei Dinge lohnen den Blick:
- Encoding. Im Account muss der Name vollständig und korrekt stehen. Erscheint dort
haftungsbeschr?nkt, ein leeres Kästchen oderhaftungsbeschränkt, ist der Datensatz beschädigt. Dann sofort den Support einschalten, bevor der Name in Verträge und Rechnungen wandert. - Das Adressfeld. Kommt später eine Anschrift dran und der Ortsname enthält einen Umlaut, greift dieselbe Maske vermutlich wieder. Gleiches Vorgehen, nur der Selektor ändert sich. Achte außerdem darauf, wie D&B die Straße schreibt, oft nämlich abgekürzt als „Str.".
- Nicht in Schleife probieren. Das Captcha im Formular deutet auf eine Ratenbegrenzung hin. Nach zwei erfolglosen Versuchen ist der Support der bessere Weg.
Wenn im Account nur eine Fehlermeldung steht
Direkt nach dem Absenden kann es passieren, dass oben rechts im Account statt des Firmennamens das hier auftaucht:
%%_USE_I18N_STRING_ERROR_%%Der erste Gedanke ist natürlich, dass der Umlaut die Anzeige zerschossen hat. Hat er aber nicht. Stell die Sprache der Seite auf Englisch um, dann steht dort:
BYTEPOTATO UG (haftungsbeschränkt) (Pending)Der Name ist also sauber gespeichert, Umlaut inklusive. Apple setzt Name und Bearbeitungsstatus über einen gemeinsamen Übersetzungsschlüssel zusammen, und für den Zusatz (Pending) fehlt schlicht die deutsche Übersetzung. Dann bricht das gesamte Label weg und übrig bleibt der Platzhalter. Ein Lokalisierungsfehler bei Apple, der mit deiner Eingabe nichts zu tun hat. Sobald die Registrierung durch ist, verschwindet der Zusatz und damit auch die Meldung.
Die Sprache stellst du ganz unten auf der Seite im grauen Fußbereich um, dort steht rechts ein Umschalter, meist als Deutschland | Deutsch. Alternativ hilft ein privates Fenster mit auf Englisch gestellter Browsersprache, weil Apple die Oberfläche teilweise über den Accept-Language-Header steuert.
07 Der offizielle Weg, falls nichts klappt
Über den Developer-Support[2] lässt sich das Enrollment manuell abschließen. Wichtig ist die Formulierung, sonst landest du in der Standardschleife „bitte prüfen Sie Ihr D&B-Profil". Sag klar, dass das Formular das Zeichen nicht annimmt:
The enrollment form does not accept non-ASCII characters in the
Legal Entity Name field. The character cannot be entered at all:
keystrokes are blocked and pasting does not work either. Our
registered name contains "ä", so the D&B match can never succeed.
D-U-N-S: [Nummer]
Legal Entity Name as registered with D&B and in the German
commercial register: [Name]
Commercial register: HRB [Nummer], Amtsgericht [Ort]
Please note the company address also contains "ö" and will likely
hit the same restriction.
Screenshots attached: the enrollment form with the character
missing, and the D&B profile showing the correct name.Beide Screenshots anhängen. Der erste belegt den Filter, der zweite entkräftet die Rückfrage nach dem D&B-Profil.
08 Warum der Umweg überhaupt nötig ist
Der Server hat den Umlaut anstandslos genommen. Die Beschränkung sitzt ausschließlich im Browser, in einer Maske, die vermutlich verhindern soll, dass jemand Unsinn ins Feld schreibt. Für deutsche Firmennamen ist das Ergebnis, dass eine korrekt eingetragene UG sich nicht anmelden kann, obwohl alle Daten stimmen.
Ein Bugreport über den Feedback Assistant[3] kostet fünf Minuten und ist die einzige realistische Chance, dass das Problem irgendwann verschwindet. Bis dahin: Konsole auf.
Quellen
- DUNS-Lookup bei Apple: https://developer.apple.com/enroll/duns-lookup/ ↩1 ↩2
- Apple Developer Support, Bereich Membership and Account: https://developer.apple.com/contact/ ↩
- Feedback Assistant: https://feedbackassistant.apple.com/ ↩