我可以将 Snapchat SDK (SnapKit) 与 SwiftUI 结合使用吗?

2023-12-20

我正在尝试整合Snapkit https://docs.snapchat.com/使用 iOS 应用程序,但我想使用 SwiftUI 而不是 UIKit。我已经使用 Snapkit 完成了所需的设置,现在我正在尝试让 Snapchat 登录按钮显示在我的应用程序中。我知道 Snapkit SDK 是为 UIKit 而不是 SwiftUI 设计的,但 SwiftUI 有办法将 UIView 包装到 SwiftUI 中 https://sarunw.com/posts/uikit-in-swiftui/使用 UIViewRepresentable 协议。我已经尝试实现此功能,但登录按钮仍然不显示。

这是我的代码:

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() {
        }
    }
}

我有一种感觉,我在 SCSDKLoginButton 中丢失了一些东西,但不确定它是什么,所以这里有文件 SCSDKLoginButton.h 供参考。任何帮助将不胜感激!

//
//  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

巧合的是,在您发布问题大约 3 天后,我尝试在一个专有的 SwiftUI/iOS13 项目中实现 SnapKit SDK。

不幸的是,我无法直接解决您的问题,因为 Snapchat 必须通过其 SDK 解决一些关键问题,然后才能适合使用 iOS 13 中引入的 SceneDelegate 和 AppDelegate Paradigm 进行开发。但我希望我可以为您提供帮助向处于类似困境的其他人提出问题并向他们展示我的发现。

这些是我在 SwiftUI 中实现 SCSDKLoginKit 和 SCSDKBitmojiKit 时提出的以下问题/观察结果:

  • 正如您正确认识到的那样,最基本的问题是 SCSDKLoginKit 模块已过时。 SCSDKLoginClient.login() 要求调用视图符合 (UIKIT) UIViewController 类。因此,我们必须使用 UIViewControllerRepresentable 的解决方法来充当我们的 SwiftUI UIKit 中介。

  • 然而,根本问题与以下事实有关:SnapKit SDK 文档尚未更新,无法为开发人员提供 Snapchat Auth 和应用程序逻辑之间的 SceneDelegate 链接。因此,即使您正确实现了 SCSDKLoginButton,也不是一帆风顺!

现在直接回答你的问题,你正在尝试将 SCSDKLoginButton 包装在 UIViewControllerRepresentable 中,这是可以完成的,我相信比我更了解协调器等的人可以帮助你。然而,我只是想表明,在 snapchat 提供更新的 SDK 之前,您目前的努力可能是徒劳的。

这是我的设置:

[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()
        }
    }
}

[登录CVWrapper.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
    }
}

[登录ViewController.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)
        }
    }
}

[运行如下]: GIF:在设备上运行的代码 https://i.stack.imgur.com/UaE0C.gif

更多关于SceneDelegate接口链接问题: 当您不可避免地实现 SCSDKLoginClient.login() 调用时(大概是在按下 SCSDKLoginButton 时),Snapchat 将打开,假设您的应用程序已链接到 Snapchat 开发门户中,它将正确显示“授予访问权限”表。

当您接受这些权限时,Snapchat 会重定向到您的应用程序。然而,这就是您的应用程序与检索 snapchat 用户名/位莫吉之间的链接将崩溃的地方。这是因为,在新的 iOS 13 应用程序中,SceneDelegate 会处理应用程序状态更改的情况,而不是像 iOS13 之前的版本中那样由 AppDelegate 处理。因此 Snapchat 返回用户数据,但您的应用程序永远不会检索它。

[向前走]

  • SnapKitSDK(当前版本为1.4.3)需要随文档一起更新。
  • 我刚刚向 Snapchat 提交了一个支持问题,询问此更新何时发布,因此如果我听到更多信息,我会更新此问题。如果您正在寻找 SCSDKLoginButton() 问题的直接解决方案,我深表歉意,我只是想让您知道当前时刻存在哪些挑战。

[延伸阅读]

  • Facebook 更新了他们的工具和文档以合并场景/应用程序代表。请参阅此处的步骤“5.连接您的应用程序代理和场景代理”:https://developers.facebook.com/docs/facebook-login/ios/ https://developers.facebook.com/docs/facebook-login/ios/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我可以将 Snapchat SDK (SnapKit) 与 SwiftUI 结合使用吗? 的相关文章

  • 快速球体结合星数据

    我想构建一个观星应用程序 现在我已经构建了一个球体并用星图覆盖它 基于天体坐标 https svs gsfc nasa gov cgi bin details cgi aid 3895 https svs gsfc nasa gov cgi
  • 在 swift 中获取 NSImage 的 PNG 表示

    嘿 我在获取 NSImage 对象的 PNG 表示时遇到了一些问题 这就是我正在做的 var imgData NSData coverImgView image TIFFRepresentation var bitmap NSBitmapI
  • Ios Swift制作字体切换粗体、斜体、boldItalic、正常而不改变其他属性

    我很惊讶 在 Swift 中简单地为现有字体设置粗体和斜体是如此复杂 我只是想通过在字体类上使用以下方法来简化事情 我希望将以下方法添加到已设置字体系列和字体大小的现有字体中 我需要保留这些并仅更改以下内容 setBold Shud 保留斜
  • NSURLConnection 的 URL 文件大小 - Swift

    我想在下载之前从 url 获取文件大小 这是 obj c 代码 NSURL URL NSURL URLWithString ExampleURL NSMutableURLRequest request NSMutableURLRequest
  • 如何在 UITableViewCell 上使用自定义初始值设定项?

    我有一个自定义 UITableViewCell 我想在我的表视图中使用它 这是我的单元格代码 class ReflectionCell UITableViewCell IBOutlet weak var header UILabel IBO
  • Swift - UICollectionView 重复(重复)单元格

    你好 我有一个数组 其中包含从 flickr 获取的 100 张图片 url 当我使用 UICollectionView 时 我显示 100 个单元格 屏幕上只有 8 个单元格 当我向下滚动查看下一个 8 个单元格时 它们与前一个单元格相同
  • Swift 在调试和发布模式下的行为不同

    不确定这是否是 Swift XCode 或 Alamofire 的问题 但我认识到我的混合 Swift Objc 应用程序中不同地方的奇怪行为 它只发生在用 Swift 编写并使用闭包 网络的部分 这是发生这种情况的示例代码 Alamofi
  • SwiftUI:为表单中的单元格添加动画

    我正在尝试动画化我的Form或者更确切地说是其中的细胞 我的问题是 下面的代码给了我一个很好的插入动画 但是对于删除 单元格在看起来很丑陋的延迟后突然被删除 import SwiftUI struct ContentView View St
  • 如何改善 ARKit 3.0 中的人物遮挡

    我们正在开发一个使用 ARKit 中的人物遮挡的演示应用程序 因为我们想在最终场景中添加视频 所以我们使用SCNPlanes 使用 a 渲染视频SCNBillboardConstraint以确保他们面向正确的方向 这些视频也是部分透明的 使
  • 在 Swift 中将半精度浮点数(字节)转换为浮点数

    我希望能够从二进制文件中读取半浮点数并将它们转换为 Swift 中的浮点数 我查看了来自其他语言 例如 Java 和 C 的几种转换 但是我无法获得与半浮点相对应的正确值 如果有人可以帮助我实施 我将不胜感激 从 Float 到 Half
  • 在 Swift 中动态设置 Dictionary 的属性

    我正在尝试根据字典中的值在类上设置一些属性 目前我正在这样做 let view UIView UIView if let hidden Bool self props hidden as Bool view hidden hidden if
  • iOS 9 中可滑动的表格视图单元格

    我希望我的表格列表具有像 iOS 8 中那样的可滑动菜单 首次在 iOS 7 中引入 我找到了清晰的 Ray Wenderlich 指南 http www raywenderlich com 62435 make swipeable tab
  • 如何跟踪 SwiftUI 应用程序中的所有触摸

    我正在尝试在 SwiftUI 应用程序中实现锁屏 我需要跟踪每个事件才能重新启动锁定计时器 在 UIKit 应用程序中 我使用了这种方法 重写 UIApplication 它允许了解应用程序中的任何事件 override func send
  • SwiftUI 检测用户何时截取屏幕截图或屏幕录制

    On UIViewController我们可以轻松地将观察者添加到控制器 喜欢 class ViewController UIViewController override func viewDidLoad super viewDidLoa
  • 如何为所有整数类型创建通用整数到十六进制函数?

    我想为所有整数类型创建一个整数到十六进制函数 对于1字节的Int8 它返回两个字母 例如0A 对于2字节的Int16 它返回四个字母 例如0A0B 对于8字节的Int64 它返回16个字母 例如0102030405060708 func h
  • 如何在 iPad 应用程序上禁用横向方向?

    我创建了一个全新的单视图 iOS 通用 Swift 应用程序 然后 我在应用程序设置中取消选中 横向左 和 横向右 我在 iPhone 上运行了它 万岁 无论我如何旋转手机 它都会保持纵向模式 然后我在 iPad 上运行它 它会旋转到任何内
  • 如何将 SCNPlane 颜色更改为透明颜色

    我正在开发一个 ARKit 项目 在水平面上点击时需要波纹动画效果 为此 我采用了 UIView 对象并将其作为 SCNPlane 对象材料的内容传递 我已将波纹动画添加到 UIView 对象 一切正常 但我无法将 SCNPlane 颜色更
  • 视频中的图像/文本叠加 swift

    我正在使用 swift 在视频中使用图像叠加来实现水印效果 我正在使用AVFoundation为此 但不知何故我没有成功 以下是我的覆盖图像 文本的代码 let path NSBundle mainBundle pathForResourc
  • dyld:无法加载插入的库,但可以在模拟器和另一部 iPhone 上使用

    所以我在过去的几个小时里在我的应用程序上编码 在某个时候我决定在我的 iPhone 8 13 3 1 上启动我的应用程序而不是使用模拟器 13 3 它立即崩溃并出现以下错误 dyld warning could not load inser
  • Swift:UICollectionViewCell didSelectItemAtIndexPath 更改背景颜色

    我可以轻松更改单元格的背景颜色CellForItemAtIndexPath method func collectionView collectionView UICollectionView cellForItemAtIndexPath

随机推荐

  • 动态修改 Tapestry 5 中的 FormInjector 上下文信息

    我当前的问题是关于动态更新上下文信息FormInjector 我之前的问题在 Tapestry 5 中更新表单内的区域 https stackoverflow com questions 2966750 updating a zone in
  • 使用 jFreeChart 在多个图形中绘制多个图形

    我正在尝试使用 jFreechart 生成两个数字 每个数字有 12 个图表 在 jFreeChart 中称为系列 然而 有些图表被简单地跳过了 我知道我在这里遇到同步问题 并尝试使用用户 trashgod 提供给我的方法here http
  • Python json.dumps() 输出缩小的json?

    有没有办法让python的json dumps
  • 如何在 Azure AD B2C 中停用和重新激活用户

    有什么方法可以停用并重新激活 Azure AD B2C 用户 我想实现切换 Azure AD 用户状态的功能 如果 停用并重新激活 是指阻止用户登录 目前 这仅适用于本地帐户 不适用于来自社交提供商的帐户 Facebook Google 等
  • 如何设置SWFUpload上传的文件夹?

    我在文档中没有看到如何使用 SWFUpload 设置上传的文件文件夹 有人能指出我正确的方向吗 如果有帮助的话我正在使用 PHP 5 您所做的就是调用 PHP 脚本 该脚本会处理文件上传 您可以打开调试 这将为您提供一个非常好的调试视图 了
  • gridview 中的分页

    我的网格视图
  • 动态缩略图/调整图像大小生成[重复]

    这个问题在这里已经有答案了 可能的重复 PHP 动态调整图像大小与存储调整大小的图像 https stackoverflow com questions 2823600 php image resize on the fly vs stor
  • 未找到 glib.h 和 gtk.h

    大家好 我有一个程序 其中包括 gtk gtk h glib h 我使用过以下命令 sudo apt get install libgtk2 0 dev glib sudo apt get install glade 但我仍然收到 glib
  • 本机 xml 数据库中的唯一性插入

    我正在开发一个基于XML 的项目 我使用 Sedna 数据库来存储我的集合 其中包含 XML 文件及其 XSD 架构文件 我在这些方案中定义了主键 唯一键 但到目前为止我可以将重复值 通过 XQuery 更新插入命令 插入到主键字段中 为了
  • 内存泄漏和处置

    我可能不理解这个概念或者我做错了什么 我对 NET 中的内存管理有一些疑问 想象一下情况 Form1是大人窗体 作为 MDI 父级和一点FormChild 被绑定为子项 public partial class Form1 Form pub
  • 如何使用 @output 将布尔值从子级发送到父级

    嗨 有角的社区 我想使用 Output 触发一个事件来隐藏或打开 关闭包含其他组件的 div 这很简单 但我以前从未使用过 EventEmitter 所以我希望当调用 hideDem 时 它会根据来自 child ts 的其他属性隐藏或打开
  • 如何增加android中线性布局中元素之间的空间? [复制]

    这个问题在这里已经有答案了 在我的应用程序中 我使用了 Linearlayout 其中有 3 个 EditText 元素 现在我想增加 Edittext 元素之间的空间 填充 是否可以 基本上这是相对于你的边框而言的 如果你想在边框内的元素
  • 使用该 exe 的 VM 参数在 Maven 中创建一个 exe 文件

    我目前正在开发一个 Java 项目 该项目需要指定 java library path 的 VM 参数 当从 Eclipse 中运行我的程序时 没问题 我可以轻松指定我的 VM 参数 现在我想通过 Maven 构建我的项目 但还没有找到向该
  • 如何将二进制字符串写入文件 C#

    我有一个二进制数字符串 例如 temp 0101110011 我想将其另存为文件 该 Temp 有 10 个字符 如何将此字符串保存到 10 位长度的文件中 void Save Data string temp bool BoolArray
  • 使用 NSXMLParserDelegate 构建项目时出错

    TurbineXMLParser h import
  • VBA - 文件夹选择器 - 设置从哪里开始[重复]

    这个问题在这里已经有答案了 我有一个小型 Access VBA 应用程序 需要用户选择一个文件夹 我想知道是否有办法告诉 VBA 启动文件夹选择器的路径 即启动文件夹选择器C data forms 目前看来是从以前使用的目录开始的 还有一种
  • WebDriver / 将元素读入变量并重新使用它们

    我有一个大问题Webdriver 硒2 在我的测试代码中 我找到测试开始时的所有元素 并对它们执行一些操作 例如click 检查属性等 我的问题是我的页面刷新并重新加载我的元素 而 Webdriver 不知道再次识别这些元素 我知道我可以再
  • 即使调整窗口大小,也保持背景图像居中

    我有一个容器 div 另一个 div 居中 里面有背景图像 当我调整浏览器窗口大小时 我希望图像保持居中 即使浏览器窗口的宽度为smaller比图像的宽度 这是一些代码 CSS wrap width 100 height 357px bac
  • Git 推送在 TOTAL 上挂起

    Git 突然开始挂起PUSH命令 我 搜索了其他问题 但解决方案不起作用 我使用的是 ubuntu 12 04 Counting objects 18 done Delta compression using up to 2 threads
  • 我可以将 Snapchat SDK (SnapKit) 与 SwiftUI 结合使用吗?

    我正在尝试整合Snapkit https docs snapchat com 使用 iOS 应用程序 但我想使用 SwiftUI 而不是 UIKit 我已经使用 Snapkit 完成了所需的设置 现在我正在尝试让 Snapchat 登录按钮