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

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

从另一端接近这一点,我知道可以从包含应用程序使用UserDefaults(suiteName:)Keychain services来与扩展程序共享有关经过身份validation的用户的信息,但是如果用户安装应用程序并且只是直接尝试在没有登录(或更新)的情况下使用其扩展程序共享内容?

  1. 要求用户在包含的应用中登录? (在自定义视图中? 默认情况下,扩展名是模态的。 )

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

  3. 切换到包含app然后回来? 除了在今天的扩展中,似乎不支持这一点,但文档中描述的机制已用于解决方法(SO线程: 1,2,3 )。


使用Firebase 在此答案中的第 2项(丑陋)示例实现。

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

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

动画

相关代码部分:

 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项目中的相关提交: https : //github.com/society-for-the-blind/Access-News-Reader-iOS/commit/e752b1c554f79ef027818db35c11fceb1ae817e0


问题

第一次我跑它,表格出现了,但不接受任何输入。 Product > CleanProduct > Clean Build Folder ... ,重新启动Xcode和模拟器,它工作。 它也适用于旧的iPad(iOS 10.3.3)。