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)")
}
}
}
}
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"
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:
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
Comentários muito úteis
Desculpe, não consegui postar um exemplo ainda, estou muito ocupado.
Espero poder postar um em breve.