├── 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 | ![Watch](https://github.com/microsoftgraph/iOS-objectiveC-apple-watch-sample/blob/master/Images/WatchScene.jpg) 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 | ![Target](https://github.com/microsoftgraph/iOS-objectiveC-apple-watch-sample/blob/master/Images/target.jpg) 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 | ![Authentication](https://github.com/microsoftgraph/iOS-objectiveC-apple-watch-sample/blob/master/Images/Authentication.jpg) 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 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 59 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 118 | 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 | --------------------------------------------------------------------------------