Estou tentando integrar o Snapkit com um aplicativo iOS, mas quero usar o SwiftUI em vez do UIKit. Já fiz a configuração necessária com o Snapkit e agora estou tentando fazer com que o botão de login do snapchat seja exibido no meu aplicativo. Eu sei que o Snapkit SDK é feito para UIKit e não para SwiftUI, mas SwiftUI tem uma maneira de envolver UIViews em SwiftUI com o protocolo UIViewRepresentable. Tentei implementar isso, mas o botão de login ainda não é exibido.
Este é meu código:
import SwiftUI
import UIKit
import SCSDKLoginKit
struct ContentView: View {
var body: some View {
SnapchatLoginButtonView()
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
struct SnapchatLoginButtonView: UIViewRepresentable {
func makeCoordinator() -> Coordinator {
Coordinator()
}
func makeUIView(context: Context) -> SCSDKLoginButton {
let s = SCSDKLoginButton()
s.delegate = context.coordinator
return s
}
func updateUIView(_ uiView: SCSDKLoginButton, context: Context) {
}
class Coordinator: NSObject, SCSDKLoginButtonDelegate {
func loginButtonDidTap() {
}
}
}
Tenho a sensação de que algo está faltando em SCSDKLoginButton, mas não tenho certeza do que é, então aqui está o arquivo SCSDKLoginButton.h para referência. Qualquer ajuda seria muito apreciada!
//
// SCSDKLoginButton.h
// SCSDKLoginKit
//
// Copyright © 2018 Snap, Inc. All rights reserved.
//
#import <UIKit/UIKit.h>
@protocol SCSDKLoginButtonDelegate
- (void)loginButtonDidTap;
@end
@interface SCSDKLoginButton : UIView
@property (nonatomic, weak, nullable) id<SCSDKLoginButtonDelegate> delegate;
- (instancetype)initWithCompletion:(nullable void (^)(BOOL success, NSError *error))completion NS_DESIGNATED_INITIALIZER;
@end
Coincidentemente, tentei implementar o SnapKit SDK em um projeto SwiftUI / iOS13 exclusivo cerca de 3 dias após você postar seu problema.
Infelizmente, não posso resolver seu problema diretamente, pois há alguns problemas principais que o Snapchat precisa resolver com seu SDK antes de ser adequado para o desenvolvimento com o Paradigma SceneDelegate e AppDelegate introduzido no iOS 13. Mas espero poder esclarecer o seu questionar e apresentar minhas descobertas a qualquer pessoa que esteja em uma situação semelhante.
Estas são as seguintes questões / observações que fiz em minha busca de Implementação de SCSDKLoginKit e SCSDKBitmojiKit em SwiftUI:
O problema mais básico é que o Módulo SCSDKLoginKit está desatualizado, como você percebeu corretamente. SCSDKLoginClient.login () requer que a visualização de chamada esteja em conformidade com a classe UIViewController (UIKIT). Portanto, devemos usar a solução alternativa com um UIViewControllerRepresentable para atuar como nosso intermediário SwiftUI <-> UIKit.
No entanto, o problema fundamental está relacionado ao fato de que a documentação do SnapKit SDK não foi atualizada para fornecer aos desenvolvedores um link SceneDelegate entre o Snapchat Auth e a lógica do seu aplicativo. Portanto, mesmo que você tenha implementado seu SCSDKLoginButton corretamente, não é fácil navegar!
Agora, para responder diretamente à sua pergunta, você está tentando envolver um SCSDKLoginButton em um UIViewControllerRepresentable, o que pode ser feito e tenho certeza de que alguém com melhor conhecimento de coordenadores etc. do que eu pode ajudá-lo com isso. Porém, eu só queria mostrar que seus esforços no momento podem ser infrutíferos até que o snapchat forneça um SDK atualizado.
Aqui está minha configuração:
[ContentView.swift]
import SwiftUI
struct ContentView: View {
@State private var isPresented = false
var body: some View {
Button("Snapchat Login Button") { self.isPresented = true}
.sheet(isPresented: $isPresented) {
LoginCVWrapper()
}
}
}
[LoginCVWrapper.swift]
import SwiftUI
import UIKit
import SCSDKLoginKit
struct LoginCVWrapper: UIViewControllerRepresentable {
func makeUIViewController(context: Context) -> UIViewController {
return LoginViewController()
}
func updateUIViewController(_ uiViewController: UIViewController, context: Context) {
//Unused in demonstration
}
}
[LoginViewController.swift]
import UIKit
import SCSDKLoginKit
class LoginViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
performLogin() //Attempt Snap Login Here
}
//Snapchat Credential Retrieval Fails Here
private func performLogin() {
//SCSDKLoginClient.login() never completes once scene becomes active again after Snapchat redirect back to this app.
SCSDKLoginClient.login(from: self, completion: { success, error in
if let error = error {
print("***ERROR LOC: manualTrigger() \(error.localizedDescription)***")
return
}
if success {
self.fetchSnapUserInfo({ (userEntity, error) in
print("***SUCCESS LOC: manualTrigger()***")
if let userEntity = userEntity {
DispatchQueue.main.async {
print("SUCCESS:\(userEntity)")
}
}
})
}
})
}
private func fetchSnapUserInfo(_ completion: @escaping ((UserEntity?, Error?) -> ())){
let graphQLQuery = "{me{displayName, bitmoji{avatar}}}"
SCSDKLoginClient
.fetchUserData(
withQuery: graphQLQuery,
variables: nil,
success: { userInfo in
if let userInfo = userInfo,
let data = try? JSONSerialization.data(withJSONObject: userInfo, options: .prettyPrinted),
let userEntity = try? JSONDecoder().decode(UserEntity.self, from: data) {
completion(userEntity, nil)
}
}) { (error, isUserLoggedOut) in
completion(nil, error)
}
}
}
[Funciona da seguinte maneira] : GIF: Código em execução no dispositivo
Mais sobre o problema do link da interface SceneDelegate: Quando você inevitavelmente implementa a chamada SCSDKLoginClient.login () (presumivelmente quando seu SCSDKLoginButton é pressionado), o Snapchat abrirá, ele apresentará a planilha "conceder acesso" assumindo corretamente que seu aplicativo está vinculado ao Snapchat Portal Dev.
Quando você aceita essas permissões, o Snapchat redireciona para o seu aplicativo. No entanto, é aqui que o link entre seu aplicativo e a recuperação de um nome de usuário / bitmoji do Snapchat será interrompido. Isso se deve ao fato de que em novos aplicativos iOS 13, o SceneDelegate controla quando os estados do aplicativo mudam, não o AppDelegate como nas versões anteriores ao iOS13. Portanto, o Snapchat retorna os dados do usuário, mas seu aplicativo nunca os recupera.
[Daqui para frente]
[Leitura Adicional]
@ Stephen2697 estava certo ao apontar que o snap sdk não foi construído para iOS 13 ainda devido ao SceneDelegate agora lidar com redirecionamentos oauth ao invés de AppDelegate. Eu descobri uma solução alternativa para usar o método SCSDKLoginClient.application () (que foi feito para appdelegate) para ser usado no delegado de cena. Aqui está o código, adicione-o ao seu delegado de cena e o manipulador de conclusão passado para seu login do Snapchat será executado:
func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
for urlContext in URLContexts {
let url = urlContext.url
var options: [UIApplication.OpenURLOptionsKey : Any] = [:]
options[.openInPlace] = urlContext.options.openInPlace
options[.sourceApplication] = urlContext.options.sourceApplication
options[.annotation] = urlContext.options.annotation
SCSDKLoginClient.application(UIApplication.shared, open: url, options: options)
}
}
Desde que o botão de login não apareça, certifique-se de adicionar um manipulador de conclusão à instância SCSDKLoginButton ou então ele não funcionará. Como isso:
let s = SCSDKLoginButton { (success, error) in
//handle login
}
Jana Duggar foi aberta sobre sua busca pelo amor. Aqui está tudo o que ela disse sobre o assunto e sua janela de cinco anos para o casamento.
O astro de 'Outlander', Sam Heughan, revelou recentemente o que vai levar do set para relembrar Jamie Fraser, o papel que o tornou uma estrela.
'She Loves You' foi escrita em uma hora, gravada em um dia, e foi a música dos Beatles com uma de suas melhores apresentações de sua carreira.
Dolly Parton e sua avó Bessie tiveram um relacionamento especial. Vovó Parton estava muito doente, mas isso não impediu Dolly de pregar uma peça nela.
Você pode achar que o carvalho ou a nogueira são madeiras resistentes, mas quando se trata da madeira mais dura do mundo, elas nem chegam perto.
O oceano é repleto de beleza, mas também esconde algumas das criaturas marinhas mais assustadoras do planeta. Muitos desses animais espreitam nas profundezas do oceano, no mundo escuro e de alta pressão do fundo do mar.
Se você está enfrentando criaturas hostis ou se preparando para cenários PvP, conhecer os melhores encantamentos de espada no Minecraft pode te dar uma grande vantagem. Encantar espadas permite causar mais dano, aumentar a quantidade de itens obtidos de criaturas e prolongar a durabilidade da sua espada.
Quando as pessoas falam sobre países socialistas, geralmente imaginam o controle total do governo e a ausência de propriedade privada. Mas, na prática, as economias socialistas variam muito.
“Children” traz uma participação especial de grande nome e algumas notícias devastadoras
Este RAV4 está em excelentes condições e está preparado para um jogo de cadeiras musicais.
Imagens de drone capturaram bombeiros parecendo lutar para apagar o incêndio.
Eyes of Wakanda está diretamente relacionado ao MCU, além de atualizações sobre X-Men '97, What If..., Demolidor e muito mais.
O anel de noivado de Kate Middleton pertenceu à Princesa Diana antes do Príncipe William pedi-la em casamento. Descubra tudo o que há para saber sobre a peça histórica aqui.
John Cleese se casou com sua esposa, Jennifer Wade, em 2012. Aqui está tudo o que você precisa saber sobre a esposa de John Cleese, Jennifer Wade.
Patton Oswalt se casou com sua esposa, a também atriz Meredith Salenger, em 2017. Aqui está tudo o que você precisa saber sobre a esposa de Patton Oswalt, Meredith Salenger.
Mena Suvari é casada com o marido Michael Hope desde 2018. Aqui está tudo o que você precisa saber sobre o marido de Mena Suvari.
Isso me atinge De repente, como tantas vezes acontece É o meio do caminho tudo de novo <Não, não aquele no Pacífico, seu marrom, aquele no carnaval> Todas as manchetes em voz alta…..
Em 2022, com o lançamento do GPT-3, a habilidade de escrita parece se tornar menos importante. Com a IA, pessoas com redação ruim também podem gerar funcionários de qualidade.
No mundo acelerado e competitivo de hoje, a carreira desempenha um papel significativo no crescimento pessoal, na estabilidade financeira e na satisfação geral com a vida. No entanto, muitos indivíduos encontram-se presos em um ciclo implacável de estagnação e insatisfação, definhando gradualmente em suas vidas profissionais.
Na semana passada, notei um comunicado de imprensa, enviado via PressGazette (um site de notícias da mídia britânica). O artigo anunciava que a Acast, a empresa de publicidade e hospedagem de podcast Scandi, lideraria um consórcio de "provavelmente os editores mais influentes" em podcasting.