我是 iOS 开发的新手。我正在尝试将 google 登录添加到我的应用程序,但我遇到了一些问题。代码显示了一些“使用未解析的标识符‘isMFAEnabled”和“类型‘AppDelegate’的值没有成员‘showTextInputPrompt’”。请帮助我。我正在关注此文档 - https://firebase.google.com/docs/auth/ios/google-signin#swift_9 在此处输入图片说明
import UIKit
import Firebase
import GoogleSignIn
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate,GIDSignInDelegate {
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
FirebaseApp.configure()
GIDSignIn.sharedInstance().clientID = FirebaseApp.app()?.options.clientID
GIDSignIn.sharedInstance().delegate = self
return true
}
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
return GIDSignIn.sharedInstance().handle(url)
}
func sign(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!, withError error: Error!) {
if let error = error {
print(error.localizedDescription)
return
} …Run Code Online (Sandbox Code Playgroud) ios appdelegate firebase-authentication google-signin swift4
我正在使用 iOS 14 中 SwiftUI 的新应用程序生命周期。
但是,我被困在如何在AppDelegate 中访问我的AppState(单一事实来源)对象。我需要的AppDelegate在启动时运行的代码,并注册通知(,,)等等。didFinishLaunchingWithOptionsdidRegisterForRemoteNotificationsWithDeviceTokendidReceiveRemoteNotification
我知道@UIApplicationDelegateAdaptor但是我不能例如通过构造函数将对象传递给AppDelegate。我想反过来(在AppDelegate 中创建AppState然后在MyApp 中访问它)也不起作用。
@main
struct MyApp: App {
@UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
@State var appState = AppState()
var body: some Scene {
WindowGroup {
ContentView().environmentObject(appState)
}
}
}
Run Code Online (Sandbox Code Playgroud)
class AppDelegate: NSObject, UIApplicationDelegate {
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
// access appState here...
return …Run Code Online (Sandbox Code Playgroud) 根据iOS开发者库
应用程序委托是您编写自定义应用程序级代码的地方.与所有类一样,AppDelegate类在应用程序的两个源代码文件中定义:在接口文件AppDelegate.h和实现文件AppDelegate.m中.
但是,在Xcode 6.3中,似乎只有AppDelegate.swift,而不再是.h和.m扩展名.我想了解.swift如何替换.h和.m扩展名.
我只想按需跟踪用户当前位置。我只需要初始位置,不需要持续更新。我认为最好的方法是向用户发送静默通知,以便一次获取用户的当前位置。接收静默通知效果很好,但 LocationManager 无法对位置进行初始修复。我的位置管理器委托类正常实例化,但在调用位置管理器方法 startUpdatingLocation() 后的任何时候都不会触发 didUpdateLocations 函数。当应用程序从 AppDelegate:didFinishLaunchingWithOptions 正常启动时,LocationManager 会毫无问题地更新用户位置。
我正在 Xcode 6.3.2 到 iOS 8.3 上进行开发
我的 AppDelegate:DidReceiveRemoteNotification 看起来像这样:
func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject], fetchCompletionHandler handler: (UIBackgroundFetchResult) -> Void) {
var bgTask = bgManager()
bgTask.registerBackgroundTask()
LocManager.locationMngr.startUpdatingLocation() // LocManager is global variable
let delayInSeconds = 8.0
let popTime = dispatch_time(DISPATCH_TIME_NOW, Int64(delayInSeconds * Double(NSEC_PER_SEC)))
dispatch_after(popTime, dispatch_get_main_queue()) {
println(LocManager.updated)
bgTask.endBackgroundTask()
handler(UIBackgroundFetchResult.NewData)
}
}
Run Code Online (Sandbox Code Playgroud)
我首先尝试仅使用以下行:
LocManager.locationMngr.startUpdatingLocation()
Run Code Online (Sandbox Code Playgroud)
但当它不起作用时,我添加了后台任务和dispatch_after,以确保我的位置管理器有足够的时间在终止之前检索第一个位置更新。
这是 LocationManager 类:
class LocationManager: NSObject, CLLocationManagerDelegate {
let locationMngr:CLLocationManager
var coord:CLLocationCoordinate2D
var …Run Code Online (Sandbox Code Playgroud) core-location apple-push-notifications appdelegate swift ios8.3
我对许多stackoverflow问题和网站进行了一些研究,试图弄清楚iOS推送通知如何影响AppDelegate生命周期方法以及何时触发哪种方法(而不是).该研究的主要焦点是"标准"iOS推送通知(带alert字段)和静默(通过content-available设置1)以及AppDelegate application:didReceiveRemoteNotification和application:didFinishLaunchingWithOptions方法.
我不想针对不同的场景问很多问题,而是试着写下我尝试过的不同测试用例的陈述,然后问你:
Is there any statement that is wrong and if yes, which one and why?
如果发送标准推送通知,则在推送通知到达时,没有任何方法被触发,应用程序在后台保持不活动状态.一旦点击推送通知并且应用程序因此而被打开,application:didReceiveRemoteNotification方法被调用并且application:didFinishLaunchingWithOptions不会被调用.我在将应用程序放到后台以及应用程序在后台运行超过一个小时之后立即测试了这种情况 - 相同的行为.我想如果由于某些原因iOS决定在后台杀死我的应用程序,这个测试用例就像场景2,从下面的声明1,对吧?
如果发送静默推送通知,则在推送通知到达的那一刻,application:didReceiveRemoteNotification方法被调用并且application:didFinishLaunchingWithOptions不被调用.
如果发送标准推送通知,则在推送通知到达时,没有任何方法被触发,应用程序仍然被杀死.一旦点击推送通知并且应用程序因此而被打开,application:didReceiveRemoteNotification方法被调用并且application:didFinishLaunchingWithOptions不会被调用.
如果发送静默推送通知,则无法触发任何方法,因为无法将静默推送通知发送到被杀死的应用程序.在发送通知后打开应用程序后,application:didFinishLaunchingWithOptions作为正常流程的一部分进行调用,并且没有任何推送通知信息.application:didReceiveRemoteNotification没有被召唤.
如果您可以想到其他一些我可能忘记提及的现实生活场景,我会非常感激地了解它们以及在这些情况下会发生什么.
干杯
感谢Sandeep Bhandari的更新和其他方案.我忘记在原来的问题中提到我正在探索应用程序到达目前not处于前台的应用程序的情况.
将Sandeep的场景添加到列表中:
如果发送标准推送通知,application:didReceiveRemoteNotification将调用方法.application:didFinishLaunchingWithOptions不会被打电话.
如果发送静默推送通知,application:didReceiveRemoteNotification则会调用方法.application:didFinishLaunchingWithOptions不会被打电话.
如果发送标准推送通知,application:didReceiveRemoteNotification将调用方法.application:didFinishLaunchingWithOptions不会被打电话.
如果发送静默推送通知,application:didReceiveRemoteNotification则会调用方法. …
编辑以添加我的更新代码,该代码是我根据 WWDC 2016 的充分利用 Healthkit 演讲编写的,但除非我打开应用程序,否则我仍然无法获得新锻炼的打印声明。
将新的锻炼项目保存到 Apple Watch 后,我尝试在 iPhone 上进行观察。下面是我正在运行的代码didFinishLaunching。为了测试它,我在我的 iPhone 应用程序上运行 Xcode...构建并运行,然后导航回主屏幕。然后在我的手表上开始并保存锻炼,但是我的打印语句没有在控制台中打印。我缺少什么?
func startObservingNewWorkouts() {
let sampleType = HKObjectType.workoutType()
//1. Enable background delivery for workouts
self.healthStore.enableBackgroundDelivery(for: sampleType, frequency: .immediate) { (success, error) in
if let unwrappedError = error {
print("could not enable background delivery: \(unwrappedError)")
}
if success {
print("background delivery enabled")
}
}
//2. open observer query
let query = HKObserverQuery(sampleType: sampleType, predicate: nil) { (query, completionHandler, error) in
self.updateWorkouts() {
completionHandler()
}
} …Run Code Online (Sandbox Code Playgroud) 我正在使用 Firebase 的深层链接来尝试在用户点击发送给他们的链接时在我的应用程序中提供特定功能。深层链接已在 Firebase 门户网站上正确设置。
单击发送给用户的链接确实会打开我的应用程序,但不会触发continue userActivity我的应用程序委托中的方法,因为其中包含的代码都没有被执行。
我已经尝试了此 StackOverflow 帖子中建议的解决方案,但没有成功,即将方法声明中的 [UIUserActivityRestoring] 切换为 [Any]。
在 Xcode 中,我设置了关联的域以匹配我在 Firebase 上设置的内容applinks:myappname.page.link:我添加了一个带有标识符“Bundle ID”的“URL 类型”,以及ca.mycompany.myappname带有角色编辑器的 URL 方案。
当然,所有这些都在设备上运行,因为我不希望这在模拟器中起作用。
这是我的应用程序委托中应该调用的方法,但实际上没有。
func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([Any]?) -> Void) -> Bool {
print ("The link worked")
}
Run Code Online (Sandbox Code Playgroud)
我也确保didFinishLaunchingWithOptions始终返回 true。
我希望“链接有效”实际打印在调试控制台中,但事实并非如此。断点表明该方法根本没有被调用,因为永远不会到达断点。
我在AppDelegate.swift中有以下代码来为iOS应用程序设置根视图控制器。但这行不通。它遵循目标结构(在“常规”选项卡下定义),并忽略此代码。
(Xcode 11,Swift 5.1,iOS 13)
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
window = UIWindow(frame: UIScreen.main.bounds)
guard let rootVC = UIViewController() else {
print("Root VC not found")
return true
}
let rootNC = UINavigationController(rootViewController: rootVC)
window?.rootViewController = rootNC
window?.makeKeyAndVisible()
return true
}
}
Run Code Online (Sandbox Code Playgroud)
无法了解问题出在哪里。
我也尝试了以下参考,但没有运气:
不知道为什么这对我来说如此具有挑战性,但是我如何检测用户何时终止应用程序?因为据我所知,Apple 提供了许多在应用程序关闭时可能会或可能不会被调用的函数。
func applicationWillTerminate(_ application: UIApplication):在(大多数)应用程序终止时调用,但不适用于支持后台执行的应用程序。
func sceneDidEnterBackground(_ scene: UIScene):当场景进入后台时调用,但无法区分应用程序进入后台与完全终止。
func sceneDidDisconnect(_ scene: UIScene):我确认如果用户直接终止应用程序,则会调用此函数,但如果将应用程序放在后台然后终止,则不会调用它。
// 编辑:所以我意识到上面的方法(sceneDidDisconnect)确实是我正在寻找的函数。我之前认为在上面描述的后一种情况下它没有被调用,但实际上,它被调用了。另请参阅(即将)接受的答案。
是否有一个函数在每次用户终止应用程序时都会被调用???
在具有 SwiftUI 生命周期的应用程序中,如何进行下面的转换,其中 AppDelegate 实现为NSApplicationDelegateAdaptor?
let appDelegate = NSApplication.shared.delegate as! AppDelegate
// or
let appDelegate = NSApp.delegate as! AppDelegate
Run Code Online (Sandbox Code Playgroud)
上面抛出以下错误:
无法将“SwiftUI.AppDelegate”(0x1e28fae40)类型的值转换为“MyApp.AppDelegate”(0x102d277c0)。
后台正在扩展中使用 AppDelegate
extension NSStatusBarButton {
public override func mouseDown(with event: NSEvent) {
super.mouseDown(with: event)
let appDelegate = NSApp.delegate as! AppDelegate
// do stuff with appDelegate on MouseDown Event
}
}
Run Code Online (Sandbox Code Playgroud)