upgrade Facebook libraries

This commit is contained in:
giuseppenuc committed 2019-03-15 13:05:40 +01:00
1 parent 451fc6aa7f
commit 060efc0c83
72 files changed
+6811 -5623

No files matched your search

@@ -199,10 +199,12 @@ typedef void (^FBSDKAuthenticationCompletionHandler)(NSURL *_Nullable callbackUR
[_safariViewController.presentingViewController dismissViewControllerAnimated:YES
completion:completePendingOpenURLBlock];
_safariViewController = nil;
} else if (@available(iOS 11.0, *)) {
if (_authenticationSession != nil) {
[_authenticationSession cancel];
_authenticationSession = nil;
} else {
if (@available(iOS 11.0, *)) {
if (_authenticationSession != nil) {
[_authenticationSession cancel];
_authenticationSession = nil;
}
}
completePendingOpenURLBlock();
}
@@ -224,7 +226,7 @@ typedef void (^FBSDKAuthenticationCompletionHandler)(NSURL *_Nullable callbackUR
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
if (_isAppLaunched) {
if ([self isAppLaunched]) {
return NO;
}
@@ -279,15 +281,6 @@ typedef void (^FBSDKAuthenticationCompletionHandler)(NSURL *_Nullable callbackUR
// within the app delegate's lifecycle like openURL, in which case there
// might have been a "didBecomeActive" event pending that we want to ignore.
BOOL notExpectingBackground = !_expectingBackground && !_safariViewController && !_isDismissingSafariViewController && !_isRequestingSFAuthenticationSession;
#if !TARGET_OS_TV
if (@available(iOS 11.0, *)) {
if (notExpectingBackground && _authenticationSessionCompletionHandler != nil) {
_authenticationSessionCompletionHandler(nil, nil);
}
notExpectingBackground = notExpectingBackground && !_authenticationSession;
}
#endif
if (notExpectingBackground) {
_active = YES;
#if !TARGET_OS_TV
@@ -586,6 +579,11 @@ typedef void (^FBSDKAuthenticationCompletionHandler)(NSURL *_Nullable callbackUR
[FBSDKAppEvents logEvent:@"fb_sdk_initialize" parameters:params];
}
// Wrapping this makes it mockable and enables testability
- (BOOL)isAppLaunched {
return _isAppLaunched;
}
#pragma mark -- (non-tvos)
#if !TARGET_OS_TV
- (BOOL)_handleBridgeAPIResponseURL:(NSURL *)responseURL sourceApplication:(NSString *)sourceApplication
@@ -53,5 +53,5 @@
#import <FBSDKCoreKit/FBSDKDeviceViewControllerBase.h>
#endif
#define FBSDK_VERSION_STRING @"4.40.0"
#define FBSDK_VERSION_STRING @"4.41.0"
#define FBSDK_TARGET_PLATFORM_VERSION @"v3.2"
@@ -136,14 +136,16 @@
- (void)setBounds:(CGRect)bounds
{
CGRect currentBounds = self.bounds;
if (!CGRectEqualToRect(currentBounds, bounds)) {
super.bounds = bounds;
if (!CGSizeEqualToSize(currentBounds.size, bounds.size)) {
_placeholderImageIsValid = NO;
[self setNeedsImageUpdate];
dispatch_async(dispatch_get_main_queue(), ^{
CGRect currentBounds = self.bounds;
if (!CGRectEqualToRect(currentBounds, bounds)) {
super.bounds = bounds;
if (!CGSizeEqualToSize(currentBounds.size, bounds.size)) {
self->_placeholderImageIsValid = NO;
[self setNeedsImageUpdate];
}
}
}
});
}
- (UIViewContentMode)contentMode
@@ -181,24 +183,23 @@
- (void)setNeedsImageUpdate
{
if (!_imageView || CGRectIsEmpty(self.bounds)) {
// we can't do anything with an empty view, so just bail out until we have a size
return;
}
// ensure that we have an image. do this here so we can draw the placeholder image synchronously if we don't have one
if (!_placeholderImageIsValid && !_hasProfileImage) {
[self _setPlaceholderImage];
}
// debounce calls to needsImage against the main runloop
if (_needsImageUpdate) {
return;
}
_needsImageUpdate = YES;
__weak FBSDKProfilePictureView *weakSelf = self;
dispatch_async(dispatch_get_main_queue(), ^{
[weakSelf _needsImageUpdate];
if (!self->_imageView || CGRectIsEmpty(self.bounds)) {
// we can't do anything with an empty view, so just bail out until we have a size
return;
}
// ensure that we have an image. do this here so we can draw the placeholder image synchronously if we don't have one
if (!self->_placeholderImageIsValid && !self->_hasProfileImage) {
[self _setPlaceholderImage];
}
// debounce calls to needsImage against the main runloop
if (self->_needsImageUpdate) {
return;
}
self->_needsImageUpdate = YES;
[self _needsImageUpdate];
});
}
@@ -348,9 +349,12 @@
- (void)_setPlaceholderImage
{
UIColor *fillColor = [UIColor colorWithRed:157.0/255.0 green:177.0/255.0 blue:204.0/255.0 alpha:1.0];
_imageView.image = [[[FBSDKMaleSilhouetteIcon alloc] initWithColor:fillColor] imageWithSize:_imageView.bounds.size];
_placeholderImageIsValid = YES;
_hasProfileImage = NO;
dispatch_async(dispatch_get_main_queue(), ^{
self->_imageView.image = [[[FBSDKMaleSilhouetteIcon alloc] initWithColor:fillColor] imageWithSize:self->_imageView.bounds.size];
});
}
- (void)_updateImageWithData:(NSData *)data state:(FBSDKProfilePictureViewState *)state
@@ -359,10 +363,13 @@
if (![state isValidForState:_lastState]) {
return;
}
UIImage *image = [[UIImage alloc] initWithData:data scale:state.scale];
if (image) {
_imageView.image = image;
_hasProfileImage = YES;
dispatch_async(dispatch_get_main_queue(), ^{
self->_imageView.image = image;
});
} else {
_hasProfileImage = NO;
_placeholderImageIsValid = NO;
@@ -29,6 +29,7 @@
#define CODELESS_MAPPING_MATCH_BITMASK_KEY @"match_bitmask"
#define CODELESS_MAPPING_ID_KEY @"id"
#define CODELESS_MAPPING_INDEX_KEY @"index"
#define CODELESS_MAPPING_IS_USER_INPUT_KEY @"is_user_input"
#define CODELESS_MAPPING_SECTION_KEY @"section"
#define CODELESS_MAPPING_ROW_KEY @"row"
#define CODELESS_MAPPING_TEXT_KEY @"text"
@@ -124,17 +124,10 @@ static void fb_dispatch_on_default_thread(dispatch_block_t block) {
}
isStarted = YES;
void (^blockToSuperview)(id view) = ^(id view) {
[self matchView:view delegate:nil];
};
void (^blockToWindow)(id view) = ^(id view) {
[self matchView:view delegate:nil];
};
[FBSDKSwizzler swizzleSelector:@selector(didMoveToSuperview)
onClass:[UIControl class]
withBlock:blockToSuperview named:@"map_control"];
[FBSDKSwizzler swizzleSelector:@selector(didMoveToWindow)
onClass:[UIControl class]
withBlock:blockToWindow named:@"map_control"];
@@ -147,17 +140,17 @@ static void fb_dispatch_on_default_thread(dispatch_block_t block) {
Class classRCTTouchHandler = objc_lookUpClass(ReactNativeClassRCTTouchHandler);
// All react-native views would be added tp RCTRootView, so no need to check didMoveToWindow
[FBSDKSwizzler swizzleSelector:@selector(didMoveToSuperview)
[FBSDKSwizzler swizzleSelector:@selector(didMoveToWindow)
onClass:classRCTView
withBlock:blockToSuperview
withBlock:blockToWindow
named:@"match_react_native"];
[FBSDKSwizzler swizzleSelector:@selector(didMoveToSuperview)
[FBSDKSwizzler swizzleSelector:@selector(didMoveToWindow)
onClass:classRCTTextView
withBlock:blockToSuperview
withBlock:blockToWindow
named:@"match_react_native"];
[FBSDKSwizzler swizzleSelector:@selector(didMoveToSuperview)
[FBSDKSwizzler swizzleSelector:@selector(didMoveToWindow)
onClass:classRCTImageView
withBlock:blockToSuperview
withBlock:blockToWindow
named:@"match_react_native"];
// RCTTouchHandler handles with touch events, like touchEnd and uses RCTEventDispather to dispatch events, so we can check _updateAndDispatchTouches to fire events
@@ -278,6 +271,10 @@ static void fb_dispatch_on_default_thread(dispatch_block_t block) {
}
fb_dispatch_on_main_thread(^{
if (![view window]) {
return;
}
NSArray *path = [FBSDKViewHierarchy getPath:view];
fb_dispatch_on_default_thread(^{
@@ -35,4 +35,6 @@
+ (NSInteger)getTag:(NSObject *)obj;
+ (NSNumber *)getViewReactTag:(UIView *)view;
+ (BOOL)isUserInputView:(NSObject *)obj;
@end
@@ -231,9 +231,14 @@ typedef NS_ENUM(NSUInteger, FBCodelessClassBitmask) {
NSMutableDictionary *componentInfo = [NSMutableDictionary dictionary];
componentInfo[CODELESS_MAPPING_CLASS_NAME_KEY] = NSStringFromClass([obj class]);
NSString *text = [FBSDKViewHierarchy getText:obj];
if (text) {
componentInfo[CODELESS_MAPPING_TEXT_KEY] = text;
if (![FBSDKViewHierarchy isUserInputView:obj]) {
NSString *text = [FBSDKViewHierarchy getText:obj];
if (text) {
componentInfo[CODELESS_MAPPING_TEXT_KEY] = text;
}
} else {
componentInfo[CODELESS_MAPPING_TEXT_KEY] = @"";
componentInfo[CODELESS_MAPPING_IS_USER_INPUT_KEY] = @YES;
}
NSString *hint = [FBSDKViewHierarchy getHint:obj];
@@ -373,25 +378,6 @@ typedef NS_ENUM(NSUInteger, FBCodelessClassBitmask) {
text = attributedText.string;
}
if ([obj conformsToProtocol:@protocol(UITextInput)]) {
id<UITextInput> input = (id<UITextInput>)obj;
if (input.secureTextEntry) {
text = nil;
} else {
switch (input.keyboardType) {
case UIKeyboardTypePhonePad:
case UIKeyboardTypeEmailAddress:
text = nil;
break;
default: break;
}
}
}
if ([FBSDKAppEventsUtility isSensitiveUserData:text]) {
return nil;
}
return text.length > 0 ? text : nil;
}
@@ -479,6 +465,29 @@ typedef NS_ENUM(NSUInteger, FBCodelessClassBitmask) {
return bitmask;
}
+ (BOOL)isUserInputView:(NSObject *)obj
{
if (obj && [obj conformsToProtocol:@protocol(UITextInput)]) {
id<UITextInput> input = (id<UITextInput>)obj;
if ([input respondsToSelector:@selector(isSecureTextEntry)]
&& input.secureTextEntry) {
return YES;
} else {
if ([input respondsToSelector:@selector(keyboardType)]) {
switch (input.keyboardType) {
case UIKeyboardTypePhonePad:
case UIKeyboardTypeEmailAddress:
return YES;
default: break;
}
}
}
}
NSString *text = [FBSDKViewHierarchy getText:obj];
return text && [FBSDKAppEventsUtility isSensitiveUserData:text];
}
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wundeclared-selector"
+ (BOOL)isRCTButton:(UIView *)view
@@ -265,7 +265,7 @@ static const u_int FB_GIGABYTE = 1024 * 1024 * 1024; // bytes
+ (NSString *)_getCarrier
{
#if TARGET_OS_TV
#if TARGET_OS_TV || TARGET_IPHONE_SIMULATOR
return @"NoCarrier";
#else
// Dynamically load class for this so calling app doesn't need to link framework in.
@@ -18,6 +18,8 @@
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface FBSDKUserDataStore : NSObject
+ (void)initStore;
@@ -38,3 +40,5 @@
+ (NSString *) getHashedUserData;
@end
NS_ASSUME_NONNULL_END
@@ -23,7 +23,7 @@
#import "FBSDKSettings.h"
#import "FBSDKUtility.h"
#define USER_DATA_KEY @"com.facebook.appevents.UserDataStore.userData"
static NSString *const FBSDKUserDataKey = @"com.facebook.appevents.UserDataStore.userData";
static NSString *const FBSDKEmail = @"em";
static NSString *const FBSDKFirstName = @"fn";
@@ -47,17 +47,8 @@ static volatile bool initialized = false;
return;
}
[FBSDKUserDataStore initAndWait];
}
+ (void)initAndWait
{
if (initialized){
return;
}
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
hashedUserData = [defaults stringForKey:USER_DATA_KEY];
hashedUserData = [defaults stringForKey:FBSDKUserDataKey];
initialized = true;
}
@@ -66,12 +57,12 @@ static volatile bool initialized = false;
if (!initialized){
[FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorDeveloperErrors
logEntry:@"initStore should have been called before calling setUserData"];
[FBSDKUserDataStore initAndWait];
[FBSDKUserDataStore initStore];
}
hashedUserData = [FBSDKUserDataStore hashUserData:ud];
NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:(hashedUserData) forKey:(USER_DATA_KEY)];
[defaults setObject:(hashedUserData) forKey:(FBSDKUserDataKey)];
}
+ (void)setUserDataAndHash:(nullable NSString *)email
@@ -85,9 +76,7 @@ static volatile bool initialized = false;
zip:(nullable NSString *)zip
country:(nullable NSString *)country
{
if (!initialized){
[FBSDKUserDataStore initAndWait];
}
[FBSDKUserDataStore initStore];
NSMutableDictionary *ud = [[NSMutableDictionary alloc] init];
if (email != nil) {
@@ -123,7 +112,7 @@ static volatile bool initialized = false;
hashedUserData = [FBSDKUserDataStore hashUserData:ud];
NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:(hashedUserData) forKey:(USER_DATA_KEY)];
[defaults setObject:(hashedUserData) forKey:(FBSDKUserDataKey)];
}
+ (NSString *)getHashedUserData
@@ -131,7 +120,7 @@ static volatile bool initialized = false;
if (!initialized){
[FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorDeveloperErrors
logEntry:@"initStore should have been called before calling setUserID"];
[FBSDKUserDataStore initAndWait];
[FBSDKUserDataStore initStore];
}
return hashedUserData;
@@ -32,8 +32,6 @@ FOUNDATION_EXPORT NSString *const FBSDKApplicationDidBecomeActiveNotification;
#endif
@class FBSDKApplicationCall;
#if !TARGET_OS_TV
typedef void(^FBSDKBridgeAPICallbackBlock)(FBSDKBridgeAPIResponse *response);
#endif
@@ -45,7 +45,7 @@ static NSMapTable *swizzles;
static FBSDKSwizzle* fb_findSwizzle(id self, SEL _cmd){
Method aMethod = class_getInstanceMethod([self class], _cmd);
FBSDKSwizzle *swizzle = (FBSDKSwizzle *)[swizzles objectForKey:MAPTABLE_ID(aMethod)];
Class this_class = [self class];
Class this_class = [FBSDKSwizzler class];
while (!swizzle && class_getSuperclass(this_class)){
this_class = class_getSuperclass(this_class);
aMethod = class_getInstanceMethod(this_class, _cmd);
@@ -133,10 +133,20 @@ static void (*fb_swizzledMethods[MAX_ARGS - MIN_ARGS + 1])() = {fb_swizzledMetho
@implementation FBSDKSwizzler
+ (void)setup {
if (!swizzles) {
swizzles = [NSMapTable mapTableWithKeyOptions:(NSPointerFunctionsOpaqueMemory | NSPointerFunctionsOpaquePersonality)
valueOptions:(NSPointerFunctionsStrongMemory | NSPointerFunctionsObjectPointerPersonality)];
+ (void)initialize
{
swizzles = [NSMapTable mapTableWithKeyOptions:(NSPointerFunctionsOpaqueMemory | NSPointerFunctionsOpaquePersonality)
valueOptions:(NSPointerFunctionsStrongMemory | NSPointerFunctionsObjectPointerPersonality)];
[FBSDKSwizzler resolveConflict];
}
+ (void)resolveConflict
{
Class swizzler = objc_lookUpClass("MPSwizzler");
if (swizzler) {
Method method = class_getClassMethod(swizzler, @selector(swizzleSelector:onClass:withBlock:named:));
Method newMethod = class_getClassMethod(self, @selector(swizzleSelector:onClass:withBlock:named:));
method_setImplementation(method, method_getImplementation(newMethod));
}
}
@@ -181,24 +191,25 @@ static void (*fb_swizzledMethods[MAX_ARGS - MIN_ARGS + 1])() = {fb_swizzledMetho
+ (void)swizzleSelector:(SEL)aSelector onClass:(Class)aClass withBlock:(swizzleBlock)aBlock named:(NSString *)aName
{
[FBSDKSwizzler setup];
Method aMethod = class_getInstanceMethod(aClass, aSelector);
if (aMethod) {
uint numArgs = method_getNumberOfArguments(aMethod);
if (numArgs >= MIN_ARGS && numArgs <= MAX_ARGS) {
BOOL isLocal = [self isLocallyDefinedMethod:aMethod onClass:aClass];
BOOL isLocal = [FBSDKSwizzler isLocallyDefinedMethod:aMethod onClass:aClass];
IMP swizzledMethod = (IMP)fb_swizzledMethods[numArgs - 2];
// Check whether the first parameter is integer
if (4 == numArgs) {
NSString *firstType = @(method_copyArgumentType(aMethod, 2));
char *type = method_copyArgumentType(aMethod, 2);
NSString *firstType = [NSString stringWithCString:type encoding:NSUTF8StringEncoding];
NSString *integerTypes = @"islq";
if ([integerTypes containsString:firstType.lowercaseString]) {
swizzledMethod = (IMP)fb_swizzleMethod_4_io;
}
free(type);
}
FBSDKSwizzle *swizzle = [self swizzleForMethod:aMethod];
FBSDKSwizzle *swizzle = [FBSDKSwizzler swizzleForMethod:aMethod];
if (isLocal) {
if (!swizzle) {
@@ -209,7 +220,7 @@ static void (*fb_swizzledMethods[MAX_ARGS - MIN_ARGS + 1])() = {fb_swizzledMetho
// Create and add the swizzle
swizzle = [[FBSDKSwizzle alloc] initWithBlock:aBlock named:aName forClass:aClass selector:aSelector originalMethod:originalMethod withNumArgs:numArgs];
[self setSwizzle:swizzle forMethod:aMethod];
[FBSDKSwizzler setSwizzle:swizzle forMethod:aMethod];
} else {
[swizzle.blocks setObject:aBlock forKey:aName];
@@ -228,7 +239,7 @@ static void (*fb_swizzledMethods[MAX_ARGS - MIN_ARGS + 1])() = {fb_swizzledMetho
}
FBSDKSwizzle *newSwizzle = [[FBSDKSwizzle alloc] initWithBlock:aBlock named:aName forClass:aClass selector:aSelector originalMethod:originalMethod withNumArgs:numArgs];
[self setSwizzle:newSwizzle forMethod:newMethod];
[FBSDKSwizzler setSwizzle:newSwizzle forMethod:newMethod];
}
}
}
@@ -237,10 +248,10 @@ static void (*fb_swizzledMethods[MAX_ARGS - MIN_ARGS + 1])() = {fb_swizzledMetho
+ (void)unswizzleSelector:(SEL)aSelector onClass:(Class)aClass
{
Method aMethod = class_getInstanceMethod(aClass, aSelector);
FBSDKSwizzle *swizzle = [self swizzleForMethod:aMethod];
FBSDKSwizzle *swizzle = [FBSDKSwizzler swizzleForMethod:aMethod];
if (swizzle) {
method_setImplementation(aMethod, swizzle.originalMethod);
[self removeSwizzleForMethod:aMethod];
[FBSDKSwizzler removeSwizzleForMethod:aMethod];
}
}
@@ -251,14 +262,14 @@ static void (*fb_swizzledMethods[MAX_ARGS - MIN_ARGS + 1])() = {fb_swizzledMetho
+ (void)unswizzleSelector:(SEL)aSelector onClass:(Class)aClass named:(NSString *)aName
{
Method aMethod = class_getInstanceMethod(aClass, aSelector);
FBSDKSwizzle *swizzle = [self swizzleForMethod:aMethod];
FBSDKSwizzle *swizzle = [FBSDKSwizzler swizzleForMethod:aMethod];
if (swizzle) {
if (aName) {
[swizzle.blocks removeObjectForKey:aName];
}
if (!aName || swizzle.blocks.count == 0) {
method_setImplementation(aMethod, swizzle.originalMethod);
[self removeSwizzleForMethod:aMethod];
[FBSDKSwizzler removeSwizzleForMethod:aMethod];
}
}
}
@@ -291,7 +302,7 @@ static void (*fb_swizzledMethods[MAX_ARGS - MIN_ARGS + 1])() = {fb_swizzledMetho
self.selector = aSelector;
self.numArgs = numArgs;
self.originalMethod = aMethod;
[self.blocks setObject:aBlock forKey:aName];
[_blocks setObject:aBlock forKey:aName];
}
return self;
}
@@ -300,9 +311,9 @@ static void (*fb_swizzledMethods[MAX_ARGS - MIN_ARGS + 1])() = {fb_swizzledMetho
{
NSString *descriptors = @"";
NSString *key;
NSEnumerator *keys = [self.blocks keyEnumerator];
NSEnumerator *keys = [_blocks keyEnumerator];
while ((key = [keys nextObject])) {
descriptors = [descriptors stringByAppendingFormat:@"\t%@ : %@\n", key, [self.blocks objectForKey:key]];
descriptors = [descriptors stringByAppendingFormat:@"\t%@ : %@\n", key, [_blocks objectForKey:key]];
}
return [NSString stringWithFormat:@"Swizzle on %@::%@ [\n%@]", NSStringFromClass(self.class), NSStringFromSelector(self.selector), descriptors];
}
@@ -18,7 +18,7 @@
#import <UIKit/UIKit.h>
#import "../FBSDKMath.h"
#import "FBSDKMath.h"
/**
Insets a CGSize with the insets in a UIEdgeInsets.
+24 -7
View File
@@ -1,16 +1,22 @@
# Facebook SDK for iOS
[![Platforms](https://img.shields.io/cocoapods/p/FBSDKCoreKit.svg)](https://cocoapods.org/pods/FBSDKCoreKit)
[![Build Status](https://travis-ci.org/facebook/facebook-objc-sdk.svg?branch=master)](https://travis-ci.org/facebook/facebook-objc-sdk)
[![CocoaPods](https://img.shields.io/cocoapods/v/FBSDKCoreKit.svg)](https://cocoapods.org/pods/FBSDKCoreKit)
[![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage)
This open-source library allows you to integrate Facebook into your iOS app.
Learn more about the provided samples, documentation, integrating the SDK into your app, accessing source code, and more at https://developers.facebook.com/docs/ios
Learn more about the provided samples, documentation, integrating the SDK into your app, accessing source code, and more
at https://developers.facebook.com/docs/ios
NOTE: By default, the Facebook SDK for iOS is installed in ~/Documents/FacebookSDK
## TRY IT OUT
1. Download the SDK at <https://developers.facebook.com/docs/ios> or via CocoaPods by adding the 'FBSDKCoreKit', 'FBSDKLoginKit', and 'FBSDKShareKit' pods.
1. Download the SDK at <https://developers.facebook.com/docs/ios> or via CocoaPods by adding the 'FBSDKCoreKit',
'FBSDKLoginKit', and 'FBSDKShareKit' pods.
2. Test your install: build and run the project at `~/Documents/FacebookSDK/Samples/Scrumptious/Scrumptious.xcodeproj`
3. Check-out the tutorials available online at: <https://developers.facebook.com/docs/ios/getting-started>
4. Start coding! Visit <https://developers.facebook.com/docs/ios> for tutorials and reference documentation.
@@ -27,7 +33,8 @@ NOTE: By default, the Facebook SDK for iOS is installed in ~/Documents/FacebookS
Please report bugs or issues to <https://developers.facebook.com/bugs/>
You can also join the [Facebook Developers Group on Facebook](https://www.facebook.com/groups/fbdevelopers/) or ask questions on [Stack Overflow](http://facebook.stackoverflow.com)
You can also join the [Facebook Developers Group on Facebook](https://www.facebook.com/groups/fbdevelopers/) or ask
questions on [Stack Overflow](http://facebook.stackoverflow.com)
## LICENSE
@@ -35,9 +42,19 @@ See the [LICENSE](LICENSE) file.
## DEVELOPER TERMS
- By enabling Facebook integrations, including through this SDK, you can share information with Facebook, including information about people’s use of your app. Facebook will use information received in accordance with our [Data Use Policy](https://www.facebook.com/about/privacy/), including to provide you with insights about the effectiveness of your ads and the use of your app. These integrations also enable us and our partners to serve ads on and off Facebook.
- You may limit your sharing of information with us by updating the Insights control in the developer tool `https://developers.facebook.com/apps/{app_id}/settings/advanced`.
- If you use a Facebook integration, including to share information with us, you agree and confirm that you have provided appropriate and sufficiently prominent notice to and obtained the appropriate consent from your users regarding such collection, use, and disclosure (including, at a minimum, through your privacy policy). You further agree that you will not share information with us about children under the age of 13.
- You agree to comply with all applicable laws and regulations and also agree to our Terms <https://www.facebook.com/policies/>, including our Platform Policies <https://developers.facebook.com/policy/>.and Advertising Guidelines, as applicable <https://www.facebook.com/ad_guidelines.php>.
- By enabling Facebook integrations, including through this SDK, you can share information with Facebook, including
information about people’s use of your app. Facebook will use information received in accordance with our
[Data Use Policy](https://www.facebook.com/about/privacy/), including to provide you with insights about the
effectiveness of your ads and the use of your app. These integrations also enable us and our partners to serve ads on
and off Facebook.
- You may limit your sharing of information with us by updating the Insights control in the developer tool
`https://developers.facebook.com/apps/{app_id}/settings/advanced`.
- If you use a Facebook integration, including to share information with us, you agree and confirm that you have
provided appropriate and sufficiently prominent notice to and obtained the appropriate consent from your users
regarding such collection, use, and disclosure (including, at a minimum, through your privacy policy). You further
agree that you will not share information with us about children under the age of 13.
- You agree to comply with all applicable laws and regulations and also agree to our Terms
<https://www.facebook.com/policies/>, including our Platform Policies <https://developers.facebook.com/policy/>.and
Advertising Guidelines, as applicable <https://www.facebook.com/ad_guidelines.php>.
By using the Facebook SDK for iOS you agree to these terms.