Swiftyinsta: Pergunte sobre credentials.code

Criado em 9 out. 2019  ·  19Comentários  ·  Fonte: TheM4hd1/SwiftyInsta

Olá,
Por favor, diga. Eu tenho um problema.

Com o pedido em func login, recebo um SMS com o código, que registei em credentials.code = "121332".
Não posso enviar este código de volta. Como fazer isso? O que estou fazendo de errado?

Este é o meu código

classe ViewController: UIViewController {

let handler = APIHandler()    
override func viewDidLoad() {
    super.viewDidLoad()
    login()
}

func login() {
    var credentials = Credentials(username: "username", password: "password", verifyBy: .text)
    credentials.code = "121332"

    handler.authenticate(with: .user(credentials)) { [weak self] in
        switch $0 {
        case .success(let response, _):
            print("Login successful.")
            guard let key = response.persist() else { return print("`Authentication.Response` could not be persisted.") }
            UserDefaults.standard.set(key, forKey: "current.account")
            UserDefaults.standard.synchronize()

            self?.getCurrentUser()
        case .failure(let error):
            if error.requiresInstagramCode {
            } else {
            }
        }
    }
}

func getCurrentUser() {
    self.handler.users.user(.me) { ( result: Result<User?, Error>) in
        switch result {
        case .success(let user):
            let username = user?.name ?? "John Doe"
            print("success, username: \(username)")
        case .failure(let error):
            print("failure, error: \(error.localizedDescription)")
        }
    }
}

}

bug help wanted

Comentários muito úteis

Desculpe, não consegui postar um exemplo ainda, estou muito ocupado.
Espero poder postar um em breve.

Todos 19 comentários

Você precisa mover credentials.code = "121332" após o manipulador de autenticação retornar .failure(let error) .
Fazer isso de forma assíncrona dentro de if error.requiresInstagramCode { } pode ser uma boa opção.

O problema ainda existe
https://prnt.sc/pgyf15
aparentemente não envia este código

Experimente sem o ponto de interrupção. Porque, dessa forma, você está realmente interrompendo o código quando ele atinge aquela linha, portanto, ele não pode propagar nenhuma solicitação enquanto credentials.code muda. :corar:
Se ainda não mudar nada, tente reter credentials também (embora não deva ser um problema pelo que posso ver em seu trecho, tbh).

https://prnt.sc/pgynah
O problema ainda existe. Gostaria de chamar a atenção, passo as credenciais para .user, pois se houver .credentials (como no exemplo), ocorre um erro

.user é a maneira correta.
.credentials foi usado em development e esqueci de mudar. Obrigado por apontar. Vou mudar agora.
Ainda não recebo o erro porque estou testando do meu jeito e tudo funciona como planejado 🤔

Como não consigo ver em sua última captura de tela, realmente não funciona persistindo credentials dessa forma e, em seguida, atualizando code depois de retornar Error exigindo isso ?
Porque parece ser a única coisa que você está fazendo diferente, tbh 😞

Se eu usar .credentials, tenho este erro https://prnt.sc/pgyvlx
Postei todo o meu código na mensagem principal.
Estou fazendo algo errado?

como você testa o envio de uma mensagem de volta?

.user é o correto, .credentials foi mantido na documentação por engano.
Mova sua declaração de credentials abaixo de handler one. Como propriedade "retida".
Deve funcionar então.

let handler = APIHandler()
let credentials = Credentials( … )

func login() {
  …
}

é todo código, há um erro de qualquer maneira (

importar UIKit
import SwiftyInsta

classe ViewController: UIViewController {
let handler = APIHandler ()
var credentials = Credentials (username: "username", password: "password", verifyBy: .text)

override func viewDidLoad() {
    super.viewDidLoad()
    login()
}

func login() {

    handler.authenticate(with: .user(credentials)) { [weak self] in
        switch $0 {
        case .success(let response, _):
            print("Login successful.")
            guard let key = response.persist() else { return print("`Authentication.Response` could not be persisted.") }
            UserDefaults.standard.set(key, forKey: "current.account")
            UserDefaults.standard.synchronize()
            self?.getCurrentUser()
        case .failure(let error):
            if error.requiresInstagramCode {
                self!.credentials.code = "178063"
            } else {
            }
        }
    }
}

func getCurrentUser() {
    self.handler.users.user(.me) { ( result: Result<User?, Error>) in
        switch result {
        case .success(let user):
            let username = user?.name ?? "John Doe"
            print("success, username: \(username)")
        case .failure(let error):
            print("failure, error: \(error.localizedDescription)")
        }
    }
}

}

E qual é o erro desta vez? @ rmelnik7777

09/10/2019 17: 32: 25.333892 + 0300 TestInsta [9747: 281440] [] nw_connection_receive_internal_block_invoke [C1] Falha de recebimento de resposta com erro "Operação cancelada"

https://prnt.sc/pgzldk

Na verdade, parece algum tipo de aviso de _Xcode_, não algo SwiftyInsta gerado 🤔

Eu tenho um problema similar. Não está claro como entrar no bloco de falha para definir um código de autorização de SMS. Você pode ajudar com um exemplo?

Olá, eu também tenho o mesmo problema. Você pode compartilhar um aplicativo de amostra funcional para autenticação de dois fatores?

@sbertix postará um exemplo claro em breve.
ser paciente.

Desculpe, não consegui postar um exemplo ainda, estou muito ocupado.
Espero poder postar um em breve.

Sou totalmente novo no Swift, mas talvez tenha encontrado o bug:

  • Aqui , você cria uma cópia mutável de user (instância de Credentials ) e define o valor da propriedade do manipulador.
  • Mas nesta linha , é a instância original de Credentials , portanto, o valor da propriedade handler não é definido. A função authentification.code() não é chamada.

Eu não tive a chance de investigar isso mais a fundo, mas poderia muito bem ser. Aparentemente no commit atual Credentials são declarados como struct e não class , que era a premissa de toda a coisa de passagem por referência.
Aparentemente, é algo que consertei ao longo do caminho na minha versão local ou algumas alterações que enviei para master ao longo do caminho, ou possivelmente nem mesmo o problema em si.
Vou tentar revisar tudo em # 96, mas não tive tempo recentemente. Desculpas.
@Lyusan

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

reefer picture reefer  ·  18Comentários

sbertix picture sbertix  ·  3Comentários

anonrig picture anonrig  ·  3Comentários

sbertix picture sbertix  ·  27Comentários

biox86 picture biox86  ·  12Comentários