FMZDropInMinimalFacebookLogin

尚未经过生产环境测试,但它是一个非常简单的 Facebook SDK 的最小替代品。Facebook SDK 不仅是个隐私怪兽,而且可能导致地球上一半的 App 在启动时崩溃。它还应该能减少 App 的下载大小,节省数兆字节的空间。

功能集仅限于以与 FacebookSDK 非常相似的方式登录和注销,以及基本的 GraphRequest 功能。虽然 GraphRequest 功能在提交时完全没有经过任何测试,但它可以在我尝试的项目中构建和启动,并且包含这些附加功能/调整。

命名是因为我不喜欢马克·扎克伯格。

它仅依赖于 iOS 框架,没有第三方包,但你需要注入一些闭包才能使其正常工作。

工作原理

它使用 ASWebAuthenticationSession 在 iOS 12+ 上提供良好的体验,并在较低版本上回退到推送至 Web 浏览器和返回*。

鸣谢

感谢 @marinbenc 的文章 在没有 Facebook SDK 的情况下在 iOS 上实现 Facebook 登录,本开发基于此。

还要感谢 Facebook 运维团队,他们最近引发的故障让我看到了希望,我可以可以说服客户从 App 中删除 Facebook SDK,为了用户的隐私利益,也为了减轻我最初为他们集成它时的良心负担,并且

设置和使用

  1. 审查这段代码,在编写这份初始 ReadMe 时,它只有 4 个文件,总共大约 270 行,所以请确保你对它感到放心。
  2. 从你的项目中删除 Facebook SDK
  3. 将此 Swift Package 添加到你的项目和目标
  4. 删除 FacebookCore 和 FacebookLogin 的 import 语句(如果它们在代码库中被大量使用,并且你希望尽可能减少代码更改,你可以将此 package 包装在你自己的一个空 package 中,并在其中一个或两个中提供它)。用 import FMZDropInMinimalFacebookLogin 替换它们
  5. 删除对 App Delegate 中 Facebook 的 application(didFinishLaunching..) 函数的调用,并配置此框架。
MinimalFacebook.currentConfig =
    MinimalFacebook.Config(
        getTokenStringFromKeychain: { keyChain.getString(key: "FacebookLoginTokenString") },
        setTokenStringToKeychain: {
            if let token = $0 {
                _ = keyChain.setString(token, key: "FacebookLoginTokenString")
            } else {
                keyChain.removeString(key: "FacebookLoginTokenString")
            }
        },
        openUrl: { UIApplication.shared.open($0, options: [:]) })

可选但建议你检查已登录用户的令牌是否仍然有效。它在 10 秒内运行,以便在你所有的初始启动逻辑之后发生。如果用户已注销,它将使令牌失效。

if AccessToken.current != nil {
    DispatchQueue.main.asyncAfter(deadline: .now() + 10) {
        MinimalFacebook.validateCurrentToken()
    }
}

你需要提供闭包来打开 URLs(对于 iOS 9、10、11),以及读取和写入钥匙串(因为 Apple 的 API 很笨拙,并且我不想添加另一个依赖项,因为你的项目中可能已经有包装器了)。当传递 nil 参数时,setTokenStringToKeyChain 闭包应删除该值。

  1. 构建并查看它是否具有你使用的所有内容。它可能在第一次使用时正确构建和运行。
  2. 如果它没有运行,你可能需要进行一些修复。某些类型可能已更改,因此你可能可以删除一些显式类型。你可能还在使用此框架不支持的功能。在这种情况下,可能需要进行一些重新实现。

潜在/已知问题

在 iOS 10 的模拟器中,登录失败,因为 App 没有使用 URL 重新打开。我没有深入研究,iOS 上的用户群现在应该非常低。

PR 和更新

我绝对对任何修复以及提高兼容性的更新感兴趣。最初,我根据单个项目的需求开发了它,如果一些小的添加可以帮助其他人,那将是很棒的,但我希望保持它的最小化,以获得小的 App 大小和可审查性。

测试

随意编写一些测试。棘手的部分是与 App 启动和 Facebook 服务器的集成,因此必要的测试对我来说并不明显。但请尝试所有你能想到的场景,并随时告诉我。

联系方式

我的 Twitter 是 @jl_hfl,请告诉我你的想法。请尽可能抵制和削减 Facebook 的资金。这旨在成为帮助人们和 App 迁移的工具,如果你在此上下文中使用它,我渴望提供支持。