Данные автозаполнения IoS в формах входа пусты в приложении Cordova (с использованием угловых) - PullRequest
0 голосов
/ 30 ноября 2018

Cordova 8 / IoS 12 / Angular 6

У меня есть приложение Cordova с формой для входа.Все работает хорошо, кроме этого.

На ios Apple предлагает пользователю ввести сохраненный пароль, когда он фокусируется в форме.Когда пользователь использует эту функцию автозаполнения ios, форма не обнаруживает новые значения, и данные остаются пустыми.(но пользователь может видеть учетные данные, появляющиеся на экране)

Вот моя форма входа:

 <form (ngSubmit)="login()" [formGroup]="loginForm">
        <input type="email" formControlName="username" name="username"/>
        <input type="password" formControlName="password" name="password"/>
        <button class="transparent-button primary">Login</button>
    </form>

И в моем компоненте:

 constructor(
    /* ... */
 ) {
  this.loginForm = formBuilder.group({
    username: ["", Validators.required],
    password: ["", Validators.required]
  });

};

login(){
    //this.loginForm.value.username and 
    this.loginForm.value.password stay empty when user 
    autofill
}

Я такжепробовал с шаблонами, управляемыми формами: та же проблема.Из-за этого Apple блокирует публикацию моего приложения.Это известная проблема ios / cordova?

Спасибо

Ответы [ 3 ]

0 голосов
/ 17 декабря 2018

Это не очень хорошее решение, но пока оно работает, и Apple приняла мое приложение.Так как я не могу заставить автозаполнение работать правильно, я отключил его:

Я изменил свой пароль для ввода текста, поэтому предложение автозаполнения не предлагается.Я также отключил свойства автозамены, автокапитализации и автозаполнения.

<form (ngSubmit)="login()" [formGroup]="loginForm">
    <input type="email" formControlName="username" name="username" autocorrect="off" autocapitalize="none" autocomplete="off"/>
    <input type="text" formControlName="password" name="password" autocorrect="off" autocapitalize="none" autocomplete="off" class="passwordInput"/>
    <button class="transparent-button primary">Login</button>
</form>

И добавил это в css, чтобы скрыть текст во входных данных и смоделировать маркеры при вводе реального пароля:

.passwordInput {
  -webkit-text-security: disc;
}

Действительно жду реального решения.

0 голосов
/ 10 февраля 2019

FWIW, у меня была такая же проблема, см. Мой обходной путь ниже.

Я использую реактивные формы, и у меня возникла проблема в форме входа в систему, когда у меня есть только имя пользователя и пароль.Я реализовал обходной путь, при котором я подписываюсь на изменения в форме, а затем определяю, равно ли собственное значение пароля полю поля формы пароля во время изменения (технически через 500 мс после изменения, чтобы дождаться, пока автозаполнение не введет значение пароля).Если они разные, я вручную переопределяю значение формы на собственное значение, которое запускает проверку формы.

Надеюсь, это кому-нибудь поможет!

// login-form.component.ts

import { Component, ViewChild, ElementRef } from '@angular/core';
import { FormGroup, FormBuilder, Validators } from '@angular/forms';

@Component({
  selector: 'app-login-form',
  template: require('./login-form.component.pug')(),
  styleUrls: ['./login-form.component.scss'],
})
export class LoginFormComponent {

  protected loginForm: FormGroup;

  @ViewChild('password') public passwordRef: ElementRef;

  constructor(private _formBuilder: FormBuilder) {
    this.loginForm = this.getForm();

    // NOTE: this hack triggers form validation on iOS autofill
    this.loginForm.valueChanges
      // wait for 500ms to be sure the autofill is finished with the password field
      .debounceTime(500)
      .subscribe((changes) => {
        // manually fetch the value from nativeElement
        let passVal = this.passwordRef.nativeElement.value; //(<HTMLInputElement>document.querySelector('[name="password"]')).value;
        // if the value saved in the form is different from the input, manually update it
        if (passVal !== changes.password) {
          this.loginForm.get('password').setValue(passVal);
        }
      })
    ;
    // NOTE: this hack triggers form validation on iOS autofill
  }

  protected getForm(): FormGroup {
    return this._formBuilder.group({
      username: ['', [
        Validators.required,
        Validators.email,
      ]],
      password: ['', [
        Validators.required,
      ]],
    });
  }

  public onSubmit(login: FormGroup) {
    // ...
  }
}
// login-form.component.pug
// NOTE: pug + bootstrap 4

h1 Login
form([formGroup]="loginForm", (ngSubmit)="onSubmit(loginForm)")
  .form-group
    input.form-control(
      formControlName="username",
      name="username",
      type="email",
      placeholder="Username",
      autocomplete="on",
      autocorrect="off",
      autocapitalize="off",
      spellcheck="false",
    )

  .form-group
    input.form-control(
      #password,
      formControlName="password",
      name="password",
      type="password",
      placeholder="Password",
      autocomplete="on",
      autocorrect="off",
      autocapitalize="off",
      spellcheck="false",
    )

  input.mb-3.btn.btn-lg(
    type="submit",
    value="Login",
    [class.btn-outline-primary]="loginForm.valid",
    [class.btn-outline-secondary]="!loginForm.valid",
    [disabled]="!loginForm.valid",
  )

0 голосов
/ 09 декабря 2018

Я могу подтвердить.У меня та же проблема с Ionic при использовании ngModel , но это также происходит с использованием вашего кода с formGroup .

<ion-item>
    <ion-label stacked>Benutzername</ion-label>
    <ion-input [(ngModel)]="username" id="un" type="text" autocomplete="on" autocorrect="on" clearInput="true" clearOnEdit="false"></ion-input>
</ion-item>
<ion-item>
    <ion-label stacked>Passwort</ion-label>
    <ion-input [(ngModel)]="password" id="pw" type="password" autocomplete="on" autocorrect="on" clearInput="true" clearOnEdit="false"></ion-input>
</ion-item>

Атрибуты автозаполнение и автозамена ( Ионные входные атрибуты ) не влияют на функцию автозаполнения iOS.

Пример приложения: Я создал примерприложение, использующее Руководство по началу работы с Ionic , чтобы продемонстрировать эту проблему:

Пример приложения для входа

При вводе учетных данных вручную онихранятся в переменных ( пароль и имя пользователя ), как показано на следующем изображении: Изображение 1

После установки учетных данных автозаполненияв настройках iOS и перезапуская симулятор, я просто щелкнул в поле Имя пользователя и нажал «Пароли» в верхней панели клавиатуры.Затем я просто выбрал пользователя для заполнения. Все выглядит хорошо и заполнено правильно, как вы можете видеть в Изображение 2

Затем я нажал кнопку Login иполучил вывод переменных username и password , как показано в Изображение 3

Как видите, username -поле, в которое я нажал и использовал функцию автозаполнения, синхронизировало его значение с его переменной.Но поле пароля (в которое я никогда не заходил из-за функции автозаполнения) не не синхронизирует свои данные с его переменной.

Когда я нажимаю на поле пароля вручную и используюФункция автозаполнения снова, данные синхронизируются с ее переменной правильно: Изображение 4

То же самое происходит наоборот, просто нажав на поле пароля с помощью функции автозаполнения.Затем поле пароля синхронизирует свое значение со своей переменной, а поле имени пользователя - нет.

...