• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

ios - 如何在 iOS 共享扩展中正式处理未经身份验证的用户?

[复制链接]
菜鸟教程小白 发表于 2022-12-11 19:49:39 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

也就是说,Apple 规定的惯用方法是什么? 对于任何建议,请解释应该如何做和/或提供官方指南的链接。这应该是一个足够常见的场景,但我只能找到解决方法。

从另一端接近这个,我知道 UserDefaults(suiteNameKeychain services可以从包含的应用程序中用于与扩展程序共享有关经过身份验证的用户的信息,但是如果用户安装了应用程序并直接尝试使用其扩展程序共享内容而无需登录(或注册)怎么办?

  1. 要求用户登录包含的应用程序?(在自定义 View 中?Extensions are modal by default.)

  2. 在扩展中重新实现身份验证?(或者通过自定义框架共享?这可能吗?)

  3. 切换到包含应用程序然后返回? 这似乎不支持,除了 Today 扩展,但 docs 中描述的机制已用于解决方法(SO 线程:123)。


第 2 项的(丑陋的)示例实现 in this answer使用 Firebase。



Best Answer-推荐答案


我找不到任何官方指南,但下面的解决方案确实有效,并且也被 App Store 接受。可能底线正是1)它不应该崩溃,(2)应该能够通过审查过程。

[FirebaseUI 身份验证[( https://github.com/firebase/FirebaseUI-iOS ) 的解决方案:

animation

相关代码部分:

import UIKit
import Social
import Firebase
import FirebaseAuthUI

class ShareViewController: SLComposeServiceViewController {

    var authUI: FUIAuth?

    /* Using shared container to communicate between extension
       and containing app. Keychain would probably work too.
    */
    let defaults = UserDefaults.init(suiteName: "your-app-group")!

    override func presentationAnimationDidFinish() {

        /* https://stackoverflow.com/questions/37910766/
        */
        if FirebaseApp.app() == nil {
            FirebaseApp.configure()
        }

        self.authUI = FUIAuth.defaultAuthUI()
        self.authUI?.delegate = self

        if self.defaults.bool(forKey: "userLoggedIn") == false {
            let fuiSignin     = 
                FUIPasswordSignInViewController(
                    authUI: FUIAuth.defaultAuthUI()!,
                    email: nil)
            let navController = 
                UINavigationController(rootViewController: fuiSignin)

            self.present(navController, animated: true)
        }
    }

/* FirebaseAuthUI delegate to handle sign-in
*/
extension ShareViewController: FUIAuthDelegate {
    func authUI(_ authUI: FUIAuth, didSignInWith user: User?, error: Error?) {
        if error != nil {
            fatalError()
        }
        if user != nil {
            self.defaults.set(true, forKey: "userLoggedIn")
        }
    }
}

成功的登录也会通过共享容器被记住(即,打开包含的应用程序不会要求登录)。

github项目中的相关commit: https://github.com/society-for-the-blind/Access-News-Reader-iOS/commit/e752b1c554f79ef027818db35c11fceb1ae817e0


问题

我第一次运行它,表单出现了,但不接受任何输入。 Product > CleanProduct > Clean Build Folder ... 是否,重新启动了 Xcode 和 Simulator,它工作正常。它也适用于旧 iPad (iOS 10.3.3)。

关于ios - 如何在 iOS 共享扩展中正式处理未经身份验证的用户?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49134868/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap