iOS开发Swift-16-App的生命周期-AppDelegate和SceneDelegate

AppDelegate:

import UIKit
import CoreData

//包含App的部分生命周期函数(钩子函数),也有其余函数(如推送)
@main
class AppDelegate: UIResponder, UIApplicationDelegate {

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        print("App启动")
        return true
    }

    // MARK: UISceneSession Lifecycle
    //iOS的App只有一个场景(只有一个窗口)
    func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
        // Called when a new scene session is being created.
        // Use this method to select a configuration to create the new scene with.
        print("即将创建一个窗口时.在此可配置一个可视窗口")
        return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
    }

    func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set<UISceneSession>) {
        // Called when the user discards a scene session.
        // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions.
        // Use this method to release any resources that were specific to the discarded scenes, as they will not return.
        print("用户关闭了某个窗口")
    }

    // MARK: - Core Data stack

    lazy var persistentContainer: NSPersistentContainer = {
        /*
         The persistent container for the application. This implementation
         creates and returns a container, having loaded the store for the
         application to it. This property is optional since there are legitimate
         error conditions that could cause the creation of the store to fail.
        */
        let container = NSPersistentContainer(name: "Todos")
        container.loadPersistentStores(completionHandler: { (storeDescription, error) in
            if let error = error as NSError? {
                // Replace this implementation with code to handle the error appropriately.
                // fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
                 
                /*
                 Typical reasons for an error here include:
                 * The parent directory does not exist, cannot be created, or disallows writing.
                 * The persistent store is not accessible, due to permissions or data protection when the device is locked.
                 * The device is out of space.
                 * The store could not be migrated to the current model version.
                 Check the error message to determine what the actual problem was.
                 */
                fatalError("Unresolved error \(error), \(error.userInfo)")
            }
        })
        return container
    }()
    

    // MARK: - Core Data Saving support

    func saveContext () {
        let context = persistentContainer.viewContext
        if context.hasChanges {
            do {
                try context.save()
            } catch {
                // Replace this implementation with code to handle the error appropriately.
                // fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
                let nserror = error as NSError
                fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
            }
        }
    }

}

SceneDelegate:

import UIKit

//包含App的UI方面的生命周期函数,也有其余函数(如从别的App跳转回来时)
class SceneDelegate: UIResponder, UIWindowSceneDelegate {

    var window: UIWindow?

    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
        // If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
        // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).
        print("若使用IB,则自动创建可视窗口;若不使用IB,则可在此利用window属性(可视窗口),然后用代码设定App的首页vc")
        guard let _ = (scene as? UIWindowScene) else { return }
    }

    func sceneDidDisconnect(_ scene: UIScene) {
        // Called as the scene is being released by the system.
        // This occurs shortly after the scene enters the background, or when its session is discarded.
        // Release any resources associated with this scene that can be re-created the next time the scene connects.
        // The scene may re-connect later, as its session was not necessarily discarded (see `application:didDiscardSceneSessions` instead).
        print("窗口/App已经断开连接(1.关闭App时调用,2.退到后台后不久调用)")
    }
    
    //App主要有三种状态:被关闭,在前台,在后台

    //下面两个方法对应的范围更广,如App关闭时,用户点击推送横幅后打开App,也会调用sceneDidBecomeActive,此时可清楚右上角角标
    func sceneDidBecomeActive(_ scene: UIScene) {
        // Called when the scene has moved from an inactive state to an active state.
        // Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive.
        print("窗口/App从非活跃-->活跃(已经被激活)")
    }
    func sceneWillResignActive(_ scene: UIScene) {
        // Called when the scene will move from an active state to an inactive state.
        // This may occur due to temporary interruptions (ex. an incoming phone call).
        print("窗口/App从活跃-->非活跃(即将被挂起)")
    }

    func sceneWillEnterForeground(_ scene: UIScene) {
        // Called as the scene transitions from the background to the foreground.
        // Use this method to undo the changes made on entering the background.
        print("窗口/App从后台-->前台(即将回到前台)")
    }
    func sceneDidEnterBackground(_ scene: UIScene) {
        // Called as the scene transitions from the foreground to the background.
        // Use this method to save data, release shared resources, and store enough scene-specific state information
        // to restore the scene back to its current state.
        print("窗口/App从前台-->后台(已经进入后台)")

        // Save changes in the application's managed object context when the application transitions to the background.
        (UIApplication.shared.delegate as? AppDelegate)?.saveContext()
    }


}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现H5跳转到APP指定页面,需要在APP中配置对应的Scheme URL,并在H5中通过该URL来触发跳转。以下是一个示例代码: ``` // H5页面中的代码 function jumpToApp() { var schemeUrl = "myapp://page?id=123"; // 这里的URL需要根据实际情况进行修改 window.location.href = schemeUrl; } // APP中的代码 // iOS // 在Info.plist文件中添加以下代码 <key>LSApplicationQueriesSchemes</key> <array> <string>myapp</string> // 这里的myapp需要和H5中的schemeUrl保持一致 </array> // 在AppDelegate.m中添加以下代码 - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options { NSString *scheme = [url scheme]; if ([scheme isEqualToString:@"myapp"]) { NSString *host = [url host]; NSString *path = [url path]; // 根据host和path来判断跳转到哪个页面 ... return YES; } return NO; } // Android // 在AndroidManifest.xml中添加以下代码 <activity android:name=".MainActivity" android:launchMode="singleTask" android:screenOrientation="portrait"> <intent-filter> <action android:name="android.intent.action.VIEW"/> <category android:name="android.intent.category.DEFAULT"/> <category android:name="android.intent.category.BROWSABLE"/> <data android:scheme="myapp"/> // 这里的myapp需要和H5中的schemeUrl保持一致 </intent-filter> </activity> // 在MainActivity中添加以下代码 @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); String scheme = intent.getScheme(); if ("myapp".equals(scheme)) { String host = intent.getData().getHost(); String path = intent.getData().getPath(); // 根据host和path来判断跳转到哪个页面 ... } } ``` 以上是一个基本的实现方式,具体的实现需要根据实际情况进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值