Proyectos de Subversion Iphone Microlearning - Nuevo Interface

Rev

Rev 17 | Rev 59 | Ir a la última revisión | | Comparar con el anterior | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
1 efrain 1
//
2
//  twogetskillsApp.swift
3
//  twogetskills
4
//
5
//  Created by Efrain Yanez Recanatini on 1/12/22.
6
//
7
 
8
import SwiftUI
9
import BackgroundTasks
10
 
11
 
12
@main
13
struct TwoGetSkillsApp: App {
14
    @UIApplicationDelegateAdaptor(AppDelegate.self) var delegate
15
    @Environment(\.scenePhase) var scenePhase
8 efrain 16
 
17 efrain 17
 
8 efrain 18
    @ObservedObject var syncForeground = SyncForegroundObservableObject()
19
    private let syncAdapter = SyncAdapter()
17 efrain 20
    private var appData = AppData.sharedInstance
21
 
1 efrain 22
    init() {
23
 
24
      let coloredAppearance = UINavigationBarAppearance()
25
      coloredAppearance.configureWithOpaqueBackground()
26
      coloredAppearance.backgroundColor = UIColor(Color("color_app_bar_backgroud"))
27
      coloredAppearance.titleTextAttributes = [.foregroundColor: Color("color_app_bar_foreground")]
28
      coloredAppearance.largeTitleTextAttributes = [.foregroundColor: Color("color_app_bar_foreground")]
29
      coloredAppearance.backButtonAppearance.normal.titleTextAttributes = [.foregroundColor: Color("color_app_bar_foreground")]
30
 
31
      UINavigationBar.appearance().standardAppearance = coloredAppearance
32
      UINavigationBar.appearance().compactAppearance = coloredAppearance
33
      UINavigationBar.appearance().scrollEdgeAppearance = coloredAppearance
34
 
35
      UINavigationBar.appearance().tintColor = UIColor(Color("color_app_bar_foreground"))
36
 
37
      UIPageControl.appearance().currentPageIndicatorTintColor = .systemBlue
38
      UIPageControl.appearance().pageIndicatorTintColor = .systemGray2
39
 
8 efrain 40
 
11 efrain 41
 
58 efrain 42
 
1 efrain 43
    }
44
 
45
    var body: some Scene {
46
 
47
        WindowGroup {
48
            MainView()
17 efrain 49
        }
50
 
51
        .onChange(of: scenePhase) { newScenePhase in
1 efrain 52
            switch newScenePhase {
8 efrain 53
                case .active:
54
                    print("App is active")
55
                    syncForeground.timer.invalidate()
17 efrain 56
                    syncForeground.timer = Timer.scheduledTimer(timeInterval: 30.0, target: syncAdapter, selector: #selector(syncAdapter.updateTimerForeground), userInfo: nil, repeats: true)
8 efrain 57
                    break
58
 
59
                case .inactive:
60
                  print("App is inactive")
61
                    syncForeground.timer.invalidate()
62
                    break
63
 
64
                case .background:
65
                  print("App is in background")
66
                    syncForeground.timer.invalidate()
67
                    break
68
 
69
                @unknown default:
70
                    print("Oh - interesting: I received an unexpected new value.")
71
                    syncForeground.timer.invalidate()
72
                    break
73
                }
1 efrain 74
          }
75
    }
76
 
77
    func registerBGTasksScheduler() {
78
        BGTaskScheduler.shared.register(forTaskWithIdentifier: Constants.BACKGROUND_TASK_REFRESH, using: nil) { task in
17 efrain 79
                 self.handleRefreshTask(task: task as! BGAppRefreshTask)
8 efrain 80
        }
81
 
1 efrain 82
        BGTaskScheduler.shared.register(forTaskWithIdentifier: Constants.BACKGROUND_TASK_PROCESS, using: nil) { task in
8 efrain 83
                 self.handleProcessTask(task: task as! BGProcessingTask)
84
        }
1 efrain 85
 
8 efrain 86
    }
1 efrain 87
 
8 efrain 88
    func scheduleRefresh() {
89
        let request = BGAppRefreshTaskRequest(identifier: Constants.BACKGROUND_TASK_REFRESH)
90
        request.earliestBeginDate = Date(timeIntervalSinceNow: 10 * 60)
91
 
1 efrain 92
 
93
 
8 efrain 94
        do {
95
             try BGTaskScheduler.shared.submit(request)
96
        } catch {
97
            print("Could not schedule app refresh: \(error)")
1 efrain 98
        }
8 efrain 99
    }
1 efrain 100
 
8 efrain 101
    func scheduleProcess() {
102
        let request = BGProcessingTaskRequest(identifier: Constants.BACKGROUND_TASK_PROCESS)
103
        request.earliestBeginDate = Date(timeIntervalSinceNow: 10 * 60)
104
        request.requiresNetworkConnectivity = true
105
        request.requiresExternalPower = false
1 efrain 106
 
8 efrain 107
        do {
108
            try BGTaskScheduler.shared.submit(request)
109
        } catch {
110
            print("Could not schedule processing: \(error)")
1 efrain 111
        }
8 efrain 112
    }
1 efrain 113
 
8 efrain 114
    func handleProcessTask(task: BGProcessingTask) {
115
        scheduleProcess()
116
 
117
        let syncAdapter = SyncAdapter()
118
        syncAdapter.sync { success in
17 efrain 119
            task.setTaskCompleted(success: success)
8 efrain 120
        }
1 efrain 121
 
17 efrain 122
        /*
8 efrain 123
        task.expirationHandler = {
124
            task.setTaskCompleted(success: false)
125
         }
17 efrain 126
         */
8 efrain 127
        task.setTaskCompleted(success: true)
128
    }
1 efrain 129
 
17 efrain 130
    func handleRefreshTask(task: BGAppRefreshTask) {
8 efrain 131
        scheduleRefresh()
17 efrain 132
 
133
 
134
 
135
        let syncAdapter = SyncAdapter()
136
        if syncAdapter.isCheckChangesRequired() {
137
            syncAdapter.checkChanges(isForeground: false) { success in
138
                task.setTaskCompleted(success: success)
139
            }
140
        } else {
141
            task.expirationHandler = {
142
                task.setTaskCompleted(success: false)
143
             }
144
        }
145
 
146
 
8 efrain 147
        task.setTaskCompleted(success: true)
148
    }
149
}
1 efrain 150
 
151
 
8 efrain 152
class SyncForegroundObservableObject: ObservableObject
153
{
154
    @Published var timer : Timer = Timer()
1 efrain 155
}