├── 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 |
--------------------------------------------------------------------------------