136 lines
5.9 KiB
Objective-C
136 lines
5.9 KiB
Objective-C
/*
|
|
* Copyright 2010-present Facebook.
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
#import "SCAppDelegate.h"
|
|
#import "SCViewController.h"
|
|
#import "SCLoginViewController.h"
|
|
#import <FacebookSDK/FBSessionTokenCachingStrategy.h>
|
|
|
|
@implementation SCAppDelegate
|
|
|
|
@synthesize window = _window,
|
|
navigationController = _navigationController,
|
|
mainViewController = _mainViewController,
|
|
loginViewController = _loginViewController,
|
|
isNavigating = _isNavigating;
|
|
|
|
- (BOOL)application:(UIApplication *)application
|
|
openURL:(NSURL *)url
|
|
sourceApplication:(NSString *)sourceApplication
|
|
annotation:(id)annotation {
|
|
|
|
// Facebook SDK * login flow *
|
|
// Attempt to handle URLs to complete any auth (e.g., SSO) flow.
|
|
return [FBAppCall handleOpenURL:url sourceApplication:sourceApplication fallbackHandler:^(FBAppCall *call) {
|
|
// Facebook SDK * App Linking *
|
|
// For simplicity, this sample will ignore the link if the session is already
|
|
// open but a more advanced app could support features like user switching.
|
|
if (call.accessTokenData) {
|
|
if ([FBSession activeSession].isOpen) {
|
|
NSLog(@"INFO: Ignoring app link because current session is open.");
|
|
}
|
|
else {
|
|
[self handleAppLink:call.accessTokenData];
|
|
}
|
|
}
|
|
}];
|
|
}
|
|
|
|
- (void)applicationWillTerminate:(UIApplication *)application {
|
|
// Facebook SDK * pro-tip *
|
|
// if the app is going away, we close the session object; this is a good idea because
|
|
// things may be hanging off the session, that need releasing (completion block, etc.) and
|
|
// other components in the app may be awaiting close notification in order to do cleanup
|
|
[FBSession.activeSession close];
|
|
}
|
|
|
|
- (void)applicationDidBecomeActive:(UIApplication *)application {
|
|
[FBAppEvents activateApp];
|
|
|
|
// Facebook SDK * login flow *
|
|
// We need to properly handle activation of the application with regards to SSO
|
|
// (e.g., returning from iOS 6.0 authorization dialog or from fast app switching).
|
|
[FBAppCall handleDidBecomeActive];
|
|
}
|
|
|
|
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
|
|
// If you have not added the -ObjC linker flag, you may need to uncomment the following line because
|
|
// Nib files require the type to have been loaded before they can do the wireup successfully.
|
|
// http://stackoverflow.com/questions/1725881/unknown-class-myclass-in-interface-builder-file-error-at-runtime
|
|
// [FBProfilePictureView class];
|
|
|
|
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
|
|
[self resetMainViewController];
|
|
self.loginViewController = [[SCLoginViewController alloc] initWithNibName:@"SCLoginViewController"
|
|
bundle:nil];
|
|
self.navigationController = [[UINavigationController alloc] initWithRootViewController:self.loginViewController];
|
|
self.navigationController.delegate = self;
|
|
self.window.rootViewController = self.navigationController;
|
|
|
|
[self.window makeKeyAndVisible];
|
|
|
|
// Facebook SDK * pro-tip *
|
|
// We take advantage of the `FBLoginView` in our loginViewController, which can
|
|
// automatically open a session if there is a token cached. If we were not using
|
|
// that control, this location would be a good place to try to open a session
|
|
// from a token cache.
|
|
|
|
return YES;
|
|
}
|
|
|
|
// Helper method to wrap logic for handling app links.
|
|
- (void)handleAppLink:(FBAccessTokenData *)appLinkToken {
|
|
// Initialize a new blank session instance...
|
|
FBSession *appLinkSession = [[FBSession alloc] initWithAppID:nil
|
|
permissions:nil
|
|
defaultAudience:FBSessionDefaultAudienceNone
|
|
urlSchemeSuffix:nil
|
|
tokenCacheStrategy:[FBSessionTokenCachingStrategy nullCacheInstance] ];
|
|
[FBSession setActiveSession:appLinkSession];
|
|
// ... and open it from the App Link's Token.
|
|
[appLinkSession openFromAccessTokenData:appLinkToken
|
|
completionHandler:^(FBSession *session, FBSessionState status, NSError *error) {
|
|
// Forward any errors to the FBLoginView delegate.
|
|
if (error) {
|
|
[self.loginViewController loginView:nil handleError:error];
|
|
}
|
|
}];
|
|
}
|
|
|
|
#pragma mark - UINavigationControllerDelegate
|
|
|
|
- (void)navigationController:(UINavigationController *)navigationController
|
|
didShowViewController:(UIViewController *)viewController
|
|
animated:(BOOL)animated {
|
|
self.isNavigating = NO;
|
|
}
|
|
|
|
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
|
|
self.isNavigating = YES;
|
|
}
|
|
|
|
- (void)resetMainViewController {
|
|
self.mainViewController = [[SCViewController alloc] initWithNibName:@"SCViewController"
|
|
bundle:nil];
|
|
#ifdef __IPHONE_7_0
|
|
if ([self.mainViewController respondsToSelector:@selector(setEdgesForExtendedLayout:)]) {
|
|
self.mainViewController.edgesForExtendedLayout &= ~UIRectEdgeTop;
|
|
}
|
|
#endif
|
|
}
|
|
|
|
@end
|