我刚刚使用了与几周前在 iOS/Swift 中使用 Firebase 身份验证的早期应用程序相同的程序。我刚刚在配置应用程序、注册应用程序、下载和执行正确的更新GoogleService-Info.plist等后添加了身份验证代码。
当我运行时,我在线上收到一个错误OIDExternalUserAgentIOSCustomBrowser.h:
API_UNAVAILABLE(macCatalyst) // currently 38
Run Code Online (Sandbox Code Playgroud)
陈述它 "expected ;"
几周前,对这段 Google 代码与通过 CocoaPods 工作和加载的代码进行了快速交叉引用,但macCatalyst在该代码中没有提及。
关于发生了什么或建议的解决方法的任何想法?
SwiftUI PhotoPicker 非常适合创建要按下的按钮/标签,然后在按下标签时显示照片选择器。但是,我想在按下选择器标签后而不是在条件测试通过后调用照片选择器。
例如,如果用户单击将调用照片选择器的按钮,我想首先检查图像将附加到的记录是否已保存。如果记录已保存,我想启动选择器。如果尚未保存,我会显示一条警报,询问他们是否要保存或取消。如果他们选择保存,我将保存记录,然后我想自动调用照片选择器。
那么我可以以编程方式调用选取器而不是让用户单击它吗?谢谢你的建议!
我正在尝试将 Xcode 15 的第一个 Beta 版与 macOS Ventura 13.4 一起使用。我已经使用 Safari 下载了链接,解压缩,然后打开 iOS_17_beta_Simulator_Runtime.dmg 并将文件“iOS 17.0.simruntime”复制到请求的位置://Library/Developer/CoreSimulator/Profiles/Runtimes/ 有一个安全性首次打开 Xcode 时出现标记,但我关闭了 Xcode,打开了安全首选项并修复了此问题,在再次重新打开 Xcode 之前重新启动了 Mac,只是为了确定。安全问题就消失了。但是,当尝试使用 TextField 运行非常基本的代码(见下图)时,它在 LivePreview 中不起作用,并且在模拟器中运行时,只要我单击文本字段,我就会看到下面的信息(来自调试窗格的元数据) :复制并粘贴)`
queryMetaDataSync 错误:2
类型:错误 | 时间戳: 2023_06_07 10:22:41.3230-04:00 | 库:DataDeliveryServices | 子系统:com.apple.DataDeliveryServices | 类别: 查询 | TID:0x3659 不支持的操作选择器 setShiftStatesNeededInDestination:autoShifted:shiftLocked:类型:错误 | 时间戳: 2023_06_07 10:22:41.4790-04:00 | 库:UIKitCore | 子系统:com.apple.UIKit | 类别: UIKeyboardImpl | TID:0x3478`
我试图理解Swift中元组数组的语法:
如果我创建一个元组:
var gameScore: (points: Int, player: String)
Run Code Online (Sandbox Code Playgroud)
我可以分配这样的值:
gameScore = (1700, "Lisa")
Run Code Online (Sandbox Code Playgroud)
并创建一个这个元组的数组:
var gameScores = [gameScore]
Run Code Online (Sandbox Code Playgroud)
我可以这样追加到数组:
gameScores.append((1650, "Bart"))
Run Code Online (Sandbox Code Playgroud)
这样:
gameScore = (1600, "Maggie")
gameScores += [gameScore]
Run Code Online (Sandbox Code Playgroud)
但不是这样的:
gameScores += [(1600, "Maggie")]
Run Code Online (Sandbox Code Playgroud)
游乐场错误是:
游乐场执行失败:错误:元组Playground.playground:38:1:错误:无法将类型'[(points:Int,player:String)]'的值转换为预期的参数类型'inout _'gameScores + = [(1600, "劣质煤")]
但是,这种方式有效:
gameScores += [(points: 1600, player: "Maggie")]
Run Code Online (Sandbox Code Playgroud)
是的 - 我上面的代码可以使用,但是我想弄清楚我在错误的语法中没有理解的东西.元素不需要为.append()方法命名,但需要为它们命名+= [()].
我注意到Xcode 10中的Playgrounds不再允许使用已声明但未初始化的变量.例如:虽然这段代码可以在Xcode 9游乐场中运行,但在Xcode 10游乐场(至少在Beta 1中),它会崩溃:
var myValue: Int
//...
myValue = 100
print (myValue)
// Xcode 9 prints 100
// Xcode 10 reports an error: variables currently must have an initial value when entered at the top level of the REPL
Run Code Online (Sandbox Code Playgroud)
这是新行为,还是当前Xcode 10 beta中的一个错误?
我曾经将早期的Xcode Playgrounds称为翻译,但是仍然会考虑将Xcode 10游乐场作为翻译(并且总是正确的)?Apple将装订线中的"运行"按钮称为"编译"代码.
谢谢!
每当应用程序首次运行时,是否会调用位置管理器(_:执行更改授权:),即使已经调用了位置管理器方法requestWhenInUseAuthorization()或startUpdatingLocation()?我正试图通过点击我在下面的@IBAction中调用的按钮来报告位置:
@IBAction func findOutPressed(_ sender: UIButton) {
getLocation()
}
Run Code Online (Sandbox Code Playgroud)
我的CoreLocation代码位于以下扩展中:
extension ViewController: CLLocationManagerDelegate {
// Called from findOutPressed to get location when button is clicked
func getLocation() {
let status = CLLocationManager.authorizationStatus()
handleLocationAuthorizationStatus(status: status)
}
// Respond to the result of the location manager authorization status
func handleLocationAuthorizationStatus(status: CLAuthorizationStatus) {
switch status {
case .notDetermined:
locationManager.requestWhenInUseAuthorization()
case .authorizedWhenInUse, .authorizedAlways:
locationManager.startUpdatingLocation()
case .denied:
print("I'm sorry - I can't show location. User has not authorized it")
case .restricted:
print("Access denied - likely …Run Code Online (Sandbox Code Playgroud) core-location uiapplicationdelegate cllocationmanager ios swift
我想将按钮用作切换按钮-单击一次即可无限旋转图片。再次单击,图像停止,再次单击,重新启动。
我发现此答案有助于使动画继续进行: 在Swift中将视图无限地旋转360度?
但是,我不清楚如何停止事情。我已经实现了下面的代码,而且似乎可以正常工作,但是很好奇这是否是停止动画的正确方法,或者是否还有其他首选方法。另外-我的旋转持续进行到完成为止,但是我想知道是否可以在按下按钮时冻结该位置的旋转(我在下面的第二次尝试中尝试了.removeAllAnimations(),但似乎在所有。
@IBOutlet weak var imageView: UIImageView!
var stopRotation = true
func rotateView(targetView: UIView, duration: Double = 1.0) {
if !stopRotation {
UIView.animate(withDuration: duration, delay: 0.0, options: .curveLinear, animations: {
targetView.transform = targetView.transform.rotated(by: CGFloat(Double.pi))
}) { finished in
self.rotateView(targetView: targetView, duration: duration)
}
}
}
@IBAction func spinPressed(_ sender: UIButton) {
stopRotation = !stopRotation
if !stopRotation {
rotateView(targetView: imageView)
}
}
Run Code Online (Sandbox Code Playgroud)
这确实有效。我还想知道是否有可能停止动画的自旋。设置方式是,动画在停止之前会完整旋转180度。我也尝试过在spinPressed动作中添加removeAnimation,并摆脱了rotateView内部的stopRotation检查,但这似乎不起作用–旋转会继续,并且如果再次按下spinPressed只会变得更快(请参见下文):
@IBOutlet weak var imageView: UIImageView!
var stopRotation = true
func rotateView(targetView: UIView, duration: Double = 1.0) …Run Code Online (Sandbox Code Playgroud) Cloud Firestore 中的事务支持使用 transaction.getDocument 获取文档,但即使有 .getDocuments 方法,似乎也没有用于获取与事务一起使用的多个文档的 .getDocuments。
我有一个使用 Cloud Firestore 数据库的类似 Yelp 的应用程序,其结构如下: - 需要评分的地方称为点。- 每个点在点集合中都有一个文档(由唯一的文档 ID 标识)。- 每个地点都可以有一个评论集合,其中包含该地点的所有评论。- 每条评论都由其自己唯一的文档 ID 标识,并且每条评论文档都包含对该点的评级。
下面是我的 Cloud Firestore 设置和一些数据的图像。

我尝试创建一个事务来获取一个点中所有评论的数据,希望我可以对平均评论进行更新计算并将其保存回现场文档的属性。我试过使用:
let db = Firestore.firestore()
db.runTransaction({ (transaction, errorPointer) -> Any? in
let ref = db.collection("spots").document(self.documentID).collection("reviews")
guard let document = try? transaction.getDocuments(ref) else {
print("*** ERROR trying to get document for ref = \(ref)")
return nil
}
Run Code Online (Sandbox Code Playgroud)
…
Xcode 声明:“事务”类型的值没有成员“getDocuments”。有一个 getDocument,可以使用它来获取单个文档(请参阅https://firebase.google.com/docs/firestore/manage-data/transactions)。
是否有可能在事务中获取文档集合?我想这样做是因为我评分的每个地方(点)都有一个平均评分,每当其中一个评分发生变化时,我想调用一个函数: - 开始交易(完成) - 读取所有该地点的当前评论(无法开始工作) - 计算新的 averageRating - 使用新的 averageRating …
使用 Swift/iOS 和 FirebsaeAuthUI 和 FirebaseGoogleAuthUI。代码和设置与我在之前的应用程序中使用的方法相同。我现在有一台运行 BigSur 的 M1 Mac,当我执行代码时,它会运行,但单击 FirebaseAuthUI 中的“使用 Google 登录”默认值会返回错误:线程 1:“未找到 OAuth 客户端 ID。请确保 Google Sign -在 Firebase 控制台中启用了登录。启用 Google 登录后,您可能需要下载新的 GoogleService-Info.plist 文件。”
返回到 Firebase 控制台,Google(单独)已启用为登录提供商,并且我已经为该登录提供商设置了项目支持电子邮件,就像我之前所做的那样。
我确实注意到最新版本的 FirebaseUI 需要更改导入:旧代码具有:
import FirebaseUI
Run Code Online (Sandbox Code Playgroud)
现在似乎需要
import FirebaseAuthUI
import FirebaseGoogleAuthUI
Run Code Online (Sandbox Code Playgroud)
(截至 2021 年 10 月 1 日,相关文档尚未在线更新,但通过 GitHub 进行的一些挖掘和查询让我得到了上面的更新信息)。同样,通过这些更改,事情确实可以编译(尽管我需要在 iPhone 上运行,因为 M1 Mac 似乎无法在模拟器中运行 FirebaseGoogleAuthUI)。然而,单击“使用 Google 登录”时会崩溃,并显示错误:“未找到 OAuth 客户端 ID。请确保在 Firebase 控制台中启用了 Google 登录。启用后,您可能需要下载新的 GoogleService-Info.plist 文件Google 登录” 除了在 Firebase 控制台中为 Google 设置身份验证登录提供程序之外,我从未被要求执行任何其他 OAuth 工作。有什么变化需要我也解决吗?谢谢你的帮助!