Skip to content

Commit

Permalink
Merge branch 'feature/Sign-in-with-Apple'
Browse files Browse the repository at this point in the history
  • Loading branch information
peterfriese committed Mar 24, 2020
2 parents e4dc2ad + ffbf70e commit 2fe7207
Show file tree
Hide file tree
Showing 21 changed files with 798 additions and 15 deletions.
Binary file added assets/siri-cropped.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/siri.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
40 changes: 38 additions & 2 deletions final/MakeItSo/MakeItSo.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,15 @@
88169CDD23C8A455009CFC9C /* Task.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88169CDC23C8A455009CFC9C /* Task.swift */; };
8825908123D9A51900AB7022 /* AuthenticationService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8825908023D9A51900AB7022 /* AuthenticationService.swift */; };
886471E923D606BC0095AD8E /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 886471E823D606BC0095AD8E /* GoogleService-Info.plist */; };
88B508EF23FDD19E00AC508B /* SettingsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88EC1C2223FDCD210045F6A8 /* SettingsViewModel.swift */; };
88D22F5D23CCC5D5003C6D03 /* TaskListViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88D22F5C23CCC5D5003C6D03 /* TaskListViewModel.swift */; };
88D22F5F23CCC5E6003C6D03 /* TaskCellViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88D22F5E23CCC5E6003C6D03 /* TaskCellViewModel.swift */; };
88D22F8223CDDC73003C6D03 /* TaskRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88D22F8123CDDC73003C6D03 /* TaskRepository.swift */; };
88D22F8423CDDE13003C6D03 /* AppDelegate+Injection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88D22F8323CDDE13003C6D03 /* AppDelegate+Injection.swift */; };
88DF00BC23FC45D00007B71E /* SignInView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88DF00BA23FC45D00007B71E /* SignInView.swift */; };
88DF00BD23FC45D00007B71E /* SignInWithAppleButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88DF00BB23FC45D00007B71E /* SignInWithAppleButton.swift */; };
88DF00C323FC46FE0007B71E /* EnvironmentKeys.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88DF00C223FC46FE0007B71E /* EnvironmentKeys.swift */; };
88EC1C1F23FD86B20045F6A8 /* SettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88EC1C1E23FD86B20045F6A8 /* SettingsView.swift */; };
/* End PBXBuildFile section */

/* Begin PBXFileReference section */
Expand All @@ -41,6 +46,13 @@
88D22F5E23CCC5E6003C6D03 /* TaskCellViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TaskCellViewModel.swift; sourceTree = "<group>"; };
88D22F8123CDDC73003C6D03 /* TaskRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TaskRepository.swift; sourceTree = "<group>"; };
88D22F8323CDDE13003C6D03 /* AppDelegate+Injection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "AppDelegate+Injection.swift"; sourceTree = "<group>"; };
88DF00BA23FC45D00007B71E /* SignInView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SignInView.swift; sourceTree = "<group>"; };
88DF00BB23FC45D00007B71E /* SignInWithAppleButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SignInWithAppleButton.swift; sourceTree = "<group>"; };
88DF00C223FC46FE0007B71E /* EnvironmentKeys.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EnvironmentKeys.swift; sourceTree = "<group>"; };
88EB713C23FC4C1200146A0F /* Make It So.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "Make It So.entitlements"; sourceTree = "<group>"; };
88EC1C1E23FD86B20045F6A8 /* SettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsView.swift; sourceTree = "<group>"; };
88EC1C2223FDCD210045F6A8 /* SettingsViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsViewModel.swift; sourceTree = "<group>"; };
A4864AFE6C02396F83AF7044 /* Pods-MakeItSo.emulators.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-MakeItSo.emulators.xcconfig"; path = "Target Support Files/Pods-MakeItSo/Pods-MakeItSo.emulators.xcconfig"; sourceTree = "<group>"; };
C1A857703B87962FBD745FCB /* Pods-MakeItSo.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-MakeItSo.debug.xcconfig"; path = "Target Support Files/Pods-MakeItSo/Pods-MakeItSo.debug.xcconfig"; sourceTree = "<group>"; };
/* End PBXFileReference section */

Expand Down Expand Up @@ -78,6 +90,7 @@
isa = PBXGroup;
children = (
88169CD923C8A0D6009CFC9C /* App */,
88DF00C123FC46E70007B71E /* Utilities */,
8825907F23D9A4FE00AB7022 /* Services */,
88D22F8023CDDC4B003C6D03 /* Repositories */,
88169CDB23C8A1B7009CFC9C /* Models */,
Expand All @@ -87,6 +100,7 @@
88169CD023C8A083009CFC9C /* LaunchScreen.storyboard */,
88169CD323C8A083009CFC9C /* Info.plist */,
886471E823D606BC0095AD8E /* GoogleService-Info.plist */,
88EB713C23FC4C1200146A0F /* Make It So.entitlements */,
88169CCD23C8A083009CFC9C /* Preview Content */,
);
path = MakeItSo;
Expand Down Expand Up @@ -114,6 +128,9 @@
isa = PBXGroup;
children = (
88169CC923C8A081009CFC9C /* TaskListView.swift */,
88EC1C1E23FD86B20045F6A8 /* SettingsView.swift */,
88DF00BA23FC45D00007B71E /* SignInView.swift */,
88DF00BB23FC45D00007B71E /* SignInWithAppleButton.swift */,
);
path = Views;
sourceTree = "<group>";
Expand All @@ -139,6 +156,7 @@
children = (
88D22F5C23CCC5D5003C6D03 /* TaskListViewModel.swift */,
88D22F5E23CCC5E6003C6D03 /* TaskCellViewModel.swift */,
88EC1C2223FDCD210045F6A8 /* SettingsViewModel.swift */,
);
path = ViewModels;
sourceTree = "<group>";
Expand All @@ -151,6 +169,14 @@
path = Repositories;
sourceTree = "<group>";
};
88DF00C123FC46E70007B71E /* Utilities */ = {
isa = PBXGroup;
children = (
88DF00C223FC46FE0007B71E /* EnvironmentKeys.swift */,
);
path = Utilities;
sourceTree = "<group>";
};
8EB657D5200F4D51FDA2B8F1 /* Frameworks */ = {
isa = PBXGroup;
children = (
Expand All @@ -164,6 +190,7 @@
children = (
C1A857703B87962FBD745FCB /* Pods-MakeItSo.debug.xcconfig */,
6CA57FACA66B563CF5EFACEC /* Pods-MakeItSo.release.xcconfig */,
A4864AFE6C02396F83AF7044 /* Pods-MakeItSo.emulators.xcconfig */,
);
path = Pods;
sourceTree = "<group>";
Expand Down Expand Up @@ -288,11 +315,16 @@
88169CDD23C8A455009CFC9C /* Task.swift in Sources */,
88169CC623C8A081009CFC9C /* AppDelegate.swift in Sources */,
8825908123D9A51900AB7022 /* AuthenticationService.swift in Sources */,
88DF00BC23FC45D00007B71E /* SignInView.swift in Sources */,
88D22F5D23CCC5D5003C6D03 /* TaskListViewModel.swift in Sources */,
88D22F5F23CCC5E6003C6D03 /* TaskCellViewModel.swift in Sources */,
88169CC823C8A081009CFC9C /* SceneDelegate.swift in Sources */,
88DF00BD23FC45D00007B71E /* SignInWithAppleButton.swift in Sources */,
88DF00C323FC46FE0007B71E /* EnvironmentKeys.swift in Sources */,
88169CCA23C8A081009CFC9C /* TaskListView.swift in Sources */,
88D22F8223CDDC73003C6D03 /* TaskRepository.swift in Sources */,
88EC1C1F23FD86B20045F6A8 /* SettingsView.swift in Sources */,
88B508EF23FDD19E00AC508B /* SettingsViewModel.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
Expand Down Expand Up @@ -429,6 +461,7 @@
baseConfigurationReference = C1A857703B87962FBD745FCB /* Pods-MakeItSo.debug.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_ENTITLEMENTS = "MakeItSo/Make It So.entitlements";
CODE_SIGN_STYLE = Automatic;
DEVELOPMENT_ASSET_PATHS = "\"MakeItSo/Preview Content\"";
DEVELOPMENT_TEAM = YGAZHQXHH4;
Expand All @@ -438,7 +471,8 @@
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = dev.peterfriese.MakeItSo;
OTHER_SWIFT_FLAGS = "$(inherited) -D NO_USE_FIREBASE_EMULATORS";
PRODUCT_BUNDLE_IDENTIFIER = dev.peterfriese.MakeItSo2;
PRODUCT_NAME = "Make It So";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
Expand All @@ -450,6 +484,7 @@
baseConfigurationReference = 6CA57FACA66B563CF5EFACEC /* Pods-MakeItSo.release.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_ENTITLEMENTS = "MakeItSo/Make It So.entitlements";
CODE_SIGN_STYLE = Automatic;
DEVELOPMENT_ASSET_PATHS = "\"MakeItSo/Preview Content\"";
DEVELOPMENT_TEAM = YGAZHQXHH4;
Expand All @@ -459,7 +494,8 @@
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = dev.peterfriese.MakeItSo;
OTHER_SWIFT_FLAGS = "$(inherited)";
PRODUCT_BUNDLE_IDENTIFIER = dev.peterfriese.MakeItSo2;
PRODUCT_NAME = "Make It So";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
Expand Down
37 changes: 35 additions & 2 deletions final/MakeItSo/MakeItSo/App/AppDelegate+Injection.swift
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,45 @@

import Foundation
import Resolver
import FirebaseFunctions
import FirebaseFirestore

extension Resolver: ResolverRegistering {
public static func registerAllServices() {
// register { TestDataTaskRepository() as TaskRepository }.scope(application)
// register { LocalTaskRepository() as TaskRepository }.scope(application)
// register Firebase services
register { Functions.functions().useEmulator() }.scope(application)
register { Firestore.firestore().useEmulator() }.scope(application)

// register application components
register { AuthenticationService() }.scope(application)
register { FirestoreTaskRepository() as TaskRepository }.scope(application)
}
}

extension Functions {
func useEmulator() -> Functions {
#if USE_FIREBASE_EMULATORS
print("Using the Firebase Emulator for Cloud Functions, running on port 5001")
self.useFunctionsEmulator(origin: "https://localhost:5001")
#else
print("Using Cloud Functions in production")
#endif
return self
}
}

extension Firestore {
func useEmulator() -> Firestore {
#if USE_FIREBASE_EMULATORS
print("Using the Firebase Emulator for Cloud Firestore, running on port 8080")
let settings = self.settings
settings.host = "localhost:8080"
settings.isPersistenceEnabled = false
settings.isSSLEnabled = false
self.settings = settings
#else
print("Using Cloud Firestore in production")
#endif
return self
}
}
4 changes: 3 additions & 1 deletion final/MakeItSo/MakeItSo/App/AppDelegate.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,16 +9,18 @@
import UIKit
import Firebase
import Resolver
import FirebaseFunctions

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

@Injected var authenticationService: AuthenticationService
@LazyInjected var authenticationService: AuthenticationService

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.

FirebaseApp.configure()

authenticationService.signIn()

return true
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "MakeItSo.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
{
"images" : [
{
"idiom" : "universal",
"filename" : "siri-cropped.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
15 changes: 15 additions & 0 deletions final/MakeItSo/MakeItSo/Info.plist
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,21 @@
<string>1</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<false/>
<key>NSExceptionDomains</key>
<dict>
<key>localhost</key>
<dict>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSIncludesSubdomains</key>
<true/>
</dict>
</dict>
</dict>
<key>UIApplicationSceneManifest</key>
<dict>
<key>UIApplicationSupportsMultipleScenes</key>
Expand Down
10 changes: 10 additions & 0 deletions final/MakeItSo/MakeItSo/Make It So.entitlements
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http:https://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.developer.applesignin</key>
<array>
<string>Default</string>
</array>
</dict>
</plist>
23 changes: 19 additions & 4 deletions final/MakeItSo/MakeItSo/Repositories/TaskRepository.swift
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import Disk
import Firebase
import FirebaseFirestore
import FirebaseFirestoreSwift
import FirebaseFunctions

import Combine
import Resolver
Expand All @@ -30,7 +31,6 @@ class TestDataTaskRepository: BaseTaskRepository, TaskRepository, ObservableObje
override init() {
super.init()
self.tasks = testDataTasks

}

func addTask(_ task: Task) {
Expand Down Expand Up @@ -98,12 +98,14 @@ class LocalTaskRepository: BaseTaskRepository, TaskRepository, ObservableObject
}

class FirestoreTaskRepository: BaseTaskRepository, TaskRepository, ObservableObject {
var db = Firestore.firestore()

@Injected var db: Firestore
@Injected var authenticationService: AuthenticationService
@LazyInjected var functions: Functions

var tasksPath: String = "tasks"
var userId: String = "unknown"

private var listenerRegistration: ListenerRegistration?
private var cancellables = Set<AnyCancellable>()

override init() {
Expand All @@ -126,7 +128,10 @@ class FirestoreTaskRepository: BaseTaskRepository, TaskRepository, ObservableObj
}

private func loadData() {
db.collection(tasksPath)
if listenerRegistration != nil {
listenerRegistration?.remove()
}
listenerRegistration = db.collection(tasksPath)
.whereField("userId", isEqualTo: self.userId)
.order(by: "createdTime")
.addSnapshotListener { (querySnapshot, error) in
Expand Down Expand Up @@ -169,4 +174,14 @@ class FirestoreTaskRepository: BaseTaskRepository, TaskRepository, ObservableObj
}
}
}

func migrateTasks(fromUserId: String) {
let data = ["previousUserId": fromUserId]
functions.httpsCallable("migrateTasks").call(data) { (result, error) in
if let error = error as NSError? {
print("Error: \(error.localizedDescription)")
}
print("Function result: \(result?.data ?? "(empty)")")
}
}
}
Loading

0 comments on commit 2fe7207

Please sign in to comment.