gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:04:04 25 4
gpt4 key购买 nike

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

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

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

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

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


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

最佳答案

我找不到任何官方指南,但下面的解决方案确实有效,而且也被 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 和模拟器,它成功了。它也适用于旧 iPad (iOS 10.3.3)。

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com