├── LocalNotificationsTutorial.xcodeproj ├── project.xcworkspace │ └── contents.xcworkspacedata ├── xcuserdata │ └── jasonnewell.xcuserdatad │ │ └── xcschemes │ │ ├── xcschememanagement.plist │ │ └── LocalNotificationsTutorial.xcscheme └── project.pbxproj ├── LocalNotificationsTutorial ├── TodoItem.swift ├── Images.xcassets │ └── AppIcon.appiconset │ │ └── Contents.json ├── TodoSchedulingViewController.swift ├── Info.plist ├── TodoTableViewController.swift ├── Base.lproj │ ├── LaunchScreen.xib │ └── Main.storyboard ├── AppDelegate.swift └── TodoList.swift └── LocalNotificationsTutorialTests ├── Info.plist └── LocalNotificationsTutorialTests.swift /LocalNotificationsTutorial.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /LocalNotificationsTutorial/TodoItem.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TodoItem.swift 3 | // TodoNotificationsTutorial 4 | // 5 | // Created by Jason Newell on 1/28/15. 6 | // Copyright (c) 2015 Jason Newell. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | struct TodoItem { 12 | var title: String 13 | var deadline: NSDate 14 | var UUID: String 15 | 16 | init(deadline: NSDate, title: String, UUID: String) { 17 | self.deadline = deadline 18 | self.title = title 19 | self.UUID = UUID 20 | } 21 | 22 | var isOverdue: Bool { 23 | return (NSDate().compare(self.deadline) == NSComparisonResult.OrderedDescending) // deadline is earlier than current date 24 | } 25 | } -------------------------------------------------------------------------------- /LocalNotificationsTutorial.xcodeproj/xcuserdata/jasonnewell.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | LocalNotificationsTutorial.xcscheme 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | SuppressBuildableAutocreation 14 | 15 | 7469E42A1A7C8E8200C68120 16 | 17 | primary 18 | 19 | 20 | 7469E43F1A7C8E8200C68120 21 | 22 | primary 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /LocalNotificationsTutorialTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | com.lumarow.$(PRODUCT_NAME:rfc1034identifier) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | 24 | 25 | -------------------------------------------------------------------------------- /LocalNotificationsTutorialTests/LocalNotificationsTutorialTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // LocalNotificationsTutorialTests.swift 3 | // LocalNotificationsTutorialTests 4 | // 5 | // Created by Jason Newell on 1/30/15. 6 | // 7 | // 8 | 9 | import UIKit 10 | import XCTest 11 | 12 | class LocalNotificationsTutorialTests: XCTestCase { 13 | 14 | override func setUp() { 15 | super.setUp() 16 | // Put setup code here. This method is called before the invocation of each test method in the class. 17 | } 18 | 19 | override func tearDown() { 20 | // Put teardown code here. This method is called after the invocation of each test method in the class. 21 | super.tearDown() 22 | } 23 | 24 | func testExample() { 25 | // This is an example of a functional test case. 26 | XCTAssert(true, "Pass") 27 | } 28 | 29 | func testPerformanceExample() { 30 | // This is an example of a performance test case. 31 | self.measureBlock() { 32 | // Put the code you want to measure the time of here. 33 | } 34 | } 35 | 36 | } 37 | -------------------------------------------------------------------------------- /LocalNotificationsTutorial/Images.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "29x29", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "29x29", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "40x40", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "40x40", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "60x60", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "60x60", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "idiom" : "ipad", 35 | "size" : "29x29", 36 | "scale" : "1x" 37 | }, 38 | { 39 | "idiom" : "ipad", 40 | "size" : "29x29", 41 | "scale" : "2x" 42 | }, 43 | { 44 | "idiom" : "ipad", 45 | "size" : "40x40", 46 | "scale" : "1x" 47 | }, 48 | { 49 | "idiom" : "ipad", 50 | "size" : "40x40", 51 | "scale" : "2x" 52 | }, 53 | { 54 | "idiom" : "ipad", 55 | "size" : "76x76", 56 | "scale" : "1x" 57 | }, 58 | { 59 | "idiom" : "ipad", 60 | "size" : "76x76", 61 | "scale" : "2x" 62 | } 63 | ], 64 | "info" : { 65 | "version" : 1, 66 | "author" : "xcode" 67 | } 68 | } -------------------------------------------------------------------------------- /LocalNotificationsTutorial/TodoSchedulingViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TodoSchedulingViewController.swift 3 | // TodoNotificationsTutorial 4 | // 5 | // Created by Jason Newell on 1/25/15. 6 | // Copyright (c) 2015 Jason Newell. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class TodoSchedulingViewController: UIViewController { 12 | @IBOutlet weak var titleField: UITextField! 13 | @IBOutlet weak var deadlinePicker: UIDatePicker! 14 | 15 | @IBAction func savePressed(sender: UIButton) { 16 | if (countElements(titleField.text.stringByTrimmingCharactersInSet(.whitespaceCharacterSet())) > 0) { // only save if titlefield text contains non-whitespace characters 17 | let todoItem = TodoItem(deadline: deadlinePicker.date, title: titleField.text, UUID: NSUUID().UUIDString) 18 | TodoList().addItem(todoItem) // schedule a local notification to persist this item 19 | self.navigationController?.popToRootViewControllerAnimated(true) // return to list view where the newly created item will be displayed 20 | } else { // text field was blank or contained only whitespace 21 | var alertController = UIAlertController(title: "Error", message: "You must give this todo item a title", preferredStyle: .Alert) 22 | alertController.addAction(UIAlertAction(title: "Ok", style: .Cancel, handler: nil)) 23 | self.presentViewController(alertController, animated: true, completion: nil) 24 | } 25 | } 26 | } -------------------------------------------------------------------------------- /LocalNotificationsTutorial/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | com.lumarow.$(PRODUCT_NAME:rfc1034identifier) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | LSRequiresIPhoneOS 24 | 25 | UILaunchStoryboardName 26 | LaunchScreen 27 | UIMainStoryboardFile 28 | Main 29 | UIRequiredDeviceCapabilities 30 | 31 | armv7 32 | 33 | UISupportedInterfaceOrientations 34 | 35 | UIInterfaceOrientationPortrait 36 | UIInterfaceOrientationLandscapeLeft 37 | UIInterfaceOrientationLandscapeRight 38 | 39 | UISupportedInterfaceOrientations~ipad 40 | 41 | UIInterfaceOrientationPortrait 42 | UIInterfaceOrientationPortraitUpsideDown 43 | UIInterfaceOrientationLandscapeLeft 44 | UIInterfaceOrientationLandscapeRight 45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /LocalNotificationsTutorial/TodoTableViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TodoTableViewController.swift 3 | // LocalNotificationsTutorial 4 | // 5 | // Created by Jason Newell on 1/30/15. 6 | // 7 | // 8 | 9 | import UIKit 10 | 11 | class TodoTableViewController: UITableViewController { 12 | var todoItems: [TodoItem] = [] 13 | 14 | override func viewDidLoad() { 15 | super.viewDidLoad() 16 | NSNotificationCenter.defaultCenter().addObserver(self, selector: "refreshList", name: "TodoListShouldRefresh", object: nil) 17 | } 18 | 19 | override func viewWillAppear(animated: Bool) { 20 | super.viewWillAppear(animated) 21 | refreshList() 22 | } 23 | 24 | func refreshList() { 25 | todoItems = TodoList().allItems() 26 | if (todoItems.count >= 64) { 27 | self.navigationItem.rightBarButtonItem!.enabled = false // disable 'add' button 28 | } 29 | tableView.reloadData() 30 | } 31 | 32 | override func numberOfSectionsInTableView(tableView: UITableView) -> Int { 33 | return 1 34 | } 35 | 36 | override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 37 | return todoItems.count 38 | } 39 | 40 | override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 41 | let cell = tableView.dequeueReusableCellWithIdentifier("todoCell", forIndexPath: indexPath) as UITableViewCell // retrieve the prototype cell (subtitle style) 42 | let todoItem = todoItems[indexPath.row] as TodoItem 43 | 44 | cell.textLabel?.text = todoItem.title as String! 45 | if (todoItem.isOverdue) { // the current time is later than the to-do item's deadline 46 | cell.detailTextLabel?.textColor = UIColor.redColor() 47 | } else { 48 | cell.detailTextLabel?.textColor = UIColor.blackColor() // we need to reset this because a cell with red subtitle may be returned by dequeueReusableCellWithIdentifier:indexPath: 49 | } 50 | 51 | let dateFormatter = NSDateFormatter() 52 | dateFormatter.dateFormat = "'Due' MMM dd 'at' h:mm a" // example: "Due Jan 01 at 12:00 PM" 53 | cell.detailTextLabel?.text = dateFormatter.stringFromDate(todoItem.deadline) 54 | 55 | return cell 56 | } 57 | 58 | override func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool { 59 | return true // all cells are editable 60 | } 61 | 62 | override func tableView(tableView: UITableView, titleForDeleteConfirmationButtonForRowAtIndexPath indexPath: NSIndexPath) -> String! { 63 | return "Complete" // alternate text for delete button 64 | } 65 | 66 | override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) { 67 | if editingStyle == .Delete { // the only editing style we'll support 68 | // Delete the row from the data source 69 | var item = todoItems.removeAtIndex(indexPath.row) // remove TodoItem from notifications array, assign removed item to 'item' 70 | tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade) 71 | TodoList().removeItem(item) // delete backing property list entry and unschedule local notification (if it still exists) 72 | self.navigationItem.rightBarButtonItem!.enabled = true // we definitely have under 64 notifications scheduled now, make sure 'add' button is enabled 73 | } 74 | } 75 | } 76 | -------------------------------------------------------------------------------- /LocalNotificationsTutorial/Base.lproj/LaunchScreen.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 20 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /LocalNotificationsTutorial/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // LocalNotificationsTutorial 4 | // 5 | // Created by Jason Newell on 1/30/15. 6 | // 7 | // 8 | 9 | import UIKit 10 | 11 | @UIApplicationMain 12 | class AppDelegate: UIResponder, UIApplicationDelegate { 13 | var window: UIWindow? 14 | 15 | func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 16 | let completeAction = UIMutableUserNotificationAction() 17 | completeAction.identifier = "COMPLETE_TODO" // the unique identifier for this action 18 | completeAction.title = "Complete" // title for the action button 19 | completeAction.activationMode = .Background // UIUserNotificationActivationMode.Background - don't bring app to foreground 20 | completeAction.authenticationRequired = false // don't require unlocking before performing action 21 | completeAction.destructive = true // display action in red 22 | 23 | let remindAction = UIMutableUserNotificationAction() 24 | remindAction.identifier = "REMIND" 25 | remindAction.title = "Remind in 30 minutes" 26 | remindAction.activationMode = .Background 27 | remindAction.destructive = false 28 | 29 | let todoCategory = UIMutableUserNotificationCategory() // notification categories allow us to create groups of actions that we can associate with a notification 30 | todoCategory.identifier = "TODO_CATEGORY" 31 | todoCategory.setActions([remindAction, completeAction], forContext: .Default) // UIUserNotificationActionContext.Default (4 actions max) 32 | todoCategory.setActions([completeAction, remindAction], forContext: .Minimal) // UIUserNotificationActionContext.Minimal - for when space is limited (2 actions max) 33 | 34 | application.registerUserNotificationSettings(UIUserNotificationSettings(forTypes: .Alert | .Badge | .Sound, categories: NSSet(array: [todoCategory]))) // we're now providing a set containing our category as an argument 35 | return true 36 | } 37 | 38 | func application(application: UIApplication, handleActionWithIdentifier identifier: String?, forLocalNotification notification: UILocalNotification, completionHandler: () -> Void) { 39 | var item = TodoItem(deadline: notification.fireDate!, title: notification.userInfo!["title"] as String, UUID: notification.userInfo!["UUID"] as String!) 40 | switch (identifier!) { 41 | case "COMPLETE_TODO": 42 | TodoList().removeItem(item) 43 | case "REMIND": 44 | TodoList().scheduleReminderforItem(item) 45 | default: // switch statements must be exhaustive - this condition should never be met 46 | println("Error: unexpected notification action identifier!") 47 | } 48 | completionHandler() // per developer documentation, app will terminate if we fail to call this 49 | } 50 | 51 | func application(application: UIApplication, didReceiveLocalNotification notification: UILocalNotification) { 52 | NSNotificationCenter.defaultCenter().postNotificationName("TodoListShouldRefresh", object: self) 53 | } 54 | 55 | func applicationDidBecomeActive(application: UIApplication) { 56 | NSNotificationCenter.defaultCenter().postNotificationName("TodoListShouldRefresh", object: self) 57 | } 58 | 59 | func applicationWillResignActive(application: UIApplication) { // fired when user quits the application 60 | var todoItems: [TodoItem] = TodoList().allItems() // retrieve list of all to-do items 61 | var overdueItems = todoItems.filter({ (todoItem) -> Bool in 62 | return todoItem.deadline.compare(NSDate()) != .OrderedDescending 63 | }) 64 | UIApplication.sharedApplication().applicationIconBadgeNumber = overdueItems.count // set our badge number to number of overdue items 65 | } 66 | } 67 | 68 | -------------------------------------------------------------------------------- /LocalNotificationsTutorial.xcodeproj/xcuserdata/jasonnewell.xcuserdatad/xcschemes/LocalNotificationsTutorial.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 29 | 35 | 36 | 37 | 38 | 39 | 44 | 45 | 47 | 53 | 54 | 55 | 56 | 57 | 63 | 64 | 65 | 66 | 75 | 77 | 83 | 84 | 85 | 86 | 87 | 88 | 94 | 96 | 102 | 103 | 104 | 105 | 107 | 108 | 111 | 112 | 113 | -------------------------------------------------------------------------------- /LocalNotificationsTutorial/TodoList.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TodoList.swift 3 | // LocalNotificationsTutorial 4 | // 5 | // Created by Jason Newell on 2/3/15. 6 | // 7 | // 8 | 9 | import Foundation 10 | import UIKit 11 | 12 | class TodoList { 13 | private let savePath = (NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as NSString).stringByAppendingPathComponent("todo.plist") // ~/todo.plist 14 | 15 | func allItems() -> [TodoItem] { 16 | var items: [AnyObject] = self.rawItems() 17 | return items.map({TodoItem(deadline: $0["deadline"] as NSDate, title: $0["title"] as String, UUID: $0["UUID"] as String!)}).sorted({ 18 | return ($0.deadline.compare($1.deadline) == .OrderedAscending) 19 | }) 20 | } 21 | 22 | private func rawItems() -> [AnyObject] { 23 | var items: Array = [] // default to an empty array... 24 | if (NSArray(contentsOfFile: self.savePath) != nil) { // ...because init?(contentsOfFile:) will return nil if file doesn't exist yet 25 | items = NSArray(contentsOfFile: self.savePath)! // load stored items, if available 26 | } 27 | return items 28 | } 29 | 30 | func setBadgeNumbers() { 31 | var notifications = UIApplication.sharedApplication().scheduledLocalNotifications as [UILocalNotification] // all scheduled notifications 32 | var todoItems: [TodoItem] = self.allItems() 33 | 34 | for notification in notifications { 35 | var overdueItems = todoItems.filter({ (todoItem) -> Bool in // array of to-do items... 36 | return (todoItem.deadline.compare(notification.fireDate!) != .OrderedDescending) // ...where item deadline is before or on notification fire date 37 | }) 38 | UIApplication.sharedApplication().cancelLocalNotification(notification) // cancel old notification 39 | notification.applicationIconBadgeNumber = -1 // set new badge number 40 | UIApplication.sharedApplication().scheduleLocalNotification(notification) // reschedule notification 41 | } 42 | } 43 | 44 | func addItem(item: TodoItem) { 45 | // persist a representation of this todo item in a plist 46 | var items: [AnyObject] = self.rawItems() 47 | items.append(["title": item.title, "deadline": item.deadline, "UUID": item.UUID]) // add a dictionary representing this TodoItem instance 48 | (items as NSArray).writeToFile(self.savePath, atomically: true) // items casted as NSArray because writeToFile:atomically: is not available on Swift arrays 49 | 50 | // create a corresponding local notification 51 | var notification = UILocalNotification() 52 | notification.alertBody = "Todo Item \"\(item.title)\" Is Overdue" // text that will be displayed in the notification 53 | notification.alertAction = "open" // text that is displayed after "slide to..." on the lock screen - defaults to "slide to view" 54 | notification.fireDate = item.deadline // todo item due date (when notification will be fired) 55 | notification.soundName = UILocalNotificationDefaultSoundName // play default sound 56 | notification.userInfo = ["title": item.title, "UUID": item.UUID] // assign a unique identifier to the notification that we can use to retrieve it later 57 | notification.category = "TODO_CATEGORY" 58 | 59 | UIApplication.sharedApplication().scheduleLocalNotification(notification) 60 | 61 | self.setBadgeNumbers() 62 | } 63 | 64 | func scheduleReminderforItem(item: TodoItem) { 65 | var notification = UILocalNotification() // create a new reminder notification 66 | notification.alertBody = "Reminder: Todo Item \"\(item.title)\" Is Overdue" // text that will be displayed in the notification 67 | notification.alertAction = "open" // text that is displayed after "slide to..." on the lock screen - defaults to "slide to view" 68 | notification.fireDate = NSDate().dateByAddingTimeInterval(30 * 60) // 30 minutes from current time 69 | notification.soundName = UILocalNotificationDefaultSoundName // play default sound 70 | notification.userInfo = ["title": item.title, "UUID": item.UUID] // assign a unique identifier to the notification that we can use to retrieve it later 71 | notification.category = "TODO_CATEGORY" 72 | 73 | UIApplication.sharedApplication().scheduleLocalNotification(notification) 74 | } 75 | 76 | func removeItem(item: TodoItem) { 77 | for notification in UIApplication.sharedApplication().scheduledLocalNotifications as [UILocalNotification] { // loop through notifications... 78 | if (notification.userInfo!["UUID"] as String == item.UUID) { // ...and cancel the notification that corresponds to this TodoItem instance (matched by UUID) 79 | UIApplication.sharedApplication().cancelLocalNotification(notification) // there should be a maximum of one match on UUID 80 | break 81 | } 82 | } 83 | 84 | var items: [AnyObject] = self.rawItems() 85 | items = items.filter {($0["UUID"] as String? != item.UUID)} // remove item that matches UUID 86 | (items as NSArray).writeToFile(self.savePath, atomically: true) // overwrite todo.plist with new array 87 | 88 | self.setBadgeNumbers() 89 | } 90 | } -------------------------------------------------------------------------------- /LocalNotificationsTutorial/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 28 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | -------------------------------------------------------------------------------- /LocalNotificationsTutorial.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 744784E51A81813400B09D65 /* TodoList.swift in Sources */ = {isa = PBXBuildFile; fileRef = 744784E41A81813400B09D65 /* TodoList.swift */; }; 11 | 744784E71A81813C00B09D65 /* TodoItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 744784E61A81813C00B09D65 /* TodoItem.swift */; }; 12 | 7469E4311A7C8E8200C68120 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7469E4301A7C8E8200C68120 /* AppDelegate.swift */; }; 13 | 7469E4361A7C8E8200C68120 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 7469E4341A7C8E8200C68120 /* Main.storyboard */; }; 14 | 7469E4381A7C8E8200C68120 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 7469E4371A7C8E8200C68120 /* Images.xcassets */; }; 15 | 7469E43B1A7C8E8200C68120 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 7469E4391A7C8E8200C68120 /* LaunchScreen.xib */; }; 16 | 7469E4471A7C8E8200C68120 /* LocalNotificationsTutorialTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7469E4461A7C8E8200C68120 /* LocalNotificationsTutorialTests.swift */; }; 17 | 7469E4531A7C9D5600C68120 /* TodoTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7469E4521A7C9D5600C68120 /* TodoTableViewController.swift */; }; 18 | 7469E4551A7C9D9500C68120 /* TodoSchedulingViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7469E4541A7C9D9500C68120 /* TodoSchedulingViewController.swift */; }; 19 | /* End PBXBuildFile section */ 20 | 21 | /* Begin PBXContainerItemProxy section */ 22 | 7469E4411A7C8E8200C68120 /* PBXContainerItemProxy */ = { 23 | isa = PBXContainerItemProxy; 24 | containerPortal = 7469E4231A7C8E8200C68120 /* Project object */; 25 | proxyType = 1; 26 | remoteGlobalIDString = 7469E42A1A7C8E8200C68120; 27 | remoteInfo = LocalNotificationsTutorial; 28 | }; 29 | /* End PBXContainerItemProxy section */ 30 | 31 | /* Begin PBXFileReference section */ 32 | 744784E41A81813400B09D65 /* TodoList.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TodoList.swift; sourceTree = ""; }; 33 | 744784E61A81813C00B09D65 /* TodoItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TodoItem.swift; sourceTree = ""; }; 34 | 7469E42B1A7C8E8200C68120 /* LocalNotificationsTutorial.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = LocalNotificationsTutorial.app; sourceTree = BUILT_PRODUCTS_DIR; }; 35 | 7469E42F1A7C8E8200C68120 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 36 | 7469E4301A7C8E8200C68120 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 37 | 7469E4351A7C8E8200C68120 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 38 | 7469E4371A7C8E8200C68120 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; 39 | 7469E43A1A7C8E8200C68120 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; 40 | 7469E4401A7C8E8200C68120 /* LocalNotificationsTutorialTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = LocalNotificationsTutorialTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 41 | 7469E4451A7C8E8200C68120 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 42 | 7469E4461A7C8E8200C68120 /* LocalNotificationsTutorialTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocalNotificationsTutorialTests.swift; sourceTree = ""; }; 43 | 7469E4521A7C9D5600C68120 /* TodoTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TodoTableViewController.swift; sourceTree = ""; }; 44 | 7469E4541A7C9D9500C68120 /* TodoSchedulingViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TodoSchedulingViewController.swift; sourceTree = ""; }; 45 | /* End PBXFileReference section */ 46 | 47 | /* Begin PBXFrameworksBuildPhase section */ 48 | 7469E4281A7C8E8200C68120 /* Frameworks */ = { 49 | isa = PBXFrameworksBuildPhase; 50 | buildActionMask = 2147483647; 51 | files = ( 52 | ); 53 | runOnlyForDeploymentPostprocessing = 0; 54 | }; 55 | 7469E43D1A7C8E8200C68120 /* Frameworks */ = { 56 | isa = PBXFrameworksBuildPhase; 57 | buildActionMask = 2147483647; 58 | files = ( 59 | ); 60 | runOnlyForDeploymentPostprocessing = 0; 61 | }; 62 | /* End PBXFrameworksBuildPhase section */ 63 | 64 | /* Begin PBXGroup section */ 65 | 7469E4221A7C8E8200C68120 = { 66 | isa = PBXGroup; 67 | children = ( 68 | 7469E42D1A7C8E8200C68120 /* LocalNotificationsTutorial */, 69 | 7469E4431A7C8E8200C68120 /* LocalNotificationsTutorialTests */, 70 | 7469E42C1A7C8E8200C68120 /* Products */, 71 | ); 72 | sourceTree = ""; 73 | }; 74 | 7469E42C1A7C8E8200C68120 /* Products */ = { 75 | isa = PBXGroup; 76 | children = ( 77 | 7469E42B1A7C8E8200C68120 /* LocalNotificationsTutorial.app */, 78 | 7469E4401A7C8E8200C68120 /* LocalNotificationsTutorialTests.xctest */, 79 | ); 80 | name = Products; 81 | sourceTree = ""; 82 | }; 83 | 7469E42D1A7C8E8200C68120 /* LocalNotificationsTutorial */ = { 84 | isa = PBXGroup; 85 | children = ( 86 | 7469E4301A7C8E8200C68120 /* AppDelegate.swift */, 87 | 7469E4521A7C9D5600C68120 /* TodoTableViewController.swift */, 88 | 7469E4541A7C9D9500C68120 /* TodoSchedulingViewController.swift */, 89 | 744784E41A81813400B09D65 /* TodoList.swift */, 90 | 744784E61A81813C00B09D65 /* TodoItem.swift */, 91 | 7469E4341A7C8E8200C68120 /* Main.storyboard */, 92 | 7469E4371A7C8E8200C68120 /* Images.xcassets */, 93 | 7469E4391A7C8E8200C68120 /* LaunchScreen.xib */, 94 | 7469E42E1A7C8E8200C68120 /* Supporting Files */, 95 | ); 96 | path = LocalNotificationsTutorial; 97 | sourceTree = ""; 98 | }; 99 | 7469E42E1A7C8E8200C68120 /* Supporting Files */ = { 100 | isa = PBXGroup; 101 | children = ( 102 | 7469E42F1A7C8E8200C68120 /* Info.plist */, 103 | ); 104 | name = "Supporting Files"; 105 | sourceTree = ""; 106 | }; 107 | 7469E4431A7C8E8200C68120 /* LocalNotificationsTutorialTests */ = { 108 | isa = PBXGroup; 109 | children = ( 110 | 7469E4461A7C8E8200C68120 /* LocalNotificationsTutorialTests.swift */, 111 | 7469E4441A7C8E8200C68120 /* Supporting Files */, 112 | ); 113 | path = LocalNotificationsTutorialTests; 114 | sourceTree = ""; 115 | }; 116 | 7469E4441A7C8E8200C68120 /* Supporting Files */ = { 117 | isa = PBXGroup; 118 | children = ( 119 | 7469E4451A7C8E8200C68120 /* Info.plist */, 120 | ); 121 | name = "Supporting Files"; 122 | sourceTree = ""; 123 | }; 124 | /* End PBXGroup section */ 125 | 126 | /* Begin PBXNativeTarget section */ 127 | 7469E42A1A7C8E8200C68120 /* LocalNotificationsTutorial */ = { 128 | isa = PBXNativeTarget; 129 | buildConfigurationList = 7469E44A1A7C8E8200C68120 /* Build configuration list for PBXNativeTarget "LocalNotificationsTutorial" */; 130 | buildPhases = ( 131 | 7469E4271A7C8E8200C68120 /* Sources */, 132 | 7469E4281A7C8E8200C68120 /* Frameworks */, 133 | 7469E4291A7C8E8200C68120 /* Resources */, 134 | ); 135 | buildRules = ( 136 | ); 137 | dependencies = ( 138 | ); 139 | name = LocalNotificationsTutorial; 140 | productName = LocalNotificationsTutorial; 141 | productReference = 7469E42B1A7C8E8200C68120 /* LocalNotificationsTutorial.app */; 142 | productType = "com.apple.product-type.application"; 143 | }; 144 | 7469E43F1A7C8E8200C68120 /* LocalNotificationsTutorialTests */ = { 145 | isa = PBXNativeTarget; 146 | buildConfigurationList = 7469E44D1A7C8E8200C68120 /* Build configuration list for PBXNativeTarget "LocalNotificationsTutorialTests" */; 147 | buildPhases = ( 148 | 7469E43C1A7C8E8200C68120 /* Sources */, 149 | 7469E43D1A7C8E8200C68120 /* Frameworks */, 150 | 7469E43E1A7C8E8200C68120 /* Resources */, 151 | ); 152 | buildRules = ( 153 | ); 154 | dependencies = ( 155 | 7469E4421A7C8E8200C68120 /* PBXTargetDependency */, 156 | ); 157 | name = LocalNotificationsTutorialTests; 158 | productName = LocalNotificationsTutorialTests; 159 | productReference = 7469E4401A7C8E8200C68120 /* LocalNotificationsTutorialTests.xctest */; 160 | productType = "com.apple.product-type.bundle.unit-test"; 161 | }; 162 | /* End PBXNativeTarget section */ 163 | 164 | /* Begin PBXProject section */ 165 | 7469E4231A7C8E8200C68120 /* Project object */ = { 166 | isa = PBXProject; 167 | attributes = { 168 | LastUpgradeCheck = 0620; 169 | TargetAttributes = { 170 | 7469E42A1A7C8E8200C68120 = { 171 | CreatedOnToolsVersion = 6.2; 172 | }; 173 | 7469E43F1A7C8E8200C68120 = { 174 | CreatedOnToolsVersion = 6.2; 175 | TestTargetID = 7469E42A1A7C8E8200C68120; 176 | }; 177 | }; 178 | }; 179 | buildConfigurationList = 7469E4261A7C8E8200C68120 /* Build configuration list for PBXProject "LocalNotificationsTutorial" */; 180 | compatibilityVersion = "Xcode 3.2"; 181 | developmentRegion = English; 182 | hasScannedForEncodings = 0; 183 | knownRegions = ( 184 | en, 185 | Base, 186 | ); 187 | mainGroup = 7469E4221A7C8E8200C68120; 188 | productRefGroup = 7469E42C1A7C8E8200C68120 /* Products */; 189 | projectDirPath = ""; 190 | projectRoot = ""; 191 | targets = ( 192 | 7469E42A1A7C8E8200C68120 /* LocalNotificationsTutorial */, 193 | 7469E43F1A7C8E8200C68120 /* LocalNotificationsTutorialTests */, 194 | ); 195 | }; 196 | /* End PBXProject section */ 197 | 198 | /* Begin PBXResourcesBuildPhase section */ 199 | 7469E4291A7C8E8200C68120 /* Resources */ = { 200 | isa = PBXResourcesBuildPhase; 201 | buildActionMask = 2147483647; 202 | files = ( 203 | 7469E4361A7C8E8200C68120 /* Main.storyboard in Resources */, 204 | 7469E43B1A7C8E8200C68120 /* LaunchScreen.xib in Resources */, 205 | 7469E4381A7C8E8200C68120 /* Images.xcassets in Resources */, 206 | ); 207 | runOnlyForDeploymentPostprocessing = 0; 208 | }; 209 | 7469E43E1A7C8E8200C68120 /* Resources */ = { 210 | isa = PBXResourcesBuildPhase; 211 | buildActionMask = 2147483647; 212 | files = ( 213 | ); 214 | runOnlyForDeploymentPostprocessing = 0; 215 | }; 216 | /* End PBXResourcesBuildPhase section */ 217 | 218 | /* Begin PBXSourcesBuildPhase section */ 219 | 7469E4271A7C8E8200C68120 /* Sources */ = { 220 | isa = PBXSourcesBuildPhase; 221 | buildActionMask = 2147483647; 222 | files = ( 223 | 744784E71A81813C00B09D65 /* TodoItem.swift in Sources */, 224 | 7469E4551A7C9D9500C68120 /* TodoSchedulingViewController.swift in Sources */, 225 | 7469E4531A7C9D5600C68120 /* TodoTableViewController.swift in Sources */, 226 | 7469E4311A7C8E8200C68120 /* AppDelegate.swift in Sources */, 227 | 744784E51A81813400B09D65 /* TodoList.swift in Sources */, 228 | ); 229 | runOnlyForDeploymentPostprocessing = 0; 230 | }; 231 | 7469E43C1A7C8E8200C68120 /* Sources */ = { 232 | isa = PBXSourcesBuildPhase; 233 | buildActionMask = 2147483647; 234 | files = ( 235 | 7469E4471A7C8E8200C68120 /* LocalNotificationsTutorialTests.swift in Sources */, 236 | ); 237 | runOnlyForDeploymentPostprocessing = 0; 238 | }; 239 | /* End PBXSourcesBuildPhase section */ 240 | 241 | /* Begin PBXTargetDependency section */ 242 | 7469E4421A7C8E8200C68120 /* PBXTargetDependency */ = { 243 | isa = PBXTargetDependency; 244 | target = 7469E42A1A7C8E8200C68120 /* LocalNotificationsTutorial */; 245 | targetProxy = 7469E4411A7C8E8200C68120 /* PBXContainerItemProxy */; 246 | }; 247 | /* End PBXTargetDependency section */ 248 | 249 | /* Begin PBXVariantGroup section */ 250 | 7469E4341A7C8E8200C68120 /* Main.storyboard */ = { 251 | isa = PBXVariantGroup; 252 | children = ( 253 | 7469E4351A7C8E8200C68120 /* Base */, 254 | ); 255 | name = Main.storyboard; 256 | sourceTree = ""; 257 | }; 258 | 7469E4391A7C8E8200C68120 /* LaunchScreen.xib */ = { 259 | isa = PBXVariantGroup; 260 | children = ( 261 | 7469E43A1A7C8E8200C68120 /* Base */, 262 | ); 263 | name = LaunchScreen.xib; 264 | sourceTree = ""; 265 | }; 266 | /* End PBXVariantGroup section */ 267 | 268 | /* Begin XCBuildConfiguration section */ 269 | 7469E4481A7C8E8200C68120 /* Debug */ = { 270 | isa = XCBuildConfiguration; 271 | buildSettings = { 272 | ALWAYS_SEARCH_USER_PATHS = NO; 273 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 274 | CLANG_CXX_LIBRARY = "libc++"; 275 | CLANG_ENABLE_MODULES = YES; 276 | CLANG_ENABLE_OBJC_ARC = YES; 277 | CLANG_WARN_BOOL_CONVERSION = YES; 278 | CLANG_WARN_CONSTANT_CONVERSION = YES; 279 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 280 | CLANG_WARN_EMPTY_BODY = YES; 281 | CLANG_WARN_ENUM_CONVERSION = YES; 282 | CLANG_WARN_INT_CONVERSION = YES; 283 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 284 | CLANG_WARN_UNREACHABLE_CODE = YES; 285 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 286 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 287 | COPY_PHASE_STRIP = NO; 288 | ENABLE_STRICT_OBJC_MSGSEND = YES; 289 | GCC_C_LANGUAGE_STANDARD = gnu99; 290 | GCC_DYNAMIC_NO_PIC = NO; 291 | GCC_OPTIMIZATION_LEVEL = 0; 292 | GCC_PREPROCESSOR_DEFINITIONS = ( 293 | "DEBUG=1", 294 | "$(inherited)", 295 | ); 296 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 297 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 298 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 299 | GCC_WARN_UNDECLARED_SELECTOR = YES; 300 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 301 | GCC_WARN_UNUSED_FUNCTION = YES; 302 | GCC_WARN_UNUSED_VARIABLE = YES; 303 | IPHONEOS_DEPLOYMENT_TARGET = 8.2; 304 | MTL_ENABLE_DEBUG_INFO = YES; 305 | ONLY_ACTIVE_ARCH = YES; 306 | SDKROOT = iphoneos; 307 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 308 | TARGETED_DEVICE_FAMILY = "1,2"; 309 | }; 310 | name = Debug; 311 | }; 312 | 7469E4491A7C8E8200C68120 /* Release */ = { 313 | isa = XCBuildConfiguration; 314 | buildSettings = { 315 | ALWAYS_SEARCH_USER_PATHS = NO; 316 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 317 | CLANG_CXX_LIBRARY = "libc++"; 318 | CLANG_ENABLE_MODULES = YES; 319 | CLANG_ENABLE_OBJC_ARC = YES; 320 | CLANG_WARN_BOOL_CONVERSION = YES; 321 | CLANG_WARN_CONSTANT_CONVERSION = YES; 322 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 323 | CLANG_WARN_EMPTY_BODY = YES; 324 | CLANG_WARN_ENUM_CONVERSION = YES; 325 | CLANG_WARN_INT_CONVERSION = YES; 326 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 327 | CLANG_WARN_UNREACHABLE_CODE = YES; 328 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 329 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 330 | COPY_PHASE_STRIP = NO; 331 | ENABLE_NS_ASSERTIONS = NO; 332 | ENABLE_STRICT_OBJC_MSGSEND = YES; 333 | GCC_C_LANGUAGE_STANDARD = gnu99; 334 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 335 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 336 | GCC_WARN_UNDECLARED_SELECTOR = YES; 337 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 338 | GCC_WARN_UNUSED_FUNCTION = YES; 339 | GCC_WARN_UNUSED_VARIABLE = YES; 340 | IPHONEOS_DEPLOYMENT_TARGET = 8.2; 341 | MTL_ENABLE_DEBUG_INFO = NO; 342 | SDKROOT = iphoneos; 343 | TARGETED_DEVICE_FAMILY = "1,2"; 344 | VALIDATE_PRODUCT = YES; 345 | }; 346 | name = Release; 347 | }; 348 | 7469E44B1A7C8E8200C68120 /* Debug */ = { 349 | isa = XCBuildConfiguration; 350 | buildSettings = { 351 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 352 | INFOPLIST_FILE = LocalNotificationsTutorial/Info.plist; 353 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 354 | PRODUCT_NAME = "$(TARGET_NAME)"; 355 | }; 356 | name = Debug; 357 | }; 358 | 7469E44C1A7C8E8200C68120 /* Release */ = { 359 | isa = XCBuildConfiguration; 360 | buildSettings = { 361 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 362 | INFOPLIST_FILE = LocalNotificationsTutorial/Info.plist; 363 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 364 | PRODUCT_NAME = "$(TARGET_NAME)"; 365 | }; 366 | name = Release; 367 | }; 368 | 7469E44E1A7C8E8200C68120 /* Debug */ = { 369 | isa = XCBuildConfiguration; 370 | buildSettings = { 371 | BUNDLE_LOADER = "$(TEST_HOST)"; 372 | FRAMEWORK_SEARCH_PATHS = ( 373 | "$(SDKROOT)/Developer/Library/Frameworks", 374 | "$(inherited)", 375 | ); 376 | GCC_PREPROCESSOR_DEFINITIONS = ( 377 | "DEBUG=1", 378 | "$(inherited)", 379 | ); 380 | INFOPLIST_FILE = LocalNotificationsTutorialTests/Info.plist; 381 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 382 | PRODUCT_NAME = "$(TARGET_NAME)"; 383 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/LocalNotificationsTutorial.app/LocalNotificationsTutorial"; 384 | }; 385 | name = Debug; 386 | }; 387 | 7469E44F1A7C8E8200C68120 /* Release */ = { 388 | isa = XCBuildConfiguration; 389 | buildSettings = { 390 | BUNDLE_LOADER = "$(TEST_HOST)"; 391 | FRAMEWORK_SEARCH_PATHS = ( 392 | "$(SDKROOT)/Developer/Library/Frameworks", 393 | "$(inherited)", 394 | ); 395 | INFOPLIST_FILE = LocalNotificationsTutorialTests/Info.plist; 396 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 397 | PRODUCT_NAME = "$(TARGET_NAME)"; 398 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/LocalNotificationsTutorial.app/LocalNotificationsTutorial"; 399 | }; 400 | name = Release; 401 | }; 402 | /* End XCBuildConfiguration section */ 403 | 404 | /* Begin XCConfigurationList section */ 405 | 7469E4261A7C8E8200C68120 /* Build configuration list for PBXProject "LocalNotificationsTutorial" */ = { 406 | isa = XCConfigurationList; 407 | buildConfigurations = ( 408 | 7469E4481A7C8E8200C68120 /* Debug */, 409 | 7469E4491A7C8E8200C68120 /* Release */, 410 | ); 411 | defaultConfigurationIsVisible = 0; 412 | defaultConfigurationName = Release; 413 | }; 414 | 7469E44A1A7C8E8200C68120 /* Build configuration list for PBXNativeTarget "LocalNotificationsTutorial" */ = { 415 | isa = XCConfigurationList; 416 | buildConfigurations = ( 417 | 7469E44B1A7C8E8200C68120 /* Debug */, 418 | 7469E44C1A7C8E8200C68120 /* Release */, 419 | ); 420 | defaultConfigurationIsVisible = 0; 421 | defaultConfigurationName = Release; 422 | }; 423 | 7469E44D1A7C8E8200C68120 /* Build configuration list for PBXNativeTarget "LocalNotificationsTutorialTests" */ = { 424 | isa = XCConfigurationList; 425 | buildConfigurations = ( 426 | 7469E44E1A7C8E8200C68120 /* Debug */, 427 | 7469E44F1A7C8E8200C68120 /* Release */, 428 | ); 429 | defaultConfigurationIsVisible = 0; 430 | defaultConfigurationName = Release; 431 | }; 432 | /* End XCConfigurationList section */ 433 | }; 434 | rootObject = 7469E4231A7C8E8200C68120 /* Project object */; 435 | } 436 | --------------------------------------------------------------------------------