You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@usergrid.apache.org by sn...@apache.org on 2016/02/16 14:16:03 UTC

[71/75] usergrid git commit: Major Updates. See commit details.

Major Updates. See commit details.

Updated ReadMe and docs.

Added ReadMe files to ActivityFeed and Push folders in samples folder.

Updated samples to use embedded frameworks for the UsergridSDK instead of cocoapods.

Updated ActivityFeed sample app to not include the Pods folder so we don't actually check in the 3rd party code used in the sample.

Added persistCurrentUserInKeychain to UsergridClientConfig.

Now saving the whole UsergridDevice object instead of just the UUID.

Added missing methods to UsergridClient, UsergridDevice and UsergridUser classes.


Project: http://git-wip-us.apache.org/repos/asf/usergrid/repo
Commit: http://git-wip-us.apache.org/repos/asf/usergrid/commit/c638c774
Tree: http://git-wip-us.apache.org/repos/asf/usergrid/tree/c638c774
Diff: http://git-wip-us.apache.org/repos/asf/usergrid/diff/c638c774

Branch: refs/heads/master
Commit: c638c77421ac532981fbb5a5960bc826a4ea026a
Parents: 7442c88
Author: Robert Walsh <rj...@gmail.com>
Authored: Mon Feb 15 15:21:07 2016 -0600
Committer: Robert Walsh <rj...@gmail.com>
Committed: Mon Feb 15 15:21:07 2016 -0600

----------------------------------------------------------------------
 sdks/swift/README.md                            |  737 +++++-
 .../ActivityFeed.xcodeproj/project.pbxproj      |  348 +--
 .../contents.xcworkspacedata                    |    3 -
 sdks/swift/Samples/ActivityFeed/Podfile         |    9 -
 sdks/swift/Samples/ActivityFeed/Podfile.lock    |   13 -
 .../SLKInputAccessoryView.h                     |    1 -
 .../SlackTextViewController/SLKTextInputbar.h   |    1 -
 .../SLKTextView+SLKAdditions.h                  |    1 -
 .../SlackTextViewController/SLKTextView.h       |    1 -
 .../SLKTextViewController.h                     |    1 -
 .../SLKTypingIndicatorProtocol.h                |    1 -
 .../SLKTypingIndicatorView.h                    |    1 -
 .../SlackTextViewController/SLKUIConstants.h    |    1 -
 .../UIResponder+SLKAdditions.h                  |    1 -
 .../UIScrollView+SLKAdditions.h                 |    1 -
 .../UIView+SLKAdditions.h                       |    1 -
 .../Samples/ActivityFeed/Pods/Manifest.lock     |   13 -
 .../Pods/Pods.xcodeproj/project.pbxproj         | 1132 ---------
 .../Pods/SlackTextViewController/LICENSE        |   14 -
 .../Pods/SlackTextViewController/README.md      |  412 ---
 .../Source/SLKInputAccessoryView.h              |   24 -
 .../Source/SLKInputAccessoryView.m              |   33 -
 .../Source/SLKTextInputbar.h                    |  153 --
 .../Source/SLKTextInputbar.m                    |  779 ------
 .../Source/SLKTextView+SLKAdditions.h           |   98 -
 .../Source/SLKTextView+SLKAdditions.m           |  189 --
 .../Source/SLKTextView.h                        |  148 --
 .../Source/SLKTextView.m                        | 1117 --------
 .../Source/SLKTextViewController.h              |  584 -----
 .../Source/SLKTextViewController.m              | 2392 ------------------
 .../Source/SLKTypingIndicatorProtocol.h         |   37 -
 .../Source/SLKTypingIndicatorView.h             |   65 -
 .../Source/SLKTypingIndicatorView.m             |  355 ---
 .../Source/SLKUIConstants.h                     |   50 -
 .../Source/UIResponder+SLKAdditions.h           |   29 -
 .../Source/UIResponder+SLKAdditions.m           |   39 -
 .../Source/UIScrollView+SLKAdditions.h          |   48 -
 .../Source/UIScrollView+SLKAdditions.m          |   80 -
 .../Source/UIView+SLKAdditions.h                |   61 -
 .../Source/UIView+SLKAdditions.m                |   78 -
 .../Pods-ActivityFeed-UsergridSDK/Info.plist    |   26 -
 .../Pods-ActivityFeed-UsergridSDK-dummy.m       |    5 -
 .../Pods-ActivityFeed-UsergridSDK-prefix.pch    |    4 -
 .../Pods-ActivityFeed-UsergridSDK-umbrella.h    |    6 -
 .../Pods-ActivityFeed-UsergridSDK.modulemap     |    6 -
 .../Pods-ActivityFeed-UsergridSDK.xcconfig      |    8 -
 .../Pods-ActivityFeed/Info.plist                |   26 -
 .../Pods-ActivityFeed-acknowledgements.markdown |  352 ---
 .../Pods-ActivityFeed-acknowledgements.plist    |  386 ---
 .../Pods-ActivityFeed/Pods-ActivityFeed-dummy.m |    5 -
 .../Pods-ActivityFeed-frameworks.sh             |   93 -
 .../Pods-ActivityFeed-resources.sh              |   95 -
 .../Pods-ActivityFeed-umbrella.h                |    6 -
 .../Pods-ActivityFeed.debug.xcconfig            |    9 -
 .../Pods-ActivityFeed.modulemap                 |    6 -
 .../Pods-ActivityFeed.release.xcconfig          |    9 -
 .../Info.plist                                  |   26 -
 ...ds-WatchSample Extension-UsergridSDK-dummy.m |    5 -
 ...WatchSample Extension-UsergridSDK-prefix.pch |    4 -
 ...WatchSample Extension-UsergridSDK-umbrella.h |    6 -
 ...-WatchSample Extension-UsergridSDK.modulemap |    6 -
 ...s-WatchSample Extension-UsergridSDK.xcconfig |    8 -
 .../Pods-WatchSample Extension/Info.plist       |   26 -
 ...chSample Extension-acknowledgements.markdown |  334 ---
 ...WatchSample Extension-acknowledgements.plist |  364 ---
 .../Pods-WatchSample Extension-dummy.m          |    5 -
 .../Pods-WatchSample Extension-frameworks.sh    |   91 -
 .../Pods-WatchSample Extension-resources.sh     |   95 -
 .../Pods-WatchSample Extension-umbrella.h       |    6 -
 .../Pods-WatchSample Extension.debug.xcconfig   |    9 -
 .../Pods-WatchSample Extension.modulemap        |    6 -
 .../Pods-WatchSample Extension.release.xcconfig |    9 -
 .../SlackTextViewController/Info.plist          |   26 -
 .../SlackTextViewController-dummy.m             |    5 -
 .../SlackTextViewController-prefix.pch          |    4 -
 .../SlackTextViewController-umbrella.h          |   17 -
 .../SlackTextViewController.modulemap           |    6 -
 .../SlackTextViewController.xcconfig            |    4 -
 .../ActivityFeed/Pods/UsergridSDK/LICENSE       |  327 ---
 .../Pods/UsergridSDK/README-Docs.md             |   13 -
 .../sdks/swift/Source/Usergrid.swift            |  610 -----
 .../sdks/swift/Source/UsergridAsset.swift       |  198 --
 .../Source/UsergridAssetRequestWrapper.swift    |   48 -
 .../sdks/swift/Source/UsergridAuth.swift        |  276 --
 .../sdks/swift/Source/UsergridClient.swift      |  875 -------
 .../swift/Source/UsergridClientConfig.swift     |  142 --
 .../sdks/swift/Source/UsergridDevice.swift      |  168 --
 .../sdks/swift/Source/UsergridEntity.swift      |  613 -----
 .../sdks/swift/Source/UsergridEnums.swift       |  415 ---
 .../sdks/swift/Source/UsergridExtensions.swift  |   42 -
 .../swift/Source/UsergridFileMetaData.swift     |  114 -
 .../swift/Source/UsergridKeychainHelpers.swift  |  148 --
 .../sdks/swift/Source/UsergridQuery.swift       |  530 ----
 .../sdks/swift/Source/UsergridRequest.swift     |  245 --
 .../swift/Source/UsergridRequestManager.swift   |  156 --
 .../sdks/swift/Source/UsergridResponse.swift    |  203 --
 .../swift/Source/UsergridResponseError.swift    |   90 -
 .../swift/Source/UsergridSessionDelegate.swift  |   90 -
 .../sdks/swift/Source/UsergridUser.swift        |  441 ----
 sdks/swift/Samples/ActivityFeed/Readme.md       |   29 +
 .../Source/FollowViewController.swift           |    1 +
 .../Source/LoginViewController.swift            |    1 +
 .../Source/RegisterViewController.swift         |    1 +
 .../ActivityFeed/Source/UsergridManager.swift   |    2 +-
 .../WatchSample/Base.lproj/Interface.storyboard |    8 +-
 sdks/swift/Samples/Push/Podfile                 |    5 -
 sdks/swift/Samples/Push/Podfile.lock            |   10 -
 sdks/swift/Samples/Push/Pods/Manifest.lock      |   10 -
 .../Push/Pods/Pods.xcodeproj/project.pbxproj    |  574 -----
 .../Pods/Target Support Files/Pods/Info.plist   |   26 -
 .../Pods/Pods-acknowledgements.markdown         |  334 ---
 .../Pods/Pods-acknowledgements.plist            |  364 ---
 .../Pods/Target Support Files/Pods/Pods-dummy.m |    5 -
 .../Pods/Pods-frameworks.sh                     |   91 -
 .../Target Support Files/Pods/Pods-resources.sh |   95 -
 .../Target Support Files/Pods/Pods-umbrella.h   |    6 -
 .../Pods/Pods.debug.xcconfig                    |    8 -
 .../Target Support Files/Pods/Pods.modulemap    |    6 -
 .../Pods/Pods.release.xcconfig                  |    8 -
 .../Target Support Files/UsergridSDK/Info.plist |   26 -
 .../UsergridSDK/UsergridSDK-dummy.m             |    5 -
 .../UsergridSDK/UsergridSDK-prefix.pch          |    4 -
 .../UsergridSDK/UsergridSDK-umbrella.h          |    6 -
 .../UsergridSDK/UsergridSDK.modulemap           |    6 -
 .../UsergridSDK/UsergridSDK.xcconfig            |    5 -
 .../swift/Samples/Push/Pods/UsergridSDK/LICENSE |  327 ---
 .../Push/Pods/UsergridSDK/README-Docs.md        |   13 -
 .../sdks/swift/Source/Usergrid.swift            |  610 -----
 .../sdks/swift/Source/UsergridAsset.swift       |  198 --
 .../Source/UsergridAssetRequestWrapper.swift    |   48 -
 .../sdks/swift/Source/UsergridAuth.swift        |  276 --
 .../sdks/swift/Source/UsergridClient.swift      |  875 -------
 .../swift/Source/UsergridClientConfig.swift     |  142 --
 .../sdks/swift/Source/UsergridDevice.swift      |  168 --
 .../sdks/swift/Source/UsergridEntity.swift      |  613 -----
 .../sdks/swift/Source/UsergridEnums.swift       |  415 ---
 .../sdks/swift/Source/UsergridExtensions.swift  |   42 -
 .../swift/Source/UsergridFileMetaData.swift     |  114 -
 .../swift/Source/UsergridKeychainHelpers.swift  |  148 --
 .../sdks/swift/Source/UsergridQuery.swift       |  530 ----
 .../sdks/swift/Source/UsergridRequest.swift     |  245 --
 .../swift/Source/UsergridRequestManager.swift   |  156 --
 .../sdks/swift/Source/UsergridResponse.swift    |  203 --
 .../swift/Source/UsergridResponseError.swift    |   90 -
 .../swift/Source/UsergridSessionDelegate.swift  |   90 -
 .../sdks/swift/Source/UsergridUser.swift        |  441 ----
 .../Samples/Push/Push.xcodeproj/project.pbxproj |  231 +-
 .../Push.xcworkspace/contents.xcworkspacedata   |    3 -
 .../xcshareddata/Push.xcscmblueprint            |   30 -
 sdks/swift/Samples/Push/Readme.md               |   21 +
 sdks/swift/Samples/Readme.md                    |   12 +-
 sdks/swift/Source/Usergrid.swift                |   43 +-
 sdks/swift/Source/UsergridClient.swift          |   61 +-
 sdks/swift/Source/UsergridClientConfig.swift    |   23 +-
 sdks/swift/Source/UsergridDevice.swift          |   56 +-
 sdks/swift/Source/UsergridEntity.swift          |   10 +-
 sdks/swift/Source/UsergridKeychainHelpers.swift |   66 +-
 sdks/swift/Source/UsergridQuery.swift           |   72 +-
 sdks/swift/Source/UsergridResponse.swift        |    8 +-
 sdks/swift/Source/UsergridUser.swift            |   62 +-
 sdks/swift/Tests/AUTH_Tests.swift               |    1 +
 sdks/swift/Tests/CONNECTION_Tests.swift         |    1 +
 sdks/swift/Tests/ClientCreationTests.swift      |    6 +-
 sdks/swift/Tests/GET_Tests.swift                |    7 +-
 sdks/swift/docs/Classes.html                    |    4 +-
 sdks/swift/docs/Classes/Usergrid.html           |  144 +-
 sdks/swift/docs/Classes/UsergridAppAuth.html    |    2 +-
 sdks/swift/docs/Classes/UsergridAsset.html      |    2 +-
 .../Classes/UsergridAssetUploadRequest.html     |    2 +-
 sdks/swift/docs/Classes/UsergridAuth.html       |    2 +-
 sdks/swift/docs/Classes/UsergridClient.html     |   90 +-
 .../docs/Classes/UsergridClientConfig.html      |   52 +-
 sdks/swift/docs/Classes/UsergridDevice.html     |   71 +-
 sdks/swift/docs/Classes/UsergridEntity.html     |    4 +-
 .../docs/Classes/UsergridFileMetaData.html      |    2 +-
 sdks/swift/docs/Classes/UsergridQuery.html      |  209 +-
 sdks/swift/docs/Classes/UsergridRequest.html    |    2 +-
 sdks/swift/docs/Classes/UsergridResponse.html   |    4 +-
 .../docs/Classes/UsergridResponseError.html     |    2 +-
 sdks/swift/docs/Classes/UsergridUser.html       |  268 +-
 sdks/swift/docs/Classes/UsergridUserAuth.html   |    2 +-
 sdks/swift/docs/Enums.html                      |    2 +-
 sdks/swift/docs/Enums/UsergridAuthFallback.html |    2 +-
 .../docs/Enums/UsergridDeviceProperties.html    |    2 +-
 sdks/swift/docs/Enums/UsergridDirection.html    |    2 +-
 .../docs/Enums/UsergridEntityProperties.html    |    2 +-
 sdks/swift/docs/Enums/UsergridHttpMethod.html   |    2 +-
 .../docs/Enums/UsergridImageContentType.html    |    2 +-
 .../swift/docs/Enums/UsergridQueryOperator.html |    2 +-
 .../docs/Enums/UsergridQuerySortOrder.html      |    2 +-
 .../docs/Enums/UsergridUserProperties.html      |    2 +-
 sdks/swift/docs/Global Variables.html           |    2 +-
 sdks/swift/docs/Typealiases.html                |    2 +-
 .../Contents/Resources/Documents/Classes.html   |    4 +-
 .../Resources/Documents/Classes/Usergrid.html   |  144 +-
 .../Documents/Classes/UsergridAppAuth.html      |    2 +-
 .../Documents/Classes/UsergridAsset.html        |    2 +-
 .../Classes/UsergridAssetUploadRequest.html     |    2 +-
 .../Documents/Classes/UsergridAuth.html         |    2 +-
 .../Documents/Classes/UsergridClient.html       |   90 +-
 .../Documents/Classes/UsergridClientConfig.html |   52 +-
 .../Documents/Classes/UsergridDevice.html       |   71 +-
 .../Documents/Classes/UsergridEntity.html       |    4 +-
 .../Documents/Classes/UsergridFileMetaData.html |    2 +-
 .../Documents/Classes/UsergridQuery.html        |  209 +-
 .../Documents/Classes/UsergridRequest.html      |    2 +-
 .../Documents/Classes/UsergridResponse.html     |    4 +-
 .../Classes/UsergridResponseError.html          |    2 +-
 .../Documents/Classes/UsergridUser.html         |  268 +-
 .../Documents/Classes/UsergridUserAuth.html     |    2 +-
 .../Contents/Resources/Documents/Enums.html     |    2 +-
 .../Documents/Enums/UsergridAuthFallback.html   |    2 +-
 .../Enums/UsergridDeviceProperties.html         |    2 +-
 .../Documents/Enums/UsergridDirection.html      |    2 +-
 .../Enums/UsergridEntityProperties.html         |    2 +-
 .../Documents/Enums/UsergridHttpMethod.html     |    2 +-
 .../Enums/UsergridImageContentType.html         |    2 +-
 .../Documents/Enums/UsergridQueryOperator.html  |    2 +-
 .../Documents/Enums/UsergridQuerySortOrder.html |    2 +-
 .../Documents/Enums/UsergridUserProperties.html |    2 +-
 .../Resources/Documents/Global Variables.html   |    2 +-
 .../Resources/Documents/Typealiases.html        |    2 +-
 .../Contents/Resources/Documents/index.html     |  695 ++++-
 .../Contents/Resources/docSet.dsidx             |  Bin 139264 -> 151552 bytes
 sdks/swift/docs/docsets/UsergridSDK.tgz         |  Bin 132184 -> 145485 bytes
 sdks/swift/docs/index.html                      |  695 ++++-
 226 files changed, 4400 insertions(+), 23754 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/usergrid/blob/c638c774/sdks/swift/README.md
----------------------------------------------------------------------
diff --git a/sdks/swift/README.md b/sdks/swift/README.md
index 8c9240c..be8b6f6 100644
--- a/sdks/swift/README.md
+++ b/sdks/swift/README.md
@@ -1,12 +1,16 @@
 # UsergridSDK
 
 [![Platform](https://img.shields.io/cocoapods/p/UsergridSDK.svg?style=flat)](http://cocoadocs.org/docsets/UsergridSDK)
-[![Cocoapods Compatible](https://img.shields.io/cocoapods/v/UsergridSDK.svg)](https://cocoapods.org/pods/UsergridSDK)
+[![CocoaPods Compatible](https://img.shields.io/cocoapods/v/UsergridSDK.svg)](https://cocoapods.org/pods/UsergridSDK)
 
 Usergrid SDK written in Swift 
 
 ## Requirements
 
+> **While the Usergrid SDK is written in Swift, the functionality remains compatible with Objective-C.**
+    
+> **Use `#import <UsergridSDK/UsergridSDK-Swift.h>` in your Objective-C files to enable the use of the SDK.**
+
 - iOS 8.0+ / Mac OS X 10.11+ / tvOS 9.1+ / watchOS 2.1+
 - Xcode 7.1+
 
@@ -65,23 +69,734 @@ The documentation for this library is available [here](http://cocoadocs.org/docs
 
 ## Initialization
 
-The `Usergrid` class acts as a static shared instance manager for the `UsergridClient` class.
+There are two different ways of initializing the Usergrid Swift SDK: 
+
+1. The singleton pattern is both convenient and enables the developer to use a globally available and always-initialized instance of Usergrid. 
 
-> While it is possible to create mutliple instances of the `UsergridClient` class, we recomend using the shared instance where possible.
+```swift
+Usergrid.initSharedInstance(orgId: "orgId", appId: "appId")
+```
 
-To initialize the shared instance of you will want to call the following code.  This code usually goes best in the AppDelegate's life cycle functions.
+2. The Instance pattern enables the developer to manage instances of the Usergrid client independently and in an isolated fashion. The primary use-case for this is when an application connects to multiple Usergrid targets.
+
+```swift
+let client = UsergridClient(orgId: "orgId", appId: "appId")
+```
+
+_Note: Examples in this readme assume you are using the `Usergrid` shared instance. If you've implemented the instance pattern instead, simply replace `Usergrid` with your client instance variable._
+
+## Push Notifications
+
+_Note: You must have an Apple Developer account along with valid provisioning profiles set in order to receive push notifications._
+
+In order to utilize Usergrid push notifications, you must register the device with an Usergrid push notifier identifier.
+
+> For a more thorough example of recieving push notifications and sending push notifications (from the device) refer to the Push sample app located in the `/Samples` folder.
+
+The following code snippet shows how you would register for push notifications and apply the push token within the application delegate.
 
 ```swift
 import UsergridSDK
 
-func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool
-    Usergrid.initSharedInstance(orgID: "orgID", appID: "appID")
-    return true
+@UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate {
+
+    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
+
+        // Initialize the shared instance of Usergrid.
+        Usergrid.initSharedInstance(orgId:"orgId", appId: "appId")
+
+        // Register for APN
+        application.registerUserNotificationSettings(UIUserNotificationSettings( forTypes: [.Alert, .Badge, .Sound], categories: nil))
+        application.registerForRemoteNotifications()
+
+        return true
+    }
+
+    func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) {
+        Usergrid.applyPushToken(deviceToken, notifierID: "notifierId") { response in
+            // The push notification is now added to Usergrid for this device and this device will now be able to recieve notifications.
+        }
+    }
+}
+```
+
+## RESTful operations
+
+When making any RESTful call, a `type` parameter (or `path`) is always required. Whether you specify this as an argument or in an object as a parameter is up to you.
+
+### GET
+
+- To get entities in a collection:
+
+```swift
+Usergrid.GET("collection") { response in
+    var entities: [UsergridEntity]? = response.entities
+}
+```
+
+- To get a specific entity in a collection by uuid or name:
+
+```swift
+Usergrid.GET("collection", uuidOrName:"<uuid-or-name>") { response in
+    var entity: UsergridEntity? = response.entity?
+}
+```
+
+- To get specific entities in a collection by passing a `UsergridQuery` object:
+
+```swift
+var query = UsergridQuery("cats").gt("weight", value: 2.4)
+                                 .contains("color", value:"bl*")
+                                 .not()
+                                 .eq("color", value:"blue")
+                                 .or()
+                                 .eq("color", value:"orange")
+	
+// this will build out the following query:
+// select * where weight > 2.4 and color contains 'bl*' and not color = 'blue' or color = 'orange'
+	
+Usergrid.GET(query) { response in
+    var entities: [UsergridEntity]? = response.entities
+}
+```
+
+### POST and PUT
+
+POST and PUT requests both require a JSON body payload. You can pass either a Swift object or a `UsergridEntity` instance. While the former works in principle, best practise is to use a `UsergridEntity` wherever practical. When an entity has a uuid or name property and already exists on the server, use a PUT request to update it. If it does not, use POST to create it.
+
+- To create a new entity in a collection (**POST**):
+
+```swift
+var entity = UsergridEntity(type: "restaurant", propertyDict: ["restaurant": "Dino's Deep Dish","cuisine": "pizza"])
+	
+Usergrid.POST(entity) { response in
+    // entity should now have a uuid property and be created
+}
+	
+// you can also POST an array of entities:
+	
+var entities = [UsergridEntity(type: "restaurant", propertyDict:["restaurant": "Dino's Deep Dish","cuisine": "pizza"]), 
+                UsergridEntity(type: "restaurant", propertyDict:["restaurant": "Pizza da Napoli","cuisine": "pizza"])]
+	
+Usergrid.POST(entities) { response in
+    // response.entities should now contain now valid posted entities.
+}
+```
+
+- To update an entity in a collection (**PUT**):
+
+```swift
+var entity = UsergridEntity(type: "restaurant", propertyDict:["restaurant": "Dino's Deep Dish", "cuisine": "pizza"])
+	
+Usergrid.POST(entity) { response in
+    if let responseEntity = response.entity {
+        responseEntity["owner"] = "Mia Carrara"
+        Usergrid.PUT(responseEntity) { (response) -> Void in
+            // entity now has the property 'owner'
+        }
+    }
+}
+	
+// or update a set of entities by passing a UsergridQuery object
+	
+var query = UsergridQuery("restaurants").eq("cuisine", value:"italian")
+	
+Usergrid.PUT(query, jsonBody: ["keywords":["pasta"]]) { response in
+	
+    /* the first 10 entities matching this query criteria will be updated:
+    e.g.:
+        [
+            {
+                "type": "restaurant",
+                "restaurant": "Il Tarazzo",
+                "cuisine": "italian",
+                "keywords": ["pasta"]
+            },
+            {
+                "type": "restaurant",
+                "restaurant": "Cono Sur Pizza & Pasta",
+                "cuisine": "italian",
+                "keywords": ["pasta"]
+            }
+        ]
+    */
+}
+```
+
+### DELETE
+
+DELETE requests require either a specific entity or a `UsergridQuery` object to be passed as an argument.
+
+- To delete a specific entity in a collection by uuid or name:
+
+```swift
+Usergrid.DELETE("collection", uuidOrName: "<uuid-or-name>") { response in
+    // if successful, entity will now be deleted
+})
+```
+
+- To specific entities in a collection to delete by passing a `UsergridQuery` object:
+
+```swift
+let query = UsergridQuery("cats").eq("color", value:"black")
+                                 .or()
+                                 .eq("color", value:"white")
+	
+// this will build out the following query:
+// select * where color = 'black' or color = 'white'
+	
+Usergrid.DELETE(query) { response in
+    // the first 10 entities matching this query criteria will be deleted
+}
+```
+
+## Entity operations and convenience methods
+
+`UsergridEntity` has a number of helper/convenience methods to make working with entities more convenient.
+
+### reload()
+
+Reloads the entity from the server:
+
+```swift
+entity.reload() { response in
+    // entity is now reloaded from the server
+}
+```
+
+### save()
+
+Saves (or creates) the entity on the server:
+
+
+```swift
+entity["aNewProperty"] = "A new value"
+entity.save() { response in
+    // entity is now updated on the server
+}
+```
+
+### remove()
+
+Deletes the entity from the server:
+
+```swift
+entity.remove() { response in
+    // entity is now deleted on the server and the local instance should be destroyed
+}
+```
+
+## Authentication, current user, and auth-fallback
+
+### appAuth and authenticateApp()
+
+`Usergrid` can use the app client ID and secret that were passed upon initialization and automatically retrieve an app-level token for these credentials.
+
+```swift
+Usergrid.setAppAuth("<client-id>", "<client-secret>")
+Usergrid.authenticateApp() { response in
+    // Usergrid.appAuth is authenticated automatically when this call is successful
+}
+```
+
+### currentUser, userAuth,  and authenticateUser()
+
+`Usergrid` has a special `currentUser` property. 
+
+> The current user is stored within the keychain so app relaunches will persist the user's login and token information.  To adjust this feature edit the `Usergrid.persistCurrentUserInKeychain` property upon initialization.
+
+By default, when calling `authenticateUser()`, `.currentUser` will be set to this user if the authentication flow is successful.
+
+```swift
+let userAuth = UsergridUserAuth(username: "<username>", password: "<password>")
+Usergrid.authenticateUser(userAuth) { auth, user, error in
+    // Usergrid.currentUser is set to the authenticated user and the token is stored within that context
+}
+```
+    
+If you want to utilize authenticateUser without setting as the current user, simply pass a `false` boolean value as the second parameter:
+
+```swift
+let userAuth = UsergridUserAuth(username: "<username>", password: "<password>")
+Usergrid.authenticateUser(userAuth,setAsCurrentUser: false) { auth, user, error in
+    // user is authenticated but Usergrid.currentUser is not set.
+}
+```
+
+### authFallback
+
+Auth-fallback defines what the client should do when a user token is not present. 
+
+By default, `Usergrid.authFallback` is set to `.None`, whereby when a token is *not* present, an API call will be performed unauthenticated. 
+
+If instead `Usergrid.authFallback` is set to `.App`, the API call will instead be performed using client credentials, _if_ they're available (i.e. `authenticateApp()` was performed at some point). 
+
+### usingAuth()
+
+At times it is desireable to have complete, granular control over the authentication context of an API call. 
+
+To facilitate this, the passthrough function `.usingAuth()` allows you to pre-define the auth context of the next API call.
+
+```swift
+// assume Usergrid.authFallback = .None
+    
+Usergrid.usingAuth(Usergrid.appAuth!).POST("roles/guest/permissions", jsonBody: ["permission" : "get,post,put,delete:/**"] ) { response in
+    // here we've temporarily used the client credentials to modify permissions
+    // subsequent calls will not use this auth context
+}
+```
+
+## User operations and convenience methods
+
+`UsergridUser` has a number of helper/convenience methods to make working with user entities more convenient. If you are _not_ utilizing the `Usergrid` shared instance, you must pass an instance of `UsergridClient` as the first argument to any of these helper methods.
+    
+### create()
+
+Creating a new user:
+
+```swift
+let user = UsergridUser(username: "username", password: "password")
+user.create() { response in
+    // user has now been created and should have a valid uuid
+}
+```
+
+### login()
+
+A simpler means of retrieving a user-level token:
+
+```swift
+user.login("username", password: "password") { auth, user, error in
+	// user is now logged in
+}
+```
+
+### logout()
+
+Logs out the selected user. You can also use this convenience method on `Usergrid.currentUser`.
+
+```swift
+user.logout() { response in
+	// user is now logged out
+}
+```
+
+### resetPassword()
+
+Resets the password for the selected user.
+
+```swift
+user.resetPassword("oldPassword", new: "newPassword") { error, didSucceed in
+    // if it was done correctly, the new password will be changed
+    // 'didSucceed' is a boolean value that indicates whether it was changed successfully
+}
+```
+
+### UsergridUser.CheckAvailable()
+
+This is a class (static) method that allows you to check whether a username or email address is available or not.
+
+```swift
+UsergridUser.checkAvailable("email", username: nil) { error, available in
+    // 'available' == whether an email already exists for a user
+}
+
+UsergridUser.checkAvailable(nil, username: "username") { error, available in
+    // 'available' == whether an username already exists for a user
+}
+
+UsergridUser.checkAvailable("email", username: "username") { error, available in
+    // 'available' == whether an email or username already exist for a user
+}
+```
+
+## Querying and filtering data
+
+### UsergridQuery initialization
+
+The `UsergridQuery` class allows you to build out complex query filters using the Usergrid [query syntax](http://docs.apigee.com/app-services/content/querying-your-data).
+
+The first parameter of the `UsergridQuery` builder pattern should be the collection (or type) you intend to query. You can either pass this as an argument, or as the first builder object:
+
+```swift
+var query = UsergridQuery("cats")
+// or
+var query = UsergridQuery().collection("cats")
+```
+
+You then can layer on additional queries:
+
+```swift
+var query = UsergridQuery("cats").gt("weight", value: 2.4)
+                                 .contains("color", value: "bl*")
+                                 .not()
+                                 .eq("color", value:"white")
+                                 .or()
+                                 .eq("color", value:"orange")
+```
+
+You can also adjust the number of results returned:
+
+```swift
+var query = UsergridQuery("cats").eq("color", value: "black")
+                                 .limit(100)
+                                 
+// returns a maximum of 100 entiteis
+```
+
+And sort the results:
+
+```swift
+var query = UsergridQuery("cats").eq("color", value: "black")
+                                 .limit(100)
+                                 .asc("name")
+                                 
+// sorts by 'name', ascending
+```
+
+And you can do geo-location queries:
+
+```swift
+var query = UsergridQuery("devices").locationWithin(<distance>, latitude: <lat>, longitude: <long>)
+```
+
+### Using a query in a request
+
+Queries can be passed as parameters to GET, PUT, and DELETE requests:
+
+```swift
+Usergrid.GET("type", query: query) { response in
+    // Gets entities of a given type matching the query.
+}
+
+Usergrid.PUT(query, jsonBody: ["aNewProperty":"A new value"]) { response in
+    // Updates the entities matching the query with the new property.
+}
+
+Usergrid.DELETE(query) { response in
+    // Deletes entities of a given type matching the query.
 }
 ```
+### List of query builder objects
+
+`type("string")`
+
+> The collection name to query
+
+`collection("string")`
+
+> An alias for `type`
+
+`eq("key", value: "value")` or 
+`equals("key", value: "value")` or 
+`filter("key", value: "value")` 
+
+> Equal to (e.g. `where color = 'black'`)
+
+`contains("key", value: "value")` or
+`containsString("key", value: "value")` or
+`containsWord("key", value: "value")`
+
+> Contains a string (e.g.` where color contains 'bl*'`)
+
+`gt("key", value: "value")` or
+`greaterThan("key", value: "value")`
+
+> Greater than (e.g. `where weight > 2.4`)
+
+`gte("key", value: "value")` or 
+`greaterThanOrEqual("key", value: "value")`
+
+> Greater than or equal to (e.g. `where weight >= 2.4`)
+
+`lt("key", value: "value")` or `lessThan("key", value: "value")`
+
+> Less than (e.g. `where weight < 2.4`)
+
+`lte("key", value: "value")` or `lessThanOrEqual("key", value: "value")`
+
+> Less than or equal to (e.g. `where weight <= 2.4`)
+
+`not()`
+
+> Negates the next block in the builder pattern, e.g.:
+
+```swift
+var query = UsergridQuery("cats").not().eq("color", value: "black")
+// select * from cats where not color = 'black'
+```
+
+`and()`
+
+> Joins two queries by requiring both of them. `and` is also implied when joining two queries _without_ an operator. E.g.:
+
+```swift
+var query = UsergridQuery("cats").eq("color", value:"black").eq("fur", value:"longHair")
+// is identical to:
+var query = UsergridQuery("cats").eq("color", value:"black").and().eq("fur", value:"longHair")  
+```
+
+`or()`
+
+> Joins two queries by requiring only one of them. `or` is never implied. e.g.:
+
+```swift
+var query = UsergridQuery("cats").eq("color",value: "black").or().eq("color", value: "white")
+```
+    
+> When using `or()` and `and()` operators, `and()` joins will take precedence over `or()` joins. You can read more about query operators and precedence [here](http://docs.apigee.com/api-baas/content/supported-query-operators-data-types).
+
+`locationWithin(distanceInMeters, latitude: latitude, longitude: longitude)`
+
+> Returns entities which have a location within the specified radius. Arguments can be `float` or `int`.
+
+`asc("key")` or `ascending("key")`
+
+> Sorts the results by the specified property, ascending
+
+`desc("key")` or `descending("key")`
+
+> Sorts the results by the specified property, descending
+
+`sort("key", value: .Asc)`
+
+> Sorts the results by the specified property, in the specified `UsergridQuerySortOrder` (`.Asc` or `.Desc`).
+ 
+`limit(int)`
+
+> The maximum number of entities to return
+
+`cursor("string")`
+
+> A pagination cursor string
+
+`fromString("query string")`
+
+> A special builder property that allows you to input a pre-defined query string. All builder properties will be ignored when this property is defined. For example:
+    
+```swift
+var query = UsergridQuery().fromString("select * where color = 'black' order by name asc")
+```
+
+## UsergridResponse object
+
+`UsergridResponse` is the core class that handles both successful and unsuccessful HTTP responses from Usergrid. 
+
+If a request is successful, any entities returned in the response will be automatically parsed into `UsergridEntity` objects and pushed to the `entities` property.
+
+If a request fails, the `error` property will contain information about the problem encountered.
+
+### ok
+
+You can check `UsergridResponse.ok`, a `Bool` value, to see if the response was successful. Any status code `< 400` returns true.
+
+```swift
+Usergrid.GET("collection") { response in
+    if response.ok {
+        // woo!
+    }
+}
+```
+    
+### entity, entities, user, users, first, last
+
+Depending on the call you make, any entities returned in the response will be automatically parsed into `UsergridEntity` objects and pushed to the `entities` property. If you're querying the `users` collection, these will also be `UsergridUser` objects, a subclass of `UsergridEntity`.
+
+- `.first` returns the first entity in an array of entities; `.entity` is an alias to `.first`. If there are no entities, both of these will be undefined.
+
+- `.last` returns the last entity in an array of entities; if there is only one entity in the array, this will be the same as `.first` _and_ `.entity`, and will be undefined if there are no entities in the response.
+
+- `.entities` will either be an array of entities in the response, or an empty array.
+
+- `.user` is a special alias for `.entity` for when querying the `users` collection. Instead of being a `UsergridEntity`, it will be its subclass, `UsergridUser`.
+
+- `.users` is the same as `.user`, though behaves as `.entities` does by returning either an array of UsergridUser objects or an empty array.
 
-## Communication
+Examples:
 
-- If you **found a bug**, open an issue.
-- If you **have a feature request**, open an issue.
-- If you **want to contribute**, submit a pull request.
+```swift
+Usergrid.GET("collection") { response in
+    // you can access:
+    //     response.entities (the returned entities)
+    //     response.first (the first entity)
+    //     response.entity (same as response.first)
+    //     response.last (the last entity returned)
+}
+
+Usergrid.GET("collection", uuidOrName:"<uuid-or-name>") { response in
+    // you can access:
+    //     response.entity (the returned entity) 
+    //     response.entities (containing only the returned entity)
+    //     response.first (same as response.entity)
+    //     response.last (same as response.entity)
+}
+
+Usergrid.GET("users") { response in
+    // you can access:
+    //     response.users (the returned users)
+    //     response.entities (same as response.users)
+    //     response.user (the first user)    
+    //     response.entity (same as response.user)   
+    //     response.first (same as response.user)  
+    //     response.last (the last user)
+}
+
+Usergrid.GET("users", uuidOrName:"<uuid-or-name>") { response in
+    // you can access;
+    //     response.users (containing only the one user)
+    //     response.entities (same as response.users)
+    //     response.user (the returned user)    
+    //     response.entity (same as response.user)   
+    //     response.first (same as response.user)  
+    //     response.last (same as response.user)  
+}
+```
+
+## Connections
+
+Connections can be managed using `Usergrid.connect()`, `Usergrid.disconnect()`, and `Usergrid.getConnections()`, or entity convenience methods of the same name. 
+
+When retrieving connections via `Usergrid.getConnections()`, you can pass in a optional `UsergridQuery` object in order to filter the connectioned entities returned.
+
+### Connect
+
+Create a connection between two entities:
+
+```swift
+Usergrid.connect(entity1, relationship: "relationship", to: entity2) { response in
+    // entity1 now has an outbound connection to entity2
+}
+```
+
+### Retrieve Connections
+
+Retrieve outbound connections:
+
+```swift
+Usergrid.getConnections(.Out, entity: entity1, relationship: "relationship", query: nil) { response in
+    // entities is an array of entities that entity1 is connected to via 'relationship'
+    // in this case, we'll see entity2 in the array
+}
+```
+
+Retrieve inbound connections:
+
+```swift
+Usergrid.getConnections(.In, entity: entity2, relationship: "relationship", query: nil) { response in
+    // entities is an array of entities that connect to entity2 via 'relationship'
+    // in this case, we'll see entity1 in the array
+}
+```
+
+### Disconnect
+
+Delete a connection between two entities:
+
+```swift
+Usergrid.disconnect(entity1, relationship: "relationship", from: entity2) { response in
+    // entity1's outbound connection to entity2 has been destroyed
+}
+```
+
+## Assets
+
+Assets can be uploaded and downloaded either directly using `Usergrid.uploadAsset()` or `Usergrid.downloadAsset()`, or via `UsergridEntity` convenience methods with the same names. Before uploading an asset, you will need to initialize a `UsergridAsset` instance.
+
+### Initialization
+
+_Note: When initializing a `UsergridAsset` object specifying a file name is optional._
+
+- Using NSData:
+
+```swift
+let image = UIImage(contentsOfFile: "path/to/image")
+let data = UIImagePNGRepresentation(image)
+let asset = UsergridAsset(fileName:"<file-name-or-nil>", data: data!, contentType:"image/png")
+```
+
+- Using an UIImage object:
+
+```swift
+let image = UIImage(contentsOfFile: "path/to/image")
+let asset = UsergridAsset(fileName:"<file-name-or-nil>", image: image!, imageContentType: .Png)
+```
+
+- Using a file URL:
+
+```swift
+let fileUrl = NSURL(string: "local/path/to/file")
+if fileUrl.isFileReferenceURL() {  // This must be a file reference url.
+    let asset = UsergridAsset(fileName:"<file-name-or-nil>", fileUrl: fileUrl!, contentType:"<content-type>")
+}
+```
+
+### Uploading
+
+Upload an image and connect it to an entity:
+
+```swift
+let image = UIImage(contentsOfFile: "path/to/image")
+let asset = UsergridAsset(fileName:"<file-name-or-nil>", image: image!, imageContentType: .Png)!
+Usergrid.uploadAsset(entity,
+                     asset: asset,
+                     progress: { bytesFinished, bytesExpected in
+                        // Monitor the upload progress
+                     },
+                     completion: { response, asset, error in
+                        // The asset is now uploaded to Usergrid and entity.asset == asset
+})
+```
+
+### Downloading
+
+Download an image which is connected to an entity:
+
+```swift
+Usergrid.downloadAsset(entity,
+                       contentType: "<expected-content-type>",
+                       progress: { bytesFinished, bytesExpected in
+                            // Monitor the download progress
+                       },
+                       completion:{ asset, error in
+                            // The asset is now downloaded from Usergrid and entity.asset == asset
+})
+```
+
+## Custom UsergridEntity Subclasses
+
+Creating custom subclasses of the base `UsergridEntity` class (just like `UsergridUser` and `UsergridDevice`) is possible.
+
+> For a working example of creating a custom subclass refer to the ActivityFeed sample app located in the `/Samples` folder.  The custom subclass there is named `ActivityEntity`.
+
+- To do so, subclass `UsergridEntity` and implement the required methods:
+
+```swift
+import UsergridSDK
+	
+public class ActivityEntity: UsergridEntity {
+	
+    required public init(type: String, name: String?, propertyDict: [String : AnyObject]?) {
+        super.init(type: type, name: name, propertyDict: propertyDict)
+    }
+	
+    required public init?(coder aDecoder: NSCoder) {
+        super.init(coder: aDecoder)
+    }
+}
+```
+- You will also need to register the custom subclass:
+
+```swift
+Usergrid.initSharedInstance(orgId: "orgId", appId: "appId")
+UsergridEntity.mapCustomType("activity", toSubclass: ActivityEntity.self)
+```
+
+By registering your custom subclass, the `UsergridEntity` and `UsergridResponse` classes are able to generate instances of these classes based on the an entities `type`.
+
+In the above example, entities which have a `type` value of `activity` can now be cast as `ActivityEntity` objects. e.g.:
+
+```swift
+Usergrid.GET("activity") { response in
+    var activityEntities: [ActivityEntity]? = response.entities as? [ActivityEntity]
+}
+```

http://git-wip-us.apache.org/repos/asf/usergrid/blob/c638c774/sdks/swift/Samples/ActivityFeed/ActivityFeed.xcodeproj/project.pbxproj
----------------------------------------------------------------------
diff --git a/sdks/swift/Samples/ActivityFeed/ActivityFeed.xcodeproj/project.pbxproj b/sdks/swift/Samples/ActivityFeed/ActivityFeed.xcodeproj/project.pbxproj
index da73d1d..215ca87 100644
--- a/sdks/swift/Samples/ActivityFeed/ActivityFeed.xcodeproj/project.pbxproj
+++ b/sdks/swift/Samples/ActivityFeed/ActivityFeed.xcodeproj/project.pbxproj
@@ -7,8 +7,10 @@
 	objects = {
 
 /* Begin PBXBuildFile section */
-		0110C4E8B22ACDC3DADC6E98 /* Pods_ActivityFeed.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8D13656DC30773B0295408B9 /* Pods_ActivityFeed.framework */; };
-		55CCCA97F765398655CE5DA4 /* Pods_WatchSample_Extension.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 33AB73250FAB15F2DBBC680F /* Pods_WatchSample_Extension.framework */; };
+		634855401C726AE9005FE016 /* UsergridSDK.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 634855331C726AD3005FE016 /* UsergridSDK.framework */; };
+		634855411C726AE9005FE016 /* UsergridSDK.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 634855331C726AD3005FE016 /* UsergridSDK.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
+		634855451C726AF7005FE016 /* UsergridSDK.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 634855351C726AD3005FE016 /* UsergridSDK.framework */; };
+		634855461C726AF7005FE016 /* UsergridSDK.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 634855351C726AD3005FE016 /* UsergridSDK.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
 		6348D95F1C4EAC0B005C978C /* Interface.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 6348D95D1C4EAC0B005C978C /* Interface.storyboard */; };
 		6348D9611C4EAC0B005C978C /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 6348D9601C4EAC0B005C978C /* Assets.xcassets */; };
 		6348D9681C4EAC0B005C978C /* WatchSample Extension.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 6348D9671C4EAC0B005C978C /* WatchSample Extension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
@@ -35,6 +37,69 @@
 /* End PBXBuildFile section */
 
 /* Begin PBXContainerItemProxy section */
+		634855321C726AD3005FE016 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 634855281C726AD3005FE016 /* UsergridSDK.xcodeproj */;
+			proxyType = 2;
+			remoteGlobalIDString = 63AF0E881BBC38FB009D4196;
+			remoteInfo = "UsergridSDK iOS";
+		};
+		634855341C726AD3005FE016 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 634855281C726AD3005FE016 /* UsergridSDK.xcodeproj */;
+			proxyType = 2;
+			remoteGlobalIDString = 639B4BEB1C3DD6CF005E26E7;
+			remoteInfo = "UsergridSDK watchOS";
+		};
+		634855361C726AD3005FE016 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 634855281C726AD3005FE016 /* UsergridSDK.xcodeproj */;
+			proxyType = 2;
+			remoteGlobalIDString = 63EE610B1C406E1600AFC2CF;
+			remoteInfo = "UsergridSDK tvOS";
+		};
+		634855381C726AD3005FE016 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 634855281C726AD3005FE016 /* UsergridSDK.xcodeproj */;
+			proxyType = 2;
+			remoteGlobalIDString = 631920451C48436500F99E86;
+			remoteInfo = "UsergridSDK OSX";
+		};
+		6348553A1C726AD3005FE016 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 634855281C726AD3005FE016 /* UsergridSDK.xcodeproj */;
+			proxyType = 2;
+			remoteGlobalIDString = 6319204B1C49BC0700F99E86;
+			remoteInfo = UsergridSDK_TVOS_Tests;
+		};
+		6348553C1C726AD3005FE016 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 634855281C726AD3005FE016 /* UsergridSDK.xcodeproj */;
+			proxyType = 2;
+			remoteGlobalIDString = 630A219F1C49BFFC008BE87F;
+			remoteInfo = UsergridSDK_OSX_Tests;
+		};
+		6348553E1C726AD3005FE016 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 634855281C726AD3005FE016 /* UsergridSDK.xcodeproj */;
+			proxyType = 2;
+			remoteGlobalIDString = 630A21B81C49C473008BE87F;
+			remoteInfo = UsergridSDK_iOS_Tests;
+		};
+		634855421C726AE9005FE016 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 634855281C726AD3005FE016 /* UsergridSDK.xcodeproj */;
+			proxyType = 1;
+			remoteGlobalIDString = 63AF0E871BBC38FB009D4196;
+			remoteInfo = "UsergridSDK iOS";
+		};
+		634855471C726AF7005FE016 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 634855281C726AD3005FE016 /* UsergridSDK.xcodeproj */;
+			proxyType = 1;
+			remoteGlobalIDString = 639B4BEA1C3DD6CF005E26E7;
+			remoteInfo = "UsergridSDK watchOS";
+		};
 		6348D9691C4EAC0B005C978C /* PBXContainerItemProxy */ = {
 			isa = PBXContainerItemProxy;
 			containerPortal = 6355FEB91BFE4FC600E07170 /* Project object */;
@@ -52,6 +117,28 @@
 /* End PBXContainerItemProxy section */
 
 /* Begin PBXCopyFilesBuildPhase section */
+		634855441C726AE9005FE016 /* Embed Frameworks */ = {
+			isa = PBXCopyFilesBuildPhase;
+			buildActionMask = 2147483647;
+			dstPath = "";
+			dstSubfolderSpec = 10;
+			files = (
+				634855411C726AE9005FE016 /* UsergridSDK.framework in Embed Frameworks */,
+			);
+			name = "Embed Frameworks";
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		634855491C726AF8005FE016 /* Embed Frameworks */ = {
+			isa = PBXCopyFilesBuildPhase;
+			buildActionMask = 2147483647;
+			dstPath = "";
+			dstSubfolderSpec = 10;
+			files = (
+				634855461C726AF7005FE016 /* UsergridSDK.framework in Embed Frameworks */,
+			);
+			name = "Embed Frameworks";
+			runOnlyForDeploymentPostprocessing = 0;
+		};
 		6348D97B1C4EAC0C005C978C /* Embed App Extensions */ = {
 			isa = PBXCopyFilesBuildPhase;
 			buildActionMask = 2147483647;
@@ -77,8 +164,7 @@
 /* End PBXCopyFilesBuildPhase section */
 
 /* Begin PBXFileReference section */
-		11770D6403BBFAC636BD634F /* Pods-WatchSample Extension.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-WatchSample Extension.release.xcconfig"; path = "Pods/Target Support Files/Pods-WatchSample Extension/Pods-WatchSample Extension.release.xcconfig"; sourceTree = "<group>"; };
-		33AB73250FAB15F2DBBC680F /* Pods_WatchSample_Extension.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_WatchSample_Extension.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+		634855281C726AD3005FE016 /* UsergridSDK.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = UsergridSDK.xcodeproj; path = ../../UsergridSDK.xcodeproj; sourceTree = "<group>"; };
 		6348D95B1C4EAC0B005C978C /* WatchSample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = WatchSample.app; sourceTree = BUILT_PRODUCTS_DIR; };
 		6348D95E1C4EAC0B005C978C /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Interface.storyboard; sourceTree = "<group>"; };
 		6348D9601C4EAC0B005C978C /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
@@ -88,8 +174,6 @@
 		6348D96E1C4EAC0B005C978C /* ExtensionDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExtensionDelegate.swift; sourceTree = "<group>"; };
 		6348D9701C4EAC0C005C978C /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
 		6348D9721C4EAC0C005C978C /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
-		6348D9801C4EB45C005C978C /* UsergridSDK.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UsergridSDK.framework; path = "Pods/../build/Debug-iphoneos/UsergridSDK.framework"; sourceTree = "<group>"; };
-		6348D9821C4EB590005C978C /* Pods.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Pods.framework; path = "Pods/../build/Debug-iphoneos/Pods.framework"; sourceTree = "<group>"; };
 		6348D9851C4EC1FD005C978C /* UsergridManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UsergridManager.swift; sourceTree = "<group>"; };
 		6355FEC11BFE4FC600E07170 /* ActivityFeed.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ActivityFeed.app; sourceTree = BUILT_PRODUCTS_DIR; };
 		6355FEC41BFE4FC600E07170 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
@@ -106,12 +190,6 @@
 		63E7DD771C518E0400D84B12 /* MessageViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MessageViewController.swift; sourceTree = "<group>"; };
 		63E7DD791C518F1700D84B12 /* FollowViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FollowViewController.swift; sourceTree = "<group>"; };
 		63E7DD7D1C518FDD00D84B12 /* FormTextField.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FormTextField.swift; sourceTree = "<group>"; };
-		73A2B8D2F7EA89F650F04C7F /* Pods-ActivityFeed.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ActivityFeed.debug.xcconfig"; path = "Pods/Target Support Files/Pods-ActivityFeed/Pods-ActivityFeed.debug.xcconfig"; sourceTree = "<group>"; };
-		759B5E451ADDEAFCFC675B4E /* Pods-WatchSample Extension.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-WatchSample Extension.debug.xcconfig"; path = "Pods/Target Support Files/Pods-WatchSample Extension/Pods-WatchSample Extension.debug.xcconfig"; sourceTree = "<group>"; };
-		8BEAAECA0D546D0C1893CE9A /* Pods.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods.framework; sourceTree = BUILT_PRODUCTS_DIR; };
-		8D13656DC30773B0295408B9 /* Pods_ActivityFeed.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_ActivityFeed.framework; sourceTree = BUILT_PRODUCTS_DIR; };
-		AC7800A4D424F7EEB81D8631 /* Pods_SDKSample.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_SDKSample.framework; sourceTree = BUILT_PRODUCTS_DIR; };
-		C9344ED6EB68998ACAFBD88C /* Pods-ActivityFeed.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ActivityFeed.release.xcconfig"; path = "Pods/Target Support Files/Pods-ActivityFeed/Pods-ActivityFeed.release.xcconfig"; sourceTree = "<group>"; };
 /* End PBXFileReference section */
 
 /* Begin PBXFrameworksBuildPhase section */
@@ -119,7 +197,7 @@
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				55CCCA97F765398655CE5DA4 /* Pods_WatchSample_Extension.framework in Frameworks */,
+				634855451C726AF7005FE016 /* UsergridSDK.framework in Frameworks */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -127,13 +205,27 @@
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				0110C4E8B22ACDC3DADC6E98 /* Pods_ActivityFeed.framework in Frameworks */,
+				634855401C726AE9005FE016 /* UsergridSDK.framework in Frameworks */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
 /* End PBXFrameworksBuildPhase section */
 
 /* Begin PBXGroup section */
+		634855291C726AD3005FE016 /* Products */ = {
+			isa = PBXGroup;
+			children = (
+				634855331C726AD3005FE016 /* UsergridSDK.framework */,
+				634855351C726AD3005FE016 /* UsergridSDK.framework */,
+				634855371C726AD3005FE016 /* UsergridSDK.framework */,
+				634855391C726AD3005FE016 /* UsergridSDK.framework */,
+				6348553B1C726AD3005FE016 /* UsergridSDK_TVOS_Tests.xctest */,
+				6348553D1C726AD3005FE016 /* UsergridSDK_OSX_Tests.xctest */,
+				6348553F1C726AD3005FE016 /* UsergridSDK_iOS_Tests.xctest */,
+			);
+			name = Products;
+			sourceTree = "<group>";
+		};
 		6348D95C1C4EAC0B005C978C /* WatchSample */ = {
 			isa = PBXGroup;
 			children = (
@@ -158,12 +250,11 @@
 		6355FEB81BFE4FC600E07170 = {
 			isa = PBXGroup;
 			children = (
+				634855281C726AD3005FE016 /* UsergridSDK.xcodeproj */,
 				6355FEC31BFE4FC600E07170 /* Source */,
 				6348D95C1C4EAC0B005C978C /* WatchSample */,
 				6348D96B1C4EAC0B005C978C /* WatchSample Extension */,
 				6355FEC21BFE4FC600E07170 /* Products */,
-				9A38C0628A51D3876968ADC0 /* Pods */,
-				F4FAD0D53C9328A8A0344149 /* Frameworks */,
 			);
 			sourceTree = "<group>";
 		};
@@ -231,30 +322,6 @@
 			name = Storyboards;
 			sourceTree = "<group>";
 		};
-		9A38C0628A51D3876968ADC0 /* Pods */ = {
-			isa = PBXGroup;
-			children = (
-				759B5E451ADDEAFCFC675B4E /* Pods-WatchSample Extension.debug.xcconfig */,
-				11770D6403BBFAC636BD634F /* Pods-WatchSample Extension.release.xcconfig */,
-				73A2B8D2F7EA89F650F04C7F /* Pods-ActivityFeed.debug.xcconfig */,
-				C9344ED6EB68998ACAFBD88C /* Pods-ActivityFeed.release.xcconfig */,
-			);
-			name = Pods;
-			sourceTree = "<group>";
-		};
-		F4FAD0D53C9328A8A0344149 /* Frameworks */ = {
-			isa = PBXGroup;
-			children = (
-				6348D9821C4EB590005C978C /* Pods.framework */,
-				6348D9801C4EB45C005C978C /* UsergridSDK.framework */,
-				8BEAAECA0D546D0C1893CE9A /* Pods.framework */,
-				AC7800A4D424F7EEB81D8631 /* Pods_SDKSample.framework */,
-				33AB73250FAB15F2DBBC680F /* Pods_WatchSample_Extension.framework */,
-				8D13656DC30773B0295408B9 /* Pods_ActivityFeed.framework */,
-			);
-			name = Frameworks;
-			sourceTree = "<group>";
-		};
 /* End PBXGroup section */
 
 /* Begin PBXNativeTarget section */
@@ -279,16 +346,15 @@
 			isa = PBXNativeTarget;
 			buildConfigurationList = 6348D97A1C4EAC0C005C978C /* Build configuration list for PBXNativeTarget "WatchSample Extension" */;
 			buildPhases = (
-				B48262459C1D6734A74B62D9 /* Check Pods Manifest.lock */,
 				6348D9631C4EAC0B005C978C /* Sources */,
 				6348D9641C4EAC0B005C978C /* Frameworks */,
 				6348D9651C4EAC0B005C978C /* Resources */,
-				AD10723865084E47855057F8 /* Embed Pods Frameworks */,
-				2174ECA30FEE613C3EEB4ADA /* Copy Pods Resources */,
+				634855491C726AF8005FE016 /* Embed Frameworks */,
 			);
 			buildRules = (
 			);
 			dependencies = (
+				634855481C726AF7005FE016 /* PBXTargetDependency */,
 			);
 			name = "WatchSample Extension";
 			productName = "WatchSample Extension";
@@ -299,18 +365,17 @@
 			isa = PBXNativeTarget;
 			buildConfigurationList = 6355FED31BFE4FC600E07170 /* Build configuration list for PBXNativeTarget "ActivityFeed" */;
 			buildPhases = (
-				C2FF22874F8A4843120F7DE3 /* Check Pods Manifest.lock */,
 				6355FEBD1BFE4FC600E07170 /* Sources */,
 				6355FEBE1BFE4FC600E07170 /* Frameworks */,
 				6355FEBF1BFE4FC600E07170 /* Resources */,
-				F841B557ECBD9D46AB1FAEA7 /* Embed Pods Frameworks */,
-				69B54258CDDDC65C3CE36F64 /* Copy Pods Resources */,
 				6348D97D1C4EAC0C005C978C /* Embed Watch Content */,
+				634855441C726AE9005FE016 /* Embed Frameworks */,
 			);
 			buildRules = (
 			);
 			dependencies = (
 				6348D9741C4EAC0C005C978C /* PBXTargetDependency */,
+				634855431C726AE9005FE016 /* PBXTargetDependency */,
 			);
 			name = ActivityFeed;
 			productName = SDKSample;
@@ -349,6 +414,12 @@
 			mainGroup = 6355FEB81BFE4FC600E07170;
 			productRefGroup = 6355FEC21BFE4FC600E07170 /* Products */;
 			projectDirPath = "";
+			projectReferences = (
+				{
+					ProductGroup = 634855291C726AD3005FE016 /* Products */;
+					ProjectRef = 634855281C726AD3005FE016 /* UsergridSDK.xcodeproj */;
+				},
+			);
 			projectRoot = "";
 			targets = (
 				6355FEC01BFE4FC600E07170 /* ActivityFeed */,
@@ -358,6 +429,58 @@
 		};
 /* End PBXProject section */
 
+/* Begin PBXReferenceProxy section */
+		634855331C726AD3005FE016 /* UsergridSDK.framework */ = {
+			isa = PBXReferenceProxy;
+			fileType = wrapper.framework;
+			path = UsergridSDK.framework;
+			remoteRef = 634855321C726AD3005FE016 /* PBXContainerItemProxy */;
+			sourceTree = BUILT_PRODUCTS_DIR;
+		};
+		634855351C726AD3005FE016 /* UsergridSDK.framework */ = {
+			isa = PBXReferenceProxy;
+			fileType = wrapper.framework;
+			path = UsergridSDK.framework;
+			remoteRef = 634855341C726AD3005FE016 /* PBXContainerItemProxy */;
+			sourceTree = BUILT_PRODUCTS_DIR;
+		};
+		634855371C726AD3005FE016 /* UsergridSDK.framework */ = {
+			isa = PBXReferenceProxy;
+			fileType = wrapper.framework;
+			path = UsergridSDK.framework;
+			remoteRef = 634855361C726AD3005FE016 /* PBXContainerItemProxy */;
+			sourceTree = BUILT_PRODUCTS_DIR;
+		};
+		634855391C726AD3005FE016 /* UsergridSDK.framework */ = {
+			isa = PBXReferenceProxy;
+			fileType = wrapper.framework;
+			path = UsergridSDK.framework;
+			remoteRef = 634855381C726AD3005FE016 /* PBXContainerItemProxy */;
+			sourceTree = BUILT_PRODUCTS_DIR;
+		};
+		6348553B1C726AD3005FE016 /* UsergridSDK_TVOS_Tests.xctest */ = {
+			isa = PBXReferenceProxy;
+			fileType = wrapper.cfbundle;
+			path = UsergridSDK_TVOS_Tests.xctest;
+			remoteRef = 6348553A1C726AD3005FE016 /* PBXContainerItemProxy */;
+			sourceTree = BUILT_PRODUCTS_DIR;
+		};
+		6348553D1C726AD3005FE016 /* UsergridSDK_OSX_Tests.xctest */ = {
+			isa = PBXReferenceProxy;
+			fileType = wrapper.cfbundle;
+			path = UsergridSDK_OSX_Tests.xctest;
+			remoteRef = 6348553C1C726AD3005FE016 /* PBXContainerItemProxy */;
+			sourceTree = BUILT_PRODUCTS_DIR;
+		};
+		6348553F1C726AD3005FE016 /* UsergridSDK_iOS_Tests.xctest */ = {
+			isa = PBXReferenceProxy;
+			fileType = wrapper.cfbundle;
+			path = UsergridSDK_iOS_Tests.xctest;
+			remoteRef = 6348553E1C726AD3005FE016 /* PBXContainerItemProxy */;
+			sourceTree = BUILT_PRODUCTS_DIR;
+		};
+/* End PBXReferenceProxy section */
+
 /* Begin PBXResourcesBuildPhase section */
 		6348D9591C4EAC0B005C978C /* Resources */ = {
 			isa = PBXResourcesBuildPhase;
@@ -388,99 +511,6 @@
 		};
 /* End PBXResourcesBuildPhase section */
 
-/* Begin PBXShellScriptBuildPhase section */
-		2174ECA30FEE613C3EEB4ADA /* Copy Pods Resources */ = {
-			isa = PBXShellScriptBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-			);
-			inputPaths = (
-			);
-			name = "Copy Pods Resources";
-			outputPaths = (
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-			shellPath = /bin/sh;
-			shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-WatchSample Extension/Pods-WatchSample Extension-resources.sh\"\n";
-			showEnvVarsInLog = 0;
-		};
-		69B54258CDDDC65C3CE36F64 /* Copy Pods Resources */ = {
-			isa = PBXShellScriptBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-			);
-			inputPaths = (
-			);
-			name = "Copy Pods Resources";
-			outputPaths = (
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-			shellPath = /bin/sh;
-			shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-ActivityFeed/Pods-ActivityFeed-resources.sh\"\n";
-			showEnvVarsInLog = 0;
-		};
-		AD10723865084E47855057F8 /* Embed Pods Frameworks */ = {
-			isa = PBXShellScriptBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-			);
-			inputPaths = (
-			);
-			name = "Embed Pods Frameworks";
-			outputPaths = (
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-			shellPath = /bin/sh;
-			shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-WatchSample Extension/Pods-WatchSample Extension-frameworks.sh\"\n";
-			showEnvVarsInLog = 0;
-		};
-		B48262459C1D6734A74B62D9 /* Check Pods Manifest.lock */ = {
-			isa = PBXShellScriptBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-			);
-			inputPaths = (
-			);
-			name = "Check Pods Manifest.lock";
-			outputPaths = (
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-			shellPath = /bin/sh;
-			shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n    cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n    exit 1\nfi\n";
-			showEnvVarsInLog = 0;
-		};
-		C2FF22874F8A4843120F7DE3 /* Check Pods Manifest.lock */ = {
-			isa = PBXShellScriptBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-			);
-			inputPaths = (
-			);
-			name = "Check Pods Manifest.lock";
-			outputPaths = (
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-			shellPath = /bin/sh;
-			shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n    cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n    exit 1\nfi\n";
-			showEnvVarsInLog = 0;
-		};
-		F841B557ECBD9D46AB1FAEA7 /* Embed Pods Frameworks */ = {
-			isa = PBXShellScriptBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-			);
-			inputPaths = (
-			);
-			name = "Embed Pods Frameworks";
-			outputPaths = (
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-			shellPath = /bin/sh;
-			shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-ActivityFeed/Pods-ActivityFeed-frameworks.sh\"\n";
-			showEnvVarsInLog = 0;
-		};
-/* End PBXShellScriptBuildPhase section */
-
 /* Begin PBXSourcesBuildPhase section */
 		6348D9631C4EAC0B005C978C /* Sources */ = {
 			isa = PBXSourcesBuildPhase;
@@ -514,6 +544,16 @@
 /* End PBXSourcesBuildPhase section */
 
 /* Begin PBXTargetDependency section */
+		634855431C726AE9005FE016 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			name = "UsergridSDK iOS";
+			targetProxy = 634855421C726AE9005FE016 /* PBXContainerItemProxy */;
+		};
+		634855481C726AF7005FE016 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			name = "UsergridSDK watchOS";
+			targetProxy = 634855471C726AF7005FE016 /* PBXContainerItemProxy */;
+		};
 		6348D96A1C4EAC0B005C978C /* PBXTargetDependency */ = {
 			isa = PBXTargetDependency;
 			target = 6348D9661C4EAC0B005C978C /* WatchSample Extension */;
@@ -558,8 +598,8 @@
 			isa = XCBuildConfiguration;
 			buildSettings = {
 				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
-				CODE_SIGN_IDENTITY = "iPhone Developer: Robert WALSH (ZDVX697LCZ)";
-				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer: Robert WALSH (ZDVX697LCZ)";
+				CODE_SIGN_IDENTITY = "iPhone Developer";
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
 				EMBEDDED_CONTENT_CONTAINS_SWIFT = YES;
 				IBSC_MODULE = WatchSample_Extension;
 				INFOPLIST_FILE = WatchSample/Info.plist;
@@ -576,8 +616,8 @@
 			isa = XCBuildConfiguration;
 			buildSettings = {
 				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
-				CODE_SIGN_IDENTITY = "iPhone Developer: Robert WALSH (ZDVX697LCZ)";
-				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer: Robert WALSH (ZDVX697LCZ)";
+				CODE_SIGN_IDENTITY = "iPhone Developer";
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
 				EMBEDDED_CONTENT_CONTAINS_SWIFT = YES;
 				IBSC_MODULE = WatchSample_Extension;
 				INFOPLIST_FILE = WatchSample/Info.plist;
@@ -592,8 +632,8 @@
 		};
 		6348D9781C4EAC0C005C978C /* Debug */ = {
 			isa = XCBuildConfiguration;
-			baseConfigurationReference = 759B5E451ADDEAFCFC675B4E /* Pods-WatchSample Extension.debug.xcconfig */;
 			buildSettings = {
+				EMBEDDED_CONTENT_CONTAINS_SWIFT = YES;
 				FRAMEWORK_SEARCH_PATHS = "$(inherited)";
 				INFOPLIST_FILE = "WatchSample Extension/Info.plist";
 				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks";
@@ -608,8 +648,8 @@
 		};
 		6348D9791C4EAC0C005C978C /* Release */ = {
 			isa = XCBuildConfiguration;
-			baseConfigurationReference = 11770D6403BBFAC636BD634F /* Pods-WatchSample Extension.release.xcconfig */;
 			buildSettings = {
+				EMBEDDED_CONTENT_CONTAINS_SWIFT = YES;
 				FRAMEWORK_SEARCH_PATHS = "$(inherited)";
 				INFOPLIST_FILE = "WatchSample Extension/Info.plist";
 				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks";
@@ -639,6 +679,7 @@
 				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
 				CLANG_WARN_UNREACHABLE_CODE = YES;
 				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+				CODE_SIGN_IDENTITY = "iPhone Developer";
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
 				COPY_PHASE_STRIP = NO;
 				DEBUG_INFORMATION_FORMAT = dwarf;
@@ -683,6 +724,7 @@
 				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
 				CLANG_WARN_UNREACHABLE_CODE = YES;
 				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+				CODE_SIGN_IDENTITY = "iPhone Developer";
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
 				COPY_PHASE_STRIP = NO;
 				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
@@ -705,17 +747,17 @@
 		};
 		6355FED41BFE4FC600E07170 /* Debug */ = {
 			isa = XCBuildConfiguration;
-			baseConfigurationReference = 73A2B8D2F7EA89F650F04C7F /* Pods-ActivityFeed.debug.xcconfig */;
 			buildSettings = {
 				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
 				CLANG_ENABLE_MODULES = YES;
-				CODE_SIGN_IDENTITY = "iPhone Developer: Robert WALSH (ZDVX697LCZ)";
-				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer: Robert WALSH (ZDVX697LCZ)";
+				CODE_SIGN_IDENTITY = "iPhone Developer";
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+				EMBEDDED_CONTENT_CONTAINS_SWIFT = YES;
 				INFOPLIST_FILE = Source/Info.plist;
 				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
 				PRODUCT_BUNDLE_IDENTIFIER = com.usergrid.activityfeed;
 				PRODUCT_NAME = ActivityFeed;
-				PROVISIONING_PROFILE = "fc62482c-0c41-4623-b17d-e695af279c7c";
+				PROVISIONING_PROFILE = "";
 				SWIFT_INSTALL_OBJC_HEADER = NO;
 				SWIFT_OBJC_BRIDGING_HEADER = "";
 				SWIFT_OPTIMIZATION_LEVEL = "-Onone";
@@ -724,17 +766,17 @@
 		};
 		6355FED51BFE4FC600E07170 /* Release */ = {
 			isa = XCBuildConfiguration;
-			baseConfigurationReference = C9344ED6EB68998ACAFBD88C /* Pods-ActivityFeed.release.xcconfig */;
 			buildSettings = {
 				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
 				CLANG_ENABLE_MODULES = YES;
-				CODE_SIGN_IDENTITY = "iPhone Developer: Robert WALSH (ZDVX697LCZ)";
-				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer: Robert WALSH (ZDVX697LCZ)";
+				CODE_SIGN_IDENTITY = "iPhone Developer";
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+				EMBEDDED_CONTENT_CONTAINS_SWIFT = YES;
 				INFOPLIST_FILE = Source/Info.plist;
 				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
 				PRODUCT_BUNDLE_IDENTIFIER = com.usergrid.activityfeed;
 				PRODUCT_NAME = ActivityFeed;
-				PROVISIONING_PROFILE = "fc62482c-0c41-4623-b17d-e695af279c7c";
+				PROVISIONING_PROFILE = "";
 				SWIFT_INSTALL_OBJC_HEADER = NO;
 				SWIFT_OBJC_BRIDGING_HEADER = "";
 			};

http://git-wip-us.apache.org/repos/asf/usergrid/blob/c638c774/sdks/swift/Samples/ActivityFeed/ActivityFeed.xcworkspace/contents.xcworkspacedata
----------------------------------------------------------------------
diff --git a/sdks/swift/Samples/ActivityFeed/ActivityFeed.xcworkspace/contents.xcworkspacedata b/sdks/swift/Samples/ActivityFeed/ActivityFeed.xcworkspace/contents.xcworkspacedata
index 43deff1..1344aa3 100644
--- a/sdks/swift/Samples/ActivityFeed/ActivityFeed.xcworkspace/contents.xcworkspacedata
+++ b/sdks/swift/Samples/ActivityFeed/ActivityFeed.xcworkspace/contents.xcworkspacedata
@@ -4,7 +4,4 @@
    <FileRef
       location = "group:ActivityFeed.xcodeproj">
    </FileRef>
-   <FileRef
-      location = "group:Pods/Pods.xcodeproj">
-   </FileRef>
 </Workspace>

http://git-wip-us.apache.org/repos/asf/usergrid/blob/c638c774/sdks/swift/Samples/ActivityFeed/Podfile
----------------------------------------------------------------------
diff --git a/sdks/swift/Samples/ActivityFeed/Podfile b/sdks/swift/Samples/ActivityFeed/Podfile
index 806f0da..23d5db6 100644
--- a/sdks/swift/Samples/ActivityFeed/Podfile
+++ b/sdks/swift/Samples/ActivityFeed/Podfile
@@ -1,17 +1,8 @@
 use_frameworks!
 inhibit_all_warnings!
 
-def shared_pods
-    pod 'UsergridSDK', '>= 2.1.0-RC.2'
-end
-
 target 'ActivityFeed' do
     platform :ios, '9.0'
-    shared_pods
     pod 'SlackTextViewController'
 end
 
-target 'WatchSample Extension' do
-    platform :watchos, '2.1'
-    shared_pods
-end

http://git-wip-us.apache.org/repos/asf/usergrid/blob/c638c774/sdks/swift/Samples/ActivityFeed/Podfile.lock
----------------------------------------------------------------------
diff --git a/sdks/swift/Samples/ActivityFeed/Podfile.lock b/sdks/swift/Samples/ActivityFeed/Podfile.lock
deleted file mode 100644
index 0a81f86..0000000
--- a/sdks/swift/Samples/ActivityFeed/Podfile.lock
+++ /dev/null
@@ -1,13 +0,0 @@
-PODS:
-  - SlackTextViewController (1.9)
-  - UsergridSDK (2.1.0-RC.2)
-
-DEPENDENCIES:
-  - SlackTextViewController
-  - UsergridSDK (= 2.1.0-RC.2)
-
-SPEC CHECKSUMS:
-  SlackTextViewController: d51503f7be846cb9976a273499dc90f2445e9447
-  UsergridSDK: d8519b4864e1c69a909aa40c85870ce8a3c88c83
-
-COCOAPODS: 0.39.0

http://git-wip-us.apache.org/repos/asf/usergrid/blob/c638c774/sdks/swift/Samples/ActivityFeed/Pods/Headers/Private/SlackTextViewController/SLKInputAccessoryView.h
----------------------------------------------------------------------
diff --git a/sdks/swift/Samples/ActivityFeed/Pods/Headers/Private/SlackTextViewController/SLKInputAccessoryView.h b/sdks/swift/Samples/ActivityFeed/Pods/Headers/Private/SlackTextViewController/SLKInputAccessoryView.h
deleted file mode 120000
index c5009dc..0000000
--- a/sdks/swift/Samples/ActivityFeed/Pods/Headers/Private/SlackTextViewController/SLKInputAccessoryView.h
+++ /dev/null
@@ -1 +0,0 @@
-../../../SlackTextViewController/Source/SLKInputAccessoryView.h
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/usergrid/blob/c638c774/sdks/swift/Samples/ActivityFeed/Pods/Headers/Private/SlackTextViewController/SLKTextInputbar.h
----------------------------------------------------------------------
diff --git a/sdks/swift/Samples/ActivityFeed/Pods/Headers/Private/SlackTextViewController/SLKTextInputbar.h b/sdks/swift/Samples/ActivityFeed/Pods/Headers/Private/SlackTextViewController/SLKTextInputbar.h
deleted file mode 120000
index 54ff338..0000000
--- a/sdks/swift/Samples/ActivityFeed/Pods/Headers/Private/SlackTextViewController/SLKTextInputbar.h
+++ /dev/null
@@ -1 +0,0 @@
-../../../SlackTextViewController/Source/SLKTextInputbar.h
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/usergrid/blob/c638c774/sdks/swift/Samples/ActivityFeed/Pods/Headers/Private/SlackTextViewController/SLKTextView+SLKAdditions.h
----------------------------------------------------------------------
diff --git a/sdks/swift/Samples/ActivityFeed/Pods/Headers/Private/SlackTextViewController/SLKTextView+SLKAdditions.h b/sdks/swift/Samples/ActivityFeed/Pods/Headers/Private/SlackTextViewController/SLKTextView+SLKAdditions.h
deleted file mode 120000
index 2162eb9..0000000
--- a/sdks/swift/Samples/ActivityFeed/Pods/Headers/Private/SlackTextViewController/SLKTextView+SLKAdditions.h
+++ /dev/null
@@ -1 +0,0 @@
-../../../SlackTextViewController/Source/SLKTextView+SLKAdditions.h
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/usergrid/blob/c638c774/sdks/swift/Samples/ActivityFeed/Pods/Headers/Private/SlackTextViewController/SLKTextView.h
----------------------------------------------------------------------
diff --git a/sdks/swift/Samples/ActivityFeed/Pods/Headers/Private/SlackTextViewController/SLKTextView.h b/sdks/swift/Samples/ActivityFeed/Pods/Headers/Private/SlackTextViewController/SLKTextView.h
deleted file mode 120000
index f1dbb3e..0000000
--- a/sdks/swift/Samples/ActivityFeed/Pods/Headers/Private/SlackTextViewController/SLKTextView.h
+++ /dev/null
@@ -1 +0,0 @@
-../../../SlackTextViewController/Source/SLKTextView.h
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/usergrid/blob/c638c774/sdks/swift/Samples/ActivityFeed/Pods/Headers/Private/SlackTextViewController/SLKTextViewController.h
----------------------------------------------------------------------
diff --git a/sdks/swift/Samples/ActivityFeed/Pods/Headers/Private/SlackTextViewController/SLKTextViewController.h b/sdks/swift/Samples/ActivityFeed/Pods/Headers/Private/SlackTextViewController/SLKTextViewController.h
deleted file mode 120000
index 8f355c2..0000000
--- a/sdks/swift/Samples/ActivityFeed/Pods/Headers/Private/SlackTextViewController/SLKTextViewController.h
+++ /dev/null
@@ -1 +0,0 @@
-../../../SlackTextViewController/Source/SLKTextViewController.h
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/usergrid/blob/c638c774/sdks/swift/Samples/ActivityFeed/Pods/Headers/Private/SlackTextViewController/SLKTypingIndicatorProtocol.h
----------------------------------------------------------------------
diff --git a/sdks/swift/Samples/ActivityFeed/Pods/Headers/Private/SlackTextViewController/SLKTypingIndicatorProtocol.h b/sdks/swift/Samples/ActivityFeed/Pods/Headers/Private/SlackTextViewController/SLKTypingIndicatorProtocol.h
deleted file mode 120000
index bdd8cfc..0000000
--- a/sdks/swift/Samples/ActivityFeed/Pods/Headers/Private/SlackTextViewController/SLKTypingIndicatorProtocol.h
+++ /dev/null
@@ -1 +0,0 @@
-../../../SlackTextViewController/Source/SLKTypingIndicatorProtocol.h
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/usergrid/blob/c638c774/sdks/swift/Samples/ActivityFeed/Pods/Headers/Private/SlackTextViewController/SLKTypingIndicatorView.h
----------------------------------------------------------------------
diff --git a/sdks/swift/Samples/ActivityFeed/Pods/Headers/Private/SlackTextViewController/SLKTypingIndicatorView.h b/sdks/swift/Samples/ActivityFeed/Pods/Headers/Private/SlackTextViewController/SLKTypingIndicatorView.h
deleted file mode 120000
index 103ffd3..0000000
--- a/sdks/swift/Samples/ActivityFeed/Pods/Headers/Private/SlackTextViewController/SLKTypingIndicatorView.h
+++ /dev/null
@@ -1 +0,0 @@
-../../../SlackTextViewController/Source/SLKTypingIndicatorView.h
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/usergrid/blob/c638c774/sdks/swift/Samples/ActivityFeed/Pods/Headers/Private/SlackTextViewController/SLKUIConstants.h
----------------------------------------------------------------------
diff --git a/sdks/swift/Samples/ActivityFeed/Pods/Headers/Private/SlackTextViewController/SLKUIConstants.h b/sdks/swift/Samples/ActivityFeed/Pods/Headers/Private/SlackTextViewController/SLKUIConstants.h
deleted file mode 120000
index 0230702..0000000
--- a/sdks/swift/Samples/ActivityFeed/Pods/Headers/Private/SlackTextViewController/SLKUIConstants.h
+++ /dev/null
@@ -1 +0,0 @@
-../../../SlackTextViewController/Source/SLKUIConstants.h
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/usergrid/blob/c638c774/sdks/swift/Samples/ActivityFeed/Pods/Headers/Private/SlackTextViewController/UIResponder+SLKAdditions.h
----------------------------------------------------------------------
diff --git a/sdks/swift/Samples/ActivityFeed/Pods/Headers/Private/SlackTextViewController/UIResponder+SLKAdditions.h b/sdks/swift/Samples/ActivityFeed/Pods/Headers/Private/SlackTextViewController/UIResponder+SLKAdditions.h
deleted file mode 120000
index 397f4e0..0000000
--- a/sdks/swift/Samples/ActivityFeed/Pods/Headers/Private/SlackTextViewController/UIResponder+SLKAdditions.h
+++ /dev/null
@@ -1 +0,0 @@
-../../../SlackTextViewController/Source/UIResponder+SLKAdditions.h
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/usergrid/blob/c638c774/sdks/swift/Samples/ActivityFeed/Pods/Headers/Private/SlackTextViewController/UIScrollView+SLKAdditions.h
----------------------------------------------------------------------
diff --git a/sdks/swift/Samples/ActivityFeed/Pods/Headers/Private/SlackTextViewController/UIScrollView+SLKAdditions.h b/sdks/swift/Samples/ActivityFeed/Pods/Headers/Private/SlackTextViewController/UIScrollView+SLKAdditions.h
deleted file mode 120000
index e3a7d43..0000000
--- a/sdks/swift/Samples/ActivityFeed/Pods/Headers/Private/SlackTextViewController/UIScrollView+SLKAdditions.h
+++ /dev/null
@@ -1 +0,0 @@
-../../../SlackTextViewController/Source/UIScrollView+SLKAdditions.h
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/usergrid/blob/c638c774/sdks/swift/Samples/ActivityFeed/Pods/Headers/Private/SlackTextViewController/UIView+SLKAdditions.h
----------------------------------------------------------------------
diff --git a/sdks/swift/Samples/ActivityFeed/Pods/Headers/Private/SlackTextViewController/UIView+SLKAdditions.h b/sdks/swift/Samples/ActivityFeed/Pods/Headers/Private/SlackTextViewController/UIView+SLKAdditions.h
deleted file mode 120000
index e9331f9..0000000
--- a/sdks/swift/Samples/ActivityFeed/Pods/Headers/Private/SlackTextViewController/UIView+SLKAdditions.h
+++ /dev/null
@@ -1 +0,0 @@
-../../../SlackTextViewController/Source/UIView+SLKAdditions.h
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/usergrid/blob/c638c774/sdks/swift/Samples/ActivityFeed/Pods/Manifest.lock
----------------------------------------------------------------------
diff --git a/sdks/swift/Samples/ActivityFeed/Pods/Manifest.lock b/sdks/swift/Samples/ActivityFeed/Pods/Manifest.lock
deleted file mode 100644
index 0a81f86..0000000
--- a/sdks/swift/Samples/ActivityFeed/Pods/Manifest.lock
+++ /dev/null
@@ -1,13 +0,0 @@
-PODS:
-  - SlackTextViewController (1.9)
-  - UsergridSDK (2.1.0-RC.2)
-
-DEPENDENCIES:
-  - SlackTextViewController
-  - UsergridSDK (= 2.1.0-RC.2)
-
-SPEC CHECKSUMS:
-  SlackTextViewController: d51503f7be846cb9976a273499dc90f2445e9447
-  UsergridSDK: d8519b4864e1c69a909aa40c85870ce8a3c88c83
-
-COCOAPODS: 0.39.0