├── Images
├── target.jpg
├── WatchScene.jpg
└── Authentication.jpg
├── iOS-ObjectiveC-MicrosoftGraph-WatchSample WatchKit Extension
├── Assets.xcassets
│ └── README__ignoredByTemplate__
├── Attendee.m
├── EventTableRowController.m
├── AttendeeListRowController.m
├── DirectsTableRowController.m
├── ExtensionDelegate.h
├── ProfileController.h
├── AttendeeListController.h
├── EventTableRowController.h
├── InterfaceController.h
├── NetworkManager.h
├── ProfilePictureHelper.h
├── Attendee.h
├── AttendeeListRowController.h
├── DirectsTableRowController.h
├── ExtensionDelegate.m
├── ProfilePictureHelper.m
├── NetworkManager.m
├── Info.plist
├── AttendeeListController.m
├── InterfaceController.m
└── ProfileController.m
├── Podfile
├── iOS-ObjectiveC-MicrosoftGraph-WatchSample.xcodeproj
├── project.xcworkspace
│ └── contents.xcworkspacedata
└── project.pbxproj
├── iOS-ObjectiveC-MicrosoftGraph-WatchSample.xcworkspace
└── contents.xcworkspacedata
├── iOS-ObjectiveC-MicrosoftGraph-WatchSample
├── AppDelegate.h
├── ViewController.h
├── main.m
├── Assets.xcassets
│ └── AppIcon.appiconset
│ │ └── Contents.json
├── AuthenticationManager.h
├── Info.plist
├── Base.lproj
│ ├── LaunchScreen.storyboard
│ └── Main.storyboard
├── AppDelegate.m
├── AuthenticationManager.m
└── ViewController.m
├── .gitignore
├── License.txt
├── iOS-ObjectiveC-MicrosoftGraph-WatchSample WatchKit App
├── Assets.xcassets
│ └── AppIcon.appiconset
│ │ └── Contents.json
├── Info.plist
└── Base.lproj
│ └── Interface.storyboard
└── Readme.md
/Images/target.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoftgraph/ios-objectivec-apple-watch-sample/master/Images/target.jpg
--------------------------------------------------------------------------------
/Images/WatchScene.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoftgraph/ios-objectivec-apple-watch-sample/master/Images/WatchScene.jpg
--------------------------------------------------------------------------------
/Images/Authentication.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/microsoftgraph/ios-objectivec-apple-watch-sample/master/Images/Authentication.jpg
--------------------------------------------------------------------------------
/iOS-ObjectiveC-MicrosoftGraph-WatchSample WatchKit Extension/Assets.xcassets/README__ignoredByTemplate__:
--------------------------------------------------------------------------------
1 | Did you know that git does not support storing empty directories?
2 |
--------------------------------------------------------------------------------
/Podfile:
--------------------------------------------------------------------------------
1 | # Uncomment this line to define a global platform for your project
2 | # platform :watchos, '2.0'
3 |
4 | target 'iOS-ObjectiveC-MicrosoftGraph-WatchSample' do
5 | pod 'ADALiOS', :git => 'https://github.com/AzureAD/azure-activedirectory-library-for-objc.git', :branch => 'watchkit'
6 | end
7 |
--------------------------------------------------------------------------------
/iOS-ObjectiveC-MicrosoftGraph-WatchSample.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/iOS-ObjectiveC-MicrosoftGraph-WatchSample WatchKit Extension/Attendee.m:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) Microsoft. All rights reserved. Licensed under the MIT license.
3 | * See LICENSE in the project root for license information.
4 | */
5 |
6 | #import "Attendee.h"
7 |
8 | @implementation Attendee
9 |
10 | @end
11 |
--------------------------------------------------------------------------------
/iOS-ObjectiveC-MicrosoftGraph-WatchSample WatchKit Extension/EventTableRowController.m:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) Microsoft. All rights reserved. Licensed under the MIT license.
3 | * See LICENSE in the project root for license information.
4 | */
5 |
6 | #import "EventTableRowController.h"
7 |
8 | @implementation EventTableRowController
9 |
10 | @end
11 |
--------------------------------------------------------------------------------
/iOS-ObjectiveC-MicrosoftGraph-WatchSample WatchKit Extension/AttendeeListRowController.m:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) Microsoft. All rights reserved. Licensed under the MIT license.
3 | * See LICENSE in the project root for license information.
4 | */
5 |
6 | #import "AttendeeListRowController.h"
7 |
8 | @implementation AttendeeListRowController
9 |
10 | @end
11 |
--------------------------------------------------------------------------------
/iOS-ObjectiveC-MicrosoftGraph-WatchSample WatchKit Extension/DirectsTableRowController.m:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) Microsoft. All rights reserved. Licensed under the MIT license.
3 | * See LICENSE in the project root for license information.
4 | */
5 |
6 | #import "DirectsTableRowController.h"
7 |
8 |
9 | @implementation DirectsTableRowController
10 |
11 | @end
12 |
--------------------------------------------------------------------------------
/iOS-ObjectiveC-MicrosoftGraph-WatchSample WatchKit Extension/ExtensionDelegate.h:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) Microsoft. All rights reserved. Licensed under the MIT license.
3 | * See LICENSE in the project root for license information.
4 | */
5 |
6 | #import
7 |
8 | @interface ExtensionDelegate : NSObject
9 |
10 | @end
11 |
--------------------------------------------------------------------------------
/iOS-ObjectiveC-MicrosoftGraph-WatchSample.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/iOS-ObjectiveC-MicrosoftGraph-WatchSample WatchKit Extension/ProfileController.h:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) Microsoft. All rights reserved. Licensed under the MIT license.
3 | * See LICENSE in the project root for license information.
4 | */
5 |
6 | #import
7 | #import
8 |
9 | @interface ProfileController : WKInterfaceController
10 |
11 | @end
12 |
--------------------------------------------------------------------------------
/iOS-ObjectiveC-MicrosoftGraph-WatchSample/AppDelegate.h:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) Microsoft. All rights reserved. Licensed under the MIT license.
3 | * See LICENSE in the project root for license information.
4 | */
5 |
6 | #import
7 |
8 | @interface AppDelegate : UIResponder
9 |
10 | @property (strong, nonatomic) UIWindow *window;
11 |
12 |
13 | @end
14 |
15 |
--------------------------------------------------------------------------------
/iOS-ObjectiveC-MicrosoftGraph-WatchSample/ViewController.h:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) Microsoft. All rights reserved. Licensed under the MIT license.
3 | * See LICENSE in the project root for license information.
4 | */
5 |
6 | #import
7 | #import
8 |
9 | @interface ViewController : UIViewController
10 |
11 |
12 | @end
13 |
14 |
--------------------------------------------------------------------------------
/iOS-ObjectiveC-MicrosoftGraph-WatchSample WatchKit Extension/AttendeeListController.h:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) Microsoft. All rights reserved. Licensed under the MIT license.
3 | * See LICENSE in the project root for license information.
4 | */
5 |
6 | #import "Attendee.h"
7 | #import
8 | #import
9 |
10 | @interface AttendeeListController : WKInterfaceController
11 |
12 | @end
13 |
--------------------------------------------------------------------------------
/iOS-ObjectiveC-MicrosoftGraph-WatchSample/main.m:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) Microsoft. All rights reserved. Licensed under the MIT license.
3 | * See LICENSE in the project root for license information.
4 | */
5 |
6 | #import
7 | #import "AppDelegate.h"
8 |
9 | int main(int argc, char * argv[]) {
10 | @autoreleasepool {
11 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/iOS-ObjectiveC-MicrosoftGraph-WatchSample WatchKit Extension/EventTableRowController.h:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) Microsoft. All rights reserved. Licensed under the MIT license.
3 | * See LICENSE in the project root for license information.
4 | */
5 |
6 | #import
7 | #import
8 |
9 | @interface EventTableRowController : NSObject
10 | @property (strong, nonatomic) IBOutlet WKInterfaceLabel *eventSubject;
11 |
12 | @end
13 |
--------------------------------------------------------------------------------
/iOS-ObjectiveC-MicrosoftGraph-WatchSample WatchKit Extension/InterfaceController.h:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) Microsoft. All rights reserved. Licensed under the MIT license.
3 | * See LICENSE in the project root for license information.
4 | */
5 |
6 | #import
7 | #import
8 | #import
9 |
10 | @interface InterfaceController : WKInterfaceController
11 |
12 | @end
13 |
--------------------------------------------------------------------------------
/iOS-ObjectiveC-MicrosoftGraph-WatchSample WatchKit Extension/NetworkManager.h:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) Microsoft. All rights reserved. Licensed under the MIT license.
3 | * See LICENSE in the project root for license information.
4 | */
5 |
6 | #import
7 |
8 | @interface NetworkManager : NSObject
9 |
10 | + (NSString*)accessToken;
11 | + (void)setAccessToken:(NSString*)newAccessToken;
12 | + (NSMutableURLRequest *)getRequest: (NSString*) requestURL;
13 |
14 | @end
15 |
--------------------------------------------------------------------------------
/iOS-ObjectiveC-MicrosoftGraph-WatchSample WatchKit Extension/ProfilePictureHelper.h:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) Microsoft. All rights reserved. Licensed under the MIT license.
3 | * See LICENSE in the project root for license information.
4 | */
5 |
6 | #import "Attendee.h"
7 | #import
8 | #import
9 |
10 |
11 | @interface ProfilePictureHelper : NSObject
12 | + (void)getPhotoForAttendee:(Attendee *)attendee withCompletion:(void (^)(UIImage *image, NSError *error))completion;
13 |
14 | @end
15 |
--------------------------------------------------------------------------------
/iOS-ObjectiveC-MicrosoftGraph-WatchSample WatchKit Extension/Attendee.h:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) Microsoft. All rights reserved. Licensed under the MIT license.
3 | * See LICENSE in the project root for license information.
4 | */
5 |
6 | #import
7 |
8 | @interface Attendee : NSObject
9 |
10 | @property (strong, nonatomic) NSString *emailAddress;
11 | @property (strong, nonatomic) NSString *name;
12 | @property (strong, nonatomic) NSString *displayName;
13 | @property (strong, nonatomic) NSString *jobTitle;
14 |
15 | @end
16 |
--------------------------------------------------------------------------------
/iOS-ObjectiveC-MicrosoftGraph-WatchSample WatchKit Extension/AttendeeListRowController.h:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) Microsoft. All rights reserved. Licensed under the MIT license.
3 | * See LICENSE in the project root for license information.
4 | */
5 |
6 | #import
7 | #import
8 |
9 | @interface AttendeeListRowController : NSObject
10 |
11 | @property (strong, nonatomic) IBOutlet WKInterfaceImage *profilePicture;
12 | @property (strong, nonatomic) IBOutlet WKInterfaceLabel *attendeeLabel;
13 |
14 | @end
15 |
--------------------------------------------------------------------------------
/iOS-ObjectiveC-MicrosoftGraph-WatchSample WatchKit Extension/DirectsTableRowController.h:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) Microsoft. All rights reserved. Licensed under the MIT license.
3 | * See LICENSE in the project root for license information.
4 | */
5 |
6 | #import
7 | #import
8 |
9 | @interface DirectsTableRowController : NSObject
10 |
11 | @property (strong, nonatomic) IBOutlet WKInterfaceImage *profilePicture;
12 | @property (strong, nonatomic) IBOutlet WKInterfaceLabel *directsName;
13 |
14 | @end
15 |
--------------------------------------------------------------------------------
/iOS-ObjectiveC-MicrosoftGraph-WatchSample/Assets.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 | "info" : {
35 | "version" : 1,
36 | "author" : "xcode"
37 | }
38 | }
--------------------------------------------------------------------------------
/iOS-ObjectiveC-MicrosoftGraph-WatchSample WatchKit Extension/ExtensionDelegate.m:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) Microsoft. All rights reserved. Licensed under the MIT license.
3 | * See LICENSE in the project root for license information.
4 | */
5 |
6 | #import "ExtensionDelegate.h"
7 |
8 | @implementation ExtensionDelegate
9 |
10 | - (void)applicationDidFinishLaunching {
11 | // Perform any final initialization of your application.
12 | }
13 |
14 | - (void)applicationDidBecomeActive {
15 | // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
16 | }
17 |
18 | - (void)applicationWillResignActive {
19 | // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
20 | // Use this method to pause ongoing tasks, disable timers, etc.
21 | }
22 |
23 | @end
24 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Created by https://www.gitignore.io
2 |
3 | ### Xcode ###
4 | build/
5 | *.pbxuser
6 | !default.pbxuser
7 | *.mode1v3
8 | !default.mode1v3
9 | *.mode2v3
10 | !default.mode2v3
11 | *.perspectivev3
12 | !default.perspectivev3
13 | xcuserdata
14 | *.xccheckout
15 | *.moved-aside
16 | DerivedData
17 | *.xcuserstate
18 |
19 |
20 | ### Objective-C ###
21 | # Xcode
22 | #
23 | build/
24 | *.pbxuser
25 | !default.pbxuser
26 | *.mode1v3
27 | !default.mode1v3
28 | *.mode2v3
29 | !default.mode2v3
30 | *.perspectivev3
31 | !default.perspectivev3
32 | xcuserdata
33 | *.xccheckout
34 | *.moved-aside
35 | DerivedData
36 | *.hmap
37 | *.ipa
38 | *.xcuserstate
39 |
40 | # CocoaPods
41 | #
42 | Pods/
43 | *Podfile.lock
44 |
45 | ### OSX ###
46 | .DS_Store
47 | .AppleDouble
48 | .LSOverride
49 |
50 | # Icon must end with two \r
51 | Icon
52 |
53 |
54 | # Thumbnails
55 | ._*
56 |
57 | # Files that might appear in the root of a volume
58 | .DocumentRevisions-V100
59 | .fseventsd
60 | .Spotlight-V100
61 | .TemporaryItems
62 | .Trashes
63 | .VolumeIcon.icns
64 |
65 | # Directories potentially created on remote AFP share
66 | .AppleDB
67 | .AppleDesktop
68 | Network Trash Folder
69 | Temporary Items
70 | .apdisk
71 |
--------------------------------------------------------------------------------
/License.txt:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 |
4 | Copyright (c) 2016 Microsoft
5 |
6 |
7 | Permission is hereby granted, free of charge, to any person obtaining a copy
8 | of this software and associated documentation files (the "Software"), to deal
9 | in the Software without restriction, including without limitation the rights
10 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11 | copies of the Software, and to permit persons to whom the Software is
12 | furnished to do so, subject to the following conditions:
13 |
14 |
15 | The above copyright notice and this permission notice shall be included in
16 | all copies or substantial portions of the Software.
17 |
18 |
19 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
25 | THE SOFTWARE.
--------------------------------------------------------------------------------
/iOS-ObjectiveC-MicrosoftGraph-WatchSample/AuthenticationManager.h:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) Microsoft. All rights reserved. Licensed under the MIT license.
3 | * See LICENSE in the project root for license information.
4 | */
5 |
6 | #import
7 | #import "ADAuthenticationContext.h"
8 |
9 |
10 | @interface AuthenticationManager : NSObject
11 |
12 | +(AuthenticationManager*)sharedInstance;
13 |
14 | @property (nonatomic, strong) NSString *accessToken;
15 | @property (nonatomic, strong) NSString *userID;
16 |
17 | -(void)initWithAuthority:(NSString *)authority
18 | clientID:(NSString *)clientID
19 | redirectURI:(NSString *)redirectURI
20 | resourceID:(NSString *)resourceID
21 | completion:(void (^)(ADAuthenticationError *error))completion;
22 |
23 | -(void) acquireAuthTokenCompletion:(void (^)(ADAuthenticationError *error))completion;
24 |
25 | -(void)acquireAuthTokenWithResource:(NSString *)resourceID
26 | clientID:(NSString *)clientID
27 | redirectURI:(NSURL*)redirectURI
28 | completion:(void (^)(ADAuthenticationError *error))completion;
29 |
30 |
31 | @end
32 |
--------------------------------------------------------------------------------
/iOS-ObjectiveC-MicrosoftGraph-WatchSample WatchKit Extension/ProfilePictureHelper.m:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) Microsoft. All rights reserved. Licensed under the MIT license.
3 | * See LICENSE in the project root for license information.
4 | */
5 |
6 | #import "Attendee.h"
7 | #import "NetworkManager.h"
8 | #import "ProfilePictureHelper.h"
9 | #import
10 |
11 | @implementation ProfilePictureHelper
12 |
13 | // Retrieves profile picture (if there is one) for meeting attendees and their direct reports.
14 | + (void)getPhotoForAttendee:(Attendee *)attendee withCompletion:(void (^)(UIImage *image, NSError *error))completion {
15 |
16 | NSString *path =[NSString stringWithFormat:@"https://graph.microsoft.com/v1.0/users/%@/Photo/$value", attendee.emailAddress];
17 | NSMutableURLRequest *request = [NetworkManager getRequest:path];
18 |
19 | NSURLSession *getSession = [NSURLSession sharedSession];
20 | [[getSession dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
21 | if (error) {
22 | completion(nil, error);
23 | }
24 | else {
25 | UIImage *image = [UIImage imageWithData:data];
26 | completion(image, nil);
27 | }
28 | }] resume];
29 | }
30 |
31 | @end
32 |
--------------------------------------------------------------------------------
/iOS-ObjectiveC-MicrosoftGraph-WatchSample WatchKit App/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "size" : "24x24",
5 | "idiom" : "watch",
6 | "scale" : "2x",
7 | "role" : "notificationCenter",
8 | "subtype" : "38mm"
9 | },
10 | {
11 | "size" : "27.5x27.5",
12 | "idiom" : "watch",
13 | "scale" : "2x",
14 | "role" : "notificationCenter",
15 | "subtype" : "42mm"
16 | },
17 | {
18 | "size" : "29x29",
19 | "idiom" : "watch",
20 | "role" : "companionSettings",
21 | "scale" : "2x"
22 | },
23 | {
24 | "size" : "29x29",
25 | "idiom" : "watch",
26 | "role" : "companionSettings",
27 | "scale" : "3x"
28 | },
29 | {
30 | "size" : "40x40",
31 | "idiom" : "watch",
32 | "scale" : "2x",
33 | "role" : "appLauncher",
34 | "subtype" : "38mm"
35 | },
36 | {
37 | "size" : "86x86",
38 | "idiom" : "watch",
39 | "scale" : "2x",
40 | "role" : "quickLook",
41 | "subtype" : "38mm"
42 | },
43 | {
44 | "size" : "98x98",
45 | "idiom" : "watch",
46 | "scale" : "2x",
47 | "role" : "quickLook",
48 | "subtype" : "42mm"
49 | }
50 | ],
51 | "info" : {
52 | "version" : 1,
53 | "author" : "xcode"
54 | }
55 | }
56 |
--------------------------------------------------------------------------------
/iOS-ObjectiveC-MicrosoftGraph-WatchSample WatchKit App/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
7 | CFBundleDisplayName
8 | iOS-ObjectiveC-MicrosoftGraph-WatchSample WatchKit App
9 | CFBundleExecutable
10 | $(EXECUTABLE_NAME)
11 | CFBundleIdentifier
12 | $(PRODUCT_BUNDLE_IDENTIFIER)
13 | CFBundleInfoDictionaryVersion
14 | 6.0
15 | CFBundleName
16 | $(PRODUCT_NAME)
17 | CFBundlePackageType
18 | APPL
19 | CFBundleShortVersionString
20 | 1.0
21 | CFBundleSignature
22 | ????
23 | CFBundleVersion
24 | 1
25 | UISupportedInterfaceOrientations
26 |
27 | UIInterfaceOrientationPortrait
28 | UIInterfaceOrientationPortraitUpsideDown
29 |
30 | WKCompanionAppBundleIdentifier
31 | com.microsoft.iOS-ObjectiveC-MicrosoftGraph-WatchSample
32 | WKWatchKitApp
33 |
34 |
35 |
36 |
--------------------------------------------------------------------------------
/iOS-ObjectiveC-MicrosoftGraph-WatchSample WatchKit Extension/NetworkManager.m:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) Microsoft. All rights reserved. Licensed under the MIT license.
3 | * See LICENSE in the project root for license information.
4 | */
5 |
6 | #import "NetworkManager.h"
7 |
8 | @implementation NetworkManager: NSObject
9 |
10 | static NSString *myAccessToken;
11 |
12 | //Store access token
13 | + (NSString *)accessToken {
14 | if (myAccessToken == nil) {
15 | }
16 | return myAccessToken;
17 | }
18 |
19 | + (void)setAccessToken:(NSString *)newAccessToken {
20 | myAccessToken = newAccessToken;
21 | }
22 |
23 | //Helper method to build requests in InterfaceController, AttendeeListController
24 | //ProfileController
25 | + (NSMutableURLRequest *)getRequest: (NSString*) requestURL {
26 |
27 | NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:requestURL]];
28 | [request setHTTPMethod:@"GET"];
29 | [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
30 | [request setValue:@"application/json, text/plain, */*" forHTTPHeaderField:@"Accept"];
31 |
32 | NSString *authorization = [NSString stringWithFormat:@"Bearer %@", [NetworkManager accessToken]];
33 | [request setValue:authorization forHTTPHeaderField:@"Authorization"];
34 |
35 | return request;
36 | }
37 |
38 | @end
39 |
--------------------------------------------------------------------------------
/iOS-ObjectiveC-MicrosoftGraph-WatchSample/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | $(PRODUCT_BUNDLE_IDENTIFIER)
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 |
40 |
41 |
--------------------------------------------------------------------------------
/iOS-ObjectiveC-MicrosoftGraph-WatchSample WatchKit Extension/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
7 | CFBundleDisplayName
8 | iOS-ObjectiveC-MicrosoftGraph-WatchSample WatchKit Extension
9 | CFBundleExecutable
10 | $(EXECUTABLE_NAME)
11 | CFBundleIdentifier
12 | $(PRODUCT_BUNDLE_IDENTIFIER)
13 | CFBundleInfoDictionaryVersion
14 | 6.0
15 | CFBundleName
16 | $(PRODUCT_NAME)
17 | CFBundlePackageType
18 | XPC!
19 | CFBundleShortVersionString
20 | 1.0
21 | CFBundleSignature
22 | ????
23 | CFBundleVersion
24 | 1
25 | NSExtension
26 |
27 | NSExtensionAttributes
28 |
29 | WKAppBundleIdentifier
30 | com.microsoft.iOS-ObjectiveC-MicrosoftGraph-WatchSample.watchkitapp
31 |
32 | NSExtensionPointIdentifier
33 | com.apple.watchkit
34 |
35 | WKExtensionDelegateClassName
36 | ExtensionDelegate
37 |
38 |
39 |
--------------------------------------------------------------------------------
/iOS-ObjectiveC-MicrosoftGraph-WatchSample/Base.lproj/LaunchScreen.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
--------------------------------------------------------------------------------
/iOS-ObjectiveC-MicrosoftGraph-WatchSample/AppDelegate.m:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) Microsoft. All rights reserved. Licensed under the MIT license.
3 | * See LICENSE in the project root for license information.
4 | */
5 |
6 | #import "AppDelegate.h"
7 |
8 | @interface AppDelegate ()
9 |
10 | @end
11 |
12 | @implementation AppDelegate
13 |
14 |
15 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
16 | // Override point for customization after application launch.
17 | return YES;
18 | }
19 |
20 | - (void)applicationWillResignActive:(UIApplication *)application {
21 | // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
22 | // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
23 | }
24 |
25 | - (void)applicationDidEnterBackground:(UIApplication *)application {
26 | // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
27 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
28 | }
29 |
30 | - (void)applicationWillEnterForeground:(UIApplication *)application {
31 | // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.
32 | }
33 |
34 | - (void)applicationDidBecomeActive:(UIApplication *)application {
35 | // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
36 | }
37 |
38 | - (void)applicationWillTerminate:(UIApplication *)application {
39 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
40 | }
41 |
42 | @end
43 |
--------------------------------------------------------------------------------
/iOS-ObjectiveC-MicrosoftGraph-WatchSample WatchKit Extension/AttendeeListController.m:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) Microsoft. All rights reserved. Licensed under the MIT license.
3 | * See LICENSE in the project root for license information.
4 | */
5 |
6 | #import "AttendeeListController.h"
7 | #import "AttendeeListRowController.h"
8 | #import "Attendee.h"
9 | #import "NetworkManager.h"
10 | #import "ProfilePictureHelper.h"
11 |
12 | @interface AttendeeListController()
13 |
14 | @property (readwrite) id selectedEvent;
15 | @property (strong, nonatomic) NSMutableArray *attendees;
16 | @property (strong, nonatomic) IBOutlet WKInterfaceTable *attendeeListTable;
17 | @property (strong, nonatomic) IBOutlet WKInterfaceLabel *loadingLabel;
18 |
19 | @end
20 |
21 | @implementation AttendeeListController
22 |
23 | - (void)awakeWithContext:(id)context {
24 | [super awakeWithContext:context];
25 |
26 | // Configure interface objects here.
27 |
28 | self.selectedEvent = context;
29 | [self getEventAttendees];
30 | }
31 |
32 | #pragma mark - Populate UI with Event Attendees and Profile Pictures
33 |
34 | //Retrieves a selection of attendees from the selected event and populates the results in the UI.
35 | - (void) getEventAttendees {
36 | [self.loadingLabel setHidden:false];
37 |
38 | if (!self.attendees) {
39 | self.attendees= [NSMutableArray new];
40 | }
41 |
42 | [self.attendees removeAllObjects];
43 |
44 | NSArray *attendeesList= [self.selectedEvent objectForKey:@"attendees"];
45 | [self.attendeeListTable setNumberOfRows: attendeesList.count withRowType:@"attendeeRow"];
46 | [attendeesList enumerateObjectsUsingBlock:^(id _Nonnull object, NSUInteger idx, BOOL * _Nonnull stop) {
47 | id emailAddress= [object objectForKey:@"emailAddress"];
48 |
49 | Attendee *attendee= [[Attendee alloc] init];
50 | attendee.emailAddress= [emailAddress objectForKey:@"address"];
51 | attendee.name= [emailAddress objectForKey:@"name"];
52 |
53 | AttendeeListRowController *rowController = [self.attendeeListTable rowControllerAtIndex:idx];
54 | rowController.attendeeLabel.text= attendee.name;
55 |
56 | [self.attendees addObject:attendee];
57 |
58 | [ProfilePictureHelper getPhotoForAttendee:attendee withCompletion:^(UIImage *image, NSError *error) {
59 | [rowController.profilePicture setImage:image];
60 | [self.loadingLabel setHidden:true];
61 |
62 | }];
63 | }];
64 | }
65 |
66 | // Pass attendee over to the profile controller
67 | - (void)table:(WKInterfaceTable *)table didSelectRowAtIndex:(NSInteger)rowIndex {
68 | [self pushControllerWithName:@"profileController" context:self.attendees[rowIndex]];
69 | }
70 |
71 |
72 | @end
73 |
--------------------------------------------------------------------------------
/iOS-ObjectiveC-MicrosoftGraph-WatchSample/AuthenticationManager.m:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) Microsoft. All rights reserved. Licensed under the MIT license.
3 | * See LICENSE in the project root for license information.
4 | */
5 |
6 | #import "AuthenticationManager.h"
7 | #import
8 |
9 |
10 |
11 | @interface AuthenticationManager()
12 |
13 | @property (nonatomic, strong) NSString *authority;
14 | @property (nonatomic, strong) NSString *clientID;
15 | @property (nonatomic, strong) NSString *redirectUri;
16 | @property (nonatomic, strong) NSString *resourceID;
17 | @property (nonatomic, strong) ADAuthenticationContext *context;
18 |
19 | @end
20 |
21 | @implementation AuthenticationManager
22 |
23 | #pragma mark - singleton
24 |
25 | + (AuthenticationManager *)sharedInstance {
26 | static AuthenticationManager *sharedInstance;
27 | static dispatch_once_t onceToken;
28 |
29 | //Initialize the AuthenticationManager only once.
30 | dispatch_once(&onceToken, ^{
31 | sharedInstance = [[AuthenticationManager alloc] init];
32 |
33 | });
34 | return sharedInstance;
35 | }
36 |
37 | #pragma mark - init
38 | - (void)initWithAuthority:(NSString *)authority
39 | clientID:(NSString *)clientID
40 | redirectURI:(NSString *)redirectURI
41 | resourceID:(NSString *)resourceID
42 | completion:(void (^)(ADAuthenticationError *error))completion
43 | {
44 | ADAuthenticationError *error;
45 | _context = [ADAuthenticationContext authenticationContextWithAuthority:authority error:&error];
46 |
47 | if(error) {
48 | //Log error
49 | completion(error);
50 | }
51 |
52 | else {
53 | self.clientID = clientID;
54 | self.redirectUri = redirectURI;
55 | self.authority = authority;
56 | self.resourceID = resourceID;
57 |
58 | completion(nil);
59 | }
60 | }
61 |
62 | #pragma mark - acquire token
63 | - (void)acquireAuthTokenCompletion:(void (^)(ADAuthenticationError *error))completion {
64 | [self acquireAuthTokenWithResource:self.resourceID
65 | clientID:self.clientID
66 | redirectURI: [NSURL URLWithString:self.redirectUri]
67 | completion:^(ADAuthenticationError *error) {
68 | completion(error);
69 | }];
70 | }
71 |
72 | - (void)acquireAuthTokenWithResource:(NSString *)resourceID
73 | clientID:(NSString *)clientID
74 | redirectURI:(NSURL *)redirectURI
75 | completion:(void (^)(ADAuthenticationError *error))completion {
76 |
77 | [self.context acquireTokenWithResource:resourceID
78 | clientId:clientID
79 | redirectUri:redirectURI
80 | completionBlock:^(ADAuthenticationResult *result) {
81 |
82 | if (result.status !=AD_SUCCEEDED) {
83 | completion(result.error);
84 | }
85 |
86 | else{
87 | self.accessToken = result.accessToken;
88 | self.userID = result.tokenCacheStoreItem.userInformation.userId;
89 | completion(nil);
90 | }
91 | }];
92 | }
93 |
94 | @end
95 |
--------------------------------------------------------------------------------
/iOS-ObjectiveC-MicrosoftGraph-WatchSample/ViewController.m:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) Microsoft. All rights reserved. Licensed under the MIT license.
3 | * See LICENSE in the project root for license information.
4 | */
5 |
6 | #import "AuthenticationManager.h"
7 | #import "ViewController.h"
8 |
9 | @interface ViewController ()
10 |
11 | @property (strong, nonatomic) WCSession *session;
12 |
13 | @end
14 |
15 | @implementation ViewController
16 |
17 | // You will set your application's clientId and redirect URI.
18 | NSString * const kRedirectUri = @"ENTER_YOUR_REDIRECT_URI";
19 | NSString * const kClientId = @"ENTER_YOUR_CLIENT_ID";
20 |
21 | NSString * const kAuthority = @"https://login.microsoftonline.com/common";
22 | NSString * const kResourceId = @"https://graph.microsoft.com";
23 |
24 | - (void)viewDidLoad {
25 | [super viewDidLoad];
26 | // Do any additional setup after loading the view, typically from a nib.
27 |
28 | if ([WCSession isSupported]){
29 | self.session = [WCSession defaultSession];
30 | self.session.delegate = self;
31 | [self.session activateSession];
32 | }
33 |
34 | }
35 | - (IBAction)connect:(id)sender {
36 | [self performConnect];
37 | }
38 |
39 | - (void)performConnect {
40 |
41 | AuthenticationManager *authManager = [AuthenticationManager sharedInstance];
42 |
43 | [authManager initWithAuthority:kAuthority clientID:kClientId redirectURI:kRedirectUri resourceID:kResourceId completion:^(ADAuthenticationError *error) {
44 |
45 | if (error) {
46 | NSLog(@"Issue authenticating with the service");
47 | }
48 |
49 | else {
50 | [authManager acquireAuthTokenCompletion:^(ADAuthenticationError *acquireTokenError) {
51 | if (acquireTokenError) {
52 | NSLog(@"Error acquiring token");
53 | }
54 |
55 | else{
56 | NSString *accessToken = authManager.accessToken;
57 | NSDictionary *dict = [NSDictionary dictionaryWithObject:accessToken forKey:@"token"];
58 |
59 | //Pass the access token over to WatchKit Extension project
60 | if (self.session.isReachable) {
61 | [self.session sendMessage:dict replyHandler:^(NSDictionary * _Nonnull replyMessage) {
62 | } errorHandler:^(NSError * _Nonnull error) {
63 | NSLog(@"%@", error.localizedDescription);
64 | }];
65 | }
66 |
67 | else {
68 | NSLog(@"%@", error.localizedDescription);
69 | }
70 | }
71 | }];
72 |
73 | }
74 | }];
75 |
76 | }
77 |
78 | - (void)didReceiveMemoryWarning {
79 | [super didReceiveMemoryWarning];
80 | // Dispose of any resources that can be recreated.
81 | }
82 |
83 |
84 | - (void)session: (nonnull WCSession *)session didReceiveMessage:(nonnull NSDictionary *)message replyHandler:(nonnull void (^)(NSDictionary * _Nonnull))replyHandler{
85 | }
86 |
87 | - (void)session: (nonnull WCSession *)session activationDidCompleteWithState:(WCSessionActivationState)activationState error:(nullable NSError *)error{
88 | }
89 |
90 | - (void)sessionDidDeactivate:(WCSession *)session {
91 |
92 | [[WCSession defaultSession] activateSession];
93 |
94 | }
95 |
96 |
97 | -(void) sessionDidBecomeInactive:(WCSession *)session {
98 |
99 | }
100 |
101 | @end
102 |
--------------------------------------------------------------------------------
/iOS-ObjectiveC-MicrosoftGraph-WatchSample WatchKit Extension/InterfaceController.m:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) Microsoft. All rights reserved. Licensed under the MIT license.
3 | * See LICENSE in the project root for license information.
4 | */
5 |
6 | #import "AttendeeListController.h"
7 | #import "EventTableRowController.h"
8 | #import "InterfaceController.h"
9 | #import "NetworkManager.h"
10 |
11 |
12 | @interface InterfaceController()
13 | @property (strong, nonatomic) WCSession *session;
14 | @property (strong, nonatomic) IBOutlet WKInterfaceTable *eventTable;
15 | @property (strong, nonatomic) NSArray *calendarEvents;
16 | @property (strong, nonatomic) IBOutlet WKInterfaceLabel *loadingLabel;
17 | @end
18 |
19 | @implementation InterfaceController
20 |
21 | - (void)awakeWithContext:(id)context {
22 | [super awakeWithContext:context];
23 |
24 | // Configure interface objects here.
25 |
26 | if ([WCSession isSupported]){
27 | self.session = [WCSession defaultSession];
28 | self.session.delegate = self;
29 | [self.session activateSession];
30 | }
31 | }
32 |
33 | - (void)willActivate {
34 | // This method is called when watch view controller is about to be visible to user
35 | [super willActivate];
36 |
37 | [self.loadingLabel setHidden:true];
38 | if([NetworkManager accessToken] !=nil) {
39 | [self getEvents];
40 | }
41 | else {
42 | NSLog(@"Please log in to the app on the phone.");
43 | }
44 | }
45 |
46 | - (void)didDeactivate {
47 | // This method is called when watch view controller is no longer visible
48 | [super didDeactivate];
49 | }
50 |
51 | // Retrieves a selection of current calendar events and populates the UI
52 | -(void)getEvents {
53 | [self.loadingLabel setHidden:false];
54 | NSString *path =[NSString stringWithFormat:@"https://graph.microsoft.com/v1.0/me/events"];
55 | NSMutableURLRequest *request = [NetworkManager getRequest:path];
56 | NSURLSession *getSession = [NSURLSession sharedSession];
57 | [[getSession dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
58 |
59 | id calendarResults = [NSJSONSerialization JSONObjectWithData:data
60 | options:NSJSONReadingMutableContainers
61 | error:nil];
62 |
63 | self.calendarEvents = [calendarResults objectForKey:@"value"];
64 |
65 | [self.eventTable setNumberOfRows: self.calendarEvents.count withRowType:@"eventRow"];
66 |
67 | [self.calendarEvents enumerateObjectsUsingBlock:^(id _Nonnull object, NSUInteger idx, BOOL * _Nonnull stop) {
68 |
69 | NSString *calendarEventName = [object objectForKey:@"subject"];
70 | EventTableRowController *eventController = [self.eventTable rowControllerAtIndex:idx];
71 | eventController.eventSubject.text = calendarEventName;
72 | [self.loadingLabel setHidden:true];
73 |
74 | }];
75 | }] resume];
76 | }
77 |
78 | - (void)table:(WKInterfaceTable *)table didSelectRowAtIndex:(NSInteger)rowIndex {
79 | [self pushControllerWithName:@"attendeeListController" context:self.calendarEvents[rowIndex]];
80 | }
81 |
82 |
83 | #pragma mark - WCSession Delegates
84 |
85 | //Retrieves and stores access token from the iOS app authentication process.
86 | //Populates UI with a recent selection of calendar events.
87 | - (void)session: (nonnull WCSession *)session didReceiveMessage:(nonnull NSDictionary *)message replyHandler:(nonnull void (^)(NSDictionary * _Nonnull))replyHandler{
88 | [NetworkManager setAccessToken:[message valueForKey:@"token"]];
89 | [self getEvents];
90 | }
91 |
92 | - (void)session: (nonnull WCSession *)session activationDidCompleteWithState:(WCSessionActivationState)activationState error:(nullable NSError *)error{
93 | }
94 |
95 | - (void)sessionDidDeactivate:(WCSession *)session {
96 | }
97 |
98 | - (void)sessionDidBecomeInactive:(WCSession *)session {
99 | }
100 |
101 | @end
102 |
103 |
104 |
105 |
--------------------------------------------------------------------------------
/iOS-ObjectiveC-MicrosoftGraph-WatchSample/Base.lproj/Main.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
27 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
--------------------------------------------------------------------------------
/iOS-ObjectiveC-MicrosoftGraph-WatchSample WatchKit Extension/ProfileController.m:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) Microsoft. All rights reserved. Licensed under the MIT license.
3 | * See LICENSE in the project root for license information.
4 | */
5 |
6 | #import "Attendee.h"
7 | #import "AttendeeListController.h"
8 | #import "DirectsTableRowController.h"
9 | #import "NetworkManager.h"
10 | #import "ProfileController.h"
11 | #import "ProfilePictureHelper.h"
12 |
13 |
14 | @interface ProfileController()
15 |
16 | @property (strong, nonatomic) IBOutlet WKInterfaceLabel *attendeeName;
17 | @property (strong, nonatomic) IBOutlet WKInterfaceLabel *jobTitle;
18 | @property (strong, nonatomic) IBOutlet WKInterfaceLabel *managerName;
19 | @property (strong, nonatomic) IBOutlet WKInterfaceLabel *directs;
20 | @property (strong, nonatomic) Attendee *attendee;
21 | @property (strong, nonatomic) IBOutlet WKInterfaceTable *directsTable;
22 | @property (strong, nonatomic) IBOutlet WKInterfaceLabel *loadingLabel;
23 |
24 | @end
25 |
26 | @implementation ProfileController
27 |
28 | - (void)awakeWithContext:(id)context {
29 | [super awakeWithContext:context];
30 |
31 | // Configure interface objects here.
32 | self.attendee = (Attendee*)context;
33 | self.attendeeName.text = self.attendee.name;
34 | [self.loadingLabel setHidden:false];
35 | [self getUserManager];
36 | [self getUserDirects];
37 |
38 | }
39 |
40 | #pragma mark - Retrieve user manager and their direct reports
41 |
42 | //Retrieves the selected attendee's manager (if they have one)
43 | - (void)getUserManager {
44 | [self.loadingLabel setHidden:false];
45 | NSString *path =[NSString stringWithFormat:@"https://graph.microsoft.com/v1.0/users/%@/manager", self.attendee.emailAddress];
46 | NSMutableURLRequest *request = [NetworkManager getRequest:path];
47 |
48 | [[[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
49 | if (error) {
50 | NSLog(@"%@", error.localizedDescription);
51 | }
52 |
53 | else {
54 | id userManager = [NSJSONSerialization JSONObjectWithData:data
55 | options:NSJSONReadingMutableContainers
56 | error:nil];
57 | NSString *managerName = [userManager objectForKey:@"displayName"];
58 | self.managerName.text = [NSString stringWithFormat:@"Manager: %@", managerName];
59 | }
60 | }]resume];
61 | }
62 |
63 | //Retrieves the selected attendee's direct reports (if they have them) idisplay direct profile picture
64 | - (void)getUserDirects {
65 | NSString *path =[NSString stringWithFormat:@"https://graph.microsoft.com/v1.0/users/%@/directReports", self.attendee.emailAddress];
66 | NSMutableURLRequest *request = [NetworkManager getRequest:path];
67 |
68 | [[[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
69 | id userDirectReports = [NSJSONSerialization JSONObjectWithData:data
70 | options:NSJSONReadingMutableContainers
71 | error:nil];
72 | if (error) {
73 | NSLog(@"%@", error.localizedDescription);
74 | }
75 |
76 | else {
77 | NSArray *directReports = [userDirectReports objectForKey:@"value"];
78 | [self.directsTable setNumberOfRows:directReports.count withRowType:@"directsRow"];
79 |
80 | [directReports enumerateObjectsUsingBlock:^(id _Nonnull object, NSUInteger idx, BOOL * _Nonnull stop) {
81 | Attendee *attendee = [[Attendee alloc] init];
82 | attendee.emailAddress = [object objectForKey:@"mail"];
83 | attendee.displayName = [object objectForKey:@"displayName"];
84 | attendee.jobTitle = [object objectForKey:@"jobTitle"];
85 | DirectsTableRowController *rowController = [self.directsTable rowControllerAtIndex:idx];
86 | rowController.directsName.text = attendee.displayName;
87 | self.jobTitle.text = attendee.jobTitle;
88 |
89 | [ProfilePictureHelper getPhotoForAttendee:attendee withCompletion:^(UIImage *image, NSError *error) {
90 | [rowController.profilePicture setImage:image];
91 | }];
92 | [self.loadingLabel setHidden:true];
93 | }];
94 | }
95 | }]resume];
96 | }
97 |
98 | @end
99 |
--------------------------------------------------------------------------------
/Readme.md:
--------------------------------------------------------------------------------
1 | # [ARCHIVED] Who are you? - Microsoft Graph and Apple Watch Sample
2 |
3 | ## IMPORTANT
4 |
5 | **This project is being archived. As part of the archival process, we're closing all open issues and pull requests.**
6 |
7 | **You can continue to use this sample "as-is", but it won't be maintained moving forward. We apologize for any inconvenience.**
8 |
9 | **Who are you?** is a watch sample that lets you find out more about a colleague in a meeting. It's meant to be a fun take on how you can intersect a wearable like an Apple Watch with Microsoft Graph, a unified endpoint for accessing data, relationships and insights that come from the Microsoft Cloud.
10 |
11 | The scenario revolves around on how we can get into a meeting where we don't know who somebody is, and we'd like to get a little more intel on them in a discreet manner. From the Apple Watch you can pull up the list of meeting attendees and view profile information such as their job title, manager, direct reports, and all associated profile pictures.
12 |
13 | 
14 |
15 |
16 | > Note: This sample is just an idea, and meant solely to open up the possibilities for integrating Microsoft Graph into a number of different scenarios. As always, when constructing your own app in your organization, you should ensure your own guidelines around security (authentication and app permissions) and app design are implemented. Also, please refer to Apple's [watchOS Human interface Guidelines](https://developer.apple.com/watch/human-interface-guidelines/).
17 |
18 | Finally, this a work in progress and we'd love it if you could contribute to, and improve upon it, as needed. **Who Are You?** is a WatchOS 2.2 sample that uses the Active Directory Authentication Library for iOS for auth, and the Microsoft Graph endpoint for gathering user profile specifics.
19 |
20 | ## Prerequisites
21 | * [Xcode](https://developer.apple.com/xcode/downloads/) from Apple (tested on version 7.3.1 with support for WatchOS 2.2.
22 | * Installation of [CocoaPods](https://guides.cocoapods.org/using/using-cocoapods.html) as a dependency manager.
23 | * A Microsoft work account such as Office 365 that supports Microsoft Exchange. You can sign up for an [Office 365 Enterprise trial subscription](https://products.office.com/en-us/business/office-365-enterprise-e5-business-software) that includes the resources that you need to start building Office 365 apps. This also includes 25 licenses to apply to users.
24 |
25 | > Note: This sample relies on having a licensed organizational accounts with limited profile information filled out such as an employee's job title, display name, manager, directs, and profile picture. If this information is not populated it won't show up in the app.
26 | * A Microsoft Azure tenant to register your application. Azure Active Directory provides identity services that applications use for authentication and authorization. A trial subscription can be acquired here: [Microsoft Azure](https://account.windowsazure.com/SignUp).
27 |
28 | **Important**: You will also need to ensure your Azure subscription is bound to your Office 365 tenant. To do this, see the Adding a new directory section in the Active Directory team's blog post, [Creating and Managing Multiple Windows Azure Active Directories](http://blogs.technet.com/b/ad/archive/2013/11/08/creating-and-managing-multiple-windows-azure-active-directories.aspx). You can also read [Set up Azure Active Directory access for your Developer Site](http://msdn.microsoft.com/office/office365/howto/setup-development-environment#bk_CreateAzureSubscription) for more information.
29 |
30 | ## Register your app with Microsoft Azure
31 | 1. Sign in to the [Azure portal](https://portal.azure.com/).
32 | 2. On the top bar, click on your account and under the **Directory** list, choose the Active Directory tenant where you wish to register your application.
33 | 3. Click on **More Services** in the left hand nav, and choose **Azure Active Directory**.
34 | 4. Click on **App registrations** and choose **Add**.
35 | 5. Enter a friendly name for the application such as **Watch Project**, select **Native** as the Application Type. For the **Redirect URI**, enter **https://localhost**. Click on **Create** to create the application.
36 | 6. While still in the Azure portal, choose your application, click on **Settings** and choose **Properties**.
37 | 7. Find the **Application ID** value and copy it to the clipboard. This is the client ID value we'll add to the project later.
38 | 8. Configure **Permissions** for your application - in the **Settings** menu, choose the **Required permissions** section, click on **Add**, then **Select an API**, and type "Microsoft Graph" in the text box. Then, click on **Select Permissions** and select:
39 | * Read all users' full profiles
40 | * Sign in and read user profile
41 | * Read user calendars
42 |
43 | 9. Click **Select**.
44 |
45 |
46 | ## Running this sample in Xcode
47 |
48 | 1. Clone this repository.
49 | 2. Use CocoaPods to import the ADAL authentication dependency. This sample app already contains a podfile that will get the pods into the project. Simply navigate to the project from **Terminal** and run:
50 |
51 | pod install
52 |
53 | For more information, see **Using CocoaPods** in [Additional Resources](#AdditionalResources)
54 |
55 | 3. Open **iOS-ObjectiveC-MicrosoftGraph-WatchSample.xcworkspace**
56 | 4. Open **ViewController.m**. You'll see that the **ClientID** (the application id you received from the prerequisites section) and **Redirect URI** from the registration process can be added to the top of the file:
57 |
58 | // You will set your application's clientId and redirect URI.
59 | NSString * const kRedirectUri = @"ENTER_REDIRECT_URI_HERE";
60 | NSString * const kClientId = @"ENTER_CLIENT_ID_HERE";
61 | NSString * const kAuthority = @"https://login.microsoftonline.com/common";
62 | NSString * const kResourceId = @"https://graph.microsoft.com";
63 |
64 | 5. Run the sample and ensure the target is set to the WatchKit App iPhone/Apple Watch scheme.
65 | 
66 | 6. Make sure the iOS app and the watch app simulators are visible. On the phone app, click *Connect* and you'll be asked to authenticate to a work mail account. Provide your credentials.
67 | 
68 | 6. Once authenticated, the watch app will immediately try to retrieve recent events from the logged in user's calendar. You will see a **Retrieving...** indicator on the watch appear. From there you can drill down into the attendees list, find somebody of interest, and view profile specifics: job title, manager, direct reports, and profile pictures.
69 |
70 | > Note: Again, you need to have a meeting created in your Office 365 tenant, licensed attendees added, and some of their profile specifcs entered for the app to return anything. Ensure that one is created with their display name and job title in Office 365 admin console. Direct reports and manager can be assigned in the Exchange admin center (recipients/mailboxes) in Office 365. Also, see the issue regarding the access token below in the **Known issues** section.
71 |
72 | ##Code of interest
73 |
74 | **Phone**
75 |
76 | *ViewController*- On the phone side this is where the where WCSession is configured and activated to establish connectivity between the phone and the watch. From here a call is made into the **AuthenticationManager** for an access token (ADAL for iOS), and it is sent to the watch via the **sendMessage:replyHandler:errorHandler:** method.
77 |
78 | **Watch**
79 |
80 | *InterfaceController* - In this controller, **session:didReceiveMessageData:replyHandler:** is implemented to receive the access token from the phone, from there it is stored in the **Network\NetworkManager.m** This controller will then make a call out to the Microsoft Graph service to retrieve the logged in user's calendar events (**getEvents**) and display them. User then selects a meeting and the calendar event object is passed to the **AttendeeListController**.
81 |
82 | *AttendeeListController* - This controller displays the list of meeting attendees along with their profile pictures. In the call to Microsoft Graph (**getEventAttendees**), an Attendee object is created/initialized with the attendee name, and then passed over to the **ProfileController** when the user selects them. Also, a helper class **ProfilePictureHelper** calls **getPhotoForAttendee:(Attendee *) withcompletion:** to retrieve all meeting participants' profile pictures.
83 |
84 | *ProfileController* - Finally two additional Microsoft Graph methods (**getUserManager, getUserDirects**) are called to retrieve the selected attendee's manager, job title, direct reports and associated profile pictures.
85 |
86 |
87 | ##Known issues
88 | Again this project is a work in progress, and at this time the access token passed between the phone and the watch is not being refreshed at expiration. For now, once it expires, you'll have to log-in again. On the simulator you can simply redeploy the app, but if deploying to a watch, the app will hang after it expires. You can either redeploy to the device, or shut down the app in the background and relaunch (open app, press side button until the power menu appears, hold down the side button again until that menu disappears, restart app).
89 |
90 | ## Questions and comments
91 |
92 | We'd love to get your feedback about the **Who are you** app. You can send your questions and suggestions to us in the [Issues](https://github.com/microsoftgraph/iOS-objectiveC-apple-watch-sample/issues) section of this repository.
93 |
94 | Questions about Microsoft Graph development in general should be posted to [Stack Overflow](http://stackoverflow.com/questions/tagged/Office365+API). Make sure that your questions or comments are tagged with [Office365] and [MicrosoftGraph].
95 |
96 | ## Contributing
97 | You will need to sign a [Contributor License Agreement](https://cla.microsoft.com/) before submitting your pull request. To complete the Contributor License Agreement (CLA), you will need to submit a request via the form and then electronically sign the CLA when you receive the email containing the link to the document.
98 |
99 | This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments.
100 |
101 | ## Additional resources
102 |
103 | * [Microsoft Graph overview page](https://graph.microsoft.io)
104 | * [Using CocoaPods](https://guides.cocoapods.org/using/using-cocoapods.html)
105 |
106 | ## Copyright
107 | Copyright (c) 2016 Microsoft. All rights reserved.
108 |
109 |
--------------------------------------------------------------------------------
/iOS-ObjectiveC-MicrosoftGraph-WatchSample WatchKit App/Base.lproj/Interface.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
59 |
60 |
63 |
64 |
65 |
66 |
69 |
70 |
71 |
72 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
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 |
118 |
119 |
120 |
121 |
122 |
123 |
124 |
125 |
126 |
127 |
128 |
131 |
132 |
133 |
134 |
135 |
136 |
137 |
138 |
139 |
140 |
141 |
142 |
143 |
144 |
145 |
146 |
147 |
148 |
149 |
150 |
151 |
--------------------------------------------------------------------------------
/iOS-ObjectiveC-MicrosoftGraph-WatchSample.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 46;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | 3A56AAF9A9FBDCC8C67AC844 /* libPods-iOS-ObjectiveC-MicrosoftGraph-WatchSample.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 24D6EC519428607D0B99722E /* libPods-iOS-ObjectiveC-MicrosoftGraph-WatchSample.a */; };
11 | D35BB6031D3DB4EB002E2A19 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = D35BB6021D3DB4EB002E2A19 /* main.m */; };
12 | D35BB6061D3DB4EB002E2A19 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = D35BB6051D3DB4EB002E2A19 /* AppDelegate.m */; };
13 | D35BB60C1D3DB4EB002E2A19 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D35BB60A1D3DB4EB002E2A19 /* Main.storyboard */; };
14 | D35BB60E1D3DB4EB002E2A19 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = D35BB60D1D3DB4EB002E2A19 /* Assets.xcassets */; };
15 | D35BB6111D3DB4EB002E2A19 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D35BB60F1D3DB4EB002E2A19 /* LaunchScreen.storyboard */; };
16 | D35BB6161D3DB4EB002E2A19 /* iOS-ObjectiveC-MicrosoftGraph-WatchSample WatchKit App.app in Embed Watch Content */ = {isa = PBXBuildFile; fileRef = D35BB6151D3DB4EB002E2A19 /* iOS-ObjectiveC-MicrosoftGraph-WatchSample WatchKit App.app */; };
17 | D35BB61C1D3DB4EB002E2A19 /* Interface.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D35BB61A1D3DB4EB002E2A19 /* Interface.storyboard */; };
18 | D35BB61E1D3DB4EB002E2A19 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = D35BB61D1D3DB4EB002E2A19 /* Assets.xcassets */; };
19 | D35BB6251D3DB4EB002E2A19 /* iOS-ObjectiveC-MicrosoftGraph-WatchSample WatchKit Extension.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = D35BB6241D3DB4EB002E2A19 /* iOS-ObjectiveC-MicrosoftGraph-WatchSample WatchKit Extension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
20 | D35BB62E1D3DB4EB002E2A19 /* ExtensionDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = D35BB62D1D3DB4EB002E2A19 /* ExtensionDelegate.m */; };
21 | D35BB6301D3DB4EB002E2A19 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = D35BB62F1D3DB4EB002E2A19 /* Assets.xcassets */; };
22 | D35BB6411D3DB5C4002E2A19 /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D35BB6401D3DB5C4002E2A19 /* ViewController.m */; };
23 | D35BB6441D3DB5E3002E2A19 /* AuthenticationManager.m in Sources */ = {isa = PBXBuildFile; fileRef = D35BB6431D3DB5E3002E2A19 /* AuthenticationManager.m */; };
24 | D35BB6461D3DB894002E2A19 /* Attendee.m in Sources */ = {isa = PBXBuildFile; fileRef = D35BB6451D3DB894002E2A19 /* Attendee.m */; };
25 | D35BB6541D3DB8BC002E2A19 /* InterfaceController.m in Sources */ = {isa = PBXBuildFile; fileRef = D35BB6491D3DB8BC002E2A19 /* InterfaceController.m */; };
26 | D35BB6551D3DB8BC002E2A19 /* EventTableRowController.m in Sources */ = {isa = PBXBuildFile; fileRef = D35BB64B1D3DB8BC002E2A19 /* EventTableRowController.m */; };
27 | D35BB6561D3DB8BC002E2A19 /* AttendeeListController.m in Sources */ = {isa = PBXBuildFile; fileRef = D35BB64D1D3DB8BC002E2A19 /* AttendeeListController.m */; };
28 | D35BB6571D3DB8BC002E2A19 /* AttendeeListRowController.m in Sources */ = {isa = PBXBuildFile; fileRef = D35BB64F1D3DB8BC002E2A19 /* AttendeeListRowController.m */; };
29 | D35BB6581D3DB8BC002E2A19 /* ProfileController.m in Sources */ = {isa = PBXBuildFile; fileRef = D35BB6511D3DB8BC002E2A19 /* ProfileController.m */; };
30 | D35BB6591D3DB8BC002E2A19 /* DirectsTableRowController.m in Sources */ = {isa = PBXBuildFile; fileRef = D35BB6531D3DB8BC002E2A19 /* DirectsTableRowController.m */; };
31 | D35BB65C1D3DB8CE002E2A19 /* NetworkManager.m in Sources */ = {isa = PBXBuildFile; fileRef = D35BB65B1D3DB8CE002E2A19 /* NetworkManager.m */; };
32 | D35BB65F1D3DB8E3002E2A19 /* ProfilePictureHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = D35BB65E1D3DB8E3002E2A19 /* ProfilePictureHelper.m */; };
33 | /* End PBXBuildFile section */
34 |
35 | /* Begin PBXContainerItemProxy section */
36 | D35BB6171D3DB4EB002E2A19 /* PBXContainerItemProxy */ = {
37 | isa = PBXContainerItemProxy;
38 | containerPortal = D35BB5F61D3DB4EB002E2A19 /* Project object */;
39 | proxyType = 1;
40 | remoteGlobalIDString = D35BB6141D3DB4EB002E2A19;
41 | remoteInfo = "iOS-ObjectiveC-MicrosoftGraph-WatchSample WatchKit App";
42 | };
43 | D35BB6261D3DB4EB002E2A19 /* PBXContainerItemProxy */ = {
44 | isa = PBXContainerItemProxy;
45 | containerPortal = D35BB5F61D3DB4EB002E2A19 /* Project object */;
46 | proxyType = 1;
47 | remoteGlobalIDString = D35BB6231D3DB4EB002E2A19;
48 | remoteInfo = "iOS-ObjectiveC-MicrosoftGraph-WatchSample WatchKit Extension";
49 | };
50 | /* End PBXContainerItemProxy section */
51 |
52 | /* Begin PBXCopyFilesBuildPhase section */
53 | D35BB6371D3DB4EB002E2A19 /* Embed App Extensions */ = {
54 | isa = PBXCopyFilesBuildPhase;
55 | buildActionMask = 2147483647;
56 | dstPath = "";
57 | dstSubfolderSpec = 13;
58 | files = (
59 | D35BB6251D3DB4EB002E2A19 /* iOS-ObjectiveC-MicrosoftGraph-WatchSample WatchKit Extension.appex in Embed App Extensions */,
60 | );
61 | name = "Embed App Extensions";
62 | runOnlyForDeploymentPostprocessing = 0;
63 | };
64 | D35BB63B1D3DB4EB002E2A19 /* Embed Watch Content */ = {
65 | isa = PBXCopyFilesBuildPhase;
66 | buildActionMask = 2147483647;
67 | dstPath = "$(CONTENTS_FOLDER_PATH)/Watch";
68 | dstSubfolderSpec = 16;
69 | files = (
70 | D35BB6161D3DB4EB002E2A19 /* iOS-ObjectiveC-MicrosoftGraph-WatchSample WatchKit App.app in Embed Watch Content */,
71 | );
72 | name = "Embed Watch Content";
73 | runOnlyForDeploymentPostprocessing = 0;
74 | };
75 | /* End PBXCopyFilesBuildPhase section */
76 |
77 | /* Begin PBXFileReference section */
78 | 24D6EC519428607D0B99722E /* libPods-iOS-ObjectiveC-MicrosoftGraph-WatchSample.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-iOS-ObjectiveC-MicrosoftGraph-WatchSample.a"; sourceTree = BUILT_PRODUCTS_DIR; };
79 | 583FC0348F9E8074390E36E1 /* Pods-iOS-ObjectiveC-MicrosoftGraph-WatchSample.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-iOS-ObjectiveC-MicrosoftGraph-WatchSample.release.xcconfig"; path = "Pods/Target Support Files/Pods-iOS-ObjectiveC-MicrosoftGraph-WatchSample/Pods-iOS-ObjectiveC-MicrosoftGraph-WatchSample.release.xcconfig"; sourceTree = ""; };
80 | 6F83F5E55412B9135B55F6C7 /* Pods-iOS-ObjectiveC-MicrosoftGraph-WatchSample.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-iOS-ObjectiveC-MicrosoftGraph-WatchSample.debug.xcconfig"; path = "Pods/Target Support Files/Pods-iOS-ObjectiveC-MicrosoftGraph-WatchSample/Pods-iOS-ObjectiveC-MicrosoftGraph-WatchSample.debug.xcconfig"; sourceTree = ""; };
81 | D35BB5FE1D3DB4EB002E2A19 /* iOS-ObjectiveC-MicrosoftGraph-WatchSample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "iOS-ObjectiveC-MicrosoftGraph-WatchSample.app"; sourceTree = BUILT_PRODUCTS_DIR; };
82 | D35BB6021D3DB4EB002E2A19 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; };
83 | D35BB6041D3DB4EB002E2A19 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; };
84 | D35BB6051D3DB4EB002E2A19 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; };
85 | D35BB60B1D3DB4EB002E2A19 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; };
86 | D35BB60D1D3DB4EB002E2A19 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
87 | D35BB6101D3DB4EB002E2A19 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; };
88 | D35BB6121D3DB4EB002E2A19 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
89 | D35BB6151D3DB4EB002E2A19 /* iOS-ObjectiveC-MicrosoftGraph-WatchSample WatchKit App.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "iOS-ObjectiveC-MicrosoftGraph-WatchSample WatchKit App.app"; sourceTree = BUILT_PRODUCTS_DIR; };
90 | D35BB61B1D3DB4EB002E2A19 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Interface.storyboard; sourceTree = ""; };
91 | D35BB61D1D3DB4EB002E2A19 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
92 | D35BB61F1D3DB4EB002E2A19 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
93 | D35BB6241D3DB4EB002E2A19 /* iOS-ObjectiveC-MicrosoftGraph-WatchSample WatchKit Extension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = "iOS-ObjectiveC-MicrosoftGraph-WatchSample WatchKit Extension.appex"; sourceTree = BUILT_PRODUCTS_DIR; };
94 | D35BB62C1D3DB4EB002E2A19 /* ExtensionDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ExtensionDelegate.h; sourceTree = ""; };
95 | D35BB62D1D3DB4EB002E2A19 /* ExtensionDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ExtensionDelegate.m; sourceTree = ""; };
96 | D35BB62F1D3DB4EB002E2A19 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
97 | D35BB6311D3DB4EB002E2A19 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
98 | D35BB63F1D3DB5C4002E2A19 /* ViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ViewController.h; path = "iOS-ObjectiveC-MicrosoftGraph-WatchSample/ViewController.h"; sourceTree = ""; };
99 | D35BB6401D3DB5C4002E2A19 /* ViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ViewController.m; path = "iOS-ObjectiveC-MicrosoftGraph-WatchSample/ViewController.m"; sourceTree = ""; };
100 | D35BB6421D3DB5E3002E2A19 /* AuthenticationManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AuthenticationManager.h; sourceTree = ""; };
101 | D35BB6431D3DB5E3002E2A19 /* AuthenticationManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AuthenticationManager.m; sourceTree = ""; };
102 | D35BB6451D3DB894002E2A19 /* Attendee.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Attendee.m; sourceTree = ""; };
103 | D35BB6471D3DB89E002E2A19 /* Attendee.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Attendee.h; sourceTree = ""; };
104 | D35BB6481D3DB8BC002E2A19 /* InterfaceController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InterfaceController.h; sourceTree = ""; };
105 | D35BB6491D3DB8BC002E2A19 /* InterfaceController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = InterfaceController.m; sourceTree = ""; };
106 | D35BB64A1D3DB8BC002E2A19 /* EventTableRowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EventTableRowController.h; sourceTree = ""; };
107 | D35BB64B1D3DB8BC002E2A19 /* EventTableRowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = EventTableRowController.m; sourceTree = ""; };
108 | D35BB64C1D3DB8BC002E2A19 /* AttendeeListController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AttendeeListController.h; sourceTree = ""; };
109 | D35BB64D1D3DB8BC002E2A19 /* AttendeeListController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AttendeeListController.m; sourceTree = ""; };
110 | D35BB64E1D3DB8BC002E2A19 /* AttendeeListRowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AttendeeListRowController.h; sourceTree = ""; };
111 | D35BB64F1D3DB8BC002E2A19 /* AttendeeListRowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AttendeeListRowController.m; sourceTree = ""; };
112 | D35BB6501D3DB8BC002E2A19 /* ProfileController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ProfileController.h; sourceTree = ""; };
113 | D35BB6511D3DB8BC002E2A19 /* ProfileController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ProfileController.m; sourceTree = ""; };
114 | D35BB6521D3DB8BC002E2A19 /* DirectsTableRowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DirectsTableRowController.h; sourceTree = ""; };
115 | D35BB6531D3DB8BC002E2A19 /* DirectsTableRowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DirectsTableRowController.m; sourceTree = ""; };
116 | D35BB65A1D3DB8CE002E2A19 /* NetworkManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NetworkManager.h; sourceTree = ""; };
117 | D35BB65B1D3DB8CE002E2A19 /* NetworkManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NetworkManager.m; sourceTree = ""; };
118 | D35BB65D1D3DB8E3002E2A19 /* ProfilePictureHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ProfilePictureHelper.h; sourceTree = ""; };
119 | D35BB65E1D3DB8E3002E2A19 /* ProfilePictureHelper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ProfilePictureHelper.m; sourceTree = ""; };
120 | /* End PBXFileReference section */
121 |
122 | /* Begin PBXFrameworksBuildPhase section */
123 | D2411351100C9B9BF19FCCA5 /* Frameworks */ = {
124 | isa = PBXFrameworksBuildPhase;
125 | buildActionMask = 2147483647;
126 | files = (
127 | );
128 | runOnlyForDeploymentPostprocessing = 0;
129 | };
130 | D35BB5FB1D3DB4EB002E2A19 /* Frameworks */ = {
131 | isa = PBXFrameworksBuildPhase;
132 | buildActionMask = 2147483647;
133 | files = (
134 | 3A56AAF9A9FBDCC8C67AC844 /* libPods-iOS-ObjectiveC-MicrosoftGraph-WatchSample.a in Frameworks */,
135 | );
136 | runOnlyForDeploymentPostprocessing = 0;
137 | };
138 | D35BB6211D3DB4EB002E2A19 /* Frameworks */ = {
139 | isa = PBXFrameworksBuildPhase;
140 | buildActionMask = 2147483647;
141 | files = (
142 | );
143 | runOnlyForDeploymentPostprocessing = 0;
144 | };
145 | /* End PBXFrameworksBuildPhase section */
146 |
147 | /* Begin PBXGroup section */
148 | 72D513875C1082E7F1A0B6D7 /* Pods */ = {
149 | isa = PBXGroup;
150 | children = (
151 | 6F83F5E55412B9135B55F6C7 /* Pods-iOS-ObjectiveC-MicrosoftGraph-WatchSample.debug.xcconfig */,
152 | 583FC0348F9E8074390E36E1 /* Pods-iOS-ObjectiveC-MicrosoftGraph-WatchSample.release.xcconfig */,
153 | );
154 | name = Pods;
155 | sourceTree = "";
156 | };
157 | 87B0C091E9B16FBD0F8E9872 /* Frameworks */ = {
158 | isa = PBXGroup;
159 | children = (
160 | 24D6EC519428607D0B99722E /* libPods-iOS-ObjectiveC-MicrosoftGraph-WatchSample.a */,
161 | );
162 | name = Frameworks;
163 | sourceTree = "";
164 | };
165 | D35BB5F51D3DB4EB002E2A19 = {
166 | isa = PBXGroup;
167 | children = (
168 | D35BB6001D3DB4EB002E2A19 /* iOS-ObjectiveC-MicrosoftGraph-WatchSample */,
169 | D35BB6191D3DB4EB002E2A19 /* iOS-ObjectiveC-MicrosoftGraph-WatchSample WatchKit App */,
170 | D35BB6281D3DB4EB002E2A19 /* iOS-ObjectiveC-MicrosoftGraph-WatchSample WatchKit Extension */,
171 | D35BB5FF1D3DB4EB002E2A19 /* Products */,
172 | 72D513875C1082E7F1A0B6D7 /* Pods */,
173 | 87B0C091E9B16FBD0F8E9872 /* Frameworks */,
174 | );
175 | sourceTree = "";
176 | };
177 | D35BB5FF1D3DB4EB002E2A19 /* Products */ = {
178 | isa = PBXGroup;
179 | children = (
180 | D35BB5FE1D3DB4EB002E2A19 /* iOS-ObjectiveC-MicrosoftGraph-WatchSample.app */,
181 | D35BB6151D3DB4EB002E2A19 /* iOS-ObjectiveC-MicrosoftGraph-WatchSample WatchKit App.app */,
182 | D35BB6241D3DB4EB002E2A19 /* iOS-ObjectiveC-MicrosoftGraph-WatchSample WatchKit Extension.appex */,
183 | );
184 | name = Products;
185 | sourceTree = "";
186 | };
187 | D35BB6001D3DB4EB002E2A19 /* iOS-ObjectiveC-MicrosoftGraph-WatchSample */ = {
188 | isa = PBXGroup;
189 | children = (
190 | D35BB6611D3DB99D002E2A19 /* Authentication */,
191 | D35BB6601D3DB985002E2A19 /* Controllers */,
192 | D35BB6041D3DB4EB002E2A19 /* AppDelegate.h */,
193 | D35BB6051D3DB4EB002E2A19 /* AppDelegate.m */,
194 | D35BB60A1D3DB4EB002E2A19 /* Main.storyboard */,
195 | D35BB60D1D3DB4EB002E2A19 /* Assets.xcassets */,
196 | D35BB60F1D3DB4EB002E2A19 /* LaunchScreen.storyboard */,
197 | D35BB6121D3DB4EB002E2A19 /* Info.plist */,
198 | D35BB6011D3DB4EB002E2A19 /* Supporting Files */,
199 | );
200 | path = "iOS-ObjectiveC-MicrosoftGraph-WatchSample";
201 | sourceTree = "";
202 | };
203 | D35BB6011D3DB4EB002E2A19 /* Supporting Files */ = {
204 | isa = PBXGroup;
205 | children = (
206 | D35BB6021D3DB4EB002E2A19 /* main.m */,
207 | );
208 | name = "Supporting Files";
209 | sourceTree = "";
210 | };
211 | D35BB6191D3DB4EB002E2A19 /* iOS-ObjectiveC-MicrosoftGraph-WatchSample WatchKit App */ = {
212 | isa = PBXGroup;
213 | children = (
214 | D35BB61A1D3DB4EB002E2A19 /* Interface.storyboard */,
215 | D35BB61D1D3DB4EB002E2A19 /* Assets.xcassets */,
216 | D35BB61F1D3DB4EB002E2A19 /* Info.plist */,
217 | );
218 | path = "iOS-ObjectiveC-MicrosoftGraph-WatchSample WatchKit App";
219 | sourceTree = "";
220 | };
221 | D35BB6281D3DB4EB002E2A19 /* iOS-ObjectiveC-MicrosoftGraph-WatchSample WatchKit Extension */ = {
222 | isa = PBXGroup;
223 | children = (
224 | D35BB6651D3DBA5A002E2A19 /* Application */,
225 | D35BB6621D3DB9BE002E2A19 /* Controllers */,
226 | D35BB6631D3DB9FE002E2A19 /* Network */,
227 | D35BB6641D3DBA2B002E2A19 /* Helpers */,
228 | D35BB62C1D3DB4EB002E2A19 /* ExtensionDelegate.h */,
229 | D35BB62D1D3DB4EB002E2A19 /* ExtensionDelegate.m */,
230 | D35BB62F1D3DB4EB002E2A19 /* Assets.xcassets */,
231 | D35BB6311D3DB4EB002E2A19 /* Info.plist */,
232 | );
233 | path = "iOS-ObjectiveC-MicrosoftGraph-WatchSample WatchKit Extension";
234 | sourceTree = "";
235 | };
236 | D35BB6601D3DB985002E2A19 /* Controllers */ = {
237 | isa = PBXGroup;
238 | children = (
239 | D35BB63F1D3DB5C4002E2A19 /* ViewController.h */,
240 | D35BB6401D3DB5C4002E2A19 /* ViewController.m */,
241 | );
242 | name = Controllers;
243 | path = ..;
244 | sourceTree = "";
245 | };
246 | D35BB6611D3DB99D002E2A19 /* Authentication */ = {
247 | isa = PBXGroup;
248 | children = (
249 | D35BB6431D3DB5E3002E2A19 /* AuthenticationManager.m */,
250 | D35BB6421D3DB5E3002E2A19 /* AuthenticationManager.h */,
251 | );
252 | name = Authentication;
253 | sourceTree = "";
254 | };
255 | D35BB6621D3DB9BE002E2A19 /* Controllers */ = {
256 | isa = PBXGroup;
257 | children = (
258 | D35BB6481D3DB8BC002E2A19 /* InterfaceController.h */,
259 | D35BB6491D3DB8BC002E2A19 /* InterfaceController.m */,
260 | D35BB64A1D3DB8BC002E2A19 /* EventTableRowController.h */,
261 | D35BB64B1D3DB8BC002E2A19 /* EventTableRowController.m */,
262 | D35BB64C1D3DB8BC002E2A19 /* AttendeeListController.h */,
263 | D35BB64D1D3DB8BC002E2A19 /* AttendeeListController.m */,
264 | D35BB64E1D3DB8BC002E2A19 /* AttendeeListRowController.h */,
265 | D35BB64F1D3DB8BC002E2A19 /* AttendeeListRowController.m */,
266 | D35BB6501D3DB8BC002E2A19 /* ProfileController.h */,
267 | D35BB6511D3DB8BC002E2A19 /* ProfileController.m */,
268 | D35BB6521D3DB8BC002E2A19 /* DirectsTableRowController.h */,
269 | D35BB6531D3DB8BC002E2A19 /* DirectsTableRowController.m */,
270 | );
271 | name = Controllers;
272 | sourceTree = "";
273 | };
274 | D35BB6631D3DB9FE002E2A19 /* Network */ = {
275 | isa = PBXGroup;
276 | children = (
277 | D35BB65A1D3DB8CE002E2A19 /* NetworkManager.h */,
278 | D35BB65B1D3DB8CE002E2A19 /* NetworkManager.m */,
279 | );
280 | name = Network;
281 | sourceTree = "";
282 | };
283 | D35BB6641D3DBA2B002E2A19 /* Helpers */ = {
284 | isa = PBXGroup;
285 | children = (
286 | D35BB65E1D3DB8E3002E2A19 /* ProfilePictureHelper.m */,
287 | D35BB65D1D3DB8E3002E2A19 /* ProfilePictureHelper.h */,
288 | );
289 | name = Helpers;
290 | sourceTree = "";
291 | };
292 | D35BB6651D3DBA5A002E2A19 /* Application */ = {
293 | isa = PBXGroup;
294 | children = (
295 | D35BB6471D3DB89E002E2A19 /* Attendee.h */,
296 | D35BB6451D3DB894002E2A19 /* Attendee.m */,
297 | );
298 | name = Application;
299 | sourceTree = "";
300 | };
301 | /* End PBXGroup section */
302 |
303 | /* Begin PBXNativeTarget section */
304 | D35BB5FD1D3DB4EB002E2A19 /* iOS-ObjectiveC-MicrosoftGraph-WatchSample */ = {
305 | isa = PBXNativeTarget;
306 | buildConfigurationList = D35BB63C1D3DB4EB002E2A19 /* Build configuration list for PBXNativeTarget "iOS-ObjectiveC-MicrosoftGraph-WatchSample" */;
307 | buildPhases = (
308 | 66AC293335C6DC278C9758C0 /* [CP] Check Pods Manifest.lock */,
309 | D35BB5FA1D3DB4EB002E2A19 /* Sources */,
310 | D35BB5FB1D3DB4EB002E2A19 /* Frameworks */,
311 | D35BB5FC1D3DB4EB002E2A19 /* Resources */,
312 | D35BB63B1D3DB4EB002E2A19 /* Embed Watch Content */,
313 | 4BA81C0F711595190FBA194C /* [CP] Embed Pods Frameworks */,
314 | 8573B85F76ECAA6CBDE581E3 /* [CP] Copy Pods Resources */,
315 | );
316 | buildRules = (
317 | );
318 | dependencies = (
319 | D35BB6181D3DB4EB002E2A19 /* PBXTargetDependency */,
320 | );
321 | name = "iOS-ObjectiveC-MicrosoftGraph-WatchSample";
322 | productName = "iOS-ObjectiveC-MicrosoftGraph-WatchSample";
323 | productReference = D35BB5FE1D3DB4EB002E2A19 /* iOS-ObjectiveC-MicrosoftGraph-WatchSample.app */;
324 | productType = "com.apple.product-type.application";
325 | };
326 | D35BB6141D3DB4EB002E2A19 /* iOS-ObjectiveC-MicrosoftGraph-WatchSample WatchKit App */ = {
327 | isa = PBXNativeTarget;
328 | buildConfigurationList = D35BB6381D3DB4EB002E2A19 /* Build configuration list for PBXNativeTarget "iOS-ObjectiveC-MicrosoftGraph-WatchSample WatchKit App" */;
329 | buildPhases = (
330 | D35BB6131D3DB4EB002E2A19 /* Resources */,
331 | D35BB6371D3DB4EB002E2A19 /* Embed App Extensions */,
332 | D2411351100C9B9BF19FCCA5 /* Frameworks */,
333 | );
334 | buildRules = (
335 | );
336 | dependencies = (
337 | D35BB6271D3DB4EB002E2A19 /* PBXTargetDependency */,
338 | );
339 | name = "iOS-ObjectiveC-MicrosoftGraph-WatchSample WatchKit App";
340 | productName = "iOS-ObjectiveC-MicrosoftGraph-WatchSample WatchKit App";
341 | productReference = D35BB6151D3DB4EB002E2A19 /* iOS-ObjectiveC-MicrosoftGraph-WatchSample WatchKit App.app */;
342 | productType = "com.apple.product-type.application.watchapp2";
343 | };
344 | D35BB6231D3DB4EB002E2A19 /* iOS-ObjectiveC-MicrosoftGraph-WatchSample WatchKit Extension */ = {
345 | isa = PBXNativeTarget;
346 | buildConfigurationList = D35BB6341D3DB4EB002E2A19 /* Build configuration list for PBXNativeTarget "iOS-ObjectiveC-MicrosoftGraph-WatchSample WatchKit Extension" */;
347 | buildPhases = (
348 | D35BB6201D3DB4EB002E2A19 /* Sources */,
349 | D35BB6211D3DB4EB002E2A19 /* Frameworks */,
350 | D35BB6221D3DB4EB002E2A19 /* Resources */,
351 | );
352 | buildRules = (
353 | );
354 | dependencies = (
355 | );
356 | name = "iOS-ObjectiveC-MicrosoftGraph-WatchSample WatchKit Extension";
357 | productName = "iOS-ObjectiveC-MicrosoftGraph-WatchSample WatchKit Extension";
358 | productReference = D35BB6241D3DB4EB002E2A19 /* iOS-ObjectiveC-MicrosoftGraph-WatchSample WatchKit Extension.appex */;
359 | productType = "com.apple.product-type.watchkit2-extension";
360 | };
361 | /* End PBXNativeTarget section */
362 |
363 | /* Begin PBXProject section */
364 | D35BB5F61D3DB4EB002E2A19 /* Project object */ = {
365 | isa = PBXProject;
366 | attributes = {
367 | LastUpgradeCheck = 0730;
368 | ORGANIZATIONNAME = Microsoft;
369 | TargetAttributes = {
370 | D35BB5FD1D3DB4EB002E2A19 = {
371 | CreatedOnToolsVersion = 7.3.1;
372 | };
373 | D35BB6141D3DB4EB002E2A19 = {
374 | CreatedOnToolsVersion = 7.3.1;
375 | };
376 | D35BB6231D3DB4EB002E2A19 = {
377 | CreatedOnToolsVersion = 7.3.1;
378 | };
379 | };
380 | };
381 | buildConfigurationList = D35BB5F91D3DB4EB002E2A19 /* Build configuration list for PBXProject "iOS-ObjectiveC-MicrosoftGraph-WatchSample" */;
382 | compatibilityVersion = "Xcode 3.2";
383 | developmentRegion = English;
384 | hasScannedForEncodings = 0;
385 | knownRegions = (
386 | en,
387 | Base,
388 | );
389 | mainGroup = D35BB5F51D3DB4EB002E2A19;
390 | productRefGroup = D35BB5FF1D3DB4EB002E2A19 /* Products */;
391 | projectDirPath = "";
392 | projectRoot = "";
393 | targets = (
394 | D35BB5FD1D3DB4EB002E2A19 /* iOS-ObjectiveC-MicrosoftGraph-WatchSample */,
395 | D35BB6141D3DB4EB002E2A19 /* iOS-ObjectiveC-MicrosoftGraph-WatchSample WatchKit App */,
396 | D35BB6231D3DB4EB002E2A19 /* iOS-ObjectiveC-MicrosoftGraph-WatchSample WatchKit Extension */,
397 | );
398 | };
399 | /* End PBXProject section */
400 |
401 | /* Begin PBXResourcesBuildPhase section */
402 | D35BB5FC1D3DB4EB002E2A19 /* Resources */ = {
403 | isa = PBXResourcesBuildPhase;
404 | buildActionMask = 2147483647;
405 | files = (
406 | D35BB6111D3DB4EB002E2A19 /* LaunchScreen.storyboard in Resources */,
407 | D35BB60E1D3DB4EB002E2A19 /* Assets.xcassets in Resources */,
408 | D35BB60C1D3DB4EB002E2A19 /* Main.storyboard in Resources */,
409 | );
410 | runOnlyForDeploymentPostprocessing = 0;
411 | };
412 | D35BB6131D3DB4EB002E2A19 /* Resources */ = {
413 | isa = PBXResourcesBuildPhase;
414 | buildActionMask = 2147483647;
415 | files = (
416 | D35BB61E1D3DB4EB002E2A19 /* Assets.xcassets in Resources */,
417 | D35BB61C1D3DB4EB002E2A19 /* Interface.storyboard in Resources */,
418 | );
419 | runOnlyForDeploymentPostprocessing = 0;
420 | };
421 | D35BB6221D3DB4EB002E2A19 /* Resources */ = {
422 | isa = PBXResourcesBuildPhase;
423 | buildActionMask = 2147483647;
424 | files = (
425 | D35BB6301D3DB4EB002E2A19 /* Assets.xcassets in Resources */,
426 | );
427 | runOnlyForDeploymentPostprocessing = 0;
428 | };
429 | /* End PBXResourcesBuildPhase section */
430 |
431 | /* Begin PBXShellScriptBuildPhase section */
432 | 4BA81C0F711595190FBA194C /* [CP] Embed Pods Frameworks */ = {
433 | isa = PBXShellScriptBuildPhase;
434 | buildActionMask = 2147483647;
435 | files = (
436 | );
437 | inputPaths = (
438 | );
439 | name = "[CP] Embed Pods Frameworks";
440 | outputPaths = (
441 | );
442 | runOnlyForDeploymentPostprocessing = 0;
443 | shellPath = /bin/sh;
444 | shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-iOS-ObjectiveC-MicrosoftGraph-WatchSample/Pods-iOS-ObjectiveC-MicrosoftGraph-WatchSample-frameworks.sh\"\n";
445 | showEnvVarsInLog = 0;
446 | };
447 | 66AC293335C6DC278C9758C0 /* [CP] Check Pods Manifest.lock */ = {
448 | isa = PBXShellScriptBuildPhase;
449 | buildActionMask = 2147483647;
450 | files = (
451 | );
452 | inputPaths = (
453 | );
454 | name = "[CP] Check Pods Manifest.lock";
455 | outputPaths = (
456 | );
457 | runOnlyForDeploymentPostprocessing = 0;
458 | shellPath = /bin/sh;
459 | 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";
460 | showEnvVarsInLog = 0;
461 | };
462 | 8573B85F76ECAA6CBDE581E3 /* [CP] Copy Pods Resources */ = {
463 | isa = PBXShellScriptBuildPhase;
464 | buildActionMask = 2147483647;
465 | files = (
466 | );
467 | inputPaths = (
468 | );
469 | name = "[CP] Copy Pods Resources";
470 | outputPaths = (
471 | );
472 | runOnlyForDeploymentPostprocessing = 0;
473 | shellPath = /bin/sh;
474 | shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-iOS-ObjectiveC-MicrosoftGraph-WatchSample/Pods-iOS-ObjectiveC-MicrosoftGraph-WatchSample-resources.sh\"\n";
475 | showEnvVarsInLog = 0;
476 | };
477 | /* End PBXShellScriptBuildPhase section */
478 |
479 | /* Begin PBXSourcesBuildPhase section */
480 | D35BB5FA1D3DB4EB002E2A19 /* Sources */ = {
481 | isa = PBXSourcesBuildPhase;
482 | buildActionMask = 2147483647;
483 | files = (
484 | D35BB6411D3DB5C4002E2A19 /* ViewController.m in Sources */,
485 | D35BB6441D3DB5E3002E2A19 /* AuthenticationManager.m in Sources */,
486 | D35BB6061D3DB4EB002E2A19 /* AppDelegate.m in Sources */,
487 | D35BB6031D3DB4EB002E2A19 /* main.m in Sources */,
488 | );
489 | runOnlyForDeploymentPostprocessing = 0;
490 | };
491 | D35BB6201D3DB4EB002E2A19 /* Sources */ = {
492 | isa = PBXSourcesBuildPhase;
493 | buildActionMask = 2147483647;
494 | files = (
495 | D35BB65F1D3DB8E3002E2A19 /* ProfilePictureHelper.m in Sources */,
496 | D35BB6591D3DB8BC002E2A19 /* DirectsTableRowController.m in Sources */,
497 | D35BB62E1D3DB4EB002E2A19 /* ExtensionDelegate.m in Sources */,
498 | D35BB6541D3DB8BC002E2A19 /* InterfaceController.m in Sources */,
499 | D35BB6551D3DB8BC002E2A19 /* EventTableRowController.m in Sources */,
500 | D35BB6461D3DB894002E2A19 /* Attendee.m in Sources */,
501 | D35BB6581D3DB8BC002E2A19 /* ProfileController.m in Sources */,
502 | D35BB6571D3DB8BC002E2A19 /* AttendeeListRowController.m in Sources */,
503 | D35BB65C1D3DB8CE002E2A19 /* NetworkManager.m in Sources */,
504 | D35BB6561D3DB8BC002E2A19 /* AttendeeListController.m in Sources */,
505 | );
506 | runOnlyForDeploymentPostprocessing = 0;
507 | };
508 | /* End PBXSourcesBuildPhase section */
509 |
510 | /* Begin PBXTargetDependency section */
511 | D35BB6181D3DB4EB002E2A19 /* PBXTargetDependency */ = {
512 | isa = PBXTargetDependency;
513 | target = D35BB6141D3DB4EB002E2A19 /* iOS-ObjectiveC-MicrosoftGraph-WatchSample WatchKit App */;
514 | targetProxy = D35BB6171D3DB4EB002E2A19 /* PBXContainerItemProxy */;
515 | };
516 | D35BB6271D3DB4EB002E2A19 /* PBXTargetDependency */ = {
517 | isa = PBXTargetDependency;
518 | target = D35BB6231D3DB4EB002E2A19 /* iOS-ObjectiveC-MicrosoftGraph-WatchSample WatchKit Extension */;
519 | targetProxy = D35BB6261D3DB4EB002E2A19 /* PBXContainerItemProxy */;
520 | };
521 | /* End PBXTargetDependency section */
522 |
523 | /* Begin PBXVariantGroup section */
524 | D35BB60A1D3DB4EB002E2A19 /* Main.storyboard */ = {
525 | isa = PBXVariantGroup;
526 | children = (
527 | D35BB60B1D3DB4EB002E2A19 /* Base */,
528 | );
529 | name = Main.storyboard;
530 | sourceTree = "";
531 | };
532 | D35BB60F1D3DB4EB002E2A19 /* LaunchScreen.storyboard */ = {
533 | isa = PBXVariantGroup;
534 | children = (
535 | D35BB6101D3DB4EB002E2A19 /* Base */,
536 | );
537 | name = LaunchScreen.storyboard;
538 | sourceTree = "";
539 | };
540 | D35BB61A1D3DB4EB002E2A19 /* Interface.storyboard */ = {
541 | isa = PBXVariantGroup;
542 | children = (
543 | D35BB61B1D3DB4EB002E2A19 /* Base */,
544 | );
545 | name = Interface.storyboard;
546 | sourceTree = "";
547 | };
548 | /* End PBXVariantGroup section */
549 |
550 | /* Begin XCBuildConfiguration section */
551 | D35BB6321D3DB4EB002E2A19 /* Debug */ = {
552 | isa = XCBuildConfiguration;
553 | buildSettings = {
554 | ALWAYS_SEARCH_USER_PATHS = NO;
555 | CLANG_ANALYZER_NONNULL = YES;
556 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
557 | CLANG_CXX_LIBRARY = "libc++";
558 | CLANG_ENABLE_MODULES = YES;
559 | CLANG_ENABLE_OBJC_ARC = YES;
560 | CLANG_WARN_BOOL_CONVERSION = YES;
561 | CLANG_WARN_CONSTANT_CONVERSION = YES;
562 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
563 | CLANG_WARN_EMPTY_BODY = YES;
564 | CLANG_WARN_ENUM_CONVERSION = YES;
565 | CLANG_WARN_INT_CONVERSION = YES;
566 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
567 | CLANG_WARN_UNREACHABLE_CODE = YES;
568 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
569 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
570 | COPY_PHASE_STRIP = NO;
571 | DEBUG_INFORMATION_FORMAT = dwarf;
572 | ENABLE_STRICT_OBJC_MSGSEND = YES;
573 | ENABLE_TESTABILITY = YES;
574 | GCC_C_LANGUAGE_STANDARD = gnu99;
575 | GCC_DYNAMIC_NO_PIC = NO;
576 | GCC_NO_COMMON_BLOCKS = YES;
577 | GCC_OPTIMIZATION_LEVEL = 0;
578 | GCC_PREPROCESSOR_DEFINITIONS = (
579 | "DEBUG=1",
580 | "$(inherited)",
581 | );
582 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
583 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
584 | GCC_WARN_UNDECLARED_SELECTOR = YES;
585 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
586 | GCC_WARN_UNUSED_FUNCTION = YES;
587 | GCC_WARN_UNUSED_VARIABLE = YES;
588 | IPHONEOS_DEPLOYMENT_TARGET = 9.3;
589 | MTL_ENABLE_DEBUG_INFO = YES;
590 | ONLY_ACTIVE_ARCH = YES;
591 | SDKROOT = iphoneos;
592 | };
593 | name = Debug;
594 | };
595 | D35BB6331D3DB4EB002E2A19 /* Release */ = {
596 | isa = XCBuildConfiguration;
597 | buildSettings = {
598 | ALWAYS_SEARCH_USER_PATHS = NO;
599 | CLANG_ANALYZER_NONNULL = YES;
600 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
601 | CLANG_CXX_LIBRARY = "libc++";
602 | CLANG_ENABLE_MODULES = YES;
603 | CLANG_ENABLE_OBJC_ARC = YES;
604 | CLANG_WARN_BOOL_CONVERSION = YES;
605 | CLANG_WARN_CONSTANT_CONVERSION = YES;
606 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
607 | CLANG_WARN_EMPTY_BODY = YES;
608 | CLANG_WARN_ENUM_CONVERSION = YES;
609 | CLANG_WARN_INT_CONVERSION = YES;
610 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
611 | CLANG_WARN_UNREACHABLE_CODE = YES;
612 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
613 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
614 | COPY_PHASE_STRIP = NO;
615 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
616 | ENABLE_NS_ASSERTIONS = NO;
617 | ENABLE_STRICT_OBJC_MSGSEND = YES;
618 | GCC_C_LANGUAGE_STANDARD = gnu99;
619 | GCC_NO_COMMON_BLOCKS = YES;
620 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
621 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
622 | GCC_WARN_UNDECLARED_SELECTOR = YES;
623 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
624 | GCC_WARN_UNUSED_FUNCTION = YES;
625 | GCC_WARN_UNUSED_VARIABLE = YES;
626 | IPHONEOS_DEPLOYMENT_TARGET = 9.3;
627 | MTL_ENABLE_DEBUG_INFO = NO;
628 | SDKROOT = iphoneos;
629 | VALIDATE_PRODUCT = YES;
630 | };
631 | name = Release;
632 | };
633 | D35BB6351D3DB4EB002E2A19 /* Debug */ = {
634 | isa = XCBuildConfiguration;
635 | buildSettings = {
636 | INFOPLIST_FILE = "iOS-ObjectiveC-MicrosoftGraph-WatchSample WatchKit Extension/Info.plist";
637 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks";
638 | PRODUCT_BUNDLE_IDENTIFIER = "com.microsoft.iOS-ObjectiveC-MicrosoftGraph-WatchSample.watchkitapp.watchkitextension";
639 | PRODUCT_NAME = "${TARGET_NAME}";
640 | SDKROOT = watchos;
641 | SKIP_INSTALL = YES;
642 | TARGETED_DEVICE_FAMILY = 4;
643 | WATCHOS_DEPLOYMENT_TARGET = 2.2;
644 | };
645 | name = Debug;
646 | };
647 | D35BB6361D3DB4EB002E2A19 /* Release */ = {
648 | isa = XCBuildConfiguration;
649 | buildSettings = {
650 | INFOPLIST_FILE = "iOS-ObjectiveC-MicrosoftGraph-WatchSample WatchKit Extension/Info.plist";
651 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks";
652 | PRODUCT_BUNDLE_IDENTIFIER = "com.microsoft.iOS-ObjectiveC-MicrosoftGraph-WatchSample.watchkitapp.watchkitextension";
653 | PRODUCT_NAME = "${TARGET_NAME}";
654 | SDKROOT = watchos;
655 | SKIP_INSTALL = YES;
656 | TARGETED_DEVICE_FAMILY = 4;
657 | WATCHOS_DEPLOYMENT_TARGET = 2.2;
658 | };
659 | name = Release;
660 | };
661 | D35BB6391D3DB4EB002E2A19 /* Debug */ = {
662 | isa = XCBuildConfiguration;
663 | buildSettings = {
664 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
665 | IBSC_MODULE = iOS_ObjectiveC_MicrosoftGraph_WatchSample_WatchKit_Extension;
666 | INFOPLIST_FILE = "iOS-ObjectiveC-MicrosoftGraph-WatchSample WatchKit App/Info.plist";
667 | PRODUCT_BUNDLE_IDENTIFIER = "com.microsoft.iOS-ObjectiveC-MicrosoftGraph-WatchSample.watchkitapp";
668 | PRODUCT_NAME = "$(TARGET_NAME)";
669 | SDKROOT = watchos;
670 | SKIP_INSTALL = YES;
671 | TARGETED_DEVICE_FAMILY = 4;
672 | WATCHOS_DEPLOYMENT_TARGET = 2.2;
673 | };
674 | name = Debug;
675 | };
676 | D35BB63A1D3DB4EB002E2A19 /* Release */ = {
677 | isa = XCBuildConfiguration;
678 | buildSettings = {
679 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
680 | IBSC_MODULE = iOS_ObjectiveC_MicrosoftGraph_WatchSample_WatchKit_Extension;
681 | INFOPLIST_FILE = "iOS-ObjectiveC-MicrosoftGraph-WatchSample WatchKit App/Info.plist";
682 | PRODUCT_BUNDLE_IDENTIFIER = "com.microsoft.iOS-ObjectiveC-MicrosoftGraph-WatchSample.watchkitapp";
683 | PRODUCT_NAME = "$(TARGET_NAME)";
684 | SDKROOT = watchos;
685 | SKIP_INSTALL = YES;
686 | TARGETED_DEVICE_FAMILY = 4;
687 | WATCHOS_DEPLOYMENT_TARGET = 2.2;
688 | };
689 | name = Release;
690 | };
691 | D35BB63D1D3DB4EB002E2A19 /* Debug */ = {
692 | isa = XCBuildConfiguration;
693 | baseConfigurationReference = 6F83F5E55412B9135B55F6C7 /* Pods-iOS-ObjectiveC-MicrosoftGraph-WatchSample.debug.xcconfig */;
694 | buildSettings = {
695 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
696 | INFOPLIST_FILE = "iOS-ObjectiveC-MicrosoftGraph-WatchSample/Info.plist";
697 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
698 | PRODUCT_BUNDLE_IDENTIFIER = "com.microsoft.iOS-ObjectiveC-MicrosoftGraph-WatchSample";
699 | PRODUCT_NAME = "$(TARGET_NAME)";
700 | };
701 | name = Debug;
702 | };
703 | D35BB63E1D3DB4EB002E2A19 /* Release */ = {
704 | isa = XCBuildConfiguration;
705 | baseConfigurationReference = 583FC0348F9E8074390E36E1 /* Pods-iOS-ObjectiveC-MicrosoftGraph-WatchSample.release.xcconfig */;
706 | buildSettings = {
707 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
708 | INFOPLIST_FILE = "iOS-ObjectiveC-MicrosoftGraph-WatchSample/Info.plist";
709 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
710 | PRODUCT_BUNDLE_IDENTIFIER = "com.microsoft.iOS-ObjectiveC-MicrosoftGraph-WatchSample";
711 | PRODUCT_NAME = "$(TARGET_NAME)";
712 | };
713 | name = Release;
714 | };
715 | /* End XCBuildConfiguration section */
716 |
717 | /* Begin XCConfigurationList section */
718 | D35BB5F91D3DB4EB002E2A19 /* Build configuration list for PBXProject "iOS-ObjectiveC-MicrosoftGraph-WatchSample" */ = {
719 | isa = XCConfigurationList;
720 | buildConfigurations = (
721 | D35BB6321D3DB4EB002E2A19 /* Debug */,
722 | D35BB6331D3DB4EB002E2A19 /* Release */,
723 | );
724 | defaultConfigurationIsVisible = 0;
725 | defaultConfigurationName = Release;
726 | };
727 | D35BB6341D3DB4EB002E2A19 /* Build configuration list for PBXNativeTarget "iOS-ObjectiveC-MicrosoftGraph-WatchSample WatchKit Extension" */ = {
728 | isa = XCConfigurationList;
729 | buildConfigurations = (
730 | D35BB6351D3DB4EB002E2A19 /* Debug */,
731 | D35BB6361D3DB4EB002E2A19 /* Release */,
732 | );
733 | defaultConfigurationIsVisible = 0;
734 | defaultConfigurationName = Release;
735 | };
736 | D35BB6381D3DB4EB002E2A19 /* Build configuration list for PBXNativeTarget "iOS-ObjectiveC-MicrosoftGraph-WatchSample WatchKit App" */ = {
737 | isa = XCConfigurationList;
738 | buildConfigurations = (
739 | D35BB6391D3DB4EB002E2A19 /* Debug */,
740 | D35BB63A1D3DB4EB002E2A19 /* Release */,
741 | );
742 | defaultConfigurationIsVisible = 0;
743 | defaultConfigurationName = Release;
744 | };
745 | D35BB63C1D3DB4EB002E2A19 /* Build configuration list for PBXNativeTarget "iOS-ObjectiveC-MicrosoftGraph-WatchSample" */ = {
746 | isa = XCConfigurationList;
747 | buildConfigurations = (
748 | D35BB63D1D3DB4EB002E2A19 /* Debug */,
749 | D35BB63E1D3DB4EB002E2A19 /* Release */,
750 | );
751 | defaultConfigurationIsVisible = 0;
752 | defaultConfigurationName = Release;
753 | };
754 | /* End XCConfigurationList section */
755 | };
756 | rootObject = D35BB5F61D3DB4EB002E2A19 /* Project object */;
757 | }
758 |
--------------------------------------------------------------------------------