- add client custom identifier to save credentials
This commit is contained in:
parent
99e06e67db
commit
1629110349
@ -26,12 +26,21 @@ PODS:
|
|||||||
- DJLocalization/Core (= 1.2.2)
|
- DJLocalization/Core (= 1.2.2)
|
||||||
- DJLocalization/Core (1.2.2)
|
- DJLocalization/Core (1.2.2)
|
||||||
- Expecta (1.0.6)
|
- Expecta (1.0.6)
|
||||||
- FBSDKCoreKit (4.37.0):
|
- Facebook-iOS-SDK (4.38.0):
|
||||||
- Bolts (~> 1.7)
|
- Bolts (~> 1.9)
|
||||||
- FBSDKLoginKit (4.37.0):
|
- Facebook-iOS-SDK/CoreKit (= 4.38.0)
|
||||||
|
- Facebook-iOS-SDK/MarketingKit (= 4.38.0)
|
||||||
|
- Facebook-iOS-SDK/CoreKit (4.38.0):
|
||||||
|
- Bolts (~> 1.9)
|
||||||
|
- FBSDKCoreKit
|
||||||
|
- Facebook-iOS-SDK/MarketingKit (4.38.0):
|
||||||
|
- Bolts (~> 1.9)
|
||||||
|
- Facebook-iOS-SDK/CoreKit
|
||||||
|
- FBSDKMarketingKit
|
||||||
|
- FBSDKCoreKit (4.39.0):
|
||||||
|
- Bolts (~> 1.9)
|
||||||
|
- FBSDKMarketingKit (4.38.0):
|
||||||
- FBSDKCoreKit
|
- FBSDKCoreKit
|
||||||
- FBSDKShareKit (4.37.0):
|
|
||||||
- FBSDKCoreKit (~> 4.37.0)
|
|
||||||
- NSDataAES (0.2.2)
|
- NSDataAES (0.2.2)
|
||||||
- NSDate_Utils (1.1.0):
|
- NSDate_Utils (1.1.0):
|
||||||
- DJLocalization
|
- DJLocalization
|
||||||
@ -43,9 +52,7 @@ PODS:
|
|||||||
- CodFis-Helper
|
- CodFis-Helper
|
||||||
- DDDKeychainWrapper
|
- DDDKeychainWrapper
|
||||||
- DJLocalization
|
- DJLocalization
|
||||||
- FBSDKCoreKit
|
- Facebook-iOS-SDK
|
||||||
- FBSDKLoginKit
|
|
||||||
- FBSDKShareKit
|
|
||||||
- NSDataAES
|
- NSDataAES
|
||||||
- NSDate_Utils
|
- NSDate_Utils
|
||||||
- NSString-Helper
|
- NSString-Helper
|
||||||
@ -54,7 +61,7 @@ PODS:
|
|||||||
- RZDataBinding
|
- RZDataBinding
|
||||||
- StrongestPasswordValidator
|
- StrongestPasswordValidator
|
||||||
- UIDevice-Utils
|
- UIDevice-Utils
|
||||||
- PureLayout (3.1.2)
|
- PureLayout (3.1.4)
|
||||||
- RZDataBinding (2.1.1)
|
- RZDataBinding (2.1.1)
|
||||||
- Specta (1.0.7)
|
- Specta (1.0.7)
|
||||||
- StrongestPasswordValidator (0.1.2)
|
- StrongestPasswordValidator (0.1.2)
|
||||||
@ -74,9 +81,9 @@ SPEC REPOS:
|
|||||||
- DDDKeychainWrapper
|
- DDDKeychainWrapper
|
||||||
- DJLocalization
|
- DJLocalization
|
||||||
- Expecta
|
- Expecta
|
||||||
|
- Facebook-iOS-SDK
|
||||||
- FBSDKCoreKit
|
- FBSDKCoreKit
|
||||||
- FBSDKLoginKit
|
- FBSDKMarketingKit
|
||||||
- FBSDKShareKit
|
|
||||||
- NSDataAES
|
- NSDataAES
|
||||||
- NSDate_Utils
|
- NSDate_Utils
|
||||||
- NSString-Helper
|
- NSString-Helper
|
||||||
@ -99,16 +106,16 @@ SPEC CHECKSUMS:
|
|||||||
DDDKeychainWrapper: e681a4daba6448786fa83b4941f58102a33b1897
|
DDDKeychainWrapper: e681a4daba6448786fa83b4941f58102a33b1897
|
||||||
DJLocalization: 0c84029af375647d4104a42ae36be87194c46c47
|
DJLocalization: 0c84029af375647d4104a42ae36be87194c46c47
|
||||||
Expecta: 3b6bd90a64b9a1dcb0b70aa0e10a7f8f631667d5
|
Expecta: 3b6bd90a64b9a1dcb0b70aa0e10a7f8f631667d5
|
||||||
FBSDKCoreKit: fe5f3474499a81963e11e3f3a5c753d0a95ca2b4
|
Facebook-iOS-SDK: 9077b67c4178ea46c62997bcf2b6314ca6555440
|
||||||
FBSDKLoginKit: 2f7249686d1e30ce8a5ef5400eedf50b3e3df332
|
FBSDKCoreKit: 1e3981faefab8c88edfaa9eecd94aab02d99a9bc
|
||||||
FBSDKShareKit: 52e0083222c38e930eb6878007478326599195c3
|
FBSDKMarketingKit: e609f39d74ab273cf52e2f8b7e8829ed412b2827
|
||||||
NSDataAES: 967ea3337476a80e9838a533c25d570a06855ed0
|
NSDataAES: 967ea3337476a80e9838a533c25d570a06855ed0
|
||||||
NSDate_Utils: c858a89da6e204ecf53aca48dbccb4da4d25bc9e
|
NSDate_Utils: c858a89da6e204ecf53aca48dbccb4da4d25bc9e
|
||||||
NSString-Helper: 1c259caa6c845e79e0bb45ee25e34f95d86d2317
|
NSString-Helper: 1c259caa6c845e79e0bb45ee25e34f95d86d2317
|
||||||
nv-ios-http-status: b6c2b5fc8656cc19e0d3000dadce2080b99d0e2f
|
nv-ios-http-status: b6c2b5fc8656cc19e0d3000dadce2080b99d0e2f
|
||||||
PEAR-FileManager-iOS: 3bc403f68a53483f5629aa822f4649e40275c4d3
|
PEAR-FileManager-iOS: 3bc403f68a53483f5629aa822f4649e40275c4d3
|
||||||
PNObject: d92d660eb43b9385e7148e42598b8a7d3a785834
|
PNObject: 11e8fe8e955d327a9832ed63f6720f60b877d66a
|
||||||
PureLayout: 4634d0b61e3b5021166e8ec7c18e9e0ca0720c8b
|
PureLayout: f08c01b8dec00bb14a1fefa3de4c7d9c265df85e
|
||||||
RZDataBinding: 289e2fbdce8b9585afef69def83425c5d380ffbd
|
RZDataBinding: 289e2fbdce8b9585afef69def83425c5d380ffbd
|
||||||
Specta: 3e1bd89c3517421982dc4d1c992503e48bd5fe66
|
Specta: 3e1bd89c3517421982dc4d1c992503e48bd5fe66
|
||||||
StrongestPasswordValidator: 921e42615bdf353513c6f925bffd4fc29865dbd7
|
StrongestPasswordValidator: 921e42615bdf353513c6f925bffd4fc29865dbd7
|
||||||
|
|||||||
@ -20,7 +20,8 @@
|
|||||||
|
|
||||||
#import <FBSDKCoreKit/FBSDKCopying.h>
|
#import <FBSDKCoreKit/FBSDKCopying.h>
|
||||||
#import <FBSDKCoreKit/FBSDKGraphRequestConnection.h>
|
#import <FBSDKCoreKit/FBSDKGraphRequestConnection.h>
|
||||||
#import <FBSDKCoreKit/FBSDKMacros.h>
|
|
||||||
|
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Notification indicating that the `currentAccessToken` has changed.
|
Notification indicating that the `currentAccessToken` has changed.
|
||||||
@ -29,7 +30,20 @@
|
|||||||
`FBSDKAccessTokenChangeOldKey` and
|
`FBSDKAccessTokenChangeOldKey` and
|
||||||
`FBSDKAccessTokenChangeNewKey`.
|
`FBSDKAccessTokenChangeNewKey`.
|
||||||
*/
|
*/
|
||||||
FBSDK_EXTERN NSString *const FBSDKAccessTokenDidChangeNotification;
|
FOUNDATION_EXPORT NSNotificationName const FBSDKAccessTokenDidChangeNotification;
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
/**
|
||||||
|
Notification indicating that the `currentAccessToken` has changed.
|
||||||
|
|
||||||
|
the userInfo dictionary of the notification will contain keys
|
||||||
|
`FBSDKAccessTokenChangeOldKey` and
|
||||||
|
`FBSDKAccessTokenChangeNewKey`.
|
||||||
|
*/
|
||||||
|
FOUNDATION_EXPORT NSString *const FBSDKAccessTokenDidChangeNotification;
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
A key in the notification's userInfo that will be set
|
A key in the notification's userInfo that will be set
|
||||||
@ -44,27 +58,33 @@ FBSDK_EXTERN NSString *const FBSDKAccessTokenDidChangeNotification;
|
|||||||
of an access token, this key will also exist since the access token
|
of an access token, this key will also exist since the access token
|
||||||
is moving from a null state (no user) to a non-null state (user).
|
is moving from a null state (no user) to a non-null state (user).
|
||||||
*/
|
*/
|
||||||
FBSDK_EXTERN NSString *const FBSDKAccessTokenDidChangeUserID;
|
FOUNDATION_EXPORT NSString *const FBSDKAccessTokenDidChangeUserIDKey;
|
||||||
|
|
||||||
|
FOUNDATION_EXPORT NSString *const FBSDKAccessTokenDidChangeUserID
|
||||||
|
DEPRECATED_MSG_ATTRIBUTE("Renamed `FBSDKAccessTokenDidChangeUserIDKey`");
|
||||||
|
|
||||||
/*
|
/*
|
||||||
key in notification's userInfo object for getting the old token.
|
key in notification's userInfo object for getting the old token.
|
||||||
|
|
||||||
If there was no old token, the key will not be present.
|
If there was no old token, the key will not be present.
|
||||||
*/
|
*/
|
||||||
FBSDK_EXTERN NSString *const FBSDKAccessTokenChangeOldKey;
|
FOUNDATION_EXPORT NSString *const FBSDKAccessTokenChangeOldKey;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
key in notification's userInfo object for getting the new token.
|
key in notification's userInfo object for getting the new token.
|
||||||
|
|
||||||
If there is no new token, the key will not be present.
|
If there is no new token, the key will not be present.
|
||||||
*/
|
*/
|
||||||
FBSDK_EXTERN NSString *const FBSDKAccessTokenChangeNewKey;
|
FOUNDATION_EXPORT NSString *const FBSDKAccessTokenChangeNewKey;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
A key in the notification's userInfo that will be set
|
A key in the notification's userInfo that will be set
|
||||||
if and only if the token has expired.
|
if and only if the token has expired.
|
||||||
*/
|
*/
|
||||||
FBSDK_EXTERN NSString *const FBSDKAccessTokenDidExpire;
|
FOUNDATION_EXPORT NSString *const FBSDKAccessTokenDidExpireKey;
|
||||||
|
|
||||||
|
FOUNDATION_EXPORT NSString *const FBSDKAccessTokenDidExpire
|
||||||
|
DEPRECATED_MSG_ATTRIBUTE("Renamed `FBSDKAccessTokenDidExpireKey`");
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@ -23,10 +23,21 @@
|
|||||||
#import "FBSDKMath.h"
|
#import "FBSDKMath.h"
|
||||||
#import "FBSDKSettings+Internal.h"
|
#import "FBSDKSettings+Internal.h"
|
||||||
|
|
||||||
|
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0
|
||||||
|
|
||||||
|
NSNotificationName const FBSDKAccessTokenDidChangeNotification = @"com.facebook.sdk.FBSDKAccessTokenData.FBSDKAccessTokenDidChangeNotification";
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
NSString *const FBSDKAccessTokenDidChangeNotification = @"com.facebook.sdk.FBSDKAccessTokenData.FBSDKAccessTokenDidChangeNotification";
|
NSString *const FBSDKAccessTokenDidChangeNotification = @"com.facebook.sdk.FBSDKAccessTokenData.FBSDKAccessTokenDidChangeNotification";
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
NSString *const FBSDKAccessTokenDidChangeUserIDKey = @"FBSDKAccessTokenDidChangeUserID";
|
||||||
NSString *const FBSDKAccessTokenDidChangeUserID = @"FBSDKAccessTokenDidChangeUserID";
|
NSString *const FBSDKAccessTokenDidChangeUserID = @"FBSDKAccessTokenDidChangeUserID";
|
||||||
NSString *const FBSDKAccessTokenChangeNewKey = @"FBSDKAccessToken";
|
NSString *const FBSDKAccessTokenChangeNewKey = @"FBSDKAccessToken";
|
||||||
NSString *const FBSDKAccessTokenChangeOldKey = @"FBSDKAccessTokenOld";
|
NSString *const FBSDKAccessTokenChangeOldKey = @"FBSDKAccessTokenOld";
|
||||||
|
NSString *const FBSDKAccessTokenDidExpireKey = @"FBSDKAccessTokenDidExpire";
|
||||||
NSString *const FBSDKAccessTokenDidExpire = @"FBSDKAccessTokenDidExpire";
|
NSString *const FBSDKAccessTokenDidExpire = @"FBSDKAccessTokenDidExpire";
|
||||||
|
|
||||||
static FBSDKAccessToken *g_currentAccessToken;
|
static FBSDKAccessToken *g_currentAccessToken;
|
||||||
@ -43,11 +54,6 @@ static FBSDKAccessToken *g_currentAccessToken;
|
|||||||
|
|
||||||
@implementation FBSDKAccessToken
|
@implementation FBSDKAccessToken
|
||||||
|
|
||||||
- (instancetype)init NS_UNAVAILABLE
|
|
||||||
{
|
|
||||||
assert(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
- (instancetype)initWithTokenString:(NSString *)tokenString
|
- (instancetype)initWithTokenString:(NSString *)tokenString
|
||||||
permissions:(NSArray *)permissions
|
permissions:(NSArray *)permissions
|
||||||
declinedPermissions:(NSArray *)declinedPermissions
|
declinedPermissions:(NSArray *)declinedPermissions
|
||||||
@ -117,7 +123,7 @@ static FBSDKAccessToken *g_currentAccessToken;
|
|||||||
[FBSDKInternalUtility dictionary:userInfo setObject:g_currentAccessToken forKey:FBSDKAccessTokenChangeOldKey];
|
[FBSDKInternalUtility dictionary:userInfo setObject:g_currentAccessToken forKey:FBSDKAccessTokenChangeOldKey];
|
||||||
// We set this flag also when the current Access Token was not valid, since there might be legacy code relying on it
|
// We set this flag also when the current Access Token was not valid, since there might be legacy code relying on it
|
||||||
if (![g_currentAccessToken.userID isEqualToString:token.userID] || ![self currentAccessTokenIsActive]) {
|
if (![g_currentAccessToken.userID isEqualToString:token.userID] || ![self currentAccessTokenIsActive]) {
|
||||||
userInfo[FBSDKAccessTokenDidChangeUserID] = @YES;
|
userInfo[FBSDKAccessTokenDidChangeUserIDKey] = @YES;
|
||||||
}
|
}
|
||||||
|
|
||||||
g_currentAccessToken = token;
|
g_currentAccessToken = token;
|
||||||
@ -128,7 +134,7 @@ static FBSDKAccessToken *g_currentAccessToken;
|
|||||||
[FBSDKInternalUtility deleteFacebookCookies];
|
[FBSDKInternalUtility deleteFacebookCookies];
|
||||||
}
|
}
|
||||||
|
|
||||||
[[FBSDKSettings accessTokenCache] cacheAccessToken:token];
|
[FBSDKSettings accessTokenCache].accessToken = token;
|
||||||
[[NSNotificationCenter defaultCenter] postNotificationName:FBSDKAccessTokenDidChangeNotification
|
[[NSNotificationCenter defaultCenter] postNotificationName:FBSDKAccessTokenDidChangeNotification
|
||||||
object:[self class]
|
object:[self class]
|
||||||
userInfo:userInfo];
|
userInfo:userInfo];
|
||||||
@ -149,7 +155,7 @@ static FBSDKAccessToken *g_currentAccessToken;
|
|||||||
[connection start];
|
[connection start];
|
||||||
} else {
|
} else {
|
||||||
if (completionHandler) {
|
if (completionHandler) {
|
||||||
completionHandler(nil, nil, [FBSDKError errorWithCode:FBSDKAccessTokenRequiredErrorCode message:@"No current access token to refresh"]);
|
completionHandler(nil, nil, [NSError fbErrorWithCode:FBSDKErrorAccessTokenRequired message:@"No current access token to refresh"]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -159,14 +165,14 @@ static FBSDKAccessToken *g_currentAccessToken;
|
|||||||
- (NSUInteger)hash
|
- (NSUInteger)hash
|
||||||
{
|
{
|
||||||
NSUInteger subhashes[] = {
|
NSUInteger subhashes[] = {
|
||||||
[self.tokenString hash],
|
self.tokenString.hash,
|
||||||
[self.permissions hash],
|
self.permissions.hash,
|
||||||
[self.declinedPermissions hash],
|
self.declinedPermissions.hash,
|
||||||
[self.appID hash],
|
self.appID.hash,
|
||||||
[self.userID hash],
|
self.userID.hash,
|
||||||
[self.refreshDate hash],
|
self.refreshDate.hash,
|
||||||
[self.expirationDate hash],
|
self.expirationDate.hash,
|
||||||
[self.dataAccessExpirationDate hash]
|
self.dataAccessExpirationDate.hash
|
||||||
};
|
};
|
||||||
return [FBSDKMath hashWithIntegerArray:subhashes count:sizeof(subhashes) / sizeof(subhashes[0])];
|
return [FBSDKMath hashWithIntegerArray:subhashes count:sizeof(subhashes) / sizeof(subhashes[0])];
|
||||||
}
|
}
|
||||||
@ -210,7 +216,7 @@ static FBSDKAccessToken *g_currentAccessToken;
|
|||||||
return YES;
|
return YES;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (id)initWithCoder:(NSCoder *)decoder
|
- (instancetype)initWithCoder:(NSCoder *)decoder
|
||||||
{
|
{
|
||||||
NSString *appID = [decoder decodeObjectOfClass:[NSString class] forKey:FBSDK_ACCESSTOKEN_APPID_KEY];
|
NSString *appID = [decoder decodeObjectOfClass:[NSString class] forKey:FBSDK_ACCESSTOKEN_APPID_KEY];
|
||||||
NSSet *declinedPermissions = [decoder decodeObjectOfClass:[NSSet class] forKey:FBSDK_ACCESSTOKEN_DECLINEDPERMISSIONS_KEY];
|
NSSet *declinedPermissions = [decoder decodeObjectOfClass:[NSSet class] forKey:FBSDK_ACCESSTOKEN_DECLINEDPERMISSIONS_KEY];
|
||||||
@ -222,8 +228,8 @@ static FBSDKAccessToken *g_currentAccessToken;
|
|||||||
NSDate *dataAccessExpirationDate = [decoder decodeObjectOfClass:[NSDate class] forKey:FBSDK_ACCESSTOKEN_DATA_EXPIRATIONDATE_KEY];
|
NSDate *dataAccessExpirationDate = [decoder decodeObjectOfClass:[NSDate class] forKey:FBSDK_ACCESSTOKEN_DATA_EXPIRATIONDATE_KEY];
|
||||||
|
|
||||||
return [self initWithTokenString:tokenString
|
return [self initWithTokenString:tokenString
|
||||||
permissions:[permissions allObjects]
|
permissions:permissions.allObjects
|
||||||
declinedPermissions:[declinedPermissions allObjects]
|
declinedPermissions:declinedPermissions.allObjects
|
||||||
appID:appID
|
appID:appID
|
||||||
userID:userID
|
userID:userID
|
||||||
expirationDate:expirationDate
|
expirationDate:expirationDate
|
||||||
|
|||||||
@ -24,16 +24,23 @@
|
|||||||
|
|
||||||
#import <FBSDKCoreKit/FBSDKGraphRequestConnection.h>
|
#import <FBSDKCoreKit/FBSDKGraphRequestConnection.h>
|
||||||
|
|
||||||
#import "FBSDKMacros.h"
|
|
||||||
|
|
||||||
@class FBSDKAccessToken;
|
@class FBSDKAccessToken;
|
||||||
@class FBSDKGraphRequest;
|
@class FBSDKGraphRequest;
|
||||||
|
|
||||||
|
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0
|
||||||
|
|
||||||
/** NSNotificationCenter name indicating a result of a failed log flush attempt. The posted object will be an NSError instance. */
|
/** NSNotificationCenter name indicating a result of a failed log flush attempt. The posted object will be an NSError instance. */
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventsLoggingResultNotification;
|
FOUNDATION_EXPORT NSNotificationName const FBSDKAppEventsLoggingResultNotification;
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
/** NSNotificationCenter name indicating a result of a failed log flush attempt. The posted object will be an NSError instance. */
|
||||||
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventsLoggingResultNotification;
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
/** optional plist key ("FacebookLoggingOverrideAppID") for setting `loggingOverrideAppID` */
|
/** optional plist key ("FacebookLoggingOverrideAppID") for setting `loggingOverrideAppID` */
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventsOverrideAppIDBundleKey;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventsOverrideAppIDBundleKey;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
||||||
@ -100,70 +107,70 @@ typedef NS_ENUM(NSUInteger, FBSDKProductCondition)
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/** Log this event when the user has achieved a level in the app. */
|
/** Log this event when the user has achieved a level in the app. */
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventNameAchievedLevel;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventNameAchievedLevel;
|
||||||
|
|
||||||
/** Log this event when the user has entered their payment info. */
|
/** Log this event when the user has entered their payment info. */
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventNameAddedPaymentInfo;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventNameAddedPaymentInfo;
|
||||||
|
|
||||||
/** Log this event when the user has added an item to their cart. The valueToSum passed to logEvent should be the item's price. */
|
/** Log this event when the user has added an item to their cart. The valueToSum passed to logEvent should be the item's price. */
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventNameAddedToCart;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventNameAddedToCart;
|
||||||
|
|
||||||
/** Log this event when the user has added an item to their wishlist. The valueToSum passed to logEvent should be the item's price. */
|
/** Log this event when the user has added an item to their wishlist. The valueToSum passed to logEvent should be the item's price. */
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventNameAddedToWishlist;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventNameAddedToWishlist;
|
||||||
|
|
||||||
/** Log this event when a user has completed registration with the app. */
|
/** Log this event when a user has completed registration with the app. */
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventNameCompletedRegistration;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventNameCompletedRegistration;
|
||||||
|
|
||||||
/** Log this event when the user has completed a tutorial in the app. */
|
/** Log this event when the user has completed a tutorial in the app. */
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventNameCompletedTutorial;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventNameCompletedTutorial;
|
||||||
|
|
||||||
/** Log this event when the user has entered the checkout process. The valueToSum passed to logEvent should be the total price in the cart. */
|
/** Log this event when the user has entered the checkout process. The valueToSum passed to logEvent should be the total price in the cart. */
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventNameInitiatedCheckout;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventNameInitiatedCheckout;
|
||||||
|
|
||||||
/** Log this event when the user has rated an item in the app. The valueToSum passed to logEvent should be the numeric rating. */
|
/** Log this event when the user has rated an item in the app. The valueToSum passed to logEvent should be the numeric rating. */
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventNameRated;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventNameRated;
|
||||||
|
|
||||||
/** Log this event when a user has performed a search within the app. */
|
/** Log this event when a user has performed a search within the app. */
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventNameSearched;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventNameSearched;
|
||||||
|
|
||||||
/** Log this event when the user has spent app credits. The valueToSum passed to logEvent should be the number of credits spent. */
|
/** Log this event when the user has spent app credits. The valueToSum passed to logEvent should be the number of credits spent. */
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventNameSpentCredits;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventNameSpentCredits;
|
||||||
|
|
||||||
/** Log this event when the user has unlocked an achievement in the app. */
|
/** Log this event when the user has unlocked an achievement in the app. */
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventNameUnlockedAchievement;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventNameUnlockedAchievement;
|
||||||
|
|
||||||
/** Log this event when a user has viewed a form of content in the app. */
|
/** Log this event when a user has viewed a form of content in the app. */
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventNameViewedContent;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventNameViewedContent;
|
||||||
|
|
||||||
/** A telephone/SMS, email, chat or other type of contact between a customer and your business. */
|
/** A telephone/SMS, email, chat or other type of contact between a customer and your business. */
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventNameContact;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventNameContact;
|
||||||
|
|
||||||
/** The customization of products through a configuration tool or other application your business owns. */
|
/** The customization of products through a configuration tool or other application your business owns. */
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventNameCustomizeProduct;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventNameCustomizeProduct;
|
||||||
|
|
||||||
/** The donation of funds to your organization or cause. */
|
/** The donation of funds to your organization or cause. */
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventNameDonate;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventNameDonate;
|
||||||
|
|
||||||
/** When a person finds one of your locations via web or application, with an intention to visit (example: find product at a local store). */
|
/** When a person finds one of your locations via web or application, with an intention to visit (example: find product at a local store). */
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventNameFindLocation;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventNameFindLocation;
|
||||||
|
|
||||||
/** The booking of an appointment to visit one of your locations. */
|
/** The booking of an appointment to visit one of your locations. */
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventNameSchedule;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventNameSchedule;
|
||||||
|
|
||||||
/** The start of a free trial of a product or service you offer (example: trial subscription). */
|
/** The start of a free trial of a product or service you offer (example: trial subscription). */
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventNameStartTrial;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventNameStartTrial;
|
||||||
|
|
||||||
/** The submission of an application for a product, service or program you offer (example: credit card, educational program or job).. */
|
/** The submission of an application for a product, service or program you offer (example: credit card, educational program or job). */
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventNameSubmitApplication;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventNameSubmitApplication;
|
||||||
|
|
||||||
/** The start of a paid subscription for a product or service you offer. */
|
/** The start of a paid subscription for a product or service you offer. */
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventNameSubscribe;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventNameSubscribe;
|
||||||
|
|
||||||
/** Log this event when the user views an ad. */
|
/** Log this event when the user views an ad. */
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventNameAdImpression;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventNameAdImpression;
|
||||||
|
|
||||||
/** Log this event when the user clicks an ad. */
|
/** Log this event when the user clicks an ad. */
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventNameAdClick;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventNameAdClick;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@methodgroup Predefined event name parameters for common additional information to accompany events logged through the `logEvent` family
|
@methodgroup Predefined event name parameters for common additional information to accompany events logged through the `logEvent` family
|
||||||
@ -176,40 +183,104 @@ FBSDK_EXTERN NSString *const FBSDKAppEventNameAdClick;
|
|||||||
* Example:
|
* Example:
|
||||||
* "[{\"id\": \"1234\", \"quantity\": 2, \"item_price\": 5.99}, {\"id\": \"5678\", \"quantity\": 1, \"item_price\": 9.99}]"
|
* "[{\"id\": \"1234\", \"quantity\": 2, \"item_price\": 5.99}, {\"id\": \"5678\", \"quantity\": 1, \"item_price\": 9.99}]"
|
||||||
*/
|
*/
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventParameterNameContent;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventParameterNameContent;
|
||||||
|
|
||||||
/** Parameter key used to specify an ID for the specific piece of content being logged about. Could be an EAN, article identifier, etc., depending on the nature of the app. */
|
/** Parameter key used to specify an ID for the specific piece of content being logged about. Could be an EAN, article identifier, etc., depending on the nature of the app. */
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventParameterNameContentID;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventParameterNameContentID;
|
||||||
|
|
||||||
/** Parameter key used to specify a generic content type/family for the logged event, e.g. "music", "photo", "video". Options to use will vary based upon what the app is all about. */
|
/** Parameter key used to specify a generic content type/family for the logged event, e.g. "music", "photo", "video". Options to use will vary based upon what the app is all about. */
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventParameterNameContentType;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventParameterNameContentType;
|
||||||
|
|
||||||
/** Parameter key used to specify currency used with logged event. E.g. "USD", "EUR", "GBP". See ISO-4217 for specific values. One reference for these is <http://en.wikipedia.org/wiki/ISO_4217>. */
|
/** Parameter key used to specify currency used with logged event. E.g. "USD", "EUR", "GBP". See ISO-4217 for specific values. One reference for these is <http://en.wikipedia.org/wiki/ISO_4217>. */
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventParameterNameCurrency;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventParameterNameCurrency;
|
||||||
|
|
||||||
/** Parameter key used to specify a description appropriate to the event being logged. E.g., the name of the achievement unlocked in the `FBAppEventNameAchievementUnlocked` event. */
|
/** Parameter key used to specify a description appropriate to the event being logged. E.g., the name of the achievement unlocked in the `FBAppEventNameAchievementUnlocked` event. */
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventParameterNameDescription;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventParameterNameDescription;
|
||||||
|
|
||||||
/** Parameter key used to specify the level achieved in a `FBAppEventNameAchieved` event. */
|
/** Parameter key used to specify the level achieved in a `FBAppEventNameAchieved` event. */
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventParameterNameLevel;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventParameterNameLevel;
|
||||||
|
|
||||||
/** Parameter key used to specify the maximum rating available for the `FBAppEventNameRate` event. E.g., "5" or "10". */
|
/** Parameter key used to specify the maximum rating available for the `FBAppEventNameRate` event. E.g., "5" or "10". */
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventParameterNameMaxRatingValue;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventParameterNameMaxRatingValue;
|
||||||
|
|
||||||
/** Parameter key used to specify how many items are being processed for an `FBAppEventNameInitiatedCheckout` or `FBAppEventNamePurchased` event. */
|
/** Parameter key used to specify how many items are being processed for an `FBAppEventNameInitiatedCheckout` or `FBAppEventNamePurchased` event. */
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventParameterNameNumItems;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventParameterNameNumItems;
|
||||||
|
|
||||||
/** Parameter key used to specify whether payment info is available for the `FBAppEventNameInitiatedCheckout` event. `FBSDKAppEventParameterValueYes` and `FBSDKAppEventParameterValueNo` are good canonical values to use for this parameter. */
|
/** Parameter key used to specify whether payment info is available for the `FBAppEventNameInitiatedCheckout` event. `FBSDKAppEventParameterValueYes` and `FBSDKAppEventParameterValueNo` are good canonical values to use for this parameter. */
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventParameterNamePaymentInfoAvailable;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventParameterNamePaymentInfoAvailable;
|
||||||
|
|
||||||
/** Parameter key used to specify method user has used to register for the app, e.g., "Facebook", "email", "Twitter", etc */
|
/** Parameter key used to specify method user has used to register for the app, e.g., "Facebook", "email", "Twitter", etc */
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventParameterNameRegistrationMethod;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventParameterNameRegistrationMethod;
|
||||||
|
|
||||||
/** Parameter key used to specify the string provided by the user for a search operation. */
|
/** Parameter key used to specify the string provided by the user for a search operation. */
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventParameterNameSearchString;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventParameterNameSearchString;
|
||||||
|
|
||||||
/** Parameter key used to specify whether the activity being logged about was successful or not. `FBSDKAppEventParameterValueYes` and `FBSDKAppEventParameterValueNo` are good canonical values to use for this parameter. */
|
/** Parameter key used to specify whether the activity being logged about was successful or not. `FBSDKAppEventParameterValueYes` and `FBSDKAppEventParameterValueNo` are good canonical values to use for this parameter. */
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventParameterNameSuccess;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventParameterNameSuccess;
|
||||||
|
|
||||||
|
/**
|
||||||
|
@methodgroup Predefined event name parameters for common additional information to accompany events logged through the `logProductItem` method on `FBSDKAppEvents`.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** Parameter key used to specify the product item's custom label 0. */
|
||||||
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventParameterProductCustomLabel0;
|
||||||
|
|
||||||
|
/** Parameter key used to specify the product item's custom label 1. */
|
||||||
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventParameterProductCustomLabel1;
|
||||||
|
|
||||||
|
/** Parameter key used to specify the product item's custom label 2. */
|
||||||
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventParameterProductCustomLabel2;
|
||||||
|
|
||||||
|
/** Parameter key used to specify the product item's custom label 3. */
|
||||||
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventParameterProductCustomLabel3;
|
||||||
|
|
||||||
|
/** Parameter key used to specify the product item's custom label 4. */
|
||||||
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventParameterProductCustomLabel4;
|
||||||
|
|
||||||
|
/** Parameter key used to specify the product item's AppLink app URL for iOS. */
|
||||||
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventParameterProductAppLinkIOSUrl;
|
||||||
|
|
||||||
|
/** Parameter key used to specify the product item's AppLink app ID for iOS App Store. */
|
||||||
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventParameterProductAppLinkIOSAppStoreID;
|
||||||
|
|
||||||
|
/** Parameter key used to specify the product item's AppLink app name for iOS. */
|
||||||
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventParameterProductAppLinkIOSAppName;
|
||||||
|
|
||||||
|
/** Parameter key used to specify the product item's AppLink app URL for iPhone. */
|
||||||
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventParameterProductAppLinkIPhoneUrl;
|
||||||
|
|
||||||
|
/** Parameter key used to specify the product item's AppLink app ID for iPhone App Store. */
|
||||||
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventParameterProductAppLinkIPhoneAppStoreID;
|
||||||
|
|
||||||
|
/** Parameter key used to specify the product item's AppLink app name for iPhone. */
|
||||||
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventParameterProductAppLinkIPhoneAppName;
|
||||||
|
|
||||||
|
/** Parameter key used to specify the product item's AppLink app URL for iPad. */
|
||||||
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventParameterProductAppLinkIPadUrl;
|
||||||
|
|
||||||
|
/** Parameter key used to specify the product item's AppLink app ID for iPad App Store. */
|
||||||
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventParameterProductAppLinkIPadAppStoreID;
|
||||||
|
|
||||||
|
/** Parameter key used to specify the product item's AppLink app name for iPad. */
|
||||||
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventParameterProductAppLinkIPadAppName;
|
||||||
|
|
||||||
|
/** Parameter key used to specify the product item's AppLink app URL for Android. */
|
||||||
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventParameterProductAppLinkAndroidUrl;
|
||||||
|
|
||||||
|
/** Parameter key used to specify the product item's AppLink fully-qualified package name for intent generation. */
|
||||||
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventParameterProductAppLinkAndroidPackage;
|
||||||
|
|
||||||
|
/** Parameter key used to specify the product item's AppLink app name for Android. */
|
||||||
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventParameterProductAppLinkAndroidAppName;
|
||||||
|
|
||||||
|
/** Parameter key used to specify the product item's AppLink app URL for Windows Phone. */
|
||||||
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventParameterProductAppLinkWindowsPhoneUrl;
|
||||||
|
|
||||||
|
/** Parameter key used to specify the product item's AppLink app ID, as a GUID, for App Store. */
|
||||||
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventParameterProductAppLinkWindowsPhoneAppID;
|
||||||
|
|
||||||
|
/** Parameter key used to specify the product item's AppLink app name for Windows Phone. */
|
||||||
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventParameterProductAppLinkWindowsPhoneAppName;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@methodgroup Predefined values to assign to event parameters that accompany events logged through the `logEvent` family
|
@methodgroup Predefined values to assign to event parameters that accompany events logged through the `logEvent` family
|
||||||
@ -217,19 +288,19 @@ FBSDK_EXTERN NSString *const FBSDKAppEventParameterNameSuccess;
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/** Yes-valued parameter value to be used with parameter keys that need a Yes/No value */
|
/** Yes-valued parameter value to be used with parameter keys that need a Yes/No value */
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventParameterValueYes;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventParameterValueYes;
|
||||||
|
|
||||||
/** No-valued parameter value to be used with parameter keys that need a Yes/No value */
|
/** No-valued parameter value to be used with parameter keys that need a Yes/No value */
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventParameterValueNo;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventParameterValueNo;
|
||||||
|
|
||||||
/** Parameter key used to specify the type of ad in an FBSDKAppEventNameAdImpression
|
/** Parameter key used to specify the type of ad in an FBSDKAppEventNameAdImpression
|
||||||
* or FBSDKAppEventNameAdClick event.
|
* or FBSDKAppEventNameAdClick event.
|
||||||
* E.g. "banner", "interstitial", "rewarded_video", "native" */
|
* E.g. "banner", "interstitial", "rewarded_video", "native" */
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventParameterNameAdType;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventParameterNameAdType;
|
||||||
|
|
||||||
/** Parameter key used to specify the unique ID for all events within a subscription
|
/** Parameter key used to specify the unique ID for all events within a subscription
|
||||||
* in an FBSDKAppEventNameSubscribe or FBSDKAppEventNameStartTrial event. */
|
* in an FBSDKAppEventNameSubscribe or FBSDKAppEventNameStartTrial event. */
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventParameterNameOrderID;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventParameterNameOrderID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
||||||
@ -530,7 +601,7 @@ FBSDK_EXTERN NSString *const FBSDKAppEventParameterNameOrderID;
|
|||||||
+ (void)activateApp;
|
+ (void)activateApp;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Push Notifications Registration
|
* Push Notifications Registration and Uninstall Tracking
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -544,6 +615,17 @@ FBSDK_EXTERN NSString *const FBSDKAppEventParameterNameOrderID;
|
|||||||
*/
|
*/
|
||||||
+ (void)setPushNotificationsDeviceToken:(NSData *)deviceToken;
|
+ (void)setPushNotificationsDeviceToken:(NSData *)deviceToken;
|
||||||
|
|
||||||
|
/**
|
||||||
|
Sets and sends device token string to register the current application for push notifications.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Sets and sends a device token string
|
||||||
|
|
||||||
|
@param deviceTokenString Device token string.
|
||||||
|
*/
|
||||||
|
+ (void)setPushNotificationsDeviceTokenString:(NSString *)deviceTokenString;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Control over event batching/flushing
|
* Control over event batching/flushing
|
||||||
*/
|
*/
|
||||||
@ -677,16 +759,16 @@ FBSDK_EXTERN NSString *const FBSDKAppEventParameterNameOrderID;
|
|||||||
@param zip user's zip
|
@param zip user's zip
|
||||||
@param country user's country
|
@param country user's country
|
||||||
*/
|
*/
|
||||||
+ (void)setUserEmail:(nullable NSString *)email
|
+ (void)setUserEmail:(NSString *)email
|
||||||
firstName:(nullable NSString *)firstName
|
firstName:(NSString *)firstName
|
||||||
lastName:(nullable NSString *)lastName
|
lastName:(NSString *)lastName
|
||||||
phone:(nullable NSString *)phone
|
phone:(NSString *)phone
|
||||||
dateOfBirth:(nullable NSString *)dateOfBirth
|
dateOfBirth:(NSString *)dateOfBirth
|
||||||
gender:(nullable NSString *)gender
|
gender:(NSString *)gender
|
||||||
city:(nullable NSString *)city
|
city:(NSString *)city
|
||||||
state:(nullable NSString *)state
|
state:(NSString *)state
|
||||||
zip:(nullable NSString *)zip
|
zip:(NSString *)zip
|
||||||
country:(nullable NSString *)country;
|
country:(NSString *)country;
|
||||||
/*
|
/*
|
||||||
Returns the set user data else nil
|
Returns the set user data else nil
|
||||||
*/
|
*/
|
||||||
@ -719,4 +801,22 @@ FBSDK_EXTERN NSString *const FBSDKAppEventParameterNameOrderID;
|
|||||||
+ (void)augmentHybridWKWebView:(WKWebView *)webView;
|
+ (void)augmentHybridWKWebView:(WKWebView *)webView;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Unity helper functions
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
|
||||||
|
Set if the Unity is already initialized
|
||||||
|
|
||||||
|
@param isUnityInit whether Unity is initialized.
|
||||||
|
|
||||||
|
*/
|
||||||
|
+ (void)setIsUnityInit:(BOOL)isUnityInit;
|
||||||
|
|
||||||
|
/*
|
||||||
|
Send event binding to Unity
|
||||||
|
*/
|
||||||
|
+ (void)sendEventBindingsToUnity;
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|||||||
@ -19,6 +19,8 @@
|
|||||||
#import "FBSDKAppEvents.h"
|
#import "FBSDKAppEvents.h"
|
||||||
#import "FBSDKAppEvents+Internal.h"
|
#import "FBSDKAppEvents+Internal.h"
|
||||||
|
|
||||||
|
#import <objc/runtime.h>
|
||||||
|
|
||||||
#import <UIKit/UIApplication.h>
|
#import <UIKit/UIApplication.h>
|
||||||
|
|
||||||
#import "FBSDKAccessToken.h"
|
#import "FBSDKAccessToken.h"
|
||||||
@ -97,6 +99,31 @@ NSString *const FBSDKAppEventParameterLaunchSource = @"fb_mobile_l
|
|||||||
NSString *const FBSDKAppEventParameterNameAdType = @"ad_type";
|
NSString *const FBSDKAppEventParameterNameAdType = @"ad_type";
|
||||||
NSString *const FBSDKAppEventParameterNameOrderID = @"fb_order_id";
|
NSString *const FBSDKAppEventParameterNameOrderID = @"fb_order_id";
|
||||||
|
|
||||||
|
//
|
||||||
|
// Public event parameter names for DPA Catalog
|
||||||
|
//
|
||||||
|
|
||||||
|
NSString *const FBSDKAppEventParameterProductCustomLabel0 = @"fb_product_custom_label_0";
|
||||||
|
NSString *const FBSDKAppEventParameterProductCustomLabel1 = @"fb_product_custom_label_1";
|
||||||
|
NSString *const FBSDKAppEventParameterProductCustomLabel2 = @"fb_product_custom_label_2";
|
||||||
|
NSString *const FBSDKAppEventParameterProductCustomLabel3 = @"fb_product_custom_label_3";
|
||||||
|
NSString *const FBSDKAppEventParameterProductCustomLabel4 = @"fb_product_custom_label_4";
|
||||||
|
NSString *const FBSDKAppEventParameterProductAppLinkIOSUrl = @"fb_product_applink_ios_url";
|
||||||
|
NSString *const FBSDKAppEventParameterProductAppLinkIOSAppStoreID = @"fb_product_applink_ios_app_store_id";
|
||||||
|
NSString *const FBSDKAppEventParameterProductAppLinkIOSAppName = @"fb_product_applink_ios_app_name";
|
||||||
|
NSString *const FBSDKAppEventParameterProductAppLinkIPhoneUrl = @"fb_product_applink_iphone_url";
|
||||||
|
NSString *const FBSDKAppEventParameterProductAppLinkIPhoneAppStoreID = @"fb_product_applink_iphone_app_store_id";
|
||||||
|
NSString *const FBSDKAppEventParameterProductAppLinkIPhoneAppName = @"fb_product_applink_iphone_app_name";
|
||||||
|
NSString *const FBSDKAppEventParameterProductAppLinkIPadUrl = @"fb_product_applink_ipad_url";
|
||||||
|
NSString *const FBSDKAppEventParameterProductAppLinkIPadAppStoreID = @"fb_product_applink_ipad_app_store_id";
|
||||||
|
NSString *const FBSDKAppEventParameterProductAppLinkIPadAppName = @"fb_product_applink_ipad_app_name";
|
||||||
|
NSString *const FBSDKAppEventParameterProductAppLinkAndroidUrl = @"fb_product_applink_android_url";
|
||||||
|
NSString *const FBSDKAppEventParameterProductAppLinkAndroidPackage = @"fb_product_applink_android_package";
|
||||||
|
NSString *const FBSDKAppEventParameterProductAppLinkAndroidAppName = @"fb_product_applink_android_app_name";
|
||||||
|
NSString *const FBSDKAppEventParameterProductAppLinkWindowsPhoneUrl = @"fb_product_applink_windows_phone_url";
|
||||||
|
NSString *const FBSDKAppEventParameterProductAppLinkWindowsPhoneAppID = @"fb_product_applink_windows_phone_app_id";
|
||||||
|
NSString *const FBSDKAppEventParameterProductAppLinkWindowsPhoneAppName = @"fb_product_applink_windows_phone_app_name";
|
||||||
|
|
||||||
//
|
//
|
||||||
// Public event parameter values
|
// Public event parameter values
|
||||||
//
|
//
|
||||||
@ -238,8 +265,16 @@ NSString *const FBSDKAppEventsDialogShareContentTypeMessengerMediaTemplate
|
|||||||
NSString *const FBSDKAppEventsDialogShareContentTypeMessengerOpenGraphMusicTemplate = @"OpenGraphMusicTemplate";
|
NSString *const FBSDKAppEventsDialogShareContentTypeMessengerOpenGraphMusicTemplate = @"OpenGraphMusicTemplate";
|
||||||
NSString *const FBSDKAppEventsDialogShareContentTypeUnknown = @"Unknown";
|
NSString *const FBSDKAppEventsDialogShareContentTypeUnknown = @"Unknown";
|
||||||
|
|
||||||
|
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0
|
||||||
|
|
||||||
|
NSNotificationName const FBSDKAppEventsLoggingResultNotification = @"com.facebook.sdk:FBSDKAppEventsLoggingResultNotification";
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
NSString *const FBSDKAppEventsLoggingResultNotification = @"com.facebook.sdk:FBSDKAppEventsLoggingResultNotification";
|
NSString *const FBSDKAppEventsLoggingResultNotification = @"com.facebook.sdk:FBSDKAppEventsLoggingResultNotification";
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
NSString *const FBSDKAppEventsOverrideAppIDBundleKey = @"FacebookLoggingOverrideAppID";
|
NSString *const FBSDKAppEventsOverrideAppIDBundleKey = @"FacebookLoggingOverrideAppID";
|
||||||
|
|
||||||
//
|
//
|
||||||
@ -271,11 +306,19 @@ NSString *const FBSDKAPPEventsWKWebViewMessagesProtocolKey = @"fbmq-0.1";
|
|||||||
#define FLUSH_PERIOD_IN_SECONDS 15
|
#define FLUSH_PERIOD_IN_SECONDS 15
|
||||||
#define USER_ID_USER_DEFAULTS_KEY @"com.facebook.sdk.appevents.userid"
|
#define USER_ID_USER_DEFAULTS_KEY @"com.facebook.sdk.appevents.userid"
|
||||||
|
|
||||||
|
#define FBUnityUtilityClassName "FBUnityUtility"
|
||||||
|
#define FBUnityUtilityUpdateBindingsSelector @"triggerUpdateBindings:"
|
||||||
|
|
||||||
|
#define UNINSTALL_TRACKING_DEVICE_ID_KEY @"device_id"
|
||||||
|
#define UNINSTALL_TRACKING_PLATFORM_KEY @"platform"
|
||||||
|
#define UNINSTALL_TRACKING_DEVICE_TOKEN_KEY @"device_token"
|
||||||
|
#define UNINSTALL_TRACKING_TOKEN_ENDPOINT @"app_push_device_token"
|
||||||
|
|
||||||
static NSString *g_overrideAppID = nil;
|
static NSString *g_overrideAppID = nil;
|
||||||
|
|
||||||
@interface FBSDKAppEvents ()
|
@interface FBSDKAppEvents ()
|
||||||
|
|
||||||
@property (nonatomic, readwrite) FBSDKAppEventsFlushBehavior flushBehavior;
|
@property (nonatomic, assign) FBSDKAppEventsFlushBehavior flushBehavior;
|
||||||
//for testing only.
|
//for testing only.
|
||||||
@property (nonatomic, assign) BOOL disableTimer;
|
@property (nonatomic, assign) BOOL disableTimer;
|
||||||
|
|
||||||
@ -294,6 +337,7 @@ static NSString *g_overrideAppID = nil;
|
|||||||
FBSDKEventBindingManager *_eventBindingManager;
|
FBSDKEventBindingManager *_eventBindingManager;
|
||||||
#endif
|
#endif
|
||||||
NSString *_userID;
|
NSString *_userID;
|
||||||
|
BOOL _isUnityInit;
|
||||||
}
|
}
|
||||||
|
|
||||||
#pragma mark - Object Lifecycle
|
#pragma mark - Object Lifecycle
|
||||||
@ -319,6 +363,7 @@ static NSString *g_overrideAppID = nil;
|
|||||||
|
|
||||||
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
|
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
|
||||||
_userID = [defaults stringForKey:USER_ID_USER_DEFAULTS_KEY];
|
_userID = [defaults stringForKey:USER_ID_USER_DEFAULTS_KEY];
|
||||||
|
[self fetchServerConfiguration:nil];
|
||||||
}
|
}
|
||||||
|
|
||||||
return self;
|
return self;
|
||||||
@ -380,7 +425,7 @@ static NSString *g_overrideAppID = nil;
|
|||||||
parameters:(NSDictionary *)parameters
|
parameters:(NSDictionary *)parameters
|
||||||
{
|
{
|
||||||
[FBSDKAppEvents logEvent:eventName
|
[FBSDKAppEvents logEvent:eventName
|
||||||
valueToSum:[NSNumber numberWithDouble:valueToSum]
|
valueToSum:@(valueToSum)
|
||||||
parameters:parameters
|
parameters:parameters
|
||||||
accessToken:nil];
|
accessToken:nil];
|
||||||
}
|
}
|
||||||
@ -432,7 +477,7 @@ static NSString *g_overrideAppID = nil;
|
|||||||
}
|
}
|
||||||
|
|
||||||
[FBSDKAppEvents logEvent:FBSDKAppEventNamePurchased
|
[FBSDKAppEvents logEvent:FBSDKAppEventNamePurchased
|
||||||
valueToSum:[NSNumber numberWithDouble:purchaseAmount]
|
valueToSum:@(purchaseAmount)
|
||||||
parameters:newParameters
|
parameters:newParameters
|
||||||
accessToken:accessToken];
|
accessToken:accessToken];
|
||||||
|
|
||||||
@ -523,7 +568,7 @@ static NSString *g_overrideAppID = nil;
|
|||||||
[dict setValuesForKeysWithDictionary:parameters];
|
[dict setValuesForKeysWithDictionary:parameters];
|
||||||
}
|
}
|
||||||
|
|
||||||
[dict setObject:itemID forKey:FBSDKAppEventParameterProductItemID];
|
dict[FBSDKAppEventParameterProductItemID] = itemID;
|
||||||
|
|
||||||
NSString *avail = nil;
|
NSString *avail = nil;
|
||||||
switch (availability) {
|
switch (availability) {
|
||||||
@ -539,7 +584,7 @@ static NSString *g_overrideAppID = nil;
|
|||||||
avail = @"DISCONTINUED"; break;
|
avail = @"DISCONTINUED"; break;
|
||||||
}
|
}
|
||||||
if (avail) {
|
if (avail) {
|
||||||
[dict setObject:avail forKey:FBSDKAppEventParameterProductAvailability];
|
dict[FBSDKAppEventParameterProductAvailability] = avail;
|
||||||
}
|
}
|
||||||
|
|
||||||
NSString *cond = nil;
|
NSString *cond = nil;
|
||||||
@ -552,23 +597,23 @@ static NSString *g_overrideAppID = nil;
|
|||||||
cond = @"USED"; break;
|
cond = @"USED"; break;
|
||||||
}
|
}
|
||||||
if (cond) {
|
if (cond) {
|
||||||
[dict setObject:cond forKey:FBSDKAppEventParameterProductCondition];
|
dict[FBSDKAppEventParameterProductCondition] = cond;
|
||||||
}
|
}
|
||||||
|
|
||||||
[dict setObject:description forKey:FBSDKAppEventParameterProductDescription];
|
dict[FBSDKAppEventParameterProductDescription] = description;
|
||||||
[dict setObject:imageLink forKey:FBSDKAppEventParameterProductImageLink];
|
dict[FBSDKAppEventParameterProductImageLink] = imageLink;
|
||||||
[dict setObject:link forKey:FBSDKAppEventParameterProductLink];
|
dict[FBSDKAppEventParameterProductLink] = link;
|
||||||
[dict setObject:title forKey:FBSDKAppEventParameterProductTitle];
|
dict[FBSDKAppEventParameterProductTitle] = title;
|
||||||
[dict setObject:[NSString stringWithFormat:@"%.3lf", priceAmount] forKey:FBSDKAppEventParameterProductPriceAmount];
|
dict[FBSDKAppEventParameterProductPriceAmount] = [NSString stringWithFormat:@"%.3lf", priceAmount];
|
||||||
[dict setObject:currency forKey:FBSDKAppEventParameterProductPriceCurrency];
|
dict[FBSDKAppEventParameterProductPriceCurrency] = currency;
|
||||||
if (gtin) {
|
if (gtin) {
|
||||||
[dict setObject:gtin forKey:FBSDKAppEventParameterProductGTIN];
|
dict[FBSDKAppEventParameterProductGTIN] = gtin;
|
||||||
}
|
}
|
||||||
if (mpn) {
|
if (mpn) {
|
||||||
[dict setObject:mpn forKey:FBSDKAppEventParameterProductMPN];
|
dict[FBSDKAppEventParameterProductMPN] = mpn;
|
||||||
}
|
}
|
||||||
if (brand) {
|
if (brand) {
|
||||||
[dict setObject:brand forKey:FBSDKAppEventParameterProductBrand];
|
dict[FBSDKAppEventParameterProductBrand] = brand;
|
||||||
}
|
}
|
||||||
|
|
||||||
[FBSDKAppEvents logEvent:FBSDKAppEventNameProductCatalogUpdate
|
[FBSDKAppEvents logEvent:FBSDKAppEventNameProductCatalogUpdate
|
||||||
@ -595,6 +640,11 @@ static NSString *g_overrideAppID = nil;
|
|||||||
+ (void)setPushNotificationsDeviceToken:(NSData *)deviceToken
|
+ (void)setPushNotificationsDeviceToken:(NSData *)deviceToken
|
||||||
{
|
{
|
||||||
NSString *deviceTokenString = [FBSDKInternalUtility hexadecimalStringFromData:deviceToken];
|
NSString *deviceTokenString = [FBSDKInternalUtility hexadecimalStringFromData:deviceToken];
|
||||||
|
[FBSDKAppEvents setPushNotificationsDeviceTokenString:deviceTokenString];
|
||||||
|
}
|
||||||
|
|
||||||
|
+ (void)setPushNotificationsDeviceTokenString:(NSString *)deviceTokenString
|
||||||
|
{
|
||||||
if (deviceTokenString == nil) {
|
if (deviceTokenString == nil) {
|
||||||
[FBSDKAppEvents singleton].pushNotificationsDeviceTokenString = nil;
|
[FBSDKAppEvents singleton].pushNotificationsDeviceTokenString = nil;
|
||||||
return;
|
return;
|
||||||
@ -609,6 +659,23 @@ static NSString *g_overrideAppID = nil;
|
|||||||
if ([FBSDKAppEvents flushBehavior] != FBSDKAppEventsFlushBehaviorExplicitOnly) {
|
if ([FBSDKAppEvents flushBehavior] != FBSDKAppEventsFlushBehaviorExplicitOnly) {
|
||||||
[[FBSDKAppEvents singleton] flushForReason:FBSDKAppEventsFlushReasonEagerlyFlushingEvent];
|
[[FBSDKAppEvents singleton] flushForReason:FBSDKAppEventsFlushReasonEagerlyFlushingEvent];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Update device push token for uninstall tracking
|
||||||
|
[FBSDKServerConfigurationManager loadServerConfigurationWithCompletionBlock:^(FBSDKServerConfiguration *serverConfiguration, NSError *error) {
|
||||||
|
if (serverConfiguration.uninstallTrackingEnabled) {
|
||||||
|
FBSDKGraphRequest *request = [[FBSDKGraphRequest alloc]
|
||||||
|
initWithGraphPath:[NSString stringWithFormat:@"%@/%@",
|
||||||
|
[FBSDKSettings appID], UNINSTALL_TRACKING_TOKEN_ENDPOINT]
|
||||||
|
parameters:@{
|
||||||
|
UNINSTALL_TRACKING_DEVICE_TOKEN_KEY: deviceTokenString,
|
||||||
|
UNINSTALL_TRACKING_PLATFORM_KEY: @"ios",
|
||||||
|
// advertiserID could be 0s if user select limit ad tracking
|
||||||
|
UNINSTALL_TRACKING_DEVICE_ID_KEY: [FBSDKAppEventsUtility advertiserID] ?: @""
|
||||||
|
}
|
||||||
|
HTTPMethod:@"POST"];
|
||||||
|
[request startWithCompletionHandler:nil];
|
||||||
|
}
|
||||||
|
}];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -668,16 +735,16 @@ static NSString *g_overrideAppID = nil;
|
|||||||
[FBSDKUserDataStore setUserDataAndHash:userData];
|
[FBSDKUserDataStore setUserDataAndHash:userData];
|
||||||
}
|
}
|
||||||
|
|
||||||
+ (void)setUserEmail:(nullable NSString *)email
|
+ (void)setUserEmail:(NSString *)email
|
||||||
firstName:(nullable NSString *)firstName
|
firstName:(NSString *)firstName
|
||||||
lastName:(nullable NSString *)lastName
|
lastName:(NSString *)lastName
|
||||||
phone:(nullable NSString *)phone
|
phone:(NSString *)phone
|
||||||
dateOfBirth:(nullable NSString *)dateOfBirth
|
dateOfBirth:(NSString *)dateOfBirth
|
||||||
gender:(nullable NSString *)gender
|
gender:(NSString *)gender
|
||||||
city:(nullable NSString *)city
|
city:(NSString *)city
|
||||||
state:(nullable NSString *)state
|
state:(NSString *)state
|
||||||
zip:(nullable NSString *)zip
|
zip:(NSString *)zip
|
||||||
country:(nullable NSString *)country
|
country:(NSString *)country
|
||||||
{
|
{
|
||||||
[FBSDKUserDataStore setUserDataAndHash:email
|
[FBSDKUserDataStore setUserDataAndHash:email
|
||||||
firstName:firstName
|
firstName:firstName
|
||||||
@ -716,7 +783,7 @@ static NSString *g_overrideAppID = nil;
|
|||||||
|
|
||||||
if (userID.length == 0) {
|
if (userID.length == 0) {
|
||||||
[FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorDeveloperErrors logEntry:@"Missing [FBSDKAppEvents userID] for [FBSDKAppEvents updateUserProperties:]"];
|
[FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorDeveloperErrors logEntry:@"Missing [FBSDKAppEvents userID] for [FBSDKAppEvents updateUserProperties:]"];
|
||||||
NSError *error = [FBSDKError requiredArgumentErrorWithName:@"userID" message:@"Missing [FBSDKAppEvents userID] for [FBSDKAppEvents updateUserProperties:]"];
|
NSError *error = [NSError fbRequiredArgumentErrorWithName:@"userID" message:@"Missing [FBSDKAppEvents userID] for [FBSDKAppEvents updateUserProperties:]"];
|
||||||
if (handler) {
|
if (handler) {
|
||||||
handler(nil, nil, error);
|
handler(nil, nil, error);
|
||||||
}
|
}
|
||||||
@ -731,7 +798,7 @@ static NSString *g_overrideAppID = nil;
|
|||||||
__block NSError *invalidObjectError;
|
__block NSError *invalidObjectError;
|
||||||
NSString *dataJSONString = [FBSDKInternalUtility JSONStringForObject:@[dataDictionary] error:&error invalidObjectHandler:^id(id object, BOOL *stop) {
|
NSString *dataJSONString = [FBSDKInternalUtility JSONStringForObject:@[dataDictionary] error:&error invalidObjectHandler:^id(id object, BOOL *stop) {
|
||||||
*stop = YES;
|
*stop = YES;
|
||||||
invalidObjectError = [FBSDKError unknownErrorWithMessage:@"The values in the properties dictionary must be NSStrings or NSNumbers"];
|
invalidObjectError = [NSError fbUnknownErrorWithMessage:@"The values in the properties dictionary must be NSStrings or NSNumbers"];
|
||||||
return nil;
|
return nil;
|
||||||
}];
|
}];
|
||||||
if (!error) {
|
if (!error) {
|
||||||
@ -785,6 +852,33 @@ static NSString *g_overrideAppID = nil;
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
+ (void)setIsUnityInit:(BOOL)isUnityInit
|
||||||
|
{
|
||||||
|
[FBSDKAppEvents singleton]->_isUnityInit = isUnityInit;
|
||||||
|
}
|
||||||
|
|
||||||
|
#pragma clang diagnostic push
|
||||||
|
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
|
||||||
|
+ (void)sendEventBindingsToUnity
|
||||||
|
{
|
||||||
|
// Send event bindings to Unity only Unity is initialized
|
||||||
|
if ([FBSDKAppEvents singleton]->_isUnityInit
|
||||||
|
&& [FBSDKAppEvents singleton]->_serverConfiguration
|
||||||
|
&& [NSJSONSerialization isValidJSONObject:[FBSDKAppEvents singleton]->_serverConfiguration.eventBindings]
|
||||||
|
) {
|
||||||
|
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:[FBSDKAppEvents singleton]->_serverConfiguration.eventBindings ?: @""
|
||||||
|
options:0
|
||||||
|
error:nil];
|
||||||
|
NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
|
||||||
|
Class classFBUnityUtility = objc_lookUpClass(FBUnityUtilityClassName);
|
||||||
|
SEL updateBindingSelector = NSSelectorFromString(FBUnityUtilityUpdateBindingsSelector);
|
||||||
|
if ([classFBUnityUtility respondsToSelector:updateBindingSelector]) {
|
||||||
|
[classFBUnityUtility performSelector:updateBindingSelector withObject:jsonString];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#pragma clang diagnostic pop
|
||||||
|
|
||||||
#pragma mark - Internal Methods
|
#pragma mark - Internal Methods
|
||||||
|
|
||||||
+ (void)logImplicitEvent:(NSString *)eventName
|
+ (void)logImplicitEvent:(NSString *)eventName
|
||||||
@ -837,7 +931,7 @@ static NSString *g_overrideAppID = nil;
|
|||||||
- (void)publishInstall
|
- (void)publishInstall
|
||||||
{
|
{
|
||||||
NSString *appID = [self appID];
|
NSString *appID = [self appID];
|
||||||
if ([appID length] == 0) {
|
if (appID.length == 0) {
|
||||||
[FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorDeveloperErrors logEntry:@"Missing [FBSDKAppEvents appID] for [FBSDKAppEvents publishInstall:]"];
|
[FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorDeveloperErrors logEntry:@"Missing [FBSDKAppEvents appID] for [FBSDKAppEvents publishInstall:]"];
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -875,8 +969,12 @@ static NSString *g_overrideAppID = nil;
|
|||||||
[_eventBindingManager start];
|
[_eventBindingManager start];
|
||||||
}
|
}
|
||||||
|
|
||||||
[_eventBindingManager updateBindings:[FBSDKEventBindingManager
|
if ([FBSDKInternalUtility isUnity]) {
|
||||||
parseArray:_serverConfiguration.eventBindings]];
|
[FBSDKAppEvents sendEventBindingsToUnity];
|
||||||
|
} else {
|
||||||
|
[_eventBindingManager updateBindings:[FBSDKEventBindingManager
|
||||||
|
parseArray:_serverConfiguration.eventBindings]];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -1046,7 +1144,7 @@ static NSString *g_overrideAppID = nil;
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ([appEventsState.appID length] == 0) {
|
if (appEventsState.appID.length == 0) {
|
||||||
[FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorDeveloperErrors logEntry:@"Missing [FBSDKAppEvents appEventsState.appID] for [FBSDKAppEvents flushOnMainQueue:]"];
|
[FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorDeveloperErrors logEntry:@"Missing [FBSDKAppEvents appEventsState.appID] for [FBSDKAppEvents flushOnMainQueue:]"];
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -1065,7 +1163,7 @@ static NSString *g_overrideAppID = nil;
|
|||||||
activityParametersDictionaryForEvent:@"CUSTOM_APP_EVENTS"
|
activityParametersDictionaryForEvent:@"CUSTOM_APP_EVENTS"
|
||||||
implicitEventsOnly:appEventsState.areAllEventsImplicit
|
implicitEventsOnly:appEventsState.areAllEventsImplicit
|
||||||
shouldAccessAdvertisingID:self->_serverConfiguration.advertisingIDEnabled];
|
shouldAccessAdvertisingID:self->_serverConfiguration.advertisingIDEnabled];
|
||||||
NSInteger length = [receipt_data length];
|
NSInteger length = receipt_data.length;
|
||||||
if (length > 0) {
|
if (length > 0) {
|
||||||
postParameters[@"receipt_data"] = receipt_data;
|
postParameters[@"receipt_data"] = receipt_data;
|
||||||
}
|
}
|
||||||
@ -1097,7 +1195,6 @@ static NSString *g_overrideAppID = nil;
|
|||||||
prettyPrintedJsonEvents];
|
prettyPrintedJsonEvents];
|
||||||
}
|
}
|
||||||
|
|
||||||
[FBSDKAppEventsUtility logAndNotify:[NSString stringWithFormat:@"param %@", postParameters]];
|
|
||||||
FBSDKGraphRequest *request = [[FBSDKGraphRequest alloc] initWithGraphPath:[NSString stringWithFormat:@"%@/activities", appEventsState.appID]
|
FBSDKGraphRequest *request = [[FBSDKGraphRequest alloc] initWithGraphPath:[NSString stringWithFormat:@"%@/activities", appEventsState.appID]
|
||||||
parameters:postParameters
|
parameters:postParameters
|
||||||
tokenString:appEventsState.tokenString
|
tokenString:appEventsState.tokenString
|
||||||
@ -1138,7 +1235,7 @@ static NSString *g_overrideAppID = nil;
|
|||||||
if (flushResult == FlushResultServerError) {
|
if (flushResult == FlushResultServerError) {
|
||||||
// Only log events that developer can do something with (i.e., if parameters are incorrect).
|
// Only log events that developer can do something with (i.e., if parameters are incorrect).
|
||||||
// as opposed to cases where the token is bad.
|
// as opposed to cases where the token is bad.
|
||||||
if ([error.userInfo[FBSDKGraphRequestErrorCategoryKey] unsignedIntegerValue] == FBSDKGraphRequestErrorCategoryOther) {
|
if ([error.userInfo[FBSDKGraphRequestErrorKey] unsignedIntegerValue] == FBSDKGraphRequestErrorOther) {
|
||||||
NSString *message = [NSString stringWithFormat:@"Failed to send AppEvents: %@", error];
|
NSString *message = [NSString stringWithFormat:@"Failed to send AppEvents: %@", error];
|
||||||
[FBSDKAppEventsUtility logAndNotify:message allowLogAsDeveloperError:!appEventsState.areAllEventsImplicit];
|
[FBSDKAppEventsUtility logAndNotify:message allowLogAsDeveloperError:!appEventsState.areAllEventsImplicit];
|
||||||
}
|
}
|
||||||
@ -1164,7 +1261,7 @@ static NSString *g_overrideAppID = nil;
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case FlushResultServerError:
|
case FlushResultServerError:
|
||||||
resultString = [NSString stringWithFormat:@"Server Error - %@", [error description]];
|
resultString = [NSString stringWithFormat:@"Server Error - %@", error.description];
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -30,11 +30,11 @@ NSString *const FBSDKAppLinkVersion = @"1.0";
|
|||||||
|
|
||||||
@interface FBSDKAppLink ()
|
@interface FBSDKAppLink ()
|
||||||
|
|
||||||
@property (nonatomic, strong, readwrite) NSURL *sourceURL;
|
@property (nonatomic, strong) NSURL *sourceURL;
|
||||||
@property (nonatomic, copy, readwrite) NSArray<FBSDKAppLinkTarget *> *targets;
|
@property (nonatomic, copy) NSArray<FBSDKAppLinkTarget *> *targets;
|
||||||
@property (nonatomic, strong, readwrite) NSURL *webURL;
|
@property (nonatomic, strong) NSURL *webURL;
|
||||||
|
|
||||||
@property (nonatomic, assign, readwrite, getter=isBackToReferrer) BOOL backToReferrer;
|
@property (nonatomic, assign, getter=isBackToReferrer) BOOL backToReferrer;
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
|
|||||||
@ -69,6 +69,12 @@ NS_EXTENSION_UNAVAILABLE_IOS("Not available in app extension")
|
|||||||
/*! The AppLink to navigate to */
|
/*! The AppLink to navigate to */
|
||||||
@property (nonatomic, strong, readonly) FBSDKAppLink *appLink;
|
@property (nonatomic, strong, readonly) FBSDKAppLink *appLink;
|
||||||
|
|
||||||
|
/*!
|
||||||
|
Return navigation type for current instance.
|
||||||
|
No-side-effect version of navigate:
|
||||||
|
*/
|
||||||
|
@property (nonatomic, readonly) FBSDKAppLinkNavigationType navigationType;
|
||||||
|
|
||||||
/*! Creates an AppLinkNavigation with the given link, extras, and App Link data */
|
/*! Creates an AppLinkNavigation with the given link, extras, and App Link data */
|
||||||
+ (instancetype)navigationWithAppLink:(FBSDKAppLink *)appLink
|
+ (instancetype)navigationWithAppLink:(FBSDKAppLink *)appLink
|
||||||
extras:(NSDictionary<NSString *, id> *)extras
|
extras:(NSDictionary<NSString *, id> *)extras
|
||||||
@ -103,12 +109,6 @@ NS_EXTENSION_UNAVAILABLE_IOS("Not available in app extension")
|
|||||||
*/
|
*/
|
||||||
+ (FBSDKAppLinkNavigationType)navigationTypeForLink:(FBSDKAppLink *)link;
|
+ (FBSDKAppLinkNavigationType)navigationTypeForLink:(FBSDKAppLink *)link;
|
||||||
|
|
||||||
/*!
|
|
||||||
Return navigation type for current instance.
|
|
||||||
No-side-effect version of navigate:
|
|
||||||
*/
|
|
||||||
- (FBSDKAppLinkNavigationType)navigationType;
|
|
||||||
|
|
||||||
/*! Navigates to a URL (an asynchronous action) and returns a FBSDKNavigationType */
|
/*! Navigates to a URL (an asynchronous action) and returns a FBSDKNavigationType */
|
||||||
+ (void)navigateToURL:(NSURL *)destination handler:(FBSDKAppLinkNavigationHandler)handler;
|
+ (void)navigateToURL:(NSURL *)destination handler:(FBSDKAppLinkNavigationHandler)handler;
|
||||||
|
|
||||||
|
|||||||
@ -37,9 +37,9 @@ static id<FBSDKAppLinkResolving> defaultResolver;
|
|||||||
|
|
||||||
@interface FBSDKAppLinkNavigation ()
|
@interface FBSDKAppLinkNavigation ()
|
||||||
|
|
||||||
@property (nonatomic, copy, readwrite) NSDictionary<NSString *, id> *extras;
|
@property (nonatomic, copy) NSDictionary<NSString *, id> *extras;
|
||||||
@property (nonatomic, copy, readwrite) NSDictionary<NSString *, id> *appLinkData;
|
@property (nonatomic, copy) NSDictionary<NSString *, id> *appLinkData;
|
||||||
@property (nonatomic, strong, readwrite) FBSDKAppLink *appLink;
|
@property (nonatomic, strong) FBSDKAppLink *appLink;
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
@ -61,15 +61,7 @@ static id<FBSDKAppLinkResolving> defaultResolver;
|
|||||||
}
|
}
|
||||||
|
|
||||||
- (NSString *)stringByEscapingQueryString:(NSString *)string {
|
- (NSString *)stringByEscapingQueryString:(NSString *)string {
|
||||||
#if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_7_0 || __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_9
|
|
||||||
return [string stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
|
return [string stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
|
||||||
#else
|
|
||||||
return (NSString *)CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(NULL,
|
|
||||||
(CFStringRef)string,
|
|
||||||
NULL,
|
|
||||||
(CFStringRef) @":/?#[]@!$&'()*+,;=",
|
|
||||||
kCFStringEncodingUTF8));
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
- (NSURL *)appLinkURLWithTargetURL:(NSURL *)targetUrl error:(NSError **)error {
|
- (NSURL *)appLinkURLWithTargetURL:(NSURL *)targetUrl error:(NSError **)error {
|
||||||
@ -96,7 +88,7 @@ static id<FBSDKAppLinkResolving> defaultResolver;
|
|||||||
NSString *encoded = [self stringByEscapingQueryString:jsonString];
|
NSString *encoded = [self stringByEscapingQueryString:jsonString];
|
||||||
|
|
||||||
NSString *endUrlString = [NSString stringWithFormat:@"%@%@%@=%@",
|
NSString *endUrlString = [NSString stringWithFormat:@"%@%@%@=%@",
|
||||||
[targetUrl absoluteString],
|
targetUrl.absoluteString,
|
||||||
targetUrl.query ? @"&" : @"?",
|
targetUrl.query ? @"&" : @"?",
|
||||||
FBSDKAppLinkDataParameterName,
|
FBSDKAppLinkDataParameterName,
|
||||||
encoded];
|
encoded];
|
||||||
@ -158,8 +150,8 @@ static id<FBSDKAppLinkResolving> defaultResolver;
|
|||||||
NSMutableDictionary<NSString *, id> *logData =
|
NSMutableDictionary<NSString *, id> *logData =
|
||||||
[[NSMutableDictionary alloc] init];
|
[[NSMutableDictionary alloc] init];
|
||||||
|
|
||||||
NSString *outputURLScheme = [outputURL scheme];
|
NSString *outputURLScheme = outputURL.scheme;
|
||||||
NSString *outputURLString = [outputURL absoluteString];
|
NSString *outputURLString = outputURL.absoluteString;
|
||||||
if (outputURLScheme) {
|
if (outputURLScheme) {
|
||||||
logData[@"outputURLScheme"] = outputURLScheme;
|
logData[@"outputURLScheme"] = outputURLScheme;
|
||||||
}
|
}
|
||||||
@ -167,9 +159,9 @@ static id<FBSDKAppLinkResolving> defaultResolver;
|
|||||||
logData[@"outputURL"] = outputURLString;
|
logData[@"outputURL"] = outputURLString;
|
||||||
}
|
}
|
||||||
|
|
||||||
NSString *sourceURLString = [self.appLink.sourceURL absoluteString];
|
NSString *sourceURLString = self.appLink.sourceURL.absoluteString;
|
||||||
NSString *sourceURLHost = [self.appLink.sourceURL host];
|
NSString *sourceURLHost = self.appLink.sourceURL.host;
|
||||||
NSString *sourceURLScheme = [self.appLink.sourceURL scheme];
|
NSString *sourceURLScheme = self.appLink.sourceURL.scheme;
|
||||||
if (sourceURLString) {
|
if (sourceURLString) {
|
||||||
logData[@"sourceURL"] = sourceURLString;
|
logData[@"sourceURL"] = sourceURLString;
|
||||||
}
|
}
|
||||||
@ -179,8 +171,8 @@ static id<FBSDKAppLinkResolving> defaultResolver;
|
|||||||
if (sourceURLScheme) {
|
if (sourceURLScheme) {
|
||||||
logData[@"sourceScheme"] = sourceURLScheme;
|
logData[@"sourceScheme"] = sourceURLScheme;
|
||||||
}
|
}
|
||||||
if ([error localizedDescription]) {
|
if (error.localizedDescription) {
|
||||||
logData[@"error"] = [error localizedDescription];
|
logData[@"error"] = error.localizedDescription;
|
||||||
}
|
}
|
||||||
NSString *success = nil; //no
|
NSString *success = nil; //no
|
||||||
NSString *linkType = nil; // unknown;
|
NSString *linkType = nil; // unknown;
|
||||||
@ -207,7 +199,7 @@ static id<FBSDKAppLinkResolving> defaultResolver;
|
|||||||
logData[@"type"] = linkType;
|
logData[@"type"] = linkType;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ([self.appLink isBackToReferrer]) {
|
if (self.appLink.backToReferrer) {
|
||||||
[FBSDKMeasurementEvent postNotificationForEventName:FBSDKAppLinkNavigateBackToReferrerEventName args:logData];
|
[FBSDKMeasurementEvent postNotificationForEventName:FBSDKAppLinkNavigateBackToReferrerEventName args:logData];
|
||||||
} else {
|
} else {
|
||||||
[FBSDKMeasurementEvent postNotificationForEventName:FBSDKAppLinkNavigateOutEventName args:logData];
|
[FBSDKMeasurementEvent postNotificationForEventName:FBSDKAppLinkNavigateOutEventName args:logData];
|
||||||
|
|||||||
@ -102,10 +102,8 @@ static Class g_BFTaskClass;
|
|||||||
appLinks[url] = self.cachedFBSDKAppLinks[url];
|
appLinks[url] = self.cachedFBSDKAppLinks[url];
|
||||||
} else {
|
} else {
|
||||||
[toFind addObject:url];
|
[toFind addObject:url];
|
||||||
#pragma clang diagnostic push
|
NSCharacterSet *urlAllowedSet = [NSCharacterSet URLQueryAllowedCharacterSet];
|
||||||
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
|
NSString *toFindString = [url.absoluteString stringByAddingPercentEncodingWithAllowedCharacters:urlAllowedSet];
|
||||||
NSString *toFindString = [url.absoluteString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
|
|
||||||
#pragma clang diagnostic pop
|
|
||||||
if (toFindString) {
|
if (toFindString) {
|
||||||
[toFindStrings addObject:toFindString];
|
[toFindStrings addObject:toFindString];
|
||||||
}
|
}
|
||||||
@ -147,25 +145,25 @@ static Class g_BFTaskClass;
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
for (NSURL *url in toFind) {
|
for (NSURL *url in toFind) {
|
||||||
id nestedObject = [[result objectForKey:url.absoluteString] objectForKey:kAppLinksKey];
|
id nestedObject = result[url.absoluteString][kAppLinksKey];
|
||||||
NSMutableArray *rawTargets = [NSMutableArray array];
|
NSMutableArray *rawTargets = [NSMutableArray array];
|
||||||
if (idiomSpecificField) {
|
if (idiomSpecificField) {
|
||||||
[rawTargets addObjectsFromArray:[nestedObject objectForKey:idiomSpecificField]];
|
[rawTargets addObjectsFromArray:nestedObject[idiomSpecificField]];
|
||||||
}
|
}
|
||||||
[rawTargets addObjectsFromArray:[nestedObject objectForKey:kIOSKey]];
|
[rawTargets addObjectsFromArray:nestedObject[kIOSKey]];
|
||||||
|
|
||||||
NSMutableArray<FBSDKAppLinkTarget *> *targets = [NSMutableArray arrayWithCapacity:rawTargets.count];
|
NSMutableArray<FBSDKAppLinkTarget *> *targets = [NSMutableArray arrayWithCapacity:rawTargets.count];
|
||||||
for (id rawTarget in rawTargets) {
|
for (id rawTarget in rawTargets) {
|
||||||
[targets addObject:[FBSDKAppLinkTarget appLinkTargetWithURL:[NSURL URLWithString:[rawTarget objectForKey:kURLKey]]
|
[targets addObject:[FBSDKAppLinkTarget appLinkTargetWithURL:[NSURL URLWithString:rawTarget[kURLKey]]
|
||||||
appStoreId:[rawTarget objectForKey:kIOSAppStoreIdKey]
|
appStoreId:rawTarget[kIOSAppStoreIdKey]
|
||||||
appName:[rawTarget objectForKey:kIOSAppNameKey]]];
|
appName:rawTarget[kIOSAppNameKey]]];
|
||||||
}
|
}
|
||||||
|
|
||||||
id webTarget = [nestedObject objectForKey:kWebKey];
|
id webTarget = nestedObject[kWebKey];
|
||||||
NSString *webFallbackString = [webTarget objectForKey:kURLKey];
|
NSString *webFallbackString = webTarget[kURLKey];
|
||||||
NSURL *fallbackUrl = webFallbackString ? [NSURL URLWithString:webFallbackString] : url;
|
NSURL *fallbackUrl = webFallbackString ? [NSURL URLWithString:webFallbackString] : url;
|
||||||
|
|
||||||
NSNumber *shouldFallback = [webTarget objectForKey:kShouldFallbackKey];
|
NSNumber *shouldFallback = webTarget[kShouldFallbackKey];
|
||||||
if (shouldFallback && !shouldFallback.boolValue) {
|
if (shouldFallback && !shouldFallback.boolValue) {
|
||||||
fallbackUrl = nil;
|
fallbackUrl = nil;
|
||||||
}
|
}
|
||||||
@ -198,10 +196,8 @@ static Class g_BFTaskClass;
|
|||||||
appLinks[url] = self.cachedBFAppLinks[url];
|
appLinks[url] = self.cachedBFAppLinks[url];
|
||||||
} else {
|
} else {
|
||||||
[toFind addObject:url];
|
[toFind addObject:url];
|
||||||
#pragma clang diagnostic push
|
NSCharacterSet *urlAllowedSet = [NSCharacterSet URLQueryAllowedCharacterSet];
|
||||||
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
|
[toFindStrings addObject:[url.absoluteString stringByAddingPercentEncodingWithAllowedCharacters:urlAllowedSet]];
|
||||||
[toFindStrings addObject:[url.absoluteString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
|
|
||||||
#pragma clang diagnostic pop
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -240,25 +236,25 @@ static Class g_BFTaskClass;
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
for (NSURL *url in toFind) {
|
for (NSURL *url in toFind) {
|
||||||
id nestedObject = [[result objectForKey:url.absoluteString] objectForKey:kAppLinksKey];
|
id nestedObject = result[url.absoluteString][kAppLinksKey];
|
||||||
NSMutableArray *rawTargets = [NSMutableArray array];
|
NSMutableArray *rawTargets = [NSMutableArray array];
|
||||||
if (idiomSpecificField) {
|
if (idiomSpecificField) {
|
||||||
[rawTargets addObjectsFromArray:[nestedObject objectForKey:idiomSpecificField]];
|
[rawTargets addObjectsFromArray:nestedObject[idiomSpecificField]];
|
||||||
}
|
}
|
||||||
[rawTargets addObjectsFromArray:[nestedObject objectForKey:kIOSKey]];
|
[rawTargets addObjectsFromArray:nestedObject[kIOSKey]];
|
||||||
|
|
||||||
NSMutableArray<BFAppLinkTarget *> *targets = [NSMutableArray arrayWithCapacity:rawTargets.count];
|
NSMutableArray<BFAppLinkTarget *> *targets = [NSMutableArray arrayWithCapacity:rawTargets.count];
|
||||||
for (id rawTarget in rawTargets) {
|
for (id rawTarget in rawTargets) {
|
||||||
[targets addObject:[g_BFAppLinkTargetClass appLinkTargetWithURL:[NSURL URLWithString:[rawTarget objectForKey:kURLKey]]
|
[targets addObject:[g_BFAppLinkTargetClass appLinkTargetWithURL:[NSURL URLWithString:rawTarget[kURLKey]]
|
||||||
appStoreId:[rawTarget objectForKey:kIOSAppStoreIdKey]
|
appStoreId:rawTarget[kIOSAppStoreIdKey]
|
||||||
appName:[rawTarget objectForKey:kIOSAppNameKey]]];
|
appName:rawTarget[kIOSAppNameKey]]];
|
||||||
}
|
}
|
||||||
|
|
||||||
id webTarget = [nestedObject objectForKey:kWebKey];
|
id webTarget = nestedObject[kWebKey];
|
||||||
NSString *webFallbackString = [webTarget objectForKey:kURLKey];
|
NSString *webFallbackString = webTarget[kURLKey];
|
||||||
NSURL *fallbackUrl = webFallbackString ? [NSURL URLWithString:webFallbackString] : url;
|
NSURL *fallbackUrl = webFallbackString ? [NSURL URLWithString:webFallbackString] : url;
|
||||||
|
|
||||||
NSNumber *shouldFallback = [webTarget objectForKey:kShouldFallbackKey];
|
NSNumber *shouldFallback = webTarget[kShouldFallbackKey];
|
||||||
if (shouldFallback && !shouldFallback.boolValue) {
|
if (shouldFallback && !shouldFallback.boolValue) {
|
||||||
fallbackUrl = nil;
|
fallbackUrl = nil;
|
||||||
}
|
}
|
||||||
@ -288,7 +284,7 @@ static Class g_BFTaskClass;
|
|||||||
}
|
}
|
||||||
#pragma clang diagnostic pop
|
#pragma clang diagnostic pop
|
||||||
|
|
||||||
+ (id)resolver
|
+ (instancetype)resolver
|
||||||
{
|
{
|
||||||
return [[self alloc] initWithUserInterfaceIdiom:UI_USER_INTERFACE_IDIOM()];
|
return [[self alloc] initWithUserInterfaceIdiom:UI_USER_INTERFACE_IDIOM()];
|
||||||
}
|
}
|
||||||
|
|||||||
@ -130,7 +130,7 @@ static const CFTimeInterval kFBSDKViewAnimationDuration = 0.25f;
|
|||||||
#pragma mark - Private
|
#pragma mark - Private
|
||||||
|
|
||||||
- (void)statusBarFrameWillChange:(NSNotification *)notification {
|
- (void)statusBarFrameWillChange:(NSNotification *)notification {
|
||||||
NSValue *rectValue = [[notification userInfo] valueForKey:UIApplicationStatusBarFrameUserInfoKey];
|
NSValue *rectValue = [notification.userInfo valueForKey:UIApplicationStatusBarFrameUserInfoKey];
|
||||||
CGRect newFrame;
|
CGRect newFrame;
|
||||||
[rectValue getValue:&newFrame];
|
[rectValue getValue:&newFrame];
|
||||||
|
|
||||||
@ -145,7 +145,7 @@ static const CFTimeInterval kFBSDKViewAnimationDuration = 0.25f;
|
|||||||
}
|
}
|
||||||
|
|
||||||
- (void)statusBarFrameDidChange:(NSNotification *)notification {
|
- (void)statusBarFrameDidChange:(NSNotification *)notification {
|
||||||
NSValue *rectValue = [[notification userInfo] valueForKey:UIApplicationStatusBarFrameUserInfoKey];
|
NSValue *rectValue = [notification.userInfo valueForKey:UIApplicationStatusBarFrameUserInfoKey];
|
||||||
CGRect newFrame;
|
CGRect newFrame;
|
||||||
[rectValue getValue:&newFrame];
|
[rectValue getValue:&newFrame];
|
||||||
|
|
||||||
|
|||||||
@ -89,11 +89,7 @@ static const CGFloat FBSDKCloseButtonHeight = 12.0;
|
|||||||
_labelView.font = [UIFont systemFontOfSize:[UIFont smallSystemFontSize]];
|
_labelView.font = [UIFont systemFontOfSize:[UIFont smallSystemFontSize]];
|
||||||
_labelView.textColor = [UIColor whiteColor];
|
_labelView.textColor = [UIColor whiteColor];
|
||||||
_labelView.backgroundColor = [UIColor clearColor];
|
_labelView.backgroundColor = [UIColor clearColor];
|
||||||
#ifdef __IPHONE_6_0
|
|
||||||
_labelView.textAlignment = NSTextAlignmentCenter;
|
_labelView.textAlignment = NSTextAlignmentCenter;
|
||||||
#else
|
|
||||||
_labelView.textAlignment = UITextAlignmentCenter;
|
|
||||||
#endif
|
|
||||||
_labelView.clipsToBounds = YES;
|
_labelView.clipsToBounds = YES;
|
||||||
[self updateLabelText];
|
[self updateLabelText];
|
||||||
[self addSubview:_labelView];
|
[self addSubview:_labelView];
|
||||||
@ -156,7 +152,7 @@ static const CGFloat FBSDKCloseButtonHeight = 12.0;
|
|||||||
include = YES;
|
include = YES;
|
||||||
break;
|
break;
|
||||||
case FBSDKIncludeStatusBarInSizeIOS7AndLater: {
|
case FBSDKIncludeStatusBarInSizeIOS7AndLater: {
|
||||||
float systemVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
|
float systemVersion = [UIDevice currentDevice].systemVersion.floatValue;
|
||||||
include = (systemVersion >= 7.0);
|
include = (systemVersion >= 7.0);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -209,7 +205,7 @@ static const CGFloat FBSDKCloseButtonHeight = 12.0;
|
|||||||
#pragma mark - Private
|
#pragma mark - Private
|
||||||
|
|
||||||
- (void)updateLabelText {
|
- (void)updateLabelText {
|
||||||
NSString *appName = (_refererAppLink && _refererAppLink.targets[0]) ? [_refererAppLink.targets[0] appName] : nil;
|
NSString *appName = (_refererAppLink && _refererAppLink.targets[0]) ? _refererAppLink.targets[0].appName : nil;
|
||||||
_labelView.text = [self localizedLabelForReferer:appName];
|
_labelView.text = [self localizedLabelForReferer:appName];
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -226,8 +222,8 @@ static const CGFloat FBSDKCloseButtonHeight = 12.0;
|
|||||||
|
|
||||||
CGContextRef context = UIGraphicsGetCurrentContext();
|
CGContextRef context = UIGraphicsGetCurrentContext();
|
||||||
|
|
||||||
CGContextSetStrokeColorWithColor(context, [color CGColor]);
|
CGContextSetStrokeColorWithColor(context, color.CGColor);
|
||||||
CGContextSetFillColorWithColor(context, [color CGColor]);
|
CGContextSetFillColorWithColor(context, color.CGColor);
|
||||||
|
|
||||||
CGContextSetLineWidth(context, 1.25f);
|
CGContextSetLineWidth(context, 1.25f);
|
||||||
|
|
||||||
@ -269,7 +265,7 @@ static const CGFloat FBSDKCloseButtonHeight = 12.0;
|
|||||||
}
|
}
|
||||||
|
|
||||||
- (void)updateHidden {
|
- (void)updateHidden {
|
||||||
[super setHidden:_explicitlyHidden || _closed || !self.hasRefererData];
|
super.hidden = _explicitlyHidden || _closed || !self.hasRefererData;
|
||||||
}
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|||||||
@ -20,9 +20,9 @@
|
|||||||
|
|
||||||
@interface FBSDKAppLinkTarget ()
|
@interface FBSDKAppLinkTarget ()
|
||||||
|
|
||||||
@property (nonatomic, strong, readwrite) NSURL *URL;
|
@property (nonatomic, strong) NSURL *URL;
|
||||||
@property (nonatomic, copy, readwrite) NSString *appStoreId;
|
@property (nonatomic, copy) NSString *appStoreId;
|
||||||
@property (nonatomic, copy, readwrite) NSString *appName;
|
@property (nonatomic, copy) NSString *appName;
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
|
|||||||
@ -66,7 +66,7 @@ typedef void (^FBSDKDeferredAppInviteHandler)(NSURL *url);
|
|||||||
@warning This method is no longer available and will always return NO.
|
@warning This method is no longer available and will always return NO.
|
||||||
*/
|
*/
|
||||||
+ (BOOL)fetchDeferredAppInvite:(FBSDKDeferredAppInviteHandler)handler
|
+ (BOOL)fetchDeferredAppInvite:(FBSDKDeferredAppInviteHandler)handler
|
||||||
__attribute__((deprecated("This method is no longer available.")));;
|
DEPRECATED_MSG_ATTRIBUTE("This method is no longer available.");
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Call this method to fetch promotion code from the url, if it's present. This function
|
Call this method to fetch promotion code from the url, if it's present. This function
|
||||||
|
|||||||
@ -63,10 +63,10 @@ static NSString *const FBSDKDeferredAppLinkEvent = @"DEFERRED_APP_LINK";
|
|||||||
NSString *createTimeUtc = result[@"click_time"];
|
NSString *createTimeUtc = result[@"click_time"];
|
||||||
if (createTimeUtc) {
|
if (createTimeUtc) {
|
||||||
// append/translate the create_time_utc so it can be used by clients
|
// append/translate the create_time_utc so it can be used by clients
|
||||||
NSString *modifiedURLString = [[applinkURL absoluteString]
|
NSString *modifiedURLString = [applinkURL.absoluteString
|
||||||
stringByAppendingFormat:@"%@fb_click_time_utc=%@",
|
stringByAppendingFormat:@"%@fb_click_time_utc=%@",
|
||||||
([applinkURL query]) ? @"&" : @"?" ,
|
(applinkURL.query) ? @"&" : @"?" ,
|
||||||
createTimeUtc ];
|
createTimeUtc];
|
||||||
applinkURL = [NSURL URLWithString:modifiedURLString];
|
applinkURL = [NSURL URLWithString:modifiedURLString];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -88,12 +88,12 @@ static NSString *const FBSDKDeferredAppLinkEvent = @"DEFERRED_APP_LINK";
|
|||||||
+ (NSString*)appInvitePromotionCodeFromURL:(NSURL*)url;
|
+ (NSString*)appInvitePromotionCodeFromURL:(NSURL*)url;
|
||||||
{
|
{
|
||||||
BFURL *parsedUrl = [[FBSDKInternalUtility resolveBoltsClassWithName:@"BFURL"] URLWithURL:url];
|
BFURL *parsedUrl = [[FBSDKInternalUtility resolveBoltsClassWithName:@"BFURL"] URLWithURL:url];
|
||||||
NSDictionary *extras = [parsedUrl appLinkExtras];
|
NSDictionary *extras = parsedUrl.appLinkExtras;
|
||||||
if (extras) {
|
if (extras) {
|
||||||
NSString *deeplinkContextString = extras[@"deeplink_context"];
|
NSString *deeplinkContextString = extras[@"deeplink_context"];
|
||||||
|
|
||||||
// Parse deeplinkContext and extract promo code
|
// Parse deeplinkContext and extract promo code
|
||||||
if ([deeplinkContextString length] > 0) {
|
if (deeplinkContextString.length > 0) {
|
||||||
NSError *error = nil;
|
NSError *error = nil;
|
||||||
NSDictionary *deeplinkContextData = [FBSDKInternalUtility objectForJSONString:deeplinkContextString error:&error];
|
NSDictionary *deeplinkContextData = [FBSDKInternalUtility objectForJSONString:deeplinkContextString error:&error];
|
||||||
if (!error && [deeplinkContextData isKindOfClass:[NSDictionary class]]) {
|
if (!error && [deeplinkContextData isKindOfClass:[NSDictionary class]]) {
|
||||||
|
|||||||
@ -29,6 +29,7 @@
|
|||||||
#import "FBSDKConstants.h"
|
#import "FBSDKConstants.h"
|
||||||
#import "FBSDKDynamicFrameworkLoader.h"
|
#import "FBSDKDynamicFrameworkLoader.h"
|
||||||
#import "FBSDKError.h"
|
#import "FBSDKError.h"
|
||||||
|
#import "FBSDKGateKeeperManager.h"
|
||||||
#import "FBSDKInternalUtility.h"
|
#import "FBSDKInternalUtility.h"
|
||||||
#import "FBSDKLogger.h"
|
#import "FBSDKLogger.h"
|
||||||
#import "FBSDKServerConfiguration.h"
|
#import "FBSDKServerConfiguration.h"
|
||||||
@ -45,8 +46,16 @@
|
|||||||
#import "FBSDKProfile+Internal.h"
|
#import "FBSDKProfile+Internal.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0
|
||||||
|
|
||||||
|
NSNotificationName const FBSDKApplicationDidBecomeActiveNotification = @"com.facebook.sdk.FBSDKApplicationDidBecomeActiveNotification";
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
NSString *const FBSDKApplicationDidBecomeActiveNotification = @"com.facebook.sdk.FBSDKApplicationDidBecomeActiveNotification";
|
NSString *const FBSDKApplicationDidBecomeActiveNotification = @"com.facebook.sdk.FBSDKApplicationDidBecomeActiveNotification";
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
static NSString *const FBSDKAppLinkInboundEvent = @"fb_al_inbound";
|
static NSString *const FBSDKAppLinkInboundEvent = @"fb_al_inbound";
|
||||||
|
|
||||||
@implementation FBSDKApplicationDelegate
|
@implementation FBSDKApplicationDelegate
|
||||||
@ -95,7 +104,6 @@ static NSString *const FBSDKAppLinkInboundEvent = @"fb_al_inbound";
|
|||||||
[FBSDKTimeSpentData registerAutoResetSourceApplication];
|
[FBSDKTimeSpentData registerAutoResetSourceApplication];
|
||||||
|
|
||||||
[FBSDKInternalUtility validateFacebookReservedURLSchemes];
|
[FBSDKInternalUtility validateFacebookReservedURLSchemes];
|
||||||
|
|
||||||
// Remove the observer
|
// Remove the observer
|
||||||
[[NSNotificationCenter defaultCenter] removeObserver:self];
|
[[NSNotificationCenter defaultCenter] removeObserver:self];
|
||||||
}
|
}
|
||||||
@ -141,10 +149,14 @@ static NSString *const FBSDKAppLinkInboundEvent = @"fb_al_inbound";
|
|||||||
openURL:(NSURL *)url
|
openURL:(NSURL *)url
|
||||||
options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options
|
options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options
|
||||||
{
|
{
|
||||||
return [self application:application
|
if (@available(iOS 9.0, *)) {
|
||||||
openURL:url
|
return [self application:application
|
||||||
sourceApplication:options[UIApplicationOpenURLOptionsSourceApplicationKey]
|
openURL:url
|
||||||
annotation:options[UIApplicationOpenURLOptionsAnnotationKey]];
|
sourceApplication:options[UIApplicationOpenURLOptionsSourceApplicationKey]
|
||||||
|
annotation:options[UIApplicationOpenURLOptionsAnnotationKey]];
|
||||||
|
}
|
||||||
|
|
||||||
|
return NO;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -208,12 +220,14 @@ static NSString *const FBSDKAppLinkInboundEvent = @"fb_al_inbound";
|
|||||||
}
|
}
|
||||||
|
|
||||||
_isAppLaunched = YES;
|
_isAppLaunched = YES;
|
||||||
FBSDKAccessToken *cachedToken = [[FBSDKSettings accessTokenCache] fetchAccessToken];
|
FBSDKAccessToken *cachedToken = [FBSDKSettings accessTokenCache].accessToken;
|
||||||
[FBSDKAccessToken setCurrentAccessToken:cachedToken];
|
[FBSDKAccessToken setCurrentAccessToken:cachedToken];
|
||||||
// fetch app settings
|
// fetch app settings
|
||||||
[FBSDKServerConfigurationManager loadServerConfigurationWithCompletionBlock:NULL];
|
[FBSDKServerConfigurationManager loadServerConfigurationWithCompletionBlock:NULL];
|
||||||
|
// fetch gate keepers
|
||||||
|
[FBSDKGateKeeperManager loadGateKeepers];
|
||||||
|
|
||||||
if ([[FBSDKSettings autoLogAppEventsEnabled] boolValue]) {
|
if ([FBSDKSettings autoLogAppEventsEnabled].boolValue) {
|
||||||
[self _logSDKInitialize];
|
[self _logSDKInitialize];
|
||||||
}
|
}
|
||||||
#if !TARGET_OS_TV
|
#if !TARGET_OS_TV
|
||||||
@ -249,7 +263,7 @@ static NSString *const FBSDKAppLinkInboundEvent = @"fb_al_inbound";
|
|||||||
- (void)applicationDidBecomeActive:(NSNotification *)notification
|
- (void)applicationDidBecomeActive:(NSNotification *)notification
|
||||||
{
|
{
|
||||||
// Auto log basic events in case autoLogAppEventsEnabled is set
|
// Auto log basic events in case autoLogAppEventsEnabled is set
|
||||||
if ([[FBSDKSettings autoLogAppEventsEnabled] boolValue]) {
|
if ([FBSDKSettings autoLogAppEventsEnabled].boolValue) {
|
||||||
[FBSDKAppEvents activateApp];
|
[FBSDKAppEvents activateApp];
|
||||||
}
|
}
|
||||||
// _expectingBackground can be YES if the caller started doing work (like login)
|
// _expectingBackground can be YES if the caller started doing work (like login)
|
||||||
@ -267,7 +281,7 @@ static NSString *const FBSDKAppLinkInboundEvent = @"fb_al_inbound";
|
|||||||
if (notExpectingBackground) {
|
if (notExpectingBackground) {
|
||||||
_active = YES;
|
_active = YES;
|
||||||
#if !TARGET_OS_TV
|
#if !TARGET_OS_TV
|
||||||
[_pendingURLOpen applicationDidBecomeActive:[notification object]];
|
[_pendingURLOpen applicationDidBecomeActive:notification.object];
|
||||||
[self _cancelBridgeRequest];
|
[self _cancelBridgeRequest];
|
||||||
#endif
|
#endif
|
||||||
[[NSNotificationCenter defaultCenter] postNotificationName:FBSDKApplicationDidBecomeActiveNotification object:self];
|
[[NSNotificationCenter defaultCenter] postNotificationName:FBSDKApplicationDidBecomeActiveNotification object:self];
|
||||||
@ -288,9 +302,11 @@ static NSString *const FBSDKAppLinkInboundEvent = @"fb_al_inbound";
|
|||||||
// Dispatch openURL calls to prevent hangs if we're inside the current app delegate's openURL flow already
|
// Dispatch openURL calls to prevent hangs if we're inside the current app delegate's openURL flow already
|
||||||
NSOperatingSystemVersion iOS10Version = { .majorVersion = 10, .minorVersion = 0, .patchVersion = 0 };
|
NSOperatingSystemVersion iOS10Version = { .majorVersion = 10, .minorVersion = 0, .patchVersion = 0 };
|
||||||
if ([FBSDKInternalUtility isOSRunTimeVersionAtLeast:iOS10Version]) {
|
if ([FBSDKInternalUtility isOSRunTimeVersionAtLeast:iOS10Version]) {
|
||||||
[[UIApplication sharedApplication] openURL:url options:@{} completionHandler:^(BOOL success) {
|
if (@available(iOS 10.0, *)) {
|
||||||
handler(success, nil);
|
[[UIApplication sharedApplication] openURL:url options:@{} completionHandler:^(BOOL success) {
|
||||||
}];
|
handler(success, nil);
|
||||||
|
}];
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
BOOL opened = [[UIApplication sharedApplication] openURL:url];
|
BOOL opened = [[UIApplication sharedApplication] openURL:url];
|
||||||
|
|
||||||
@ -332,10 +348,10 @@ static NSString *const FBSDKAppLinkInboundEvent = @"fb_al_inbound";
|
|||||||
self->_pendingRequestCompletionBlock = nil;
|
self->_pendingRequestCompletionBlock = nil;
|
||||||
NSError *openedURLError;
|
NSError *openedURLError;
|
||||||
if ([request.scheme hasPrefix:@"http"]) {
|
if ([request.scheme hasPrefix:@"http"]) {
|
||||||
openedURLError = [FBSDKError errorWithCode:FBSDKBrowserUnavailableErrorCode
|
openedURLError = [NSError fbErrorWithCode:FBSDKErrorBrowserUnavailable
|
||||||
message:@"the app switch failed because the browser is unavailable"];
|
message:@"the app switch failed because the browser is unavailable"];
|
||||||
} else {
|
} else {
|
||||||
openedURLError = [FBSDKError errorWithCode:FBSDKAppVersionUnsupportedErrorCode
|
openedURLError = [NSError fbErrorWithCode:FBSDKErrorAppVersionUnsupported
|
||||||
message:@"the app switch failed because the destination app is out of date"];
|
message:@"the app switch failed because the destination app is out of date"];
|
||||||
}
|
}
|
||||||
FBSDKBridgeAPIResponse *response = [FBSDKBridgeAPIResponse bridgeAPIResponseWithRequest:request
|
FBSDKBridgeAPIResponse *response = [FBSDKBridgeAPIResponse bridgeAPIResponseWithRequest:request
|
||||||
@ -409,7 +425,7 @@ static NSString *const FBSDKAppLinkInboundEvent = @"fb_al_inbound";
|
|||||||
|
|
||||||
NSURLComponents *components = [NSURLComponents componentsWithURL:url resolvingAgainstBaseURL:NO];
|
NSURLComponents *components = [NSURLComponents componentsWithURL:url resolvingAgainstBaseURL:NO];
|
||||||
NSURLQueryItem *sfvcQueryItem = [[NSURLQueryItem alloc] initWithName:@"sfvc" value:@"1"];
|
NSURLQueryItem *sfvcQueryItem = [[NSURLQueryItem alloc] initWithName:@"sfvc" value:@"1"];
|
||||||
[components setQueryItems:[components.queryItems arrayByAddingObject:sfvcQueryItem]];
|
components.queryItems = [components.queryItems arrayByAddingObject:sfvcQueryItem];
|
||||||
url = components.URL;
|
url = components.URL;
|
||||||
FBSDKContainerViewController *container = [[FBSDKContainerViewController alloc] init];
|
FBSDKContainerViewController *container = [[FBSDKContainerViewController alloc] init];
|
||||||
container.delegate = self;
|
container.delegate = self;
|
||||||
@ -499,8 +515,8 @@ static NSString *const FBSDKAppLinkInboundEvent = @"fb_al_inbound";
|
|||||||
NSURL *targetURL = [targetURLString isKindOfClass:[NSString class]] ? [NSURL URLWithString:targetURLString] : nil;
|
NSURL *targetURL = [targetURLString isKindOfClass:[NSString class]] ? [NSURL URLWithString:targetURLString] : nil;
|
||||||
|
|
||||||
NSMutableDictionary *logData = [[NSMutableDictionary alloc] init];
|
NSMutableDictionary *logData = [[NSMutableDictionary alloc] init];
|
||||||
[FBSDKInternalUtility dictionary:logData setObject:[targetURL absoluteString] forKey:@"targetURL"];
|
[FBSDKInternalUtility dictionary:logData setObject:targetURL.absoluteString forKey:@"targetURL"];
|
||||||
[FBSDKInternalUtility dictionary:logData setObject:[targetURL host] forKey:@"targetURLHost"];
|
[FBSDKInternalUtility dictionary:logData setObject:targetURL.host forKey:@"targetURLHost"];
|
||||||
|
|
||||||
NSDictionary *refererData = applinkData[@"referer_data"];
|
NSDictionary *refererData = applinkData[@"referer_data"];
|
||||||
if (refererData) {
|
if (refererData) {
|
||||||
@ -508,8 +524,8 @@ static NSString *const FBSDKAppLinkInboundEvent = @"fb_al_inbound";
|
|||||||
[FBSDKInternalUtility dictionary:logData setObject:refererData[@"url"] forKey:@"referralURL"];
|
[FBSDKInternalUtility dictionary:logData setObject:refererData[@"url"] forKey:@"referralURL"];
|
||||||
[FBSDKInternalUtility dictionary:logData setObject:refererData[@"app_name"] forKey:@"referralAppName"];
|
[FBSDKInternalUtility dictionary:logData setObject:refererData[@"app_name"] forKey:@"referralAppName"];
|
||||||
}
|
}
|
||||||
[FBSDKInternalUtility dictionary:logData setObject:[url absoluteString] forKey:@"inputURL"];
|
[FBSDKInternalUtility dictionary:logData setObject:url.absoluteString forKey:@"inputURL"];
|
||||||
[FBSDKInternalUtility dictionary:logData setObject:[url scheme] forKey:@"inputURLScheme"];
|
[FBSDKInternalUtility dictionary:logData setObject:url.scheme forKey:@"inputURLScheme"];
|
||||||
|
|
||||||
[FBSDKAppEvents logImplicitEvent:FBSDKAppLinkInboundEvent
|
[FBSDKAppEvents logImplicitEvent:FBSDKAppLinkInboundEvent
|
||||||
valueToSum:nil
|
valueToSum:nil
|
||||||
@ -520,27 +536,27 @@ static NSString *const FBSDKAppLinkInboundEvent = @"fb_al_inbound";
|
|||||||
- (void)_logSDKInitialize
|
- (void)_logSDKInitialize
|
||||||
{
|
{
|
||||||
NSMutableDictionary *params = [NSMutableDictionary new];
|
NSMutableDictionary *params = [NSMutableDictionary new];
|
||||||
[params setObject:@1 forKey:@"core_lib_included"];
|
params[@"core_lib_included"] = @1;
|
||||||
if (objc_lookUpClass("FBSDKShareDialog") != nil) {
|
if (objc_lookUpClass("FBSDKShareDialog") != nil) {
|
||||||
[params setObject:@1 forKey:@"share_lib_included"];
|
params[@"share_lib_included"] = @1;
|
||||||
}
|
}
|
||||||
if (objc_lookUpClass("FBSDKLoginManager") != nil) {
|
if (objc_lookUpClass("FBSDKLoginManager") != nil) {
|
||||||
[params setObject:@1 forKey:@"login_lib_included"];
|
params[@"login_lib_included"] = @1;
|
||||||
}
|
}
|
||||||
if (objc_lookUpClass("FBSDKPlacesManager") != nil) {
|
if (objc_lookUpClass("FBSDKPlacesManager") != nil) {
|
||||||
[params setObject:@1 forKey:@"places_lib_included"];
|
params[@"places_lib_included"] = @1;
|
||||||
}
|
}
|
||||||
if (objc_lookUpClass("FBSDKMessengerButton") != nil) {
|
if (objc_lookUpClass("FBSDKMessengerButton") != nil) {
|
||||||
[params setObject:@1 forKey:@"messenger_lib_included"];
|
params[@"messenger_lib_included"] = @1;
|
||||||
}
|
}
|
||||||
if (objc_lookUpClass("FBSDKMessengerButton") != nil) {
|
if (objc_lookUpClass("FBSDKMessengerButton") != nil) {
|
||||||
[params setObject:@1 forKey:@"messenger_lib_included"];
|
params[@"messenger_lib_included"] = @1;
|
||||||
}
|
}
|
||||||
if (objc_lookUpClass("FBSDKTVInterfaceFactory.m") != nil) {
|
if (objc_lookUpClass("FBSDKTVInterfaceFactory.m") != nil) {
|
||||||
[params setObject:@1 forKey:@"tv_lib_included"];
|
params[@"tv_lib_included"] = @1;
|
||||||
}
|
}
|
||||||
if (objc_lookUpClass("FBSDKAutoLog") != nil) {
|
if (objc_lookUpClass("FBSDKAutoLog") != nil) {
|
||||||
[params setObject:@1 forKey:@"marketing_lib_included"];
|
params[@"marketing_lib_included"] = @1;
|
||||||
}
|
}
|
||||||
[FBSDKAppEvents logEvent:@"fb_sdk_initialize" parameters:params];
|
[FBSDKAppEvents logEvent:@"fb_sdk_initialize" parameters:params];
|
||||||
}
|
}
|
||||||
|
|||||||
@ -76,7 +76,7 @@
|
|||||||
|
|
||||||
- (CGRect)imageRectForContentRect:(CGRect)contentRect
|
- (CGRect)imageRectForContentRect:(CGRect)contentRect
|
||||||
{
|
{
|
||||||
if ([self isHidden] || CGRectIsEmpty(self.bounds)) {
|
if (self.hidden || CGRectIsEmpty(self.bounds)) {
|
||||||
return CGRectZero;
|
return CGRectZero;
|
||||||
}
|
}
|
||||||
CGRect imageRect = UIEdgeInsetsInsetRect(contentRect, self.imageEdgeInsets);
|
CGRect imageRect = UIEdgeInsetsInsetRect(contentRect, self.imageEdgeInsets);
|
||||||
@ -101,9 +101,9 @@
|
|||||||
{
|
{
|
||||||
// automatic impression tracking if the button conforms to FBSDKButtonImpressionTracking
|
// automatic impression tracking if the button conforms to FBSDKButtonImpressionTracking
|
||||||
if ([self conformsToProtocol:@protocol(FBSDKButtonImpressionTracking)]) {
|
if ([self conformsToProtocol:@protocol(FBSDKButtonImpressionTracking)]) {
|
||||||
NSString *eventName = [(id<FBSDKButtonImpressionTracking>)self impressionTrackingEventName];
|
NSString *eventName = ((id<FBSDKButtonImpressionTracking>)self).impressionTrackingEventName;
|
||||||
NSString *identifier = [(id<FBSDKButtonImpressionTracking>)self impressionTrackingIdentifier];
|
NSString *identifier = ((id<FBSDKButtonImpressionTracking>)self).impressionTrackingIdentifier;
|
||||||
NSDictionary *parameters = [(id<FBSDKButtonImpressionTracking>)self analyticsParameters];
|
NSDictionary<NSString *, id> *parameters = ((id<FBSDKButtonImpressionTracking>)self).analyticsParameters;
|
||||||
if (eventName && identifier) {
|
if (eventName && identifier) {
|
||||||
FBSDKViewImpressionTracker *impressionTracker = [FBSDKViewImpressionTracker impressionTrackerWithEventName:eventName];
|
FBSDKViewImpressionTracker *impressionTracker = [FBSDKViewImpressionTracker impressionTrackerWithEventName:eventName];
|
||||||
[impressionTracker logImpressionWithIdentifier:identifier parameters:parameters];
|
[impressionTracker logImpressionWithIdentifier:identifier parameters:parameters];
|
||||||
@ -114,7 +114,7 @@
|
|||||||
|
|
||||||
- (CGSize)sizeThatFits:(CGSize)size
|
- (CGSize)sizeThatFits:(CGSize)size
|
||||||
{
|
{
|
||||||
if ([self isHidden]) {
|
if (self.hidden) {
|
||||||
return CGSizeZero;
|
return CGSizeZero;
|
||||||
}
|
}
|
||||||
CGSize normalSize = [self sizeThatFits:size title:[self titleForState:UIControlStateNormal]];
|
CGSize normalSize = [self sizeThatFits:size title:[self titleForState:UIControlStateNormal]];
|
||||||
@ -131,7 +131,7 @@
|
|||||||
|
|
||||||
- (CGRect)titleRectForContentRect:(CGRect)contentRect
|
- (CGRect)titleRectForContentRect:(CGRect)contentRect
|
||||||
{
|
{
|
||||||
if ([self isHidden] || CGRectIsEmpty(self.bounds)) {
|
if (self.hidden || CGRectIsEmpty(self.bounds)) {
|
||||||
return CGRectZero;
|
return CGRectZero;
|
||||||
}
|
}
|
||||||
CGRect imageRect = [self imageRectForContentRect:contentRect];
|
CGRect imageRect = [self imageRectForContentRect:contentRect];
|
||||||
@ -174,9 +174,9 @@
|
|||||||
|
|
||||||
- (void)checkImplicitlyDisabled
|
- (void)checkImplicitlyDisabled
|
||||||
{
|
{
|
||||||
BOOL enabled = !_isExplicitlyDisabled && ![self isImplicitlyDisabled];
|
BOOL enabled = !_isExplicitlyDisabled && !self.implicitlyDisabled;
|
||||||
BOOL currentEnabled = [self isEnabled];
|
BOOL currentEnabled = self.enabled;
|
||||||
[super setEnabled:enabled];
|
super.enabled = enabled;
|
||||||
if (currentEnabled != enabled) {
|
if (currentEnabled != enabled) {
|
||||||
[self invalidateIntrinsicContentSize];
|
[self invalidateIntrinsicContentSize];
|
||||||
[self setNeedsLayout];
|
[self setNeedsLayout];
|
||||||
|
|||||||
@ -18,195 +18,300 @@
|
|||||||
|
|
||||||
#import <Foundation/Foundation.h>
|
#import <Foundation/Foundation.h>
|
||||||
|
|
||||||
#import <FBSDKCoreKit/FBSDKMacros.h>
|
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0
|
||||||
|
|
||||||
/**
|
/**
|
||||||
The error domain for all errors from FBSDKCoreKit.
|
The error domain for all errors from FBSDKCoreKit.
|
||||||
|
|
||||||
Error codes from the SDK in the range 0-99 are reserved for this domain.
|
Error codes from the SDK in the range 0-99 are reserved for this domain.
|
||||||
*/
|
*/
|
||||||
FBSDK_EXTERN NSString *const FBSDKErrorDomain;
|
FOUNDATION_EXPORT NSErrorDomain const FBSDKErrorDomain;
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
/**
|
/**
|
||||||
NS_ENUM(NSInteger, FBSDKErrorCode)
|
The error domain for all errors from FBSDKCoreKit.
|
||||||
Error codes for FBSDKErrorDomain.
|
|
||||||
|
Error codes from the SDK in the range 0-99 are reserved for this domain.
|
||||||
*/
|
*/
|
||||||
typedef NS_ENUM(NSInteger, FBSDKErrorCode)
|
FOUNDATION_EXPORT NSString *const FBSDKErrorDomain;
|
||||||
{
|
|
||||||
/**
|
|
||||||
Reserved.
|
|
||||||
*/
|
|
||||||
FBSDKReservedErrorCode = 0,
|
|
||||||
|
|
||||||
/**
|
#endif
|
||||||
The error code for errors from invalid encryption on incoming encryption URLs.
|
|
||||||
*/
|
|
||||||
FBSDKEncryptionErrorCode,
|
|
||||||
|
|
||||||
/**
|
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_11_0
|
||||||
The error code for errors from invalid arguments to SDK methods.
|
|
||||||
*/
|
|
||||||
FBSDKInvalidArgumentErrorCode,
|
|
||||||
|
|
||||||
/**
|
|
||||||
The error code for unknown errors.
|
|
||||||
*/
|
|
||||||
FBSDKUnknownErrorCode,
|
|
||||||
|
|
||||||
/**
|
|
||||||
A request failed due to a network error. Use NSUnderlyingErrorKey to retrieve
|
|
||||||
the error object from the NSURLConnection for more information.
|
|
||||||
*/
|
|
||||||
FBSDKNetworkErrorCode,
|
|
||||||
|
|
||||||
/**
|
|
||||||
The error code for errors encountered during an App Events flush.
|
|
||||||
*/
|
|
||||||
FBSDKAppEventsFlushErrorCode,
|
|
||||||
|
|
||||||
/**
|
|
||||||
An endpoint that returns a binary response was used with FBSDKGraphRequestConnection.
|
|
||||||
|
|
||||||
Endpoints that return image/jpg, etc. should be accessed using NSURLRequest
|
|
||||||
*/
|
|
||||||
FBSDKGraphRequestNonTextMimeTypeReturnedErrorCode,
|
|
||||||
|
|
||||||
/**
|
|
||||||
The operation failed because the server returned an unexpected response.
|
|
||||||
|
|
||||||
You can get this error if you are not using the most recent SDK, or you are accessing a version of the
|
|
||||||
Graph API incompatible with the current SDK.
|
|
||||||
*/
|
|
||||||
FBSDKGraphRequestProtocolMismatchErrorCode,
|
|
||||||
|
|
||||||
/**
|
|
||||||
The Graph API returned an error.
|
|
||||||
|
|
||||||
See below for useful userInfo keys (beginning with FBSDKGraphRequestError*)
|
|
||||||
*/
|
|
||||||
FBSDKGraphRequestGraphAPIErrorCode,
|
|
||||||
|
|
||||||
/**
|
|
||||||
The specified dialog configuration is not available.
|
|
||||||
|
|
||||||
This error may signify that the configuration for the dialogs has not yet been downloaded from the server
|
|
||||||
or that the dialog is unavailable. Subsequent attempts to use the dialog may succeed as the configuration is loaded.
|
|
||||||
*/
|
|
||||||
FBSDKDialogUnavailableErrorCode,
|
|
||||||
|
|
||||||
/**
|
|
||||||
Indicates an operation failed because a required access token was not found.
|
|
||||||
*/
|
|
||||||
FBSDKAccessTokenRequiredErrorCode,
|
|
||||||
|
|
||||||
/**
|
|
||||||
Indicates an app switch (typically for a dialog) failed because the destination app is out of date.
|
|
||||||
*/
|
|
||||||
FBSDKAppVersionUnsupportedErrorCode,
|
|
||||||
|
|
||||||
/**
|
|
||||||
Indicates an app switch to the browser (typically for a dialog) failed.
|
|
||||||
*/
|
|
||||||
FBSDKBrowserUnavailableErrorCode,
|
|
||||||
|
|
||||||
/**
|
|
||||||
|
|
||||||
@warning use FBSDKBrowserUnavailableErrorCode instead
|
|
||||||
*/
|
|
||||||
FBSDKBrowswerUnavailableErrorCode __attribute__ ((deprecated("use FBSDKBrowserUnavailableErrorCode instead"))) = FBSDKBrowserUnavailableErrorCode,
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
NS_ENUM(NSUInteger, FBSDKGraphRequestErrorCategory)
|
|
||||||
Describes the category of Facebook error. See `FBSDKGraphRequestErrorCategoryKey`.
|
|
||||||
*/
|
|
||||||
typedef NS_ENUM(NSUInteger, FBSDKGraphRequestErrorCategory)
|
|
||||||
{
|
|
||||||
/** The default error category that is not known to be recoverable. Check `FBSDKLocalizedErrorDescriptionKey` for a user facing message. */
|
|
||||||
FBSDKGraphRequestErrorCategoryOther = 0,
|
|
||||||
/** Indicates the error is temporary (such as server throttling). While a recoveryAttempter will be provided with the error instance, the attempt is guaranteed to succeed so you can simply retry the operation if you do not want to present an alert. */
|
|
||||||
FBSDKGraphRequestErrorCategoryTransient = 1,
|
|
||||||
/** Indicates the error can be recovered (such as requiring a login). A recoveryAttempter will be provided with the error instance that can take UI action. */
|
|
||||||
FBSDKGraphRequestErrorCategoryRecoverable = 2
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@methodgroup error userInfo keys
|
@methodgroup error userInfo keys
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
The userInfo key for the invalid collection for errors with FBSDKInvalidArgumentErrorCode.
|
The userInfo key for the invalid collection for errors with FBSDKErrorInvalidArgument.
|
||||||
|
|
||||||
If the invalid argument is a collection, the collection can be found with this key and the individual
|
If the invalid argument is a collection, the collection can be found with this key and the individual
|
||||||
invalid item can be found with FBSDKErrorArgumentValueKey.
|
invalid item can be found with FBSDKErrorArgumentValueKey.
|
||||||
*/
|
*/
|
||||||
FBSDK_EXTERN NSString *const FBSDKErrorArgumentCollectionKey;
|
FOUNDATION_EXPORT NSErrorUserInfoKey const FBSDKErrorArgumentCollectionKey;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
The userInfo key for the invalid argument name for errors with FBSDKInvalidArgumentErrorCode.
|
The userInfo key for the invalid argument name for errors with FBSDKErrorInvalidArgument.
|
||||||
*/
|
*/
|
||||||
FBSDK_EXTERN NSString *const FBSDKErrorArgumentNameKey;
|
FOUNDATION_EXPORT NSErrorUserInfoKey const FBSDKErrorArgumentNameKey;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
The userInfo key for the invalid argument value for errors with FBSDKInvalidArgumentErrorCode.
|
The userInfo key for the invalid argument value for errors with FBSDKErrorInvalidArgument.
|
||||||
*/
|
*/
|
||||||
FBSDK_EXTERN NSString *const FBSDKErrorArgumentValueKey;
|
FOUNDATION_EXPORT NSErrorUserInfoKey const FBSDKErrorArgumentValueKey;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
The userInfo key for the message for developers in NSErrors that originate from the SDK.
|
The userInfo key for the message for developers in NSErrors that originate from the SDK.
|
||||||
|
|
||||||
The developer message will not be localized and is not intended to be presented within the app.
|
The developer message will not be localized and is not intended to be presented within the app.
|
||||||
*/
|
*/
|
||||||
FBSDK_EXTERN NSString *const FBSDKErrorDeveloperMessageKey;
|
FOUNDATION_EXPORT NSErrorUserInfoKey const FBSDKErrorDeveloperMessageKey;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
The userInfo key describing a localized description that can be presented to the user.
|
The userInfo key describing a localized description that can be presented to the user.
|
||||||
*/
|
*/
|
||||||
FBSDK_EXTERN NSString *const FBSDKErrorLocalizedDescriptionKey;
|
FOUNDATION_EXPORT NSErrorUserInfoKey const FBSDKErrorLocalizedDescriptionKey;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
The userInfo key describing a localized title that can be presented to the user, used with `FBSDKLocalizedErrorDescriptionKey`.
|
The userInfo key describing a localized title that can be presented to the user, used with `FBSDKLocalizedErrorDescriptionKey`.
|
||||||
*/
|
*/
|
||||||
FBSDK_EXTERN NSString *const FBSDKErrorLocalizedTitleKey;
|
FOUNDATION_EXPORT NSErrorUserInfoKey const FBSDKErrorLocalizedTitleKey;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@methodgroup FBSDKGraphRequest error userInfo keys
|
@methodgroup FBSDKGraphRequest error userInfo keys
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
The userInfo key describing the error category, for error recovery purposes.
|
The userInfo key describing the error category, for error recovery purposes.
|
||||||
|
|
||||||
See `FBSDKGraphErrorRecoveryProcessor` and `[FBSDKGraphRequest disableErrorRecovery]`.
|
See `FBSDKGraphErrorRecoveryProcessor` and `[FBSDKGraphRequest disableErrorRecovery]`.
|
||||||
*/
|
*/
|
||||||
FBSDK_EXTERN NSString *const FBSDKGraphRequestErrorCategoryKey;
|
FOUNDATION_EXPORT NSErrorUserInfoKey const FBSDKGraphRequestErrorKey;
|
||||||
|
|
||||||
|
FOUNDATION_EXPORT NSErrorUserInfoKey const FBSDKGraphRequestErrorCategoryKey
|
||||||
|
DEPRECATED_MSG_ATTRIBUTE("use FBSDKGraphRequestErrorKey instead");
|
||||||
|
|
||||||
/*
|
/*
|
||||||
The userInfo key for the Graph API error code.
|
The userInfo key for the Graph API error code.
|
||||||
*/
|
*/
|
||||||
FBSDK_EXTERN NSString *const FBSDKGraphRequestErrorGraphErrorCode;
|
FOUNDATION_EXPORT NSErrorUserInfoKey const FBSDKGraphRequestErrorGraphErrorCodeKey;
|
||||||
|
|
||||||
|
FOUNDATION_EXPORT NSErrorUserInfoKey const FBSDKGraphRequestErrorGraphErrorCode
|
||||||
|
DEPRECATED_MSG_ATTRIBUTE("use FBSDKGraphRequestErrorGraphErrorCodeKey instead");
|
||||||
|
|
||||||
/*
|
/*
|
||||||
The userInfo key for the Graph API error subcode.
|
The userInfo key for the Graph API error subcode.
|
||||||
*/
|
*/
|
||||||
FBSDK_EXTERN NSString *const FBSDKGraphRequestErrorGraphErrorSubcode;
|
FOUNDATION_EXPORT NSErrorUserInfoKey const FBSDKGraphRequestErrorGraphErrorSubcodeKey;
|
||||||
|
|
||||||
|
FOUNDATION_EXPORT NSErrorUserInfoKey const FBSDKGraphRequestErrorGraphErrorSubcode
|
||||||
|
DEPRECATED_MSG_ATTRIBUTE("use FBSDKGraphRequestErrorGraphErrorSubcodeKey instead");
|
||||||
|
|
||||||
/*
|
/*
|
||||||
The userInfo key for the HTTP status code.
|
The userInfo key for the HTTP status code.
|
||||||
*/
|
*/
|
||||||
FBSDK_EXTERN NSString *const FBSDKGraphRequestErrorHTTPStatusCodeKey;
|
FOUNDATION_EXPORT NSErrorUserInfoKey const FBSDKGraphRequestErrorHTTPStatusCodeKey;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
The userInfo key for the raw JSON response.
|
The userInfo key for the raw JSON response.
|
||||||
|
*/
|
||||||
|
FOUNDATION_EXPORT NSErrorUserInfoKey const FBSDKGraphRequestErrorParsedJSONResponseKey;
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
/*
|
||||||
|
@methodgroup error userInfo keys
|
||||||
*/
|
*/
|
||||||
FBSDK_EXTERN NSString *const FBSDKGraphRequestErrorParsedJSONResponseKey;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
a formal protocol very similar to the informal protocol NSErrorRecoveryAttempting
|
The userInfo key for the invalid collection for errors with FBSDKErrorInvalidArgument.
|
||||||
|
|
||||||
|
If the invalid argument is a collection, the collection can be found with this key and the individual
|
||||||
|
invalid item can be found with FBSDKErrorArgumentValueKey.
|
||||||
|
*/
|
||||||
|
FOUNDATION_EXPORT NSString *const FBSDKErrorArgumentCollectionKey;
|
||||||
|
|
||||||
|
/**
|
||||||
|
The userInfo key for the invalid argument name for errors with FBSDKErrorInvalidArgument.
|
||||||
|
*/
|
||||||
|
FOUNDATION_EXPORT NSString *const FBSDKErrorArgumentNameKey;
|
||||||
|
|
||||||
|
/**
|
||||||
|
The userInfo key for the invalid argument value for errors with FBSDKErrorInvalidArgument.
|
||||||
|
*/
|
||||||
|
FOUNDATION_EXPORT NSString *const FBSDKErrorArgumentValueKey;
|
||||||
|
|
||||||
|
/**
|
||||||
|
The userInfo key for the message for developers in NSErrors that originate from the SDK.
|
||||||
|
|
||||||
|
The developer message will not be localized and is not intended to be presented within the app.
|
||||||
|
*/
|
||||||
|
FOUNDATION_EXPORT NSString *const FBSDKErrorDeveloperMessageKey;
|
||||||
|
|
||||||
|
/**
|
||||||
|
The userInfo key describing a localized description that can be presented to the user.
|
||||||
|
*/
|
||||||
|
FOUNDATION_EXPORT NSString *const FBSDKErrorLocalizedDescriptionKey;
|
||||||
|
|
||||||
|
/**
|
||||||
|
The userInfo key describing a localized title that can be presented to the user, used with `FBSDKLocalizedErrorDescriptionKey`.
|
||||||
|
*/
|
||||||
|
FOUNDATION_EXPORT NSString *const FBSDKErrorLocalizedTitleKey;
|
||||||
|
|
||||||
|
/*
|
||||||
|
@methodgroup FBSDKGraphRequest error userInfo keys
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
The userInfo key describing the error category, for error recovery purposes.
|
||||||
|
|
||||||
|
See `FBSDKGraphErrorRecoveryProcessor` and `[FBSDKGraphRequest disableErrorRecovery]`.
|
||||||
|
*/
|
||||||
|
FOUNDATION_EXPORT NSString *const FBSDKGraphRequestErrorKey;
|
||||||
|
|
||||||
|
FOUNDATION_EXPORT NSString *const FBSDKGraphRequestErrorCategoryKey
|
||||||
|
DEPRECATED_MSG_ATTRIBUTE("use FBSDKGraphRequestErrorKey instead");
|
||||||
|
|
||||||
|
/*
|
||||||
|
The userInfo key for the Graph API error code.
|
||||||
|
*/
|
||||||
|
FOUNDATION_EXPORT NSString *const FBSDKGraphRequestErrorGraphErrorCodeKey;
|
||||||
|
|
||||||
|
FOUNDATION_EXPORT NSString *const FBSDKGraphRequestErrorGraphErrorCode
|
||||||
|
DEPRECATED_MSG_ATTRIBUTE("use FBSDKGraphRequestErrorGraphErrorCodeKey instead");
|
||||||
|
|
||||||
|
/*
|
||||||
|
The userInfo key for the Graph API error subcode.
|
||||||
|
*/
|
||||||
|
FOUNDATION_EXPORT NSString *const FBSDKGraphRequestErrorGraphErrorSubcodeKey;
|
||||||
|
|
||||||
|
FOUNDATION_EXPORT NSString *const FBSDKGraphRequestErrorGraphErrorSubcode
|
||||||
|
DEPRECATED_MSG_ATTRIBUTE("use FBSDKGraphRequestErrorGraphErrorSubcodeKey instead");
|
||||||
|
|
||||||
|
/*
|
||||||
|
The userInfo key for the HTTP status code.
|
||||||
|
*/
|
||||||
|
FOUNDATION_EXPORT NSString *const FBSDKGraphRequestErrorHTTPStatusCodeKey;
|
||||||
|
|
||||||
|
/*
|
||||||
|
The userInfo key for the raw JSON response.
|
||||||
|
*/
|
||||||
|
FOUNDATION_EXPORT NSString *const FBSDKGraphRequestErrorParsedJSONResponseKey;
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef NS_ERROR_ENUM
|
||||||
|
#define NS_ERROR_ENUM(_domain, _name) \
|
||||||
|
enum _name: NSInteger _name; \
|
||||||
|
enum __attribute__((ns_error_domain(_domain))) _name: NSInteger
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
FBSDKError
|
||||||
|
Error codes for FBSDKErrorDomain.
|
||||||
|
*/
|
||||||
|
typedef NS_ERROR_ENUM(FBSDKErrorDomain, FBSDKError)
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
Reserved.
|
||||||
|
*/
|
||||||
|
FBSDKErrorReserved = 0,
|
||||||
|
|
||||||
|
/**
|
||||||
|
The error code for errors from invalid encryption on incoming encryption URLs.
|
||||||
|
*/
|
||||||
|
FBSDKErrorEncryption,
|
||||||
|
|
||||||
|
/**
|
||||||
|
The error code for errors from invalid arguments to SDK methods.
|
||||||
|
*/
|
||||||
|
FBSDKErrorInvalidArgument,
|
||||||
|
|
||||||
|
/**
|
||||||
|
The error code for unknown errors.
|
||||||
|
*/
|
||||||
|
FBSDKErrorUnknown,
|
||||||
|
|
||||||
|
/**
|
||||||
|
A request failed due to a network error. Use NSUnderlyingErrorKey to retrieve
|
||||||
|
the error object from the NSURLSession for more information.
|
||||||
|
*/
|
||||||
|
FBSDKErrorNetwork,
|
||||||
|
|
||||||
|
/**
|
||||||
|
The error code for errors encountered during an App Events flush.
|
||||||
|
*/
|
||||||
|
FBSDKErrorAppEventsFlush,
|
||||||
|
|
||||||
|
/**
|
||||||
|
An endpoint that returns a binary response was used with FBSDKGraphRequestConnection.
|
||||||
|
|
||||||
|
Endpoints that return image/jpg, etc. should be accessed using NSURLRequest
|
||||||
|
*/
|
||||||
|
FBSDKErrorGraphRequestNonTextMimeTypeReturned,
|
||||||
|
|
||||||
|
/**
|
||||||
|
The operation failed because the server returned an unexpected response.
|
||||||
|
|
||||||
|
You can get this error if you are not using the most recent SDK, or you are accessing a version of the
|
||||||
|
Graph API incompatible with the current SDK.
|
||||||
|
*/
|
||||||
|
FBSDKErrorGraphRequestProtocolMismatch,
|
||||||
|
|
||||||
|
/**
|
||||||
|
The Graph API returned an error.
|
||||||
|
|
||||||
|
See below for useful userInfo keys (beginning with FBSDKGraphRequestError*)
|
||||||
|
*/
|
||||||
|
FBSDKErrorGraphRequestGraphAPI,
|
||||||
|
|
||||||
|
/**
|
||||||
|
The specified dialog configuration is not available.
|
||||||
|
|
||||||
|
This error may signify that the configuration for the dialogs has not yet been downloaded from the server
|
||||||
|
or that the dialog is unavailable. Subsequent attempts to use the dialog may succeed as the configuration is loaded.
|
||||||
|
*/
|
||||||
|
FBSDKErrorDialogUnavailable,
|
||||||
|
|
||||||
|
/**
|
||||||
|
Indicates an operation failed because a required access token was not found.
|
||||||
|
*/
|
||||||
|
FBSDKErrorAccessTokenRequired,
|
||||||
|
|
||||||
|
/**
|
||||||
|
Indicates an app switch (typically for a dialog) failed because the destination app is out of date.
|
||||||
|
*/
|
||||||
|
FBSDKErrorAppVersionUnsupported,
|
||||||
|
|
||||||
|
/**
|
||||||
|
Indicates an app switch to the browser (typically for a dialog) failed.
|
||||||
|
*/
|
||||||
|
FBSDKErrorBrowserUnavailable,
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
FBSDKGraphRequestError
|
||||||
|
Describes the category of Facebook error. See `FBSDKGraphRequestErrorKey`.
|
||||||
|
*/
|
||||||
|
typedef NS_ENUM(NSUInteger, FBSDKGraphRequestError)
|
||||||
|
{
|
||||||
|
/** The default error category that is not known to be recoverable. Check `FBSDKLocalizedErrorDescriptionKey` for a user facing message. */
|
||||||
|
FBSDKGraphRequestErrorOther = 0,
|
||||||
|
/** Indicates the error is temporary (such as server throttling). While a recoveryAttempter will be provided with the error instance, the attempt is guaranteed to succeed so you can simply retry the operation if you do not want to present an alert. */
|
||||||
|
FBSDKGraphRequestErrorTransient = 1,
|
||||||
|
/** Indicates the error can be recovered (such as requiring a login). A recoveryAttempter will be provided with the error instance that can take UI action. */
|
||||||
|
FBSDKGraphRequestErrorRecoverable = 2
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
a formal protocol very similar to the informal protocol NSErrorRecoveryAttempting
|
||||||
*/
|
*/
|
||||||
@protocol FBSDKErrorRecoveryAttempting<NSObject>
|
@protocol FBSDKErrorRecoveryAttempting<NSObject>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
attempt the recovery
|
attempt the recovery
|
||||||
@param error the error
|
@param error the error
|
||||||
@param recoveryOptionIndex the selected option index
|
@param recoveryOptionIndex the selected option index
|
||||||
@param delegate the delegate
|
@param delegate the delegate
|
||||||
@ -223,3 +328,34 @@ FBSDK_EXTERN NSString *const FBSDKGraphRequestErrorParsedJSONResponseKey;
|
|||||||
- (void)attemptRecoveryFromError:(NSError *)error optionIndex:(NSUInteger)recoveryOptionIndex delegate:(id)delegate didRecoverSelector:(SEL)didRecoverSelector contextInfo:(void *)contextInfo;
|
- (void)attemptRecoveryFromError:(NSError *)error optionIndex:(NSUInteger)recoveryOptionIndex delegate:(id)delegate didRecoverSelector:(SEL)didRecoverSelector contextInfo:(void *)contextInfo;
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
|
/**
|
||||||
|
Deprecated
|
||||||
|
*/
|
||||||
|
typedef NS_ENUM(NSInteger, FBSDKErrorCode)
|
||||||
|
{
|
||||||
|
FBSDKReservedErrorCode DEPRECATED_MSG_ATTRIBUTE("use FBSDKErrorReserved instead") = 0,
|
||||||
|
FBSDKEncryptionErrorCode DEPRECATED_MSG_ATTRIBUTE("use FBSDKErrorEncryption instead"),
|
||||||
|
FBSDKInvalidArgumentErrorCode DEPRECATED_MSG_ATTRIBUTE("use FBSDKErrorInvalidArgument instead"),
|
||||||
|
FBSDKUnknownErrorCode DEPRECATED_MSG_ATTRIBUTE("use FBSDKErrorUnknown instead"),
|
||||||
|
FBSDKNetworkErrorCode DEPRECATED_MSG_ATTRIBUTE("use FBSDKErrorNetwork instead"),
|
||||||
|
FBSDKAppEventsFlushErrorCode DEPRECATED_MSG_ATTRIBUTE("use FBSDKErrorAppEventsFlush instead"),
|
||||||
|
FBSDKGraphRequestNonTextMimeTypeReturnedErrorCode DEPRECATED_MSG_ATTRIBUTE("use FBSDKErrorGraphRequestNonTextMimeTypeReturned instead"),
|
||||||
|
FBSDKGraphRequestProtocolMismatchErrorCode DEPRECATED_MSG_ATTRIBUTE("use FBSDKErrorGraphRequestProtocolMismatch instead"),
|
||||||
|
FBSDKGraphRequestGraphAPIErrorCode DEPRECATED_MSG_ATTRIBUTE("use FBSDKErrorGraphRequestGraphAPI instead"),
|
||||||
|
FBSDKDialogUnavailableErrorCode DEPRECATED_MSG_ATTRIBUTE("use FBSDKErrorDialogUnavailable instead"),
|
||||||
|
FBSDKAccessTokenRequiredErrorCode DEPRECATED_MSG_ATTRIBUTE("use FBSDKErrorAccessTokenRequired instead"),
|
||||||
|
FBSDKAppVersionUnsupportedErrorCode DEPRECATED_MSG_ATTRIBUTE("use FBSDKErrorAppVersionUnsupported instead"),
|
||||||
|
FBSDKBrowserUnavailableErrorCode DEPRECATED_MSG_ATTRIBUTE("use FBSDKErrorBrowserUnavailable instead"),
|
||||||
|
FBSDKBrowswerUnavailableErrorCode DEPRECATED_MSG_ATTRIBUTE("use FBSDKErrorBrowserUnavailable instead") = FBSDKBrowserUnavailableErrorCode,
|
||||||
|
} DEPRECATED_MSG_ATTRIBUTE("use FBSDKError instead");
|
||||||
|
|
||||||
|
/**
|
||||||
|
Deprecated
|
||||||
|
*/
|
||||||
|
typedef NS_ENUM(NSUInteger, FBSDKGraphRequestErrorCategory)
|
||||||
|
{
|
||||||
|
FBSDKGraphRequestErrorCategoryOther DEPRECATED_MSG_ATTRIBUTE("use FBSDKGraphRequestErrorOther instead") = 0,
|
||||||
|
FBSDKGraphRequestErrorCategoryTransient DEPRECATED_MSG_ATTRIBUTE("use FBSDKGraphRequestErrorTransient instead") = 1,
|
||||||
|
FBSDKGraphRequestErrorCategoryRecoverable DEPRECATED_MSG_ATTRIBUTE("use FBSDKGraphRequestErrorRecoverable instead") = 2
|
||||||
|
} DEPRECATED_MSG_ATTRIBUTE("use FBSDKGraphRequestError instead");
|
||||||
|
|||||||
@ -18,8 +18,37 @@
|
|||||||
|
|
||||||
#import "FBSDKConstants.h"
|
#import "FBSDKConstants.h"
|
||||||
|
|
||||||
|
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0
|
||||||
|
|
||||||
|
NSErrorDomain const FBSDKErrorDomain = @"com.facebook.sdk.core";
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
NSString *const FBSDKErrorDomain = @"com.facebook.sdk.core";
|
NSString *const FBSDKErrorDomain = @"com.facebook.sdk.core";
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0
|
||||||
|
|
||||||
|
NSErrorUserInfoKey const FBSDKErrorArgumentCollectionKey = @"com.facebook.sdk:FBSDKErrorArgumentCollectionKey";
|
||||||
|
NSErrorUserInfoKey const FBSDKErrorArgumentNameKey = @"com.facebook.sdk:FBSDKErrorArgumentNameKey";
|
||||||
|
NSErrorUserInfoKey const FBSDKErrorArgumentValueKey = @"com.facebook.sdk:FBSDKErrorArgumentValueKey";
|
||||||
|
NSErrorUserInfoKey const FBSDKErrorDeveloperMessageKey = @"com.facebook.sdk:FBSDKErrorDeveloperMessageKey";
|
||||||
|
NSErrorUserInfoKey const FBSDKErrorLocalizedDescriptionKey = @"com.facebook.sdk:FBSDKErrorLocalizedDescriptionKey";
|
||||||
|
NSErrorUserInfoKey const FBSDKErrorLocalizedTitleKey = @"com.facebook.sdk:FBSDKErrorLocalizedErrorTitleKey";
|
||||||
|
|
||||||
|
NSErrorUserInfoKey const FBSDKGraphRequestErrorKey = @"com.facebook.sdk:FBSDKGraphRequestErrorCategoryKey";
|
||||||
|
NSErrorUserInfoKey const FBSDKGraphRequestErrorCategoryKey = @"com.facebook.sdk:FBSDKGraphRequestErrorCategoryKey";
|
||||||
|
NSErrorUserInfoKey const FBSDKGraphRequestErrorGraphErrorCodeKey = @"com.facebook.sdk:FBSDKGraphRequestErrorGraphErrorCode";
|
||||||
|
NSErrorUserInfoKey const FBSDKGraphRequestErrorGraphErrorCode = @"com.facebook.sdk:FBSDKGraphRequestErrorGraphErrorCode";
|
||||||
|
NSErrorUserInfoKey const FBSDKGraphRequestErrorGraphErrorSubcodeKey = @"com.facebook.sdk:FBSDKGraphRequestErrorGraphErrorSubcode";
|
||||||
|
NSErrorUserInfoKey const FBSDKGraphRequestErrorGraphErrorSubcode = @"com.facebook.sdk:FBSDKGraphRequestErrorGraphErrorSubcode";
|
||||||
|
NSErrorUserInfoKey const FBSDKGraphRequestErrorHTTPStatusCodeKey = @"com.facebook.sdk:FBSDKGraphRequestErrorHTTPStatusCodeKey";
|
||||||
|
NSErrorUserInfoKey const FBSDKGraphRequestErrorParsedJSONResponseKey = @"com.facebook.sdk:FBSDKGraphRequestErrorParsedJSONResponseKey";
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
NSString *const FBSDKErrorArgumentCollectionKey = @"com.facebook.sdk:FBSDKErrorArgumentCollectionKey";
|
NSString *const FBSDKErrorArgumentCollectionKey = @"com.facebook.sdk:FBSDKErrorArgumentCollectionKey";
|
||||||
NSString *const FBSDKErrorArgumentNameKey = @"com.facebook.sdk:FBSDKErrorArgumentNameKey";
|
NSString *const FBSDKErrorArgumentNameKey = @"com.facebook.sdk:FBSDKErrorArgumentNameKey";
|
||||||
NSString *const FBSDKErrorArgumentValueKey = @"com.facebook.sdk:FBSDKErrorArgumentValueKey";
|
NSString *const FBSDKErrorArgumentValueKey = @"com.facebook.sdk:FBSDKErrorArgumentValueKey";
|
||||||
@ -27,8 +56,13 @@ NSString *const FBSDKErrorDeveloperMessageKey = @"com.facebook.sdk:FBSDKErrorDev
|
|||||||
NSString *const FBSDKErrorLocalizedDescriptionKey = @"com.facebook.sdk:FBSDKErrorLocalizedDescriptionKey";
|
NSString *const FBSDKErrorLocalizedDescriptionKey = @"com.facebook.sdk:FBSDKErrorLocalizedDescriptionKey";
|
||||||
NSString *const FBSDKErrorLocalizedTitleKey = @"com.facebook.sdk:FBSDKErrorLocalizedErrorTitleKey";
|
NSString *const FBSDKErrorLocalizedTitleKey = @"com.facebook.sdk:FBSDKErrorLocalizedErrorTitleKey";
|
||||||
|
|
||||||
|
NSString *const FBSDKGraphRequestErrorKey = @"com.facebook.sdk:FBSDKGraphRequestErrorCategoryKey";
|
||||||
NSString *const FBSDKGraphRequestErrorCategoryKey = @"com.facebook.sdk:FBSDKGraphRequestErrorCategoryKey";
|
NSString *const FBSDKGraphRequestErrorCategoryKey = @"com.facebook.sdk:FBSDKGraphRequestErrorCategoryKey";
|
||||||
|
NSString *const FBSDKGraphRequestErrorGraphErrorCodeKey = @"com.facebook.sdk:FBSDKGraphRequestErrorGraphErrorCode";
|
||||||
NSString *const FBSDKGraphRequestErrorGraphErrorCode = @"com.facebook.sdk:FBSDKGraphRequestErrorGraphErrorCode";
|
NSString *const FBSDKGraphRequestErrorGraphErrorCode = @"com.facebook.sdk:FBSDKGraphRequestErrorGraphErrorCode";
|
||||||
|
NSString *const FBSDKGraphRequestErrorGraphErrorSubcodeKey = @"com.facebook.sdk:FBSDKGraphRequestErrorGraphErrorSubcode";
|
||||||
NSString *const FBSDKGraphRequestErrorGraphErrorSubcode = @"com.facebook.sdk:FBSDKGraphRequestErrorGraphErrorSubcode";
|
NSString *const FBSDKGraphRequestErrorGraphErrorSubcode = @"com.facebook.sdk:FBSDKGraphRequestErrorGraphErrorSubcode";
|
||||||
NSString *const FBSDKGraphRequestErrorHTTPStatusCodeKey = @"com.facebook.sdk:FBSDKGraphRequestErrorHTTPStatusCodeKey";
|
NSString *const FBSDKGraphRequestErrorHTTPStatusCodeKey = @"com.facebook.sdk:FBSDKGraphRequestErrorHTTPStatusCodeKey";
|
||||||
NSString *const FBSDKGraphRequestErrorParsedJSONResponseKey = @"com.facebook.sdk:FBSDKGraphRequestErrorParsedJSONResponseKey";
|
NSString *const FBSDKGraphRequestErrorParsedJSONResponseKey = @"com.facebook.sdk:FBSDKGraphRequestErrorParsedJSONResponseKey";
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|||||||
@ -53,5 +53,5 @@
|
|||||||
#import <FBSDKCoreKit/FBSDKDeviceViewControllerBase.h>
|
#import <FBSDKCoreKit/FBSDKDeviceViewControllerBase.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define FBSDK_VERSION_STRING @"4.37.0"
|
#define FBSDK_VERSION_STRING @"4.39.0"
|
||||||
#define FBSDK_TARGET_PLATFORM_VERSION @"v3.1"
|
#define FBSDK_TARGET_PLATFORM_VERSION @"v3.2"
|
||||||
|
|||||||
@ -44,7 +44,7 @@
|
|||||||
|
|
||||||
return NO if the processor should not process the error. For example,
|
return NO if the processor should not process the error. For example,
|
||||||
if you want to prevent alerts of localized messages but otherwise perform retries and recoveries,
|
if you want to prevent alerts of localized messages but otherwise perform retries and recoveries,
|
||||||
you could return NO for errors where userInfo[FBSDKGraphRequestErrorCategoryKey] equal to FBSDKGraphRequestErrorCategoryOther
|
you could return NO for errors where userInfo[FBSDKGraphRequestErrorKey] equal to FBSDKGraphRequestErrorOther
|
||||||
*/
|
*/
|
||||||
- (BOOL)processorWillProcessError:(FBSDKGraphErrorRecoveryProcessor *)processor error:(NSError *)error;
|
- (BOOL)processorWillProcessError:(FBSDKGraphErrorRecoveryProcessor *)processor error:(NSError *)error;
|
||||||
|
|
||||||
@ -56,7 +56,7 @@
|
|||||||
Facebook NSErrors can contain FBSDKErrorRecoveryAttempting instances to recover from errors, or
|
Facebook NSErrors can contain FBSDKErrorRecoveryAttempting instances to recover from errors, or
|
||||||
localized messages to present to the user. This class will process the instances as follows:
|
localized messages to present to the user. This class will process the instances as follows:
|
||||||
|
|
||||||
1. If the error is temporary as indicated by FBSDKGraphRequestErrorCategoryKey, assume the recovery succeeded and
|
1. If the error is temporary as indicated by FBSDKGraphRequestErrorKey, assume the recovery succeeded and
|
||||||
notify the delegate.
|
notify the delegate.
|
||||||
2. If a FBSDKErrorRecoveryAttempting instance is available, display an alert (dispatched to main thread)
|
2. If a FBSDKErrorRecoveryAttempting instance is available, display an alert (dispatched to main thread)
|
||||||
with the recovery options and call the instance's [ attemptRecoveryFromError:optionIndex:...].
|
with the recovery options and call the instance's [ attemptRecoveryFromError:optionIndex:...].
|
||||||
|
|||||||
@ -20,17 +20,13 @@
|
|||||||
#import "FBSDKCoreKit+Internal.h"
|
#import "FBSDKCoreKit+Internal.h"
|
||||||
#import "FBSDKErrorRecoveryAttempter.h"
|
#import "FBSDKErrorRecoveryAttempter.h"
|
||||||
|
|
||||||
@interface FBSDKGraphErrorRecoveryProcessor()<UIAlertViewDelegate>
|
@interface FBSDKGraphErrorRecoveryProcessor()
|
||||||
{
|
{
|
||||||
FBSDKErrorRecoveryAttempter *_recoveryAttempter;
|
FBSDKErrorRecoveryAttempter *_recoveryAttempter;
|
||||||
NSError *_error;
|
NSError *_error;
|
||||||
#pragma clang diagnostic push
|
|
||||||
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
|
|
||||||
UIAlertView *_alertView;
|
|
||||||
#pragma clang diagnostic pop
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@property (nonatomic, strong, readwrite) id<FBSDKGraphErrorRecoveryProcessorDelegate>delegate;
|
@property (nonatomic, strong) id<FBSDKGraphErrorRecoveryProcessorDelegate>delegate;
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
@ -38,9 +34,7 @@
|
|||||||
|
|
||||||
- (void)dealloc
|
- (void)dealloc
|
||||||
{
|
{
|
||||||
if (_alertView) {
|
|
||||||
_alertView.delegate = nil;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
- (BOOL)processError:(NSError *)error request:(FBSDKGraphRequest *)request delegate:(id<FBSDKGraphErrorRecoveryProcessorDelegate>) delegate
|
- (BOOL)processError:(NSError *)error request:(FBSDKGraphRequest *)request delegate:(id<FBSDKGraphErrorRecoveryProcessorDelegate>) delegate
|
||||||
@ -52,13 +46,13 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
FBSDKGraphRequestErrorCategory errorCategory = [error.userInfo[FBSDKGraphRequestErrorCategoryKey] unsignedIntegerValue];
|
FBSDKGraphRequestError errorCategory = [error.userInfo[FBSDKGraphRequestErrorKey] unsignedIntegerValue];
|
||||||
switch (errorCategory) {
|
switch (errorCategory) {
|
||||||
case FBSDKGraphRequestErrorCategoryTransient :
|
case FBSDKGraphRequestErrorTransient :
|
||||||
[self.delegate processorDidAttemptRecovery:self didRecover:YES error:nil];
|
[self.delegate processorDidAttemptRecovery:self didRecover:YES error:nil];
|
||||||
self.delegate = nil;
|
self.delegate = nil;
|
||||||
return YES;
|
return YES;
|
||||||
case FBSDKGraphRequestErrorCategoryRecoverable :
|
case FBSDKGraphRequestErrorRecoverable :
|
||||||
if ([request.tokenString isEqualToString:[FBSDKAccessToken currentAccessToken].tokenString]) {
|
if ([request.tokenString isEqualToString:[FBSDKAccessToken currentAccessToken].tokenString]) {
|
||||||
_recoveryAttempter = error.recoveryAttempter;
|
_recoveryAttempter = error.recoveryAttempter;
|
||||||
BOOL isLoginRecoveryAttempter = [_recoveryAttempter isKindOfClass:NSClassFromString(@"_FBSDKLoginRecoveryAttempter")];
|
BOOL isLoginRecoveryAttempter = [_recoveryAttempter isKindOfClass:NSClassFromString(@"_FBSDKLoginRecoveryAttempter")];
|
||||||
@ -78,7 +72,7 @@
|
|||||||
return NO;
|
return NO;
|
||||||
};
|
};
|
||||||
|
|
||||||
if ([request.tokenString isEqualToString:[[FBSDKSystemAccountStoreAdapter sharedInstance] accessTokenString]] &&
|
if ([request.tokenString isEqualToString:[FBSDKSystemAccountStoreAdapter sharedInstance].accessTokenString] &&
|
||||||
isLoginRecoveryAttempter) {
|
isLoginRecoveryAttempter) {
|
||||||
// special system auth case: if user has granted permissions we can simply renew. On a successful
|
// special system auth case: if user has granted permissions we can simply renew. On a successful
|
||||||
// renew, treat this as immediately recovered without the standard alert prompty.
|
// renew, treat this as immediately recovered without the standard alert prompty.
|
||||||
@ -101,7 +95,7 @@
|
|||||||
return standardRecoveryWork();
|
return standardRecoveryWork();
|
||||||
}
|
}
|
||||||
return NO;
|
return NO;
|
||||||
case FBSDKGraphRequestErrorCategoryOther :
|
case FBSDKGraphRequestErrorOther :
|
||||||
if ([request.tokenString isEqualToString:[FBSDKAccessToken currentAccessToken].tokenString]) {
|
if ([request.tokenString isEqualToString:[FBSDKAccessToken currentAccessToken].tokenString]) {
|
||||||
NSString *message = error.userInfo[FBSDKErrorLocalizedDescriptionKey];
|
NSString *message = error.userInfo[FBSDKErrorLocalizedDescriptionKey];
|
||||||
NSString *title = error.userInfo[FBSDKErrorLocalizedTitleKey];
|
NSString *title = error.userInfo[FBSDKErrorLocalizedTitleKey];
|
||||||
@ -120,93 +114,53 @@
|
|||||||
return NO;
|
return NO;
|
||||||
}
|
}
|
||||||
|
|
||||||
#pragma mark - UIAlertView and UIAlertController support
|
#pragma mark - UIAlertController support
|
||||||
|
|
||||||
- (void)displayAlertWithRecoverySuggestion:(NSString *)recoverySuggestion recoveryOptionsTitles:(NSArray<NSString *> *)recoveryOptionsTitles
|
- (void)displayAlertWithRecoverySuggestion:(NSString *)recoverySuggestion recoveryOptionsTitles:(NSArray<NSString *> *)recoveryOptionsTitles
|
||||||
{
|
{
|
||||||
if ([UIAlertController class]) {
|
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:nil
|
||||||
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:nil
|
message:recoverySuggestion
|
||||||
message:recoverySuggestion
|
preferredStyle:UIAlertControllerStyleAlert];
|
||||||
preferredStyle:UIAlertControllerStyleAlert];
|
for (NSUInteger i = 0; i < recoveryOptionsTitles.count; i++) {
|
||||||
for (NSUInteger i = 0; i < recoveryOptionsTitles.count; i++) {
|
NSString *title = recoveryOptionsTitles[i];
|
||||||
NSString *title = recoveryOptionsTitles[i];
|
UIAlertAction *option = [UIAlertAction actionWithTitle:title
|
||||||
UIAlertAction *option = [UIAlertAction actionWithTitle:title
|
style:UIAlertActionStyleDefault
|
||||||
style:UIAlertActionStyleDefault
|
handler:^(UIAlertAction * _Nonnull action) {
|
||||||
handler:^(UIAlertAction * _Nonnull action) {
|
[self->_recoveryAttempter attemptRecoveryFromError:self->_error
|
||||||
[self->_recoveryAttempter attemptRecoveryFromError:self->_error
|
optionIndex:i
|
||||||
optionIndex:i
|
delegate:self
|
||||||
delegate:self
|
didRecoverSelector:@selector(didPresentErrorWithRecovery:contextInfo:)
|
||||||
didRecoverSelector:@selector(didPresentErrorWithRecovery:contextInfo:)
|
contextInfo:nil];
|
||||||
contextInfo:nil];
|
}];
|
||||||
}];
|
[alertController addAction:option];
|
||||||
[alertController addAction:option];
|
|
||||||
}
|
|
||||||
UIViewController *topMostViewController = [FBSDKInternalUtility topMostViewController];
|
|
||||||
[topMostViewController presentViewController:alertController
|
|
||||||
animated:YES
|
|
||||||
completion:nil];
|
|
||||||
} else {
|
|
||||||
#pragma clang diagnostic push
|
|
||||||
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
|
|
||||||
_alertView = [[UIAlertView alloc] initWithTitle:nil
|
|
||||||
message:recoverySuggestion
|
|
||||||
delegate:self
|
|
||||||
cancelButtonTitle:nil
|
|
||||||
otherButtonTitles:nil];
|
|
||||||
#pragma clang diagnostic pop
|
|
||||||
for (NSString *option in recoveryOptionsTitles) {
|
|
||||||
[_alertView addButtonWithTitle:option];
|
|
||||||
}
|
|
||||||
[_alertView show];
|
|
||||||
}
|
}
|
||||||
|
UIViewController *topMostViewController = [FBSDKInternalUtility topMostViewController];
|
||||||
|
[topMostViewController presentViewController:alertController
|
||||||
|
animated:YES
|
||||||
|
completion:nil];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)displayAlertWithTitle:(NSString *)title message:(NSString *)message cancelButtonTitle:(NSString *)localizedOK
|
- (void)displayAlertWithTitle:(NSString *)title message:(NSString *)message cancelButtonTitle:(NSString *)localizedOK
|
||||||
{
|
{
|
||||||
if ([UIAlertController class]) {
|
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:nil
|
||||||
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:nil
|
message:message
|
||||||
message:message
|
preferredStyle:UIAlertControllerStyleAlert];
|
||||||
preferredStyle:UIAlertControllerStyleAlert];
|
UIAlertAction *OKAction = [UIAlertAction actionWithTitle:localizedOK
|
||||||
UIAlertAction *OKAction = [UIAlertAction actionWithTitle:localizedOK
|
style:UIAlertActionStyleCancel
|
||||||
style:UIAlertActionStyleCancel
|
handler:^(UIAlertAction * _Nonnull action) {
|
||||||
handler:^(UIAlertAction * _Nonnull action) {
|
[self->_recoveryAttempter attemptRecoveryFromError:self->_error
|
||||||
[self->_recoveryAttempter attemptRecoveryFromError:self->_error
|
optionIndex:0
|
||||||
optionIndex:0
|
delegate:self
|
||||||
delegate:self
|
didRecoverSelector:@selector(didPresentErrorWithRecovery:contextInfo:)
|
||||||
didRecoverSelector:@selector(didPresentErrorWithRecovery:contextInfo:)
|
contextInfo:nil];
|
||||||
contextInfo:nil];
|
}];
|
||||||
}];
|
[alertController addAction:OKAction];
|
||||||
[alertController addAction:OKAction];
|
UIViewController *topMostViewController = [FBSDKInternalUtility topMostViewController];
|
||||||
UIViewController *topMostViewController = [FBSDKInternalUtility topMostViewController];
|
[topMostViewController presentViewController:alertController
|
||||||
[topMostViewController presentViewController:alertController
|
animated:YES
|
||||||
animated:YES
|
completion:nil];
|
||||||
completion:nil];
|
|
||||||
} else {
|
|
||||||
#pragma clang diagnostic push
|
|
||||||
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
|
|
||||||
[[[UIAlertView alloc] initWithTitle:title
|
|
||||||
message:message
|
|
||||||
delegate:nil
|
|
||||||
cancelButtonTitle:localizedOK
|
|
||||||
otherButtonTitles:nil] show];
|
|
||||||
#pragma clang diagnostic pop
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#pragma mark - UIAlertViewDelegate
|
|
||||||
|
|
||||||
#pragma clang diagnostic push
|
|
||||||
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
|
|
||||||
- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex
|
|
||||||
{
|
|
||||||
[_recoveryAttempter attemptRecoveryFromError:_error optionIndex:buttonIndex delegate:self didRecoverSelector:@selector(didPresentErrorWithRecovery:contextInfo:) contextInfo:nil];
|
|
||||||
if (_alertView) {
|
|
||||||
_alertView.delegate = nil;
|
|
||||||
_alertView = nil;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#pragma clang diagnostic pop
|
|
||||||
|
|
||||||
#pragma mark - FBSDKErrorRecoveryAttempting "delegate"
|
#pragma mark - FBSDKErrorRecoveryAttempting "delegate"
|
||||||
|
|
||||||
- (void)didPresentErrorWithRecovery:(BOOL)didRecover contextInfo:(void *)contextInfo
|
- (void)didPresentErrorWithRecovery:(BOOL)didRecover contextInfo:(void *)contextInfo
|
||||||
|
|||||||
@ -43,6 +43,9 @@
|
|||||||
*/
|
*/
|
||||||
@interface FBSDKGraphRequest : NSObject
|
@interface FBSDKGraphRequest : NSObject
|
||||||
|
|
||||||
|
- (instancetype)init NS_UNAVAILABLE;
|
||||||
|
+ (instancetype)new NS_UNAVAILABLE;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Initializes a new instance that use use `[FBSDKAccessToken currentAccessToken]`.
|
Initializes a new instance that use use `[FBSDKAccessToken currentAccessToken]`.
|
||||||
@param graphPath the graph path (e.g., @"me").
|
@param graphPath the graph path (e.g., @"me").
|
||||||
|
|||||||
@ -38,11 +38,6 @@ static NSString *const kPostHTTPMethod = @"POST";
|
|||||||
|
|
||||||
@implementation FBSDKGraphRequest
|
@implementation FBSDKGraphRequest
|
||||||
|
|
||||||
- (instancetype)init NS_UNAVAILABLE
|
|
||||||
{
|
|
||||||
assert(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
- (instancetype)initWithGraphPath:(NSString *)graphPath
|
- (instancetype)initWithGraphPath:(NSString *)graphPath
|
||||||
parameters:(NSDictionary *)parameters {
|
parameters:(NSDictionary *)parameters {
|
||||||
return [self initWithGraphPath:graphPath
|
return [self initWithGraphPath:graphPath
|
||||||
@ -154,10 +149,9 @@ static NSString *const kPostHTTPMethod = @"POST";
|
|||||||
forBatch:(BOOL)forBatch {
|
forBatch:(BOOL)forBatch {
|
||||||
params = [self preprocessParams: params];
|
params = [self preprocessParams: params];
|
||||||
|
|
||||||
#pragma clang diagnostic push
|
NSCharacterSet *urlAllowedSet = [NSCharacterSet URLFragmentAllowedCharacterSet];
|
||||||
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
|
NSURL *parsedURL = [NSURL URLWithString:[baseUrl stringByAddingPercentEncodingWithAllowedCharacters:urlAllowedSet]];
|
||||||
NSURL *parsedURL = [NSURL URLWithString:[baseUrl stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
|
|
||||||
#pragma clang pop
|
|
||||||
if ([httpMethod isEqualToString:kPostHTTPMethod] && !forBatch) {
|
if ([httpMethod isEqualToString:kPostHTTPMethod] && !forBatch) {
|
||||||
return baseUrl;
|
return baseUrl;
|
||||||
}
|
}
|
||||||
@ -181,7 +175,7 @@ static NSString *const kPostHTTPMethod = @"POST";
|
|||||||
NSString *debugValue = [FBSDKSettings graphAPIDebugParamValue];
|
NSString *debugValue = [FBSDKSettings graphAPIDebugParamValue];
|
||||||
if (debugValue) {
|
if (debugValue) {
|
||||||
NSMutableDictionary *mutableParams = [NSMutableDictionary dictionaryWithDictionary:params];
|
NSMutableDictionary *mutableParams = [NSMutableDictionary dictionaryWithDictionary:params];
|
||||||
[mutableParams setObject:debugValue forKey:@"debug"];
|
mutableParams[@"debug"] = debugValue;
|
||||||
return mutableParams;
|
return mutableParams;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -209,7 +203,7 @@ static NSString *const kPostHTTPMethod = @"POST";
|
|||||||
if (self.HTTPMethod) {
|
if (self.HTTPMethod) {
|
||||||
[result appendFormat:@", HTTPMethod: %@", self.HTTPMethod];
|
[result appendFormat:@", HTTPMethod: %@", self.HTTPMethod];
|
||||||
}
|
}
|
||||||
[result appendFormat:@", parameters: %@>", [self.parameters description]];
|
[result appendFormat:@", parameters: %@>", self.parameters.description];
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -18,8 +18,6 @@
|
|||||||
|
|
||||||
#import <Foundation/Foundation.h>
|
#import <Foundation/Foundation.h>
|
||||||
|
|
||||||
#import <FBSDKCoreKit/FBSDKMacros.h>
|
|
||||||
|
|
||||||
@class FBSDKGraphRequest;
|
@class FBSDKGraphRequest;
|
||||||
@class FBSDKGraphRequestConnection;
|
@class FBSDKGraphRequestConnection;
|
||||||
|
|
||||||
@ -118,7 +116,7 @@ typedef void (^FBSDKGraphRequestHandler)(FBSDKGraphRequestConnection *connection
|
|||||||
|
|
||||||
The byte count arguments refer to the aggregated <FBSDKGraphRequest> objects, not a particular <FBSDKGraphRequest>.
|
The byte count arguments refer to the aggregated <FBSDKGraphRequest> objects, not a particular <FBSDKGraphRequest>.
|
||||||
|
|
||||||
Like `NSURLConnection`, the values may change in unexpected ways if data needs to be resent.
|
Like `NSURLSession`, the values may change in unexpected ways if data needs to be resent.
|
||||||
|
|
||||||
@param connection The request connection transmitting data to a remote host
|
@param connection The request connection transmitting data to a remote host
|
||||||
@param bytesWritten The number of bytes sent in the last transmission
|
@param bytesWritten The number of bytes sent in the last transmission
|
||||||
@ -153,7 +151,7 @@ totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite;
|
|||||||
/**
|
/**
|
||||||
Gets or sets the timeout interval to wait for a response before giving up.
|
Gets or sets the timeout interval to wait for a response before giving up.
|
||||||
*/
|
*/
|
||||||
@property (nonatomic) NSTimeInterval timeout;
|
@property (nonatomic, assign) NSTimeInterval timeout;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
The raw response that was returned from the server. (readonly)
|
The raw response that was returned from the server. (readonly)
|
||||||
@ -222,9 +220,14 @@ totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite;
|
|||||||
completion or cancellation of the connection. This request can be named
|
completion or cancellation of the connection. This request can be named
|
||||||
to allow for using the request's response in a subsequent request.
|
to allow for using the request's response in a subsequent request.
|
||||||
*/
|
*/
|
||||||
|
- (void)addRequest:(FBSDKGraphRequest *)request
|
||||||
|
batchEntryName:(NSString *)name
|
||||||
|
completionHandler:(FBSDKGraphRequestHandler)handler;
|
||||||
|
|
||||||
- (void)addRequest:(FBSDKGraphRequest *)request
|
- (void)addRequest:(FBSDKGraphRequest *)request
|
||||||
completionHandler:(FBSDKGraphRequestHandler)handler
|
completionHandler:(FBSDKGraphRequestHandler)handler
|
||||||
batchEntryName:(NSString *)name;
|
batchEntryName:(NSString *)name
|
||||||
|
DEPRECATED_MSG_ATTRIBUTE("Renamed `addRequest:batchEntryName:completionHandler:`");
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@method
|
@method
|
||||||
@ -245,9 +248,14 @@ totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite;
|
|||||||
completion or cancellation of the connection. This request can be named
|
completion or cancellation of the connection. This request can be named
|
||||||
to allow for using the request's response in a subsequent request.
|
to allow for using the request's response in a subsequent request.
|
||||||
*/
|
*/
|
||||||
|
- (void)addRequest:(FBSDKGraphRequest *)request
|
||||||
|
batchParameters:(NSDictionary<NSString *, id> *)batchParameters
|
||||||
|
completionHandler:(FBSDKGraphRequestHandler)handler;
|
||||||
|
|
||||||
- (void)addRequest:(FBSDKGraphRequest *)request
|
- (void)addRequest:(FBSDKGraphRequest *)request
|
||||||
completionHandler:(FBSDKGraphRequestHandler)handler
|
completionHandler:(FBSDKGraphRequestHandler)handler
|
||||||
batchParameters:(NSDictionary *)batchParameters;
|
batchParameters:(NSDictionary *)batchParameters
|
||||||
|
DEPRECATED_MSG_ATTRIBUTE("Renamed `addRequest:batchParameters:completionHandler:`");
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@methodgroup Instance methods
|
@methodgroup Instance methods
|
||||||
@ -289,8 +297,6 @@ totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite;
|
|||||||
|
|
||||||
By default, a connection is scheduled on the current thread in the default mode when it is created.
|
By default, a connection is scheduled on the current thread in the default mode when it is created.
|
||||||
You cannot reschedule a connection after it has started.
|
You cannot reschedule a connection after it has started.
|
||||||
|
|
||||||
This is very similar to `[NSURLConnection setDelegateQueue:]`.
|
|
||||||
*/
|
*/
|
||||||
- (void)setDelegateQueue:(NSOperationQueue *)queue;
|
- (void)setDelegateQueue:(NSOperationQueue *)queue;
|
||||||
|
|
||||||
@ -307,7 +313,10 @@ totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite;
|
|||||||
|
|
||||||
@param version This is a string in the form @"v2.0" which will be used for the version part of an API path
|
@param version This is a string in the form @"v2.0" which will be used for the version part of an API path
|
||||||
*/
|
*/
|
||||||
- (void)overrideVersionPartWith:(NSString *)version;
|
- (void)overrideGraphAPIVersion:(NSString *)version;
|
||||||
|
|
||||||
|
- (void)overrideVersionPartWith:(NSString *)version
|
||||||
|
DEPRECATED_MSG_ATTRIBUTE("Renamed `overrideGraphAPIVersion`");
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
@ -320,4 +329,4 @@ totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite;
|
|||||||
will be wrapped into a dictionary using this const as the key. This only applies for very few Graph API
|
will be wrapped into a dictionary using this const as the key. This only applies for very few Graph API
|
||||||
prior to v2.1.
|
prior to v2.1.
|
||||||
*/
|
*/
|
||||||
FBSDK_EXTERN NSString *const FBSDKNonJSONResponseProperty;
|
FOUNDATION_EXPORT NSString *const FBSDKNonJSONResponseProperty;
|
||||||
|
|||||||
@ -154,20 +154,20 @@ NSURLSessionDataDelegate
|
|||||||
- (void)addRequest:(FBSDKGraphRequest *)request
|
- (void)addRequest:(FBSDKGraphRequest *)request
|
||||||
completionHandler:(FBSDKGraphRequestHandler)handler
|
completionHandler:(FBSDKGraphRequestHandler)handler
|
||||||
{
|
{
|
||||||
[self addRequest:request completionHandler:handler batchEntryName:nil];
|
[self addRequest:request batchEntryName:nil completionHandler:handler];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)addRequest:(FBSDKGraphRequest *)request
|
- (void)addRequest:(FBSDKGraphRequest *)request
|
||||||
completionHandler:(FBSDKGraphRequestHandler)handler
|
|
||||||
batchEntryName:(NSString *)name
|
batchEntryName:(NSString *)name
|
||||||
|
completionHandler:(FBSDKGraphRequestHandler)handler
|
||||||
{
|
{
|
||||||
NSDictionary *batchParams = (name)? @{kBatchEntryName : name } : nil;
|
NSDictionary *batchParams = (name)? @{kBatchEntryName : name } : nil;
|
||||||
[self addRequest:request completionHandler:handler batchParameters:batchParams];
|
[self addRequest:request batchParameters:batchParams completionHandler:handler];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)addRequest:(FBSDKGraphRequest *)request
|
- (void)addRequest:(FBSDKGraphRequest *)request
|
||||||
|
batchParameters:(NSDictionary<NSString *, id> *)batchParameters
|
||||||
completionHandler:(FBSDKGraphRequestHandler)handler
|
completionHandler:(FBSDKGraphRequestHandler)handler
|
||||||
batchParameters:(NSDictionary *)batchParameters
|
|
||||||
{
|
{
|
||||||
if (self.state != kStateCreated) {
|
if (self.state != kStateCreated) {
|
||||||
@throw [NSException exceptionWithName:NSInternalInconsistencyException
|
@throw [NSException exceptionWithName:NSInternalInconsistencyException
|
||||||
@ -181,6 +181,20 @@ NSURLSessionDataDelegate
|
|||||||
[self.requests addObject:metadata];
|
[self.requests addObject:metadata];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (void)addRequest:(FBSDKGraphRequest *)request
|
||||||
|
completionHandler:(FBSDKGraphRequestHandler)handler
|
||||||
|
batchEntryName:(NSString *)name
|
||||||
|
{
|
||||||
|
[self addRequest:request batchEntryName:name completionHandler:handler];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)addRequest:(FBSDKGraphRequest *)request
|
||||||
|
completionHandler:(FBSDKGraphRequestHandler)handler
|
||||||
|
batchParameters:(NSDictionary *)batchParameters
|
||||||
|
{
|
||||||
|
[self addRequest:request batchParameters:batchParameters completionHandler:handler];
|
||||||
|
}
|
||||||
|
|
||||||
- (void)cancel
|
- (void)cancel
|
||||||
{
|
{
|
||||||
self.state = kStateCancelled;
|
self.state = kStateCancelled;
|
||||||
@ -188,13 +202,18 @@ NSURLSessionDataDelegate
|
|||||||
[self cleanUpSession];
|
[self cleanUpSession];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)overrideVersionPartWith:(NSString *)version
|
- (void)overrideGraphAPIVersion:(NSString *)version
|
||||||
{
|
{
|
||||||
if (![_overrideVersionPart isEqualToString:version]) {
|
if (![_overrideVersionPart isEqualToString:version]) {
|
||||||
_overrideVersionPart = [version copy];
|
_overrideVersionPart = [version copy];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (void)overrideVersionPartWith:(NSString *)version
|
||||||
|
{
|
||||||
|
[self overrideGraphAPIVersion:version];
|
||||||
|
}
|
||||||
|
|
||||||
- (void)start
|
- (void)start
|
||||||
{
|
{
|
||||||
static dispatch_once_t onceToken;
|
static dispatch_once_t onceToken;
|
||||||
@ -284,13 +303,13 @@ NSURLSessionDataDelegate
|
|||||||
if ([FBSDKGraphRequest isAttachment:value]) {
|
if ([FBSDKGraphRequest isAttachment:value]) {
|
||||||
NSString *name = [NSString stringWithFormat:@"%@%lu",
|
NSString *name = [NSString stringWithFormat:@"%@%lu",
|
||||||
kBatchFileNamePrefix,
|
kBatchFileNamePrefix,
|
||||||
(unsigned long)[attachments count]];
|
(unsigned long)attachments.count];
|
||||||
[attachmentNames addObject:name];
|
[attachmentNames addObject:name];
|
||||||
attachments[name] = value;
|
attachments[name] = value;
|
||||||
}
|
}
|
||||||
}];
|
}];
|
||||||
|
|
||||||
if ([attachmentNames count]) {
|
if (attachmentNames.count) {
|
||||||
requestElement[kBatchAttachmentKey] = [attachmentNames componentsJoinedByString:@","];
|
requestElement[kBatchAttachmentKey] = [attachmentNames componentsJoinedByString:@","];
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -412,16 +431,16 @@ NSURLSessionDataDelegate
|
|||||||
|
|
||||||
[self _validateFieldsParamForGetRequests:requests];
|
[self _validateFieldsParamForGetRequests:requests];
|
||||||
|
|
||||||
if ([requests count] == 1) {
|
if (requests.count == 1) {
|
||||||
FBSDKGraphRequestMetadata *metadata = [requests objectAtIndex:0];
|
FBSDKGraphRequestMetadata *metadata = requests[0];
|
||||||
NSURL *url = [NSURL URLWithString:[self urlStringForSingleRequest:metadata.request forBatch:NO]];
|
NSURL *url = [NSURL URLWithString:[self urlStringForSingleRequest:metadata.request forBatch:NO]];
|
||||||
request = [NSMutableURLRequest requestWithURL:url
|
request = [NSMutableURLRequest requestWithURL:url
|
||||||
cachePolicy:NSURLRequestUseProtocolCachePolicy
|
cachePolicy:NSURLRequestUseProtocolCachePolicy
|
||||||
timeoutInterval:timeout];
|
timeoutInterval:timeout];
|
||||||
|
|
||||||
// HTTP methods are case-sensitive; be helpful in case someone provided a mixed case one.
|
// HTTP methods are case-sensitive; be helpful in case someone provided a mixed case one.
|
||||||
NSString *httpMethod = [metadata.request.HTTPMethod uppercaseString];
|
NSString *httpMethod = metadata.request.HTTPMethod.uppercaseString;
|
||||||
[request setHTTPMethod:httpMethod];
|
request.HTTPMethod = httpMethod;
|
||||||
[self appendAttachments:metadata.request.parameters
|
[self appendAttachments:metadata.request.parameters
|
||||||
toBody:body
|
toBody:body
|
||||||
addFormData:[httpMethod isEqualToString:@"POST"]
|
addFormData:[httpMethod isEqualToString:@"POST"]
|
||||||
@ -457,11 +476,11 @@ NSURLSessionDataDelegate
|
|||||||
request = [NSMutableURLRequest requestWithURL:url
|
request = [NSMutableURLRequest requestWithURL:url
|
||||||
cachePolicy:NSURLRequestUseProtocolCachePolicy
|
cachePolicy:NSURLRequestUseProtocolCachePolicy
|
||||||
timeoutInterval:timeout];
|
timeoutInterval:timeout];
|
||||||
[request setHTTPMethod:@"POST"];
|
request.HTTPMethod = @"POST";
|
||||||
}
|
}
|
||||||
|
|
||||||
[request setHTTPBody:[body data]];
|
request.HTTPBody = body.data;
|
||||||
NSUInteger bodyLength = [[body data] length] / 1024;
|
NSUInteger bodyLength = body.data.length / 1024;
|
||||||
|
|
||||||
[request setValue:[FBSDKGraphRequestConnection userAgent] forHTTPHeaderField:@"User-Agent"];
|
[request setValue:[FBSDKGraphRequestConnection userAgent] forHTTPHeaderField:@"User-Agent"];
|
||||||
[request setValue:[body mimeContentType] forHTTPHeaderField:@"Content-Type"];
|
[request setValue:[body mimeContentType] forHTTPHeaderField:@"Content-Type"];
|
||||||
@ -501,17 +520,17 @@ NSURLSessionDataDelegate
|
|||||||
NSString *prefix = kGraphURLPrefix;
|
NSString *prefix = kGraphURLPrefix;
|
||||||
// We special case a graph post to <id>/videos and send it to graph-video.facebook.com
|
// We special case a graph post to <id>/videos and send it to graph-video.facebook.com
|
||||||
// We only do this for non batch post requests
|
// We only do this for non batch post requests
|
||||||
NSString *graphPath = [request.graphPath lowercaseString];
|
NSString *graphPath = request.graphPath.lowercaseString;
|
||||||
if ([[request.HTTPMethod uppercaseString] isEqualToString:@"POST"] &&
|
if ([request.HTTPMethod.uppercaseString isEqualToString:@"POST"] &&
|
||||||
[graphPath hasSuffix:@"/videos"]) {
|
[graphPath hasSuffix:@"/videos"]) {
|
||||||
graphPath = [graphPath stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"/"]];
|
graphPath = [graphPath stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"/"]];
|
||||||
NSArray *components = [graphPath componentsSeparatedByString:@"/"];
|
NSArray *components = [graphPath componentsSeparatedByString:@"/"];
|
||||||
if ([components count] == 2) {
|
if (components.count == 2) {
|
||||||
prefix = kGraphVideoURLPrefix;
|
prefix = kGraphVideoURLPrefix;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
baseURL = [[FBSDKInternalUtility facebookURLWithHostPrefix:prefix path:request.graphPath queryParameters:nil defaultVersion:request.version error:NULL] absoluteString];
|
baseURL = [FBSDKInternalUtility facebookURLWithHostPrefix:prefix path:request.graphPath queryParameters:nil defaultVersion:request.version error:NULL].absoluteString;
|
||||||
}
|
}
|
||||||
|
|
||||||
NSString *url = [FBSDKGraphRequest serializeURL:baseURL
|
NSString *url = [FBSDKGraphRequest serializeURL:baseURL
|
||||||
@ -544,7 +563,7 @@ NSURLSessionDataDelegate
|
|||||||
NSInteger statusCode = _URLResponse.statusCode;
|
NSInteger statusCode = _URLResponse.statusCode;
|
||||||
|
|
||||||
if (!error && [response.MIMEType hasPrefix:@"image"]) {
|
if (!error && [response.MIMEType hasPrefix:@"image"]) {
|
||||||
error = [FBSDKError errorWithCode:FBSDKGraphRequestNonTextMimeTypeReturnedErrorCode
|
error = [NSError fbErrorWithCode:FBSDKErrorGraphRequestNonTextMimeTypeReturned
|
||||||
message:@"Response is a non-text MIME type; endpoints that return images and other "
|
message:@"Response is a non-text MIME type; endpoints that return images and other "
|
||||||
@"binary data should be fetched using NSURLRequest and NSURLSession"];
|
@"binary data should be fetched using NSURLRequest and NSURLSession"];
|
||||||
} else {
|
} else {
|
||||||
@ -553,28 +572,28 @@ NSURLSessionDataDelegate
|
|||||||
statusCode:statusCode];
|
statusCode:statusCode];
|
||||||
}
|
}
|
||||||
} else if (!error) {
|
} else if (!error) {
|
||||||
error = [FBSDKError errorWithCode:FBSDKUnknownErrorCode
|
error = [NSError fbErrorWithCode:FBSDKErrorUnknown
|
||||||
message:@"Missing NSURLResponse"];
|
message:@"Missing NSURLResponse"];
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!error) {
|
if (!error) {
|
||||||
if ([self.requests count] != [results count]) {
|
if (self.requests.count != results.count) {
|
||||||
error = [FBSDKError errorWithCode:FBSDKGraphRequestProtocolMismatchErrorCode
|
error = [NSError fbErrorWithCode:FBSDKErrorGraphRequestProtocolMismatch
|
||||||
message:@"Unexpected number of results returned from server."];
|
message:@"Unexpected number of results returned from server."];
|
||||||
} else {
|
} else {
|
||||||
[_logger appendFormat:@"Response <#%lu>\nDuration: %llu msec\nSize: %lu kB\nResponse Body:\n%@\n\n",
|
[_logger appendFormat:@"Response <#%lu>\nDuration: %llu msec\nSize: %lu kB\nResponse Body:\n%@\n\n",
|
||||||
(unsigned long)[_logger loggerSerialNumber],
|
(unsigned long)_logger.loggerSerialNumber,
|
||||||
[FBSDKInternalUtility currentTimeInMilliseconds] - _requestStartTime,
|
[FBSDKInternalUtility currentTimeInMilliseconds] - _requestStartTime,
|
||||||
(unsigned long)[data length],
|
(unsigned long)data.length,
|
||||||
results];
|
results];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (error) {
|
if (error) {
|
||||||
[_logger appendFormat:@"Response <#%lu> <Error>:\n%@\n%@\n",
|
[_logger appendFormat:@"Response <#%lu> <Error>:\n%@\n%@\n",
|
||||||
(unsigned long)[_logger loggerSerialNumber],
|
(unsigned long)_logger.loggerSerialNumber,
|
||||||
[error localizedDescription],
|
error.localizedDescription,
|
||||||
[error userInfo]];
|
error.userInfo];
|
||||||
}
|
}
|
||||||
[_logger emitToNSLog];
|
[_logger emitToNSLog];
|
||||||
|
|
||||||
@ -607,7 +626,7 @@ NSURLSessionDataDelegate
|
|||||||
id response = [self parseJSONOrOtherwise:responseUTF8 error:error];
|
id response = [self parseJSONOrOtherwise:responseUTF8 error:error];
|
||||||
|
|
||||||
if (responseUTF8 == nil) {
|
if (responseUTF8 == nil) {
|
||||||
NSString *base64Data = [data length] != 0 ? [data base64EncodedStringWithOptions:0] : @"";
|
NSString *base64Data = data.length != 0 ? [data base64EncodedStringWithOptions:0] : @"";
|
||||||
if (base64Data != nil) {
|
if (base64Data != nil) {
|
||||||
[FBSDKAppEvents logImplicitEvent:@"fb_response_invalid_utf8"
|
[FBSDKAppEvents logImplicitEvent:@"fb_response_invalid_utf8"
|
||||||
valueToSum:nil
|
valueToSum:nil
|
||||||
@ -619,13 +638,13 @@ NSURLSessionDataDelegate
|
|||||||
NSDictionary *responseError = nil;
|
NSDictionary *responseError = nil;
|
||||||
if (!response) {
|
if (!response) {
|
||||||
if ((error != NULL) && (*error == nil)) {
|
if ((error != NULL) && (*error == nil)) {
|
||||||
*error = [self errorWithCode:FBSDKUnknownErrorCode
|
*error = [self errorWithCode:FBSDKErrorUnknown
|
||||||
statusCode:statusCode
|
statusCode:statusCode
|
||||||
parsedJSONResponse:nil
|
parsedJSONResponse:nil
|
||||||
innerError:nil
|
innerError:nil
|
||||||
message:@"The server returned an unexpected response."];
|
message:@"The server returned an unexpected response."];
|
||||||
}
|
}
|
||||||
} else if ([self.requests count] == 1) {
|
} else if (self.requests.count == 1) {
|
||||||
// response is the entry, so put it in a dictionary under "body" and add
|
// response is the entry, so put it in a dictionary under "body" and add
|
||||||
// that to array of responses.
|
// that to array of responses.
|
||||||
[results addObject:@{
|
[results addObject:@{
|
||||||
@ -666,7 +685,7 @@ NSURLSessionDataDelegate
|
|||||||
[results addObject:result];
|
[results addObject:result];
|
||||||
}
|
}
|
||||||
} else if (error != NULL) {
|
} else if (error != NULL) {
|
||||||
*error = [self errorWithCode:FBSDKGraphRequestProtocolMismatchErrorCode
|
*error = [self errorWithCode:FBSDKErrorGraphRequestProtocolMismatch
|
||||||
statusCode:statusCode
|
statusCode:statusCode
|
||||||
parsedJSONResponse:results
|
parsedJSONResponse:results
|
||||||
innerError:nil
|
innerError:nil
|
||||||
@ -703,11 +722,11 @@ NSURLSessionDataDelegate
|
|||||||
- (void)completeWithResults:(NSArray *)results
|
- (void)completeWithResults:(NSArray *)results
|
||||||
networkError:(NSError *)networkError
|
networkError:(NSError *)networkError
|
||||||
{
|
{
|
||||||
NSUInteger count = [self.requests count];
|
NSUInteger count = self.requests.count;
|
||||||
_expectingResults = count;
|
_expectingResults = count;
|
||||||
NSUInteger disabledRecoveryCount = 0;
|
NSUInteger disabledRecoveryCount = 0;
|
||||||
for (FBSDKGraphRequestMetadata *metadata in self.requests) {
|
for (FBSDKGraphRequestMetadata *metadata in self.requests) {
|
||||||
if ([metadata.request isGraphErrorRecoveryDisabled]) {
|
if (metadata.request.graphErrorRecoveryDisabled) {
|
||||||
disabledRecoveryCount++;
|
disabledRecoveryCount++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -716,7 +735,7 @@ NSURLSessionDataDelegate
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
[self.requests enumerateObjectsUsingBlock:^(FBSDKGraphRequestMetadata *metadata, NSUInteger i, BOOL *stop) {
|
[self.requests enumerateObjectsUsingBlock:^(FBSDKGraphRequestMetadata *metadata, NSUInteger i, BOOL *stop) {
|
||||||
id result = networkError ? nil : [results objectAtIndex:i];
|
id result = networkError ? nil : results[i];
|
||||||
NSError *resultError = networkError ?: [self errorFromResult:result request:metadata.request];
|
NSError *resultError = networkError ?: [self errorFromResult:result request:metadata.request];
|
||||||
|
|
||||||
id body = nil;
|
id body = nil;
|
||||||
@ -726,7 +745,7 @@ NSURLSessionDataDelegate
|
|||||||
}
|
}
|
||||||
|
|
||||||
#if !TARGET_OS_TV
|
#if !TARGET_OS_TV
|
||||||
if (resultError && ![metadata.request isGraphErrorRecoveryDisabled] && isSingleRequestToRecover) {
|
if (resultError && !metadata.request.graphErrorRecoveryDisabled && isSingleRequestToRecover) {
|
||||||
self->_recoveringRequestMetadata = metadata;
|
self->_recoveringRequestMetadata = metadata;
|
||||||
self->_errorRecoveryProcessor = [[FBSDKGraphErrorRecoveryProcessor alloc] init];
|
self->_errorRecoveryProcessor = [[FBSDKGraphErrorRecoveryProcessor alloc] init];
|
||||||
if ([self->_errorRecoveryProcessor processError:resultError request:metadata.request delegate:self]) {
|
if ([self->_errorRecoveryProcessor processError:resultError request:metadata.request delegate:self]) {
|
||||||
@ -748,7 +767,7 @@ NSURLSessionDataDelegate
|
|||||||
- (void)processResultBody:(NSDictionary *)body error:(NSError *)error metadata:(FBSDKGraphRequestMetadata *)metadata canNotifyDelegate:(BOOL)canNotifyDelegate
|
- (void)processResultBody:(NSDictionary *)body error:(NSError *)error metadata:(FBSDKGraphRequestMetadata *)metadata canNotifyDelegate:(BOOL)canNotifyDelegate
|
||||||
{
|
{
|
||||||
void (^finishAndInvokeCompletionHandler)(void) = ^{
|
void (^finishAndInvokeCompletionHandler)(void) = ^{
|
||||||
NSDictionary *graphDebugDict = [body objectForKey:@"__debug__"];
|
NSDictionary<NSString *, id> *graphDebugDict = body[@"__debug__"];
|
||||||
if ([graphDebugDict isKindOfClass:[NSDictionary class]]) {
|
if ([graphDebugDict isKindOfClass:[NSDictionary class]]) {
|
||||||
[self processResultDebugDictionary: graphDebugDict];
|
[self processResultDebugDictionary: graphDebugDict];
|
||||||
}
|
}
|
||||||
@ -781,8 +800,8 @@ NSURLSessionDataDelegate
|
|||||||
BOOL isAccountStoreLogin = [metadataTokenString isEqualToString:accountStoreTokenString];
|
BOOL isAccountStoreLogin = [metadataTokenString isEqualToString:accountStoreTokenString];
|
||||||
|
|
||||||
if ([metadataTokenString isEqualToString:currentTokenString] || isAccountStoreLogin) {
|
if ([metadataTokenString isEqualToString:currentTokenString] || isAccountStoreLogin) {
|
||||||
NSInteger errorCode = [error.userInfo[FBSDKGraphRequestErrorGraphErrorCode] integerValue];
|
NSInteger errorCode = [error.userInfo[FBSDKGraphRequestErrorGraphErrorCodeKey] integerValue];
|
||||||
NSInteger errorSubcode = [error.userInfo[FBSDKGraphRequestErrorGraphErrorSubcode] integerValue];
|
NSInteger errorSubcode = [error.userInfo[FBSDKGraphRequestErrorGraphErrorSubcodeKey] integerValue];
|
||||||
if (errorCode == 190 || errorCode == 102) {
|
if (errorCode == 190 || errorCode == 102) {
|
||||||
if (isAccountStoreLogin) {
|
if (isAccountStoreLogin) {
|
||||||
if (errorSubcode == 460) {
|
if (errorSubcode == 460) {
|
||||||
@ -821,7 +840,7 @@ NSURLSessionDataDelegate
|
|||||||
- (void)processResultDebugDictionary:(NSDictionary *)dict
|
- (void)processResultDebugDictionary:(NSDictionary *)dict
|
||||||
{
|
{
|
||||||
NSArray *messages = [FBSDKTypeUtility arrayValue:dict[@"messages"]];
|
NSArray *messages = [FBSDKTypeUtility arrayValue:dict[@"messages"]];
|
||||||
if (![messages count]) {
|
if (!messages.count) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -854,8 +873,8 @@ NSURLSessionDataDelegate
|
|||||||
|
|
||||||
if ([errorDictionary isKindOfClass:[NSDictionary class]]) {
|
if ([errorDictionary isKindOfClass:[NSDictionary class]]) {
|
||||||
NSMutableDictionary *userInfo = [NSMutableDictionary dictionary];
|
NSMutableDictionary *userInfo = [NSMutableDictionary dictionary];
|
||||||
[FBSDKInternalUtility dictionary:userInfo setObject:errorDictionary[@"code"] forKey:FBSDKGraphRequestErrorGraphErrorCode];
|
[FBSDKInternalUtility dictionary:userInfo setObject:errorDictionary[@"code"] forKey:FBSDKGraphRequestErrorGraphErrorCodeKey];
|
||||||
[FBSDKInternalUtility dictionary:userInfo setObject:errorDictionary[@"error_subcode"] forKey:FBSDKGraphRequestErrorGraphErrorSubcode];
|
[FBSDKInternalUtility dictionary:userInfo setObject:errorDictionary[@"error_subcode"] forKey:FBSDKGraphRequestErrorGraphErrorSubcodeKey];
|
||||||
//"message" is preferred over error_msg or error_reason.
|
//"message" is preferred over error_msg or error_reason.
|
||||||
[FBSDKInternalUtility dictionary:userInfo setObject:errorDictionary[@"error_msg"] forKey:FBSDKErrorDeveloperMessageKey];
|
[FBSDKInternalUtility dictionary:userInfo setObject:errorDictionary[@"error_msg"] forKey:FBSDKErrorDeveloperMessageKey];
|
||||||
[FBSDKInternalUtility dictionary:userInfo setObject:errorDictionary[@"error_reason"] forKey:FBSDKErrorDeveloperMessageKey];
|
[FBSDKInternalUtility dictionary:userInfo setObject:errorDictionary[@"error_reason"] forKey:FBSDKErrorDeveloperMessageKey];
|
||||||
@ -867,20 +886,20 @@ NSURLSessionDataDelegate
|
|||||||
[FBSDKInternalUtility dictionary:userInfo setObject:result forKey:FBSDKGraphRequestErrorParsedJSONResponseKey];
|
[FBSDKInternalUtility dictionary:userInfo setObject:result forKey:FBSDKGraphRequestErrorParsedJSONResponseKey];
|
||||||
|
|
||||||
FBSDKErrorRecoveryConfiguration *recoveryConfiguration = [g_errorConfiguration
|
FBSDKErrorRecoveryConfiguration *recoveryConfiguration = [g_errorConfiguration
|
||||||
recoveryConfigurationForCode:[userInfo[FBSDKGraphRequestErrorGraphErrorCode] stringValue]
|
recoveryConfigurationForCode:[userInfo[FBSDKGraphRequestErrorGraphErrorCodeKey] stringValue]
|
||||||
subcode:[userInfo[FBSDKGraphRequestErrorGraphErrorSubcode] stringValue]
|
subcode:[userInfo[FBSDKGraphRequestErrorGraphErrorSubcodeKey] stringValue]
|
||||||
request:request];
|
request:request];
|
||||||
if ([errorDictionary[@"is_transient"] boolValue]) {
|
if ([errorDictionary[@"is_transient"] boolValue]) {
|
||||||
userInfo[FBSDKGraphRequestErrorCategoryKey] = @(FBSDKGraphRequestErrorCategoryTransient);
|
userInfo[FBSDKGraphRequestErrorKey] = @(FBSDKGraphRequestErrorTransient);
|
||||||
} else {
|
} else {
|
||||||
[FBSDKInternalUtility dictionary:userInfo setObject:@(recoveryConfiguration.errorCategory) forKey:FBSDKGraphRequestErrorCategoryKey];
|
[FBSDKInternalUtility dictionary:userInfo setObject:@(recoveryConfiguration.errorCategory) forKey:FBSDKGraphRequestErrorKey];
|
||||||
}
|
}
|
||||||
[FBSDKInternalUtility dictionary:userInfo setObject:recoveryConfiguration.localizedRecoveryDescription forKey:NSLocalizedRecoverySuggestionErrorKey];
|
[FBSDKInternalUtility dictionary:userInfo setObject:recoveryConfiguration.localizedRecoveryDescription forKey:NSLocalizedRecoverySuggestionErrorKey];
|
||||||
[FBSDKInternalUtility dictionary:userInfo setObject:recoveryConfiguration.localizedRecoveryOptionDescriptions forKey:NSLocalizedRecoveryOptionsErrorKey];
|
[FBSDKInternalUtility dictionary:userInfo setObject:recoveryConfiguration.localizedRecoveryOptionDescriptions forKey:NSLocalizedRecoveryOptionsErrorKey];
|
||||||
FBSDKErrorRecoveryAttempter *attempter = [FBSDKErrorRecoveryAttempter recoveryAttempterFromConfiguration:recoveryConfiguration];
|
FBSDKErrorRecoveryAttempter *attempter = [FBSDKErrorRecoveryAttempter recoveryAttempterFromConfiguration:recoveryConfiguration];
|
||||||
[FBSDKInternalUtility dictionary:userInfo setObject:attempter forKey:NSRecoveryAttempterErrorKey];
|
[FBSDKInternalUtility dictionary:userInfo setObject:attempter forKey:NSRecoveryAttempterErrorKey];
|
||||||
|
|
||||||
return [FBSDKError errorWithCode:FBSDKGraphRequestGraphAPIErrorCode
|
return [NSError fbErrorWithCode:FBSDKErrorGraphRequestGraphAPI
|
||||||
userInfo:userInfo
|
userInfo:userInfo
|
||||||
message:nil
|
message:nil
|
||||||
underlyingError:nil];
|
underlyingError:nil];
|
||||||
@ -890,7 +909,7 @@ NSURLSessionDataDelegate
|
|||||||
return nil;
|
return nil;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (NSError *)errorWithCode:(FBSDKErrorCode)code
|
- (NSError *)errorWithCode:(FBSDKError)code
|
||||||
statusCode:(NSInteger)statusCode
|
statusCode:(NSInteger)statusCode
|
||||||
parsedJSONResponse:(id)response
|
parsedJSONResponse:(id)response
|
||||||
innerError:(NSError *)innerError
|
innerError:(NSError *)innerError
|
||||||
@ -927,8 +946,8 @@ NSURLSessionDataDelegate
|
|||||||
{
|
{
|
||||||
if (_logger.isActive) {
|
if (_logger.isActive) {
|
||||||
[_logger appendFormat:@"Request <#%lu>:\n", (unsigned long)_logger.loggerSerialNumber];
|
[_logger appendFormat:@"Request <#%lu>:\n", (unsigned long)_logger.loggerSerialNumber];
|
||||||
[_logger appendKey:@"URL" value:[[request URL] absoluteString]];
|
[_logger appendKey:@"URL" value:request.URL.absoluteString];
|
||||||
[_logger appendKey:@"Method" value:[request HTTPMethod]];
|
[_logger appendKey:@"Method" value:request.HTTPMethod];
|
||||||
[_logger appendKey:@"UserAgent" value:[request valueForHTTPHeaderField:@"User-Agent"]];
|
[_logger appendKey:@"UserAgent" value:[request valueForHTTPHeaderField:@"User-Agent"]];
|
||||||
[_logger appendKey:@"MIME" value:[request valueForHTTPHeaderField:@"Content-Type"]];
|
[_logger appendKey:@"MIME" value:[request valueForHTTPHeaderField:@"Content-Type"]];
|
||||||
|
|
||||||
@ -1054,7 +1073,7 @@ totalBytesExpectedToSend:(int64_t)totalBytesExpectedToSend
|
|||||||
if (comma) {
|
if (comma) {
|
||||||
[result appendString:@",\n"];
|
[result appendString:@",\n"];
|
||||||
}
|
}
|
||||||
[result appendString:[request description]];
|
[result appendString:request.description];
|
||||||
comma = YES;
|
comma = YES;
|
||||||
}
|
}
|
||||||
[result appendString:@"\n)>"];
|
[result appendString:@"\n)>"];
|
||||||
|
|||||||
@ -23,6 +23,9 @@
|
|||||||
*/
|
*/
|
||||||
@interface FBSDKGraphRequestDataAttachment : NSObject
|
@interface FBSDKGraphRequestDataAttachment : NSObject
|
||||||
|
|
||||||
|
- (instancetype)init NS_UNAVAILABLE;
|
||||||
|
+ (instancetype)new NS_UNAVAILABLE;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Initializes the receiver with the attachment data and metadata.
|
Initializes the receiver with the attachment data and metadata.
|
||||||
@param data The attachment data (retained, not copied)
|
@param data The attachment data (retained, not copied)
|
||||||
|
|||||||
@ -18,8 +18,6 @@
|
|||||||
|
|
||||||
#import "FBSDKGraphRequestDataAttachment.h"
|
#import "FBSDKGraphRequestDataAttachment.h"
|
||||||
|
|
||||||
#import "FBSDKMacros.h"
|
|
||||||
|
|
||||||
@implementation FBSDKGraphRequestDataAttachment
|
@implementation FBSDKGraphRequestDataAttachment
|
||||||
|
|
||||||
- (instancetype)initWithData:(NSData *)data filename:(NSString *)filename contentType:(NSString *)contentType
|
- (instancetype)initWithData:(NSData *)data filename:(NSString *)filename contentType:(NSString *)contentType
|
||||||
@ -32,10 +30,4 @@
|
|||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (instancetype)init
|
|
||||||
{
|
|
||||||
FBSDK_NOT_DESIGNATED_INITIALIZER(initWithData:filename:contentType:);
|
|
||||||
return [self initWithData:nil filename:nil contentType:nil];
|
|
||||||
}
|
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|||||||
@ -17,23 +17,3 @@
|
|||||||
// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
#import <Foundation/Foundation.h>
|
#import <Foundation/Foundation.h>
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
#define FBSDK_EXTERN extern "C" __attribute__((visibility ("default")))
|
|
||||||
#else
|
|
||||||
#define FBSDK_EXTERN extern __attribute__((visibility ("default")))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define FBSDK_STATIC_INLINE static inline
|
|
||||||
|
|
||||||
#define FBSDK_NO_DESIGNATED_INITIALIZER() \
|
|
||||||
@throw [NSException exceptionWithName:NSInvalidArgumentException \
|
|
||||||
reason:[NSString stringWithFormat:@"unrecognized selector sent to instance %p", self] \
|
|
||||||
userInfo:nil]
|
|
||||||
|
|
||||||
#define FBSDK_NOT_DESIGNATED_INITIALIZER(DESIGNATED_INITIALIZER) \
|
|
||||||
@throw [NSException exceptionWithName:NSInvalidArgumentException \
|
|
||||||
reason:[NSString stringWithFormat:@"Please use the designated initializer [%p %@]", \
|
|
||||||
self, \
|
|
||||||
NSStringFromSelector(@selector(DESIGNATED_INITIALIZER))] \
|
|
||||||
userInfo:nil]
|
|
||||||
|
|||||||
@ -20,8 +20,20 @@
|
|||||||
|
|
||||||
NS_ASSUME_NONNULL_BEGIN
|
NS_ASSUME_NONNULL_BEGIN
|
||||||
|
|
||||||
|
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0
|
||||||
|
|
||||||
/*! The name of the notification posted by FBSDKMeasurementEvent */
|
/*! The name of the notification posted by FBSDKMeasurementEvent */
|
||||||
FOUNDATION_EXPORT NSString *const FBSDKMeasurementEventNotificationName;
|
FOUNDATION_EXPORT NSNotificationName const FBSDKMeasurementEventNotification;
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
/*! The name of the notification posted by FBSDKMeasurementEvent */
|
||||||
|
FOUNDATION_EXPORT NSString *const FBSDKMeasurementEventNotification;
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
FOUNDATION_EXPORT NSString *const FBSDKMeasurementEventNotificationName
|
||||||
|
DEPRECATED_MSG_ATTRIBUTE("Use `FBSDKMeasurementEventNotification` instead");
|
||||||
|
|
||||||
/*! Defines keys in the userInfo object for the notification named FBSDKMeasurementEventNotificationName */
|
/*! Defines keys in the userInfo object for the notification named FBSDKMeasurementEventNotificationName */
|
||||||
/*! The string field for the name of the event */
|
/*! The string field for the name of the event */
|
||||||
|
|||||||
@ -18,6 +18,16 @@
|
|||||||
|
|
||||||
#import "FBSDKMeasurementEvent_Internal.h"
|
#import "FBSDKMeasurementEvent_Internal.h"
|
||||||
|
|
||||||
|
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0
|
||||||
|
|
||||||
|
NSNotificationName const FBSDKMeasurementEventNotification = @"com.facebook.facebook-objc-sdk.measurement_event";
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
NSString *const FBSDKMeasurementEventNotification = @"com.facebook.facebook-objc-sdk.measurement_event";
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
NSString *const FBSDKMeasurementEventNotificationName = @"com.facebook.facebook-objc-sdk.measurement_event";
|
NSString *const FBSDKMeasurementEventNotificationName = @"com.facebook.facebook-objc-sdk.measurement_event";
|
||||||
|
|
||||||
NSString *const FBSDKMeasurementEventNameKey = @"event_name";
|
NSString *const FBSDKMeasurementEventNameKey = @"event_name";
|
||||||
@ -46,7 +56,7 @@ NSString *const FBSDKAppLinkNavigateBackToReferrerEventName = @"al_ref_back_out"
|
|||||||
NSDictionary<NSString *, id> *userInfo = @{FBSDKMeasurementEventNameKey : _name,
|
NSDictionary<NSString *, id> *userInfo = @{FBSDKMeasurementEventNameKey : _name,
|
||||||
FBSDKMeasurementEventArgsKey : _args};
|
FBSDKMeasurementEventArgsKey : _args};
|
||||||
|
|
||||||
[center postNotificationName:FBSDKMeasurementEventNotificationName
|
[center postNotificationName:FBSDKMeasurementEventNotification
|
||||||
object:self
|
object:self
|
||||||
userInfo:userInfo];
|
userInfo:userInfo];
|
||||||
}
|
}
|
||||||
|
|||||||
@ -14,11 +14,12 @@
|
|||||||
// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||||||
// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||||
// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE."
|
||||||
|
|
||||||
#import "FBSDKMacros.h"
|
|
||||||
#import "FBSDKProfilePictureView.h"
|
#import "FBSDKProfilePictureView.h"
|
||||||
|
|
||||||
|
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Notification indicating that the `currentProfile` has changed.
|
Notification indicating that the `currentProfile` has changed.
|
||||||
|
|
||||||
@ -26,19 +27,32 @@
|
|||||||
`FBSDKProfileChangeOldKey` and
|
`FBSDKProfileChangeOldKey` and
|
||||||
`FBSDKProfileChangeNewKey`.
|
`FBSDKProfileChangeNewKey`.
|
||||||
*/
|
*/
|
||||||
FBSDK_EXTERN NSString *const FBSDKProfileDidChangeNotification;
|
FOUNDATION_EXPORT NSNotificationName const FBSDKProfileDidChangeNotification;
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
/**
|
||||||
|
Notification indicating that the `currentProfile` has changed.
|
||||||
|
|
||||||
|
the userInfo dictionary of the notification will contain keys
|
||||||
|
`FBSDKProfileChangeOldKey` and
|
||||||
|
`FBSDKProfileChangeNewKey`.
|
||||||
|
*/
|
||||||
|
FOUNDATION_EXPORT NSString *const FBSDKProfileDidChangeNotification;
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
/* key in notification's userInfo object for getting the old profile.
|
/* key in notification's userInfo object for getting the old profile.
|
||||||
|
|
||||||
If there was no old profile, the key will not be present.
|
If there was no old profile, the key will not be present.
|
||||||
*/
|
*/
|
||||||
FBSDK_EXTERN NSString *const FBSDKProfileChangeOldKey;
|
FOUNDATION_EXPORT NSString *const FBSDKProfileChangeOldKey;
|
||||||
|
|
||||||
/* key in notification's userInfo object for getting the new profile.
|
/* key in notification's userInfo object for getting the new profile.
|
||||||
|
|
||||||
If there is no new profile, the key will not be present.
|
If there is no new profile, the key will not be present.
|
||||||
*/
|
*/
|
||||||
FBSDK_EXTERN NSString *const FBSDKProfileChangeNewKey;
|
FOUNDATION_EXPORT NSString *const FBSDKProfileChangeNewKey;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Represents an immutable Facebook profile
|
Represents an immutable Facebook profile
|
||||||
@ -54,6 +68,9 @@ FBSDK_EXTERN NSString *const FBSDKProfileChangeNewKey;
|
|||||||
*/
|
*/
|
||||||
@interface FBSDKProfile : NSObject<NSCopying, NSSecureCoding>
|
@interface FBSDKProfile : NSObject<NSCopying, NSSecureCoding>
|
||||||
|
|
||||||
|
- (instancetype)init NS_UNAVAILABLE;
|
||||||
|
+ (instancetype)new NS_UNAVAILABLE;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
initializes a new instance.
|
initializes a new instance.
|
||||||
@param userID the user ID
|
@param userID the user ID
|
||||||
@ -156,7 +173,7 @@ FBSDK_EXTERN NSString *const FBSDKProfileChangeNewKey;
|
|||||||
@param size The height and width. This will be rounded to integer precision.
|
@param size The height and width. This will be rounded to integer precision.
|
||||||
*/
|
*/
|
||||||
- (NSString *)imagePathForPictureMode:(FBSDKProfilePictureMode)mode size:(CGSize)size
|
- (NSString *)imagePathForPictureMode:(FBSDKProfilePictureMode)mode size:(CGSize)size
|
||||||
__attribute__ ((deprecated("use imageURLForPictureMode:size: instead")));
|
DEPRECATED_MSG_ATTRIBUTE("use imageURLForPictureMode:size: instead");
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Returns YES if the profile is equivalent to the receiver.
|
Returns YES if the profile is equivalent to the receiver.
|
||||||
|
|||||||
@ -20,7 +20,16 @@
|
|||||||
|
|
||||||
#import "FBSDKCoreKit+Internal.h"
|
#import "FBSDKCoreKit+Internal.h"
|
||||||
|
|
||||||
|
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0
|
||||||
|
|
||||||
|
NSNotificationName const FBSDKProfileDidChangeNotification = @"com.facebook.sdk.FBSDKProfile.FBSDKProfileDidChangeNotification";;
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
NSString *const FBSDKProfileDidChangeNotification = @"com.facebook.sdk.FBSDKProfile.FBSDKProfileDidChangeNotification";;
|
NSString *const FBSDKProfileDidChangeNotification = @"com.facebook.sdk.FBSDKProfile.FBSDKProfileDidChangeNotification";;
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
NSString *const FBSDKProfileChangeOldKey = @"FBSDKProfileOld";
|
NSString *const FBSDKProfileChangeOldKey = @"FBSDKProfileOld";
|
||||||
NSString *const FBSDKProfileChangeNewKey = @"FBSDKProfileNew";
|
NSString *const FBSDKProfileChangeNewKey = @"FBSDKProfileNew";
|
||||||
static NSString *const FBSDKProfileUserDefaultsKey = @"com.facebook.sdk.FBSDKProfile.currentProfile";
|
static NSString *const FBSDKProfileUserDefaultsKey = @"com.facebook.sdk.FBSDKProfile.currentProfile";
|
||||||
@ -39,11 +48,6 @@ static FBSDKProfile *g_currentProfile;
|
|||||||
|
|
||||||
@implementation FBSDKProfile
|
@implementation FBSDKProfile
|
||||||
|
|
||||||
- (instancetype)init NS_UNAVAILABLE
|
|
||||||
{
|
|
||||||
assert(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
- (instancetype)initWithUserID:(NSString *)userID
|
- (instancetype)initWithUserID:(NSString *)userID
|
||||||
firstName:(NSString *)firstName
|
firstName:(NSString *)firstName
|
||||||
middleName:(NSString *)middleName
|
middleName:(NSString *)middleName
|
||||||
@ -140,13 +144,13 @@ static FBSDKProfile *g_currentProfile;
|
|||||||
- (NSUInteger)hash
|
- (NSUInteger)hash
|
||||||
{
|
{
|
||||||
NSUInteger subhashes[] = {
|
NSUInteger subhashes[] = {
|
||||||
[self.userID hash],
|
self.userID.hash,
|
||||||
[self.firstName hash],
|
self.firstName.hash,
|
||||||
[self.middleName hash],
|
self.middleName.hash,
|
||||||
[self.lastName hash],
|
self.lastName.hash,
|
||||||
[self.name hash],
|
self.name.hash,
|
||||||
[self.linkURL hash],
|
self.linkURL.hash,
|
||||||
[self.refreshDate hash]
|
self.refreshDate.hash
|
||||||
};
|
};
|
||||||
return [FBSDKMath hashWithIntegerArray:subhashes count:sizeof(subhashes) / sizeof(subhashes[0])];
|
return [FBSDKMath hashWithIntegerArray:subhashes count:sizeof(subhashes) / sizeof(subhashes[0])];
|
||||||
}
|
}
|
||||||
@ -179,7 +183,7 @@ static FBSDKProfile *g_currentProfile;
|
|||||||
return YES;
|
return YES;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (id)initWithCoder:(NSCoder *)decoder
|
- (instancetype)initWithCoder:(NSCoder *)decoder
|
||||||
{
|
{
|
||||||
NSString *userID = [decoder decodeObjectOfClass:[NSString class] forKey:FBSDKPROFILE_USERID_KEY];
|
NSString *userID = [decoder decodeObjectOfClass:[NSString class] forKey:FBSDKPROFILE_USERID_KEY];
|
||||||
NSString *firstName = [decoder decodeObjectOfClass:[NSString class] forKey:FBSDKPROFILE_FIRSTNAME_KEY];
|
NSString *firstName = [decoder decodeObjectOfClass:[NSString class] forKey:FBSDKPROFILE_FIRSTNAME_KEY];
|
||||||
|
|||||||
@ -22,7 +22,6 @@
|
|||||||
#import "FBSDKInternalUtility.h"
|
#import "FBSDKInternalUtility.h"
|
||||||
#import "FBSDKMaleSilhouetteIcon.h"
|
#import "FBSDKMaleSilhouetteIcon.h"
|
||||||
#import "FBSDKMath.h"
|
#import "FBSDKMath.h"
|
||||||
#import "FBSDKURLConnection.h"
|
|
||||||
#import "FBSDKUtility.h"
|
#import "FBSDKUtility.h"
|
||||||
|
|
||||||
@interface FBSDKProfilePictureViewState : NSObject
|
@interface FBSDKProfilePictureViewState : NSObject
|
||||||
@ -70,7 +69,7 @@
|
|||||||
(NSUInteger)_size.height,
|
(NSUInteger)_size.height,
|
||||||
(NSUInteger)_scale,
|
(NSUInteger)_scale,
|
||||||
(NSUInteger)_pictureMode,
|
(NSUInteger)_pictureMode,
|
||||||
[_profileID hash],
|
_profileID.hash,
|
||||||
};
|
};
|
||||||
return [FBSDKMath hashWithIntegerArray:subhashes count:sizeof(subhashes) / sizeof(subhashes[0])];
|
return [FBSDKMath hashWithIntegerArray:subhashes count:sizeof(subhashes) / sizeof(subhashes[0])];
|
||||||
}
|
}
|
||||||
@ -120,7 +119,7 @@
|
|||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (id)initWithCoder:(NSCoder *)decoder
|
- (instancetype)initWithCoder:(NSCoder *)decoder
|
||||||
{
|
{
|
||||||
if ((self = [super initWithCoder:decoder])) {
|
if ((self = [super initWithCoder:decoder])) {
|
||||||
[self _configureProfilePictureView];
|
[self _configureProfilePictureView];
|
||||||
@ -139,7 +138,7 @@
|
|||||||
{
|
{
|
||||||
CGRect currentBounds = self.bounds;
|
CGRect currentBounds = self.bounds;
|
||||||
if (!CGRectEqualToRect(currentBounds, bounds)) {
|
if (!CGRectEqualToRect(currentBounds, bounds)) {
|
||||||
[super setBounds:bounds];
|
super.bounds = bounds;
|
||||||
if (!CGSizeEqualToSize(currentBounds.size, bounds.size)) {
|
if (!CGSizeEqualToSize(currentBounds.size, bounds.size)) {
|
||||||
_placeholderImageIsValid = NO;
|
_placeholderImageIsValid = NO;
|
||||||
[self setNeedsImageUpdate];
|
[self setNeedsImageUpdate];
|
||||||
@ -156,7 +155,7 @@
|
|||||||
{
|
{
|
||||||
if (_imageView.contentMode != contentMode) {
|
if (_imageView.contentMode != contentMode) {
|
||||||
_imageView.contentMode = contentMode;
|
_imageView.contentMode = contentMode;
|
||||||
[super setContentMode:contentMode];
|
super.contentMode = contentMode;
|
||||||
[self setNeedsImageUpdate];
|
[self setNeedsImageUpdate];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -212,16 +211,16 @@
|
|||||||
if (!imageURL) {
|
if (!imageURL) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
FBSDKURLConnectionHandler completionHandler = ^(FBSDKURLConnection *connection,
|
|
||||||
NSError *error,
|
|
||||||
NSURLResponse *response,
|
|
||||||
NSData *responseData) {
|
|
||||||
if (!error && [responseData length]) {
|
|
||||||
completionBlock(responseData);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
NSURLRequest *request = [[NSURLRequest alloc] initWithURL:imageURL];
|
NSURLRequest *request = [[NSURLRequest alloc] initWithURL:imageURL];
|
||||||
[[[FBSDKURLConnection alloc] initWithRequest:request completionHandler:completionHandler] start];
|
NSURLSession *session = [NSURLSession sharedSession];
|
||||||
|
[[session
|
||||||
|
dataTaskWithRequest:request
|
||||||
|
completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
|
||||||
|
if (!error && data.length) {
|
||||||
|
completionBlock(data);
|
||||||
|
}
|
||||||
|
}] resume];
|
||||||
}
|
}
|
||||||
|
|
||||||
+ (NSURL *)_imageURLWithState:(FBSDKProfilePictureViewState *)state
|
+ (NSURL *)_imageURLWithState:(FBSDKProfilePictureViewState *)state
|
||||||
@ -241,7 +240,7 @@
|
|||||||
|
|
||||||
- (void)_accessTokenDidChangeNotification:(NSNotification *)notification
|
- (void)_accessTokenDidChangeNotification:(NSNotification *)notification
|
||||||
{
|
{
|
||||||
if (![_profileID isEqualToString:@"me"] || !notification.userInfo[FBSDKAccessTokenDidChangeUserID]) {
|
if (![_profileID isEqualToString:@"me"] || !notification.userInfo[FBSDKAccessTokenDidChangeUserIDKey]) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
_lastState = nil;
|
_lastState = nil;
|
||||||
@ -328,7 +327,7 @@
|
|||||||
// leave the current value until the new resolution image is downloaded
|
// leave the current value until the new resolution image is downloaded
|
||||||
BOOL imageShouldFit = [self _imageShouldFit];
|
BOOL imageShouldFit = [self _imageShouldFit];
|
||||||
UIScreen *screen = self.window.screen ?: [UIScreen mainScreen];
|
UIScreen *screen = self.window.screen ?: [UIScreen mainScreen];
|
||||||
CGFloat scale = [screen scale];
|
CGFloat scale = screen.scale;
|
||||||
CGSize imageSize = [self _imageSize:imageShouldFit scale:scale];
|
CGSize imageSize = [self _imageSize:imageShouldFit scale:scale];
|
||||||
FBSDKProfilePictureViewState *state = [[FBSDKProfilePictureViewState alloc] initWithProfileID:_profileID
|
FBSDKProfilePictureViewState *state = [[FBSDKProfilePictureViewState alloc] initWithProfileID:_profileID
|
||||||
size:imageSize
|
size:imageSize
|
||||||
|
|||||||
@ -18,46 +18,47 @@
|
|||||||
|
|
||||||
#import <UIKit/UIKit.h>
|
#import <UIKit/UIKit.h>
|
||||||
|
|
||||||
#import <FBSDKCoreKit/FBSDKMacros.h>
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Constants defining logging behavior. Use with <[FBSDKSettings setLoggingBehavior]>.
|
* Constants defining logging behavior. Use with <[FBSDKSettings setLoggingBehavior]>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/** Include access token in logging. */
|
/** Include access token in logging. */
|
||||||
FBSDK_EXTERN NSString *const FBSDKLoggingBehaviorAccessTokens;
|
FOUNDATION_EXPORT NSString *const FBSDKLoggingBehaviorAccessTokens;
|
||||||
|
|
||||||
/** Log performance characteristics */
|
/** Log performance characteristics */
|
||||||
FBSDK_EXTERN NSString *const FBSDKLoggingBehaviorPerformanceCharacteristics;
|
FOUNDATION_EXPORT NSString *const FBSDKLoggingBehaviorPerformanceCharacteristics;
|
||||||
|
|
||||||
/** Log FBSDKAppEvents interactions */
|
/** Log FBSDKAppEvents interactions */
|
||||||
FBSDK_EXTERN NSString *const FBSDKLoggingBehaviorAppEvents;
|
FOUNDATION_EXPORT NSString *const FBSDKLoggingBehaviorAppEvents;
|
||||||
|
|
||||||
/** Log Informational occurrences */
|
/** Log Informational occurrences */
|
||||||
FBSDK_EXTERN NSString *const FBSDKLoggingBehaviorInformational;
|
FOUNDATION_EXPORT NSString *const FBSDKLoggingBehaviorInformational;
|
||||||
|
|
||||||
/** Log cache errors. */
|
/** Log cache errors. */
|
||||||
FBSDK_EXTERN NSString *const FBSDKLoggingBehaviorCacheErrors;
|
FOUNDATION_EXPORT NSString *const FBSDKLoggingBehaviorCacheErrors;
|
||||||
|
|
||||||
/** Log errors from SDK UI controls */
|
/** Log errors from SDK UI controls */
|
||||||
FBSDK_EXTERN NSString *const FBSDKLoggingBehaviorUIControlErrors;
|
FOUNDATION_EXPORT NSString *const FBSDKLoggingBehaviorUIControlErrors;
|
||||||
|
|
||||||
/** Log debug warnings from API response, i.e. when friends fields requested, but user_friends permission isn't granted. */
|
/** Log debug warnings from API response, i.e. when friends fields requested, but user_friends permission isn't granted. */
|
||||||
FBSDK_EXTERN NSString *const FBSDKLoggingBehaviorGraphAPIDebugWarning;
|
FOUNDATION_EXPORT NSString *const FBSDKLoggingBehaviorGraphAPIDebugWarning;
|
||||||
|
|
||||||
/** Log warnings from API response, i.e. when requested feature will be deprecated in next version of API.
|
/** Log warnings from API response, i.e. when requested feature will be deprecated in next version of API.
|
||||||
Info is the lowest level of severity, using it will result in logging all previously mentioned levels.
|
Info is the lowest level of severity, using it will result in logging all previously mentioned levels.
|
||||||
*/
|
*/
|
||||||
FBSDK_EXTERN NSString *const FBSDKLoggingBehaviorGraphAPIDebugInfo;
|
FOUNDATION_EXPORT NSString *const FBSDKLoggingBehaviorGraphAPIDebugInfo;
|
||||||
|
|
||||||
/** Log errors from SDK network requests */
|
/** Log errors from SDK network requests */
|
||||||
FBSDK_EXTERN NSString *const FBSDKLoggingBehaviorNetworkRequests;
|
FOUNDATION_EXPORT NSString *const FBSDKLoggingBehaviorNetworkRequests;
|
||||||
|
|
||||||
/** Log errors likely to be preventable by the developer. This is in the default set of enabled logging behaviors. */
|
/** Log errors likely to be preventable by the developer. This is in the default set of enabled logging behaviors. */
|
||||||
FBSDK_EXTERN NSString *const FBSDKLoggingBehaviorDeveloperErrors;
|
FOUNDATION_EXPORT NSString *const FBSDKLoggingBehaviorDeveloperErrors;
|
||||||
|
|
||||||
@interface FBSDKSettings : NSObject
|
@interface FBSDKSettings : NSObject
|
||||||
|
|
||||||
|
- (instancetype)init NS_UNAVAILABLE;
|
||||||
|
+ (instancetype)new NS_UNAVAILABLE;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Get the Facebook App ID used by the SDK.
|
Get the Facebook App ID used by the SDK.
|
||||||
|
|
||||||
@ -177,6 +178,18 @@ FBSDK_EXTERN NSString *const FBSDKLoggingBehaviorDeveloperErrors;
|
|||||||
*/
|
*/
|
||||||
+ (void)setCodelessDebugLogEnabled:(NSNumber *)CodelessDebugLogEnabled;
|
+ (void)setCodelessDebugLogEnabled:(NSNumber *)CodelessDebugLogEnabled;
|
||||||
|
|
||||||
|
/**
|
||||||
|
Flag which controls whether advertiserID could be collected.
|
||||||
|
If not explicitly set, the default is 1 - true
|
||||||
|
*/
|
||||||
|
+ (NSNumber *)advertiserIDCollectionEnabled;
|
||||||
|
|
||||||
|
/**
|
||||||
|
Set the flag which controls ontrols whether advertiserID could be collected.
|
||||||
|
@param AdvertiserIDCollectionEnabled Flag value, expressed as a value from 0 - false or 1 - true.
|
||||||
|
*/
|
||||||
|
+ (void)setAdvertiserIDCollectionEnabled:(NSNumber *)AdvertiserIDCollectionEnabled;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Gets whether data such as that generated through FBSDKAppEvents and sent to Facebook should be restricted from being used for other than analytics and conversions. Defaults to NO. This value is stored on the device and persists across app launches.
|
Gets whether data such as that generated through FBSDKAppEvents and sent to Facebook should be restricted from being used for other than analytics and conversions. Defaults to NO. This value is stored on the device and persists across app launches.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@ -77,6 +77,8 @@ FBSDKSETTINGS_PLIST_CONFIGURATION_SETTING_IMPL(NSNumber, FacebookAutoLogAppEvent
|
|||||||
setAutoLogAppEventsEnabled, @1);
|
setAutoLogAppEventsEnabled, @1);
|
||||||
FBSDKSETTINGS_PLIST_CONFIGURATION_SETTING_IMPL(NSNumber, FacebookCodelessDebugLogEnabled, codelessDebugLogEnabled,
|
FBSDKSETTINGS_PLIST_CONFIGURATION_SETTING_IMPL(NSNumber, FacebookCodelessDebugLogEnabled, codelessDebugLogEnabled,
|
||||||
setCodelessDebugLogEnabled, @0);
|
setCodelessDebugLogEnabled, @0);
|
||||||
|
FBSDKSETTINGS_PLIST_CONFIGURATION_SETTING_IMPL(NSNumber, FacebookAdvertiserIDCollectionEnabled, advertiserIDCollectionEnabled,
|
||||||
|
setAdvertiserIDCollectionEnabled, @1);
|
||||||
|
|
||||||
+ (void)setGraphErrorRecoveryDisabled:(BOOL)disableGraphErrorRecovery {
|
+ (void)setGraphErrorRecoveryDisabled:(BOOL)disableGraphErrorRecovery {
|
||||||
g_disableErrorRecovery = disableGraphErrorRecovery;
|
g_disableErrorRecovery = disableGraphErrorRecovery;
|
||||||
@ -88,7 +90,7 @@ FBSDKSETTINGS_PLIST_CONFIGURATION_SETTING_IMPL(NSNumber, FacebookCodelessDebugLo
|
|||||||
|
|
||||||
+ (CGFloat)JPEGCompressionQuality
|
+ (CGFloat)JPEGCompressionQuality
|
||||||
{
|
{
|
||||||
return [[self _JPEGCompressionQualityNumber] floatValue];
|
return [self _JPEGCompressionQualityNumber].floatValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
+ (void)setJPEGCompressionQuality:(CGFloat)JPEGCompressionQuality
|
+ (void)setJPEGCompressionQuality:(CGFloat)JPEGCompressionQuality
|
||||||
@ -173,14 +175,6 @@ FBSDKSETTINGS_PLIST_CONFIGURATION_SETTING_IMPL(NSNumber, FacebookCodelessDebugLo
|
|||||||
return FBSDK_VERSION_STRING;
|
return FBSDK_VERSION_STRING;
|
||||||
}
|
}
|
||||||
|
|
||||||
#pragma mark - Object Lifecycle
|
|
||||||
|
|
||||||
- (instancetype)init
|
|
||||||
{
|
|
||||||
FBSDK_NO_DESIGNATED_INITIALIZER();
|
|
||||||
return nil;
|
|
||||||
}
|
|
||||||
|
|
||||||
#pragma mark - Internal
|
#pragma mark - Internal
|
||||||
|
|
||||||
+ (NSObject<FBSDKAccessTokenCaching> *)accessTokenCache
|
+ (NSObject<FBSDKAccessTokenCaching> *)accessTokenCache
|
||||||
|
|||||||
@ -48,6 +48,9 @@ typedef void (^FBSDKTestUsersManagerRemoveTestAccountHandler)(NSError *error) ;
|
|||||||
*/
|
*/
|
||||||
@interface FBSDKTestUsersManager : NSObject
|
@interface FBSDKTestUsersManager : NSObject
|
||||||
|
|
||||||
|
- (instancetype)init NS_UNAVAILABLE;
|
||||||
|
+ (instancetype)new NS_UNAVAILABLE;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
construct or return the shared instance
|
construct or return the shared instance
|
||||||
@param appID the Facebook app id
|
@param appID the Facebook app id
|
||||||
|
|||||||
@ -48,12 +48,6 @@ static NSMutableDictionary *gInstancesDictionary;
|
|||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (instancetype)init
|
|
||||||
{
|
|
||||||
FBSDK_NOT_DESIGNATED_INITIALIZER(initWithAppID:appSecret:);
|
|
||||||
return [self initWithAppID:nil appSecret:nil];
|
|
||||||
}
|
|
||||||
|
|
||||||
+ (instancetype)sharedInstanceForAppID:(NSString *)appID appSecret:(NSString *)appSecret {
|
+ (instancetype)sharedInstanceForAppID:(NSString *)appID appSecret:(NSString *)appSecret {
|
||||||
static dispatch_once_t onceToken;
|
static dispatch_once_t onceToken;
|
||||||
dispatch_once(&onceToken, ^{
|
dispatch_once(&onceToken, ^{
|
||||||
@ -132,7 +126,7 @@ static NSMutableDictionary *gInstancesDictionary;
|
|||||||
completionHandler:(FBSDKTestUsersManagerRetrieveTestAccountTokensHandler)handler {
|
completionHandler:(FBSDKTestUsersManagerRetrieveTestAccountTokensHandler)handler {
|
||||||
NSDictionary *params = @{
|
NSDictionary *params = @{
|
||||||
@"installed" : @"true",
|
@"installed" : @"true",
|
||||||
@"permissions" : [[permissions allObjects] componentsJoinedByString:@","],
|
@"permissions" : [permissions.allObjects componentsJoinedByString:@","],
|
||||||
@"access_token" : self.appAccessToken
|
@"access_token" : self.appAccessToken
|
||||||
};
|
};
|
||||||
FBSDKGraphRequest *request = [[FBSDKGraphRequest alloc] initWithGraphPath:[NSString stringWithFormat:kFBGraphAPITestUsersPathFormat, _appID]
|
FBSDKGraphRequest *request = [[FBSDKGraphRequest alloc] initWithGraphPath:[NSString stringWithFormat:kFBGraphAPITestUsersPathFormat, _appID]
|
||||||
@ -166,8 +160,8 @@ static NSMutableDictionary *gInstancesDictionary;
|
|||||||
__block int expectedCount = 2;
|
__block int expectedCount = 2;
|
||||||
void (^complete)(NSError *) = ^(NSError *error) {
|
void (^complete)(NSError *) = ^(NSError *error) {
|
||||||
// ignore if they're already friends or pending request
|
// ignore if they're already friends or pending request
|
||||||
if ([error.userInfo[FBSDKGraphRequestErrorGraphErrorCode] integerValue] == 522 ||
|
if ([error.userInfo[FBSDKGraphRequestErrorGraphErrorCodeKey] integerValue] == 522 ||
|
||||||
[error.userInfo[FBSDKGraphRequestErrorGraphErrorCode] integerValue] == 520) {
|
[error.userInfo[FBSDKGraphRequestErrorGraphErrorCodeKey] integerValue] == 520) {
|
||||||
error = nil;
|
error = nil;
|
||||||
}
|
}
|
||||||
if (--expectedCount == 0 || error) {
|
if (--expectedCount == 0 || error) {
|
||||||
@ -185,12 +179,16 @@ static NSMutableDictionary *gInstancesDictionary;
|
|||||||
version:nil
|
version:nil
|
||||||
HTTPMethod:@"POST"];
|
HTTPMethod:@"POST"];
|
||||||
FBSDKGraphRequestConnection *conn = [[FBSDKGraphRequestConnection alloc] init];
|
FBSDKGraphRequestConnection *conn = [[FBSDKGraphRequestConnection alloc] init];
|
||||||
[conn addRequest:one completionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) {
|
[conn addRequest:one
|
||||||
|
batchEntryName:@"first"
|
||||||
|
completionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) {
|
||||||
complete(error);
|
complete(error);
|
||||||
} batchEntryName:@"first"];
|
}];
|
||||||
[conn addRequest:two completionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) {
|
[conn addRequest:two
|
||||||
|
batchParameters:@{ @"depends_on" : @"first"}
|
||||||
|
completionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) {
|
||||||
complete(error);
|
complete(error);
|
||||||
} batchParameters:@{ @"depends_on" : @"first"} ];
|
}];
|
||||||
[conn start];
|
[conn start];
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -211,7 +209,7 @@ static NSMutableDictionary *gInstancesDictionary;
|
|||||||
#pragma mark - private methods
|
#pragma mark - private methods
|
||||||
- (FBSDKAccessToken *)tokenDataForTokenString:(NSString *)tokenString permissions:(NSSet *)permissions userId:(NSString *)userId{
|
- (FBSDKAccessToken *)tokenDataForTokenString:(NSString *)tokenString permissions:(NSSet *)permissions userId:(NSString *)userId{
|
||||||
return [[FBSDKAccessToken alloc] initWithTokenString:tokenString
|
return [[FBSDKAccessToken alloc] initWithTokenString:tokenString
|
||||||
permissions:[permissions allObjects]
|
permissions:permissions.allObjects
|
||||||
declinedPermissions:nil
|
declinedPermissions:nil
|
||||||
appID:_appID
|
appID:_appID
|
||||||
userID:userId
|
userID:userId
|
||||||
|
|||||||
@ -88,14 +88,14 @@
|
|||||||
if (sourceApplication) {
|
if (sourceApplication) {
|
||||||
logData[@"sourceApplication"] = sourceApplication;
|
logData[@"sourceApplication"] = sourceApplication;
|
||||||
}
|
}
|
||||||
if ([_targetURL absoluteString]) {
|
if (_targetURL.absoluteString) {
|
||||||
logData[@"targetURL"] = [_targetURL absoluteString];
|
logData[@"targetURL"] = _targetURL.absoluteString;
|
||||||
}
|
}
|
||||||
if ([_inputURL absoluteString]) {
|
if (_inputURL.absoluteString) {
|
||||||
logData[@"inputURL"] = [_inputURL absoluteString];
|
logData[@"inputURL"] = _inputURL.absoluteString;
|
||||||
}
|
}
|
||||||
if ([_inputURL scheme]) {
|
if (_inputURL.scheme) {
|
||||||
logData[@"inputURLScheme"] = [_inputURL scheme];
|
logData[@"inputURLScheme"] = _inputURL.scheme;
|
||||||
}
|
}
|
||||||
logData[@"forRenderBackToReferrerBar"] = forRenderBackToReferrerBar ? EVENT_YES_VAL : EVENT_NO_VAL;
|
logData[@"forRenderBackToReferrerBar"] = forRenderBackToReferrerBar ? EVENT_YES_VAL : EVENT_NO_VAL;
|
||||||
logData[@"forOpenUrl"] = forOpenURLEvent ? EVENT_YES_VAL : EVENT_NO_VAL;
|
logData[@"forOpenUrl"] = forOpenURLEvent ? EVENT_YES_VAL : EVENT_NO_VAL;
|
||||||
|
|||||||
@ -23,6 +23,9 @@
|
|||||||
*/
|
*/
|
||||||
@interface FBSDKUtility : NSObject
|
@interface FBSDKUtility : NSObject
|
||||||
|
|
||||||
|
- (instancetype)init NS_UNAVAILABLE;
|
||||||
|
+ (instancetype)new NS_UNAVAILABLE;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Parses a query string into a dictionary.
|
Parses a query string into a dictionary.
|
||||||
@param queryString The query string value.
|
@param queryString The query string value.
|
||||||
|
|||||||
@ -21,7 +21,6 @@
|
|||||||
#import <CommonCrypto/CommonDigest.h>
|
#import <CommonCrypto/CommonDigest.h>
|
||||||
|
|
||||||
#import "FBSDKInternalUtility.h"
|
#import "FBSDKInternalUtility.h"
|
||||||
#import "FBSDKMacros.h"
|
|
||||||
|
|
||||||
@implementation FBSDKUtility
|
@implementation FBSDKUtility
|
||||||
|
|
||||||
@ -31,7 +30,7 @@
|
|||||||
NSArray *parts = [queryString componentsSeparatedByString:@"&"];
|
NSArray *parts = [queryString componentsSeparatedByString:@"&"];
|
||||||
|
|
||||||
for (NSString *part in parts) {
|
for (NSString *part in parts) {
|
||||||
if ([part length] == 0) {
|
if (part.length == 0) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -63,23 +62,18 @@
|
|||||||
|
|
||||||
+ (NSString *)URLDecode:(NSString *)value
|
+ (NSString *)URLDecode:(NSString *)value
|
||||||
{
|
{
|
||||||
value = [value stringByReplacingOccurrencesOfString:@"+" withString:@" "];
|
return [value
|
||||||
#pragma clang diagnostic push
|
stringByReplacingOccurrencesOfString:@"+"
|
||||||
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
|
withString:@" "].stringByRemovingPercentEncoding;
|
||||||
value = [value stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
|
|
||||||
#pragma clang diagnostic pop
|
|
||||||
return value;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#pragma clang diagnostic push
|
#pragma clang diagnostic push
|
||||||
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
|
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
|
||||||
+ (NSString *)URLEncode:(NSString *)value
|
+ (NSString *)URLEncode:(NSString *)value
|
||||||
{
|
{
|
||||||
return (__bridge_transfer NSString *)CFURLCreateStringByAddingPercentEscapes(NULL,
|
NSCharacterSet *urlAllowedSet = [NSCharacterSet
|
||||||
(CFStringRef)value,
|
characterSetWithCharactersInString:@" !*();:'@&=+$,/?%#[]\""].invertedSet;
|
||||||
NULL, // characters to leave unescaped
|
return [value stringByAddingPercentEncodingWithAllowedCharacters:urlAllowedSet];
|
||||||
CFSTR(":!*();@/&?+$,='"),
|
|
||||||
kCFStringEncodingUTF8);
|
|
||||||
}
|
}
|
||||||
#pragma clang diagnostic pop
|
#pragma clang diagnostic pop
|
||||||
|
|
||||||
@ -133,10 +127,4 @@
|
|||||||
return encryptedStuff;
|
return encryptedStuff;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (instancetype)init
|
|
||||||
{
|
|
||||||
FBSDK_NO_DESIGNATED_INITIALIZER();
|
|
||||||
return nil;
|
|
||||||
}
|
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|||||||
@ -139,14 +139,10 @@ static NSString *const FBSDKWebViewAppLinkResolverShouldFallbackKey = @"should_f
|
|||||||
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
|
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
|
||||||
[request setValue:FBSDKWebViewAppLinkResolverMetaTagPrefix forHTTPHeaderField:FBSDKWebViewAppLinkResolverPreferHeader];
|
[request setValue:FBSDKWebViewAppLinkResolverMetaTagPrefix forHTTPHeaderField:FBSDKWebViewAppLinkResolverPreferHeader];
|
||||||
|
|
||||||
#if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_7_0 || __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_9
|
|
||||||
NSURLSession *session = [NSURLSession sharedSession];
|
NSURLSession *session = [NSURLSession sharedSession];
|
||||||
[[session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
|
[[session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
|
||||||
completion(response, data, error);
|
completion(response, data, error);
|
||||||
}] resume];
|
}] resume];
|
||||||
#else
|
|
||||||
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:completion];
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)appLinkFromURL:(NSURL *)url handler:(FBSDKAppLinkFromURLHandler)handler
|
- (void)appLinkFromURL:(NSURL *)url handler:(FBSDKAppLinkFromURLHandler)handler
|
||||||
@ -293,7 +289,7 @@ static NSString *const FBSDKWebViewAppLinkResolverShouldFallbackKey = @"should_f
|
|||||||
NSURL *webUrl = destination;
|
NSURL *webUrl = destination;
|
||||||
|
|
||||||
if (shouldFallbackString &&
|
if (shouldFallbackString &&
|
||||||
[@[ @"no", @"false", @"0" ] containsObject:[shouldFallbackString lowercaseString]]) {
|
[@[ @"no", @"false", @"0" ] containsObject:shouldFallbackString.lowercaseString]) {
|
||||||
webUrl = nil;
|
webUrl = nil;
|
||||||
}
|
}
|
||||||
if (webUrl && webUrlString) {
|
if (webUrl && webUrlString) {
|
||||||
|
|||||||
@ -18,8 +18,8 @@
|
|||||||
|
|
||||||
#import <Foundation/Foundation.h>
|
#import <Foundation/Foundation.h>
|
||||||
|
|
||||||
#import "FBSDKCoreKit+Internal.h"
|
@interface FBSDKCodelessIndexer : NSObject
|
||||||
|
|
||||||
@interface FBSDKShareError : FBSDKError
|
+ (NSString *)extInfo;
|
||||||
|
|
||||||
@end
|
@end
|
||||||
322
Example/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/Codeless/FBSDKCodelessIndexer.m
generated
Normal file
322
Example/Pods/FBSDKCoreKit/FBSDKCoreKit/FBSDKCoreKit/Internal/AppEvents/Codeless/FBSDKCodelessIndexer.m
generated
Normal file
@ -0,0 +1,322 @@
|
|||||||
|
// Copyright (c) 2014-present, Facebook, Inc. All rights reserved.
|
||||||
|
//
|
||||||
|
// You are hereby granted a non-exclusive, worldwide, royalty-free license to use,
|
||||||
|
// copy, modify, and distribute this software in source code or binary form for use
|
||||||
|
// in connection with the web services and APIs provided by Facebook.
|
||||||
|
//
|
||||||
|
// As with any software that integrates with the Facebook platform, your use of
|
||||||
|
// this software is subject to the Facebook Developer Principles and Policies
|
||||||
|
// [http://developers.facebook.com/policy/]. This copyright notice shall be
|
||||||
|
// included in all copies or substantial portions of the software.
|
||||||
|
//
|
||||||
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||||
|
// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||||||
|
// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||||
|
// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
|
// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
|
#import "FBSDKCodelessIndexer.h"
|
||||||
|
|
||||||
|
#import <objc/runtime.h>
|
||||||
|
#import <sys/sysctl.h>
|
||||||
|
#import <sys/utsname.h>
|
||||||
|
|
||||||
|
#import <UIKit/UIKit.h>
|
||||||
|
|
||||||
|
#import <FBSDKCoreKit/FBSDKGraphRequest.h>
|
||||||
|
#import <FBSDKCoreKit/FBSDKSettings.h>
|
||||||
|
|
||||||
|
#import "FBSDKCoreKit+Internal.h"
|
||||||
|
|
||||||
|
@implementation FBSDKCodelessIndexer
|
||||||
|
|
||||||
|
static BOOL _isCodelessIndexing;
|
||||||
|
static BOOL _isCheckingSession;
|
||||||
|
static BOOL _isCodelessIndexingEnabled;
|
||||||
|
|
||||||
|
static NSString *_deviceSessionID;
|
||||||
|
static NSTimer *_appIndexingTimer;
|
||||||
|
static NSString *_lastTreeHash;
|
||||||
|
|
||||||
|
+ (void)load
|
||||||
|
{
|
||||||
|
#if TARGET_OS_SIMULATOR
|
||||||
|
[self setupGesture];
|
||||||
|
#else
|
||||||
|
[FBSDKServerConfigurationManager loadServerConfigurationWithCompletionBlock:^(FBSDKServerConfiguration *serverConfiguration, NSError *error) {
|
||||||
|
if (serverConfiguration.codelessSetupEnabled) {
|
||||||
|
[self setupGesture];
|
||||||
|
}
|
||||||
|
}];
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
+ (void)setupGesture
|
||||||
|
{
|
||||||
|
[UIApplication sharedApplication].applicationSupportsShakeToEdit = YES;
|
||||||
|
Class class = [UIApplication class];
|
||||||
|
|
||||||
|
[FBSDKSwizzler swizzleSelector:@selector(motionBegan:withEvent:) onClass:class withBlock:^{
|
||||||
|
if ([FBSDKServerConfigurationManager cachedServerConfiguration].isCodelessEventsEnabled) {
|
||||||
|
[self checkCodelessIndexingSession];
|
||||||
|
}
|
||||||
|
} named:@"motionBegan"];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
+ (void)checkCodelessIndexingSession
|
||||||
|
{
|
||||||
|
if (_isCheckingSession) return;
|
||||||
|
|
||||||
|
_isCheckingSession = YES;
|
||||||
|
NSDictionary *parameters = @{
|
||||||
|
CODELESS_INDEXING_SESSION_ID_KEY: [self currentSessionDeviceID],
|
||||||
|
CODELESS_INDEXING_EXT_INFO_KEY: [self extInfo]
|
||||||
|
};
|
||||||
|
FBSDKGraphRequest *request = [[FBSDKGraphRequest alloc]
|
||||||
|
initWithGraphPath:[NSString stringWithFormat:@"%@/%@",
|
||||||
|
[FBSDKSettings appID], CODELESS_INDEXING_SESSION_ENDPOINT]
|
||||||
|
parameters: parameters
|
||||||
|
HTTPMethod:@"POST"];
|
||||||
|
[request startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) {
|
||||||
|
_isCheckingSession = NO;
|
||||||
|
if ([result isKindOfClass:[NSDictionary class]]) {
|
||||||
|
_isCodelessIndexingEnabled = [((NSDictionary *)result)[CODELESS_INDEXING_STATUS_KEY] boolValue];
|
||||||
|
if (_isCodelessIndexingEnabled) {
|
||||||
|
_lastTreeHash = nil;
|
||||||
|
if (!_appIndexingTimer) {
|
||||||
|
_appIndexingTimer = [NSTimer timerWithTimeInterval:CODELESS_INDEXING_UPLOAD_INTERVAL_IN_SECONDS
|
||||||
|
target:self
|
||||||
|
selector:@selector(startIndexing)
|
||||||
|
userInfo:nil
|
||||||
|
repeats:YES];
|
||||||
|
|
||||||
|
[[NSRunLoop mainRunLoop] addTimer:_appIndexingTimer forMode:NSDefaultRunLoopMode];
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
_deviceSessionID = nil;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}];
|
||||||
|
}
|
||||||
|
|
||||||
|
+ (NSString *)currentSessionDeviceID
|
||||||
|
{
|
||||||
|
if (!_deviceSessionID) {
|
||||||
|
_deviceSessionID = [NSUUID UUID].UUIDString;
|
||||||
|
}
|
||||||
|
return _deviceSessionID;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ (NSString *)extInfo
|
||||||
|
{
|
||||||
|
struct utsname systemInfo;
|
||||||
|
uname(&systemInfo);
|
||||||
|
NSString *machine = @(systemInfo.machine);
|
||||||
|
NSString *advertiserID = [FBSDKAppEventsUtility advertiserID] ?: @"";
|
||||||
|
machine = machine ?: @"";
|
||||||
|
NSString *debugStatus = [FBSDKAppEventsUtility isDebugBuild] ? @"1" : @"0";
|
||||||
|
#if TARGET_IPHONE_SIMULATOR
|
||||||
|
NSString *isSimulator = @"1";
|
||||||
|
#else
|
||||||
|
NSString *isSimulator = @"0";
|
||||||
|
#endif
|
||||||
|
NSLocale *locale = [NSLocale currentLocale];
|
||||||
|
NSString *languageCode = [locale objectForKey:NSLocaleLanguageCode];
|
||||||
|
NSString *countryCode = [locale objectForKey:NSLocaleCountryCode];
|
||||||
|
NSString *localeString = locale.localeIdentifier;
|
||||||
|
if (languageCode && countryCode) {
|
||||||
|
localeString = [NSString stringWithFormat:@"%@_%@", languageCode, countryCode];
|
||||||
|
}
|
||||||
|
|
||||||
|
NSString *extinfo = [FBSDKInternalUtility JSONStringForObject:@[machine,
|
||||||
|
advertiserID,
|
||||||
|
debugStatus,
|
||||||
|
isSimulator,
|
||||||
|
localeString]
|
||||||
|
error:NULL
|
||||||
|
invalidObjectHandler:NULL];
|
||||||
|
|
||||||
|
return extinfo ?: @"";
|
||||||
|
}
|
||||||
|
|
||||||
|
+ (void)startIndexing {
|
||||||
|
if (!_isCodelessIndexingEnabled) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (UIApplicationStateActive != [UIApplication sharedApplication].applicationState) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If userAgentSuffix begins with Unity, trigger unity code to upload view hierarchy
|
||||||
|
NSString *userAgentSuffix = [FBSDKSettings userAgentSuffix];
|
||||||
|
if (userAgentSuffix != nil && [userAgentSuffix hasPrefix:@"Unity"]) {
|
||||||
|
Class FBUnityUtility = objc_lookUpClass("FBUnityUtility");
|
||||||
|
SEL selector = NSSelectorFromString(@"triggerUploadViewHierarchy");
|
||||||
|
if (FBUnityUtility && selector && [FBUnityUtility respondsToSelector:selector]) {
|
||||||
|
#pragma clang diagnostic push
|
||||||
|
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
|
||||||
|
[FBUnityUtility performSelector:selector];
|
||||||
|
#pragma clang diagnostic pop
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
[self uploadIndexing];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
+ (void)uploadIndexing
|
||||||
|
{
|
||||||
|
if (_isCodelessIndexing) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
NSString *tree = [FBSDKCodelessIndexer currentViewTree];
|
||||||
|
|
||||||
|
[self uploadIndexing:tree];
|
||||||
|
}
|
||||||
|
|
||||||
|
+ (void)uploadIndexing:(NSString *)tree
|
||||||
|
{
|
||||||
|
if (_isCodelessIndexing) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!tree) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
NSString *currentTreeHash = [FBSDKUtility SHA256Hash:tree];
|
||||||
|
if (_lastTreeHash && [_lastTreeHash isEqualToString:currentTreeHash]) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
_lastTreeHash = currentTreeHash;
|
||||||
|
|
||||||
|
NSBundle *mainBundle = [NSBundle mainBundle];
|
||||||
|
NSString *version = [mainBundle objectForInfoDictionaryKey:@"CFBundleShortVersionString"];
|
||||||
|
|
||||||
|
FBSDKGraphRequest *request = [[FBSDKGraphRequest alloc]
|
||||||
|
initWithGraphPath:[NSString stringWithFormat:@"%@/%@",
|
||||||
|
[FBSDKSettings appID], CODELESS_INDEXING_ENDPOINT]
|
||||||
|
parameters:@{
|
||||||
|
CODELESS_INDEXING_TREE_KEY: tree,
|
||||||
|
CODELESS_INDEXING_APP_VERSION_KEY: version ?: @"",
|
||||||
|
CODELESS_INDEXING_PLATFORM_KEY: @"iOS",
|
||||||
|
CODELESS_INDEXING_SESSION_ID_KEY: [self currentSessionDeviceID]
|
||||||
|
}
|
||||||
|
HTTPMethod:@"POST"];
|
||||||
|
_isCodelessIndexing = YES;
|
||||||
|
[request startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) {
|
||||||
|
_isCodelessIndexing = NO;
|
||||||
|
if ([result isKindOfClass:[NSDictionary class]]) {
|
||||||
|
_isCodelessIndexingEnabled = [result[CODELESS_INDEXING_STATUS_KEY] boolValue];
|
||||||
|
if (!_isCodelessIndexingEnabled) {
|
||||||
|
_deviceSessionID = nil;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}];
|
||||||
|
}
|
||||||
|
|
||||||
|
+ (NSString *)currentViewTree
|
||||||
|
{
|
||||||
|
NSMutableArray *trees = [NSMutableArray array];
|
||||||
|
|
||||||
|
NSArray *windows = [UIApplication sharedApplication].windows;
|
||||||
|
for (UIWindow *window in windows) {
|
||||||
|
NSDictionary *tree = [FBSDKCodelessIndexer recursiveCaptureTree:window];
|
||||||
|
if (tree) {
|
||||||
|
if (window.isKeyWindow) {
|
||||||
|
[trees insertObject:tree atIndex:0];
|
||||||
|
} else {
|
||||||
|
[trees addObject:tree];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (0 == trees.count) {
|
||||||
|
return nil;
|
||||||
|
}
|
||||||
|
|
||||||
|
NSArray *viewTrees = [trees reverseObjectEnumerator].allObjects;
|
||||||
|
|
||||||
|
NSData *data = UIImageJPEGRepresentation([FBSDKCodelessIndexer screenshot], 0.5);
|
||||||
|
NSString *screenshot = [data base64EncodedStringWithOptions:0];
|
||||||
|
|
||||||
|
NSMutableDictionary *treeInfo = [NSMutableDictionary dictionary];
|
||||||
|
|
||||||
|
treeInfo[@"view"] = viewTrees;
|
||||||
|
treeInfo[@"screenshot"] = screenshot ?: @"";
|
||||||
|
|
||||||
|
NSString *tree = nil;
|
||||||
|
data = [NSJSONSerialization dataWithJSONObject:treeInfo options:0 error:nil];
|
||||||
|
if (data) {
|
||||||
|
tree = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
|
||||||
|
}
|
||||||
|
|
||||||
|
return tree;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ (NSDictionary<NSString *, id> *)recursiveCaptureTree:(NSObject *)obj
|
||||||
|
{
|
||||||
|
if (!obj) {
|
||||||
|
return nil;
|
||||||
|
}
|
||||||
|
|
||||||
|
NSMutableDictionary *result = [FBSDKViewHierarchy getDetailAttributesOf:obj];
|
||||||
|
|
||||||
|
NSArray *children = [FBSDKViewHierarchy getChildren:obj];
|
||||||
|
NSMutableArray *childrenTrees = [NSMutableArray array];
|
||||||
|
for (NSObject *child in children) {
|
||||||
|
NSDictionary *objTree = [self recursiveCaptureTree:child];
|
||||||
|
[childrenTrees addObject:objTree];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (childrenTrees.count > 0) {
|
||||||
|
[result setValue:[childrenTrees copy] forKey:CODELESS_VIEW_TREE_CHILDREN_KEY];
|
||||||
|
}
|
||||||
|
|
||||||
|
return [result copy];
|
||||||
|
}
|
||||||
|
|
||||||
|
+ (UIImage *)screenshot {
|
||||||
|
UIWindow *window = [UIApplication sharedApplication].delegate.window;
|
||||||
|
|
||||||
|
UIGraphicsBeginImageContext(window.bounds.size);
|
||||||
|
[window drawViewHierarchyInRect:window.bounds afterScreenUpdates:YES];
|
||||||
|
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
|
||||||
|
UIGraphicsEndImageContext();
|
||||||
|
|
||||||
|
return image;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ (NSDictionary<NSString *, NSNumber *> *)dimensionOf:(NSObject *)obj
|
||||||
|
{
|
||||||
|
UIView *view = nil;
|
||||||
|
|
||||||
|
if ([obj isKindOfClass:[UIView class]]) {
|
||||||
|
view = (UIView *)obj;
|
||||||
|
} else if ([obj isKindOfClass:[UIViewController class]]) {
|
||||||
|
view = ((UIViewController *)obj).view;
|
||||||
|
}
|
||||||
|
|
||||||
|
CGRect frame = view.frame;
|
||||||
|
CGPoint offset = CGPointZero;
|
||||||
|
|
||||||
|
if ([view isKindOfClass:[UIScrollView class]])
|
||||||
|
offset = ((UIScrollView *)view).contentOffset;
|
||||||
|
|
||||||
|
return @{
|
||||||
|
CODELESS_VIEW_TREE_TOP_KEY: @((int)frame.origin.y),
|
||||||
|
CODELESS_VIEW_TREE_LEFT_KEY: @((int)frame.origin.x),
|
||||||
|
CODELESS_VIEW_TREE_WIDTH_KEY: @((int)frame.size.width),
|
||||||
|
CODELESS_VIEW_TREE_HEIGHT_KEY: @((int)frame.size.height),
|
||||||
|
CODELESS_VIEW_TREE_OFFSET_X_KEY: @((int)offset.x),
|
||||||
|
CODELESS_VIEW_TREE_OFFSET_Y_KEY: @((int)offset.y),
|
||||||
|
CODELESS_VIEW_TREE_VISIBILITY_KEY: view.isHidden ? @4 : @0
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
||||||
@ -37,12 +37,49 @@
|
|||||||
#define CODELESS_MAPPING_HINT_KEY @"hint"
|
#define CODELESS_MAPPING_HINT_KEY @"hint"
|
||||||
#define CODELESS_MAPPING_PARAMETERS_KEY @"parameters"
|
#define CODELESS_MAPPING_PARAMETERS_KEY @"parameters"
|
||||||
#define CODELESS_MAPPING_PARAMETER_NAME_KEY @"name"
|
#define CODELESS_MAPPING_PARAMETER_NAME_KEY @"name"
|
||||||
#define CODELESS_MAPPING_PARAMETER_VALUE_KEY @"value"
|
#define CODELESS_MAPPING_PARAMETER_VALUE_KEY @"value"
|
||||||
|
|
||||||
#define CODELESS_MAPPING_PARENT_CLASS_NAME @".."
|
#define CODELESS_MAPPING_PARENT_CLASS_NAME @".."
|
||||||
#define CODELESS_MAPPING_CURRENT_CLASS_NAME @"."
|
#define CODELESS_MAPPING_CURRENT_CLASS_NAME @"."
|
||||||
|
|
||||||
#define ReactNativeClassRCTView @"RCTView"
|
#define ReactNativeClassRCTView "RCTView"
|
||||||
#define ReactNativeClassRCTRootView @"RCTRootView"
|
#define ReactNativeClassRCTRootView "RCTRootView"
|
||||||
|
|
||||||
|
#define CODELESS_INDEXING_UPLOAD_INTERVAL_IN_SECONDS 1
|
||||||
|
#define CODELESS_INDEXING_STATUS_KEY @"is_app_indexing_enabled"
|
||||||
|
#define CODELESS_INDEXING_SESSION_ID_KEY @"device_session_id"
|
||||||
|
#define CODELESS_INDEXING_APP_VERSION_KEY @"app_version"
|
||||||
|
#define CODELESS_INDEXING_SDK_VERSION_KEY @"sdk_version"
|
||||||
|
#define CODELESS_INDEXING_PLATFORM_KEY @"platform"
|
||||||
|
#define CODELESS_INDEXING_TREE_KEY @"tree"
|
||||||
|
#define CODELESS_INDEXING_SCREENSHOT_KEY @"screenshot"
|
||||||
|
#define CODELESS_INDEXING_EXT_INFO_KEY @"extinfo"
|
||||||
|
|
||||||
|
#define CODELESS_INDEXING_ENDPOINT @"app_indexing"
|
||||||
|
#define CODELESS_INDEXING_SESSION_ENDPOINT @"app_indexing_session"
|
||||||
|
|
||||||
|
// keys for view tree
|
||||||
|
#define CODELESS_VIEW_TREE_CLASS_NAME_KEY @"classname"
|
||||||
|
#define CODELESS_VIEW_TREE_CLASS_TYPE_BIT_MASK_KEY @"classtypebitmask"
|
||||||
|
#define CODELESS_VIEW_TREE_TEXT_KEY @"text"
|
||||||
|
#define CODELESS_VIEW_TREE_DESC_KEY @"description"
|
||||||
|
#define CODELESS_VIEW_TREE_DIMENSION_KEY @"dimension"
|
||||||
|
#define CODELESS_VIEW_TREE_TAG_KEY @"tag"
|
||||||
|
#define CODELESS_VIEW_TREE_CHILDREN_KEY @"childviews"
|
||||||
|
#define CODELESS_VIEW_TREE_HINT_KEY @"hint"
|
||||||
|
#define CODELESS_VIEW_TREE_ACTIONS_KEY @"actions"
|
||||||
|
|
||||||
|
#define CODELESS_VIEW_TREE_TOP_KEY @"top"
|
||||||
|
#define CODELESS_VIEW_TREE_LEFT_KEY @"left"
|
||||||
|
#define CODELESS_VIEW_TREE_WIDTH_KEY @"width"
|
||||||
|
#define CODELESS_VIEW_TREE_HEIGHT_KEY @"height"
|
||||||
|
#define CODELESS_VIEW_TREE_OFFSET_X_KEY @"scrollx"
|
||||||
|
#define CODELESS_VIEW_TREE_OFFSET_Y_KEY @"scrolly"
|
||||||
|
#define CODELESS_VIEW_TREE_VISIBILITY_KEY @"visibility"
|
||||||
|
|
||||||
|
#define CODELESS_VIEW_TREE_TEXT_STYLE_KEY @"text_style"
|
||||||
|
#define CODELESS_VIEW_TREE_TEXT_IS_BOLD_KEY @"is_bold"
|
||||||
|
#define CODELESS_VIEW_TREE_TEXT_IS_ITALIC_KEY @"is_italic"
|
||||||
|
#define CODELESS_VIEW_TREE_TEXT_SIZE_KEY @"font_size"
|
||||||
|
|
||||||
#endif /* FBSDKCodelessMacros_h */
|
#endif /* FBSDKCodelessMacros_h */
|
||||||
|
|||||||
@ -25,15 +25,14 @@
|
|||||||
|
|
||||||
- (instancetype)initWithJSON:(NSDictionary *)dict {
|
- (instancetype)initWithJSON:(NSDictionary *)dict {
|
||||||
if (self = [super init]) {
|
if (self = [super init]) {
|
||||||
_name = [[dict objectForKey:CODELESS_MAPPING_PARAMETER_NAME_KEY] copy];
|
_name = [dict[CODELESS_MAPPING_PARAMETER_NAME_KEY] copy];
|
||||||
_value = [[dict objectForKey:CODELESS_MAPPING_PARAMETER_VALUE_KEY] copy];
|
_value = [dict[CODELESS_MAPPING_PARAMETER_VALUE_KEY] copy];
|
||||||
_pathType = [[dict objectForKey:CODELESS_MAPPING_PATH_TYPE_KEY] copy];
|
_pathType = [dict[CODELESS_MAPPING_PATH_TYPE_KEY] copy];
|
||||||
|
|
||||||
NSArray *ary = [dict objectForKey:CODELESS_MAPPING_PATH_KEY];
|
NSArray *ary = dict[CODELESS_MAPPING_PATH_KEY];
|
||||||
NSMutableArray *mut = [NSMutableArray array];
|
NSMutableArray *mut = [NSMutableArray array];
|
||||||
for (NSDictionary *info in ary) {
|
for (NSDictionary *info in ary) {
|
||||||
FBSDKCodelessPathComponent *component = [[FBSDKCodelessPathComponent alloc]
|
FBSDKCodelessPathComponent *component = [[FBSDKCodelessPathComponent alloc] initWithJSON:info];
|
||||||
initWithJSON:info];
|
|
||||||
[mut addObject:component];
|
[mut addObject:component];
|
||||||
}
|
}
|
||||||
_path = [mut copy];
|
_path = [mut copy];
|
||||||
|
|||||||
@ -24,32 +24,32 @@
|
|||||||
|
|
||||||
- (instancetype)initWithJSON:(NSDictionary *)dict {
|
- (instancetype)initWithJSON:(NSDictionary *)dict {
|
||||||
if (self = [super init]) {
|
if (self = [super init]) {
|
||||||
_className = [[dict objectForKey:CODELESS_MAPPING_CLASS_NAME_KEY] copy];
|
_className = [dict[CODELESS_MAPPING_CLASS_NAME_KEY] copy];
|
||||||
_text = [[dict objectForKey:CODELESS_MAPPING_TEXT_KEY] copy];
|
_text = [dict[CODELESS_MAPPING_TEXT_KEY] copy];
|
||||||
_hint = [[dict objectForKey:CODELESS_MAPPING_HINT_KEY] copy];
|
_hint = [dict[CODELESS_MAPPING_HINT_KEY] copy];
|
||||||
_desc = [[dict objectForKey:CODELESS_MAPPING_DESC_KEY] copy];
|
_desc = [dict[CODELESS_MAPPING_DESC_KEY] copy];
|
||||||
|
|
||||||
|
|
||||||
if ([dict objectForKey:CODELESS_MAPPING_INDEX_KEY]) {
|
if (dict[CODELESS_MAPPING_INDEX_KEY]) {
|
||||||
_index = [[dict objectForKey:CODELESS_MAPPING_INDEX_KEY] intValue];
|
_index = [dict[CODELESS_MAPPING_INDEX_KEY] intValue];
|
||||||
} else {
|
} else {
|
||||||
_index = -1;
|
_index = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ([dict objectForKey:CODELESS_MAPPING_SECTION_KEY]) {
|
if (dict[CODELESS_MAPPING_SECTION_KEY]) {
|
||||||
_section = [[dict objectForKey:CODELESS_MAPPING_SECTION_KEY] intValue];
|
_section = [dict[CODELESS_MAPPING_SECTION_KEY] intValue];
|
||||||
} else {
|
} else {
|
||||||
_section = -1;
|
_section = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ([dict objectForKey:CODELESS_MAPPING_ROW_KEY]) {
|
if (dict[CODELESS_MAPPING_ROW_KEY]) {
|
||||||
_row = [[dict objectForKey:CODELESS_MAPPING_ROW_KEY] intValue];
|
_row = [dict[CODELESS_MAPPING_ROW_KEY] intValue];
|
||||||
} else {
|
} else {
|
||||||
_row = -1;
|
_row = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
_tag = [[dict objectForKey:CODELESS_MAPPING_TAG_KEY] intValue];
|
_tag = [dict[CODELESS_MAPPING_TAG_KEY] intValue];
|
||||||
_matchBitmask = [[dict objectForKey:CODELESS_MAPPING_MATCH_BITMASK_KEY] intValue];
|
_matchBitmask = [dict[CODELESS_MAPPING_MATCH_BITMASK_KEY] intValue];
|
||||||
}
|
}
|
||||||
|
|
||||||
return self;
|
return self;
|
||||||
|
|||||||
@ -37,25 +37,23 @@
|
|||||||
- (FBSDKEventBinding *)initWithJSON:(NSDictionary *)dict
|
- (FBSDKEventBinding *)initWithJSON:(NSDictionary *)dict
|
||||||
{
|
{
|
||||||
if ((self = [super init])) {
|
if ((self = [super init])) {
|
||||||
_eventName = [[dict objectForKey:CODELESS_MAPPING_EVENT_NAME_KEY] copy];
|
_eventName = [dict[CODELESS_MAPPING_EVENT_NAME_KEY] copy];
|
||||||
_eventType = [[dict objectForKey:CODELESS_MAPPING_EVENT_TYPE_KEY] copy];
|
_eventType = [dict[CODELESS_MAPPING_EVENT_TYPE_KEY] copy];
|
||||||
_appVersion = [[dict objectForKey:CODELESS_MAPPING_APP_VERSION_KEY] copy];
|
_appVersion = [dict[CODELESS_MAPPING_APP_VERSION_KEY] copy];
|
||||||
_pathType = [[dict objectForKey:CODELESS_MAPPING_PATH_TYPE_KEY] copy];
|
_pathType = [dict[CODELESS_MAPPING_PATH_TYPE_KEY] copy];
|
||||||
|
|
||||||
NSArray *pathComponents = [dict objectForKey:CODELESS_MAPPING_PATH_KEY];
|
NSArray *pathComponents = dict[CODELESS_MAPPING_PATH_KEY];
|
||||||
NSMutableArray *mut = [NSMutableArray array];
|
NSMutableArray *mut = [NSMutableArray array];
|
||||||
for (NSDictionary *info in pathComponents) {
|
for (NSDictionary *info in pathComponents) {
|
||||||
FBSDKCodelessPathComponent *component = [[FBSDKCodelessPathComponent alloc]
|
FBSDKCodelessPathComponent *component = [[FBSDKCodelessPathComponent alloc] initWithJSON:info];
|
||||||
initWithJSON:info];
|
|
||||||
[mut addObject:component];
|
[mut addObject:component];
|
||||||
}
|
}
|
||||||
_path = [mut copy];
|
_path = [mut copy];
|
||||||
|
|
||||||
NSArray *parameters = [dict objectForKey:CODELESS_MAPPING_PARAMETERS_KEY];
|
NSArray *parameters = dict[CODELESS_MAPPING_PARAMETERS_KEY];
|
||||||
mut = [NSMutableArray array];
|
mut = [NSMutableArray array];
|
||||||
for (NSDictionary *info in parameters) {
|
for (NSDictionary *info in parameters) {
|
||||||
FBSDKCodelessParameterComponent *component = [[FBSDKCodelessParameterComponent alloc]
|
FBSDKCodelessParameterComponent *component = [[FBSDKCodelessParameterComponent alloc] initWithJSON:info];
|
||||||
initWithJSON:info];
|
|
||||||
[mut addObject:component];
|
[mut addObject:component];
|
||||||
}
|
}
|
||||||
_parameters = [mut copy];
|
_parameters = [mut copy];
|
||||||
@ -67,7 +65,7 @@
|
|||||||
{
|
{
|
||||||
UIView *sourceView = [sender isKindOfClass:[UIView class]] ? (UIView *)sender : nil;
|
UIView *sourceView = [sender isKindOfClass:[UIView class]] ? (UIView *)sender : nil;
|
||||||
NSMutableDictionary *params = [NSMutableDictionary dictionary];
|
NSMutableDictionary *params = [NSMutableDictionary dictionary];
|
||||||
[params setObject:@"1" forKey:CODELESS_CODELESS_EVENT_KEY];
|
params[CODELESS_CODELESS_EVENT_KEY] = @"1";
|
||||||
for (FBSDKCodelessParameterComponent *component in self.parameters) {
|
for (FBSDKCodelessParameterComponent *component in self.parameters) {
|
||||||
NSString *text = component.value;
|
NSString *text = component.value;
|
||||||
if (!text || text.length == 0) {
|
if (!text || text.length == 0) {
|
||||||
@ -78,9 +76,9 @@
|
|||||||
if (text) {
|
if (text) {
|
||||||
if ([component.name isEqualToString:PARAMETER_NAME_PRICE]) {
|
if ([component.name isEqualToString:PARAMETER_NAME_PRICE]) {
|
||||||
NSNumber *value = [FBSDKAppEventsUtility getNumberValue:text];
|
NSNumber *value = [FBSDKAppEventsUtility getNumberValue:text];
|
||||||
[params setObject:value forKey:component.name];
|
params[component.name] = value;
|
||||||
} else {
|
} else {
|
||||||
[params setObject:text forKey:component.name];
|
params[component.name] = text;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -162,8 +160,8 @@ pathComponent:(FBSDKCodelessPathComponent *)component
|
|||||||
NSInteger idxPath = path.count - i - 1;
|
NSInteger idxPath = path.count - i - 1;
|
||||||
NSInteger idxViewPath = viewPath.count - i - 1;
|
NSInteger idxViewPath = viewPath.count - i - 1;
|
||||||
|
|
||||||
FBSDKCodelessPathComponent *pathComponent = [path objectAtIndex:idxPath];
|
FBSDKCodelessPathComponent *pathComponent = path[idxPath];
|
||||||
FBSDKCodelessPathComponent *viewPathComponent = [viewPath objectAtIndex:idxViewPath];
|
FBSDKCodelessPathComponent *viewPathComponent = viewPath[idxViewPath];
|
||||||
|
|
||||||
if (![pathComponent.className isEqualToString:viewPathComponent.className]) {
|
if (![pathComponent.className isEqualToString:viewPathComponent.className]) {
|
||||||
return NO;
|
return NO;
|
||||||
@ -206,7 +204,7 @@ pathComponent:(FBSDKCodelessPathComponent *)component
|
|||||||
return nil;
|
return nil;
|
||||||
}
|
}
|
||||||
|
|
||||||
FBSDKCodelessPathComponent *pathComponent = [path objectAtIndex:level];
|
FBSDKCodelessPathComponent *pathComponent = path[level];
|
||||||
|
|
||||||
// If found parent, skip to next level
|
// If found parent, skip to next level
|
||||||
if ([pathComponent.className isEqualToString:CODELESS_MAPPING_PARENT_CLASS_NAME]) {
|
if ([pathComponent.className isEqualToString:CODELESS_MAPPING_PARENT_CLASS_NAME]) {
|
||||||
@ -232,7 +230,7 @@ pathComponent:(FBSDKCodelessPathComponent *)component
|
|||||||
if (path.count - 1 == level) {
|
if (path.count - 1 == level) {
|
||||||
int index = pathComponent.index;
|
int index = pathComponent.index;
|
||||||
if (index >= 0) {
|
if (index >= 0) {
|
||||||
NSObject *child = index < children.count ? [children objectAtIndex:index] : nil;
|
NSObject *child = index < children.count ? children[index] : nil;
|
||||||
if ([self match:child pathComponent:pathComponent]) {
|
if ([self match:child pathComponent:pathComponent]) {
|
||||||
return child;
|
return child;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -18,6 +18,8 @@
|
|||||||
|
|
||||||
#import "FBSDKEventBindingManager.h"
|
#import "FBSDKEventBindingManager.h"
|
||||||
|
|
||||||
|
#import <objc/runtime.h>
|
||||||
|
|
||||||
#import <UIKit/UIKit.h>
|
#import <UIKit/UIKit.h>
|
||||||
|
|
||||||
#import "FBSDKCodelessMacros.h"
|
#import "FBSDKCodelessMacros.h"
|
||||||
@ -27,14 +29,13 @@
|
|||||||
#import "FBSDKTypeUtility.h"
|
#import "FBSDKTypeUtility.h"
|
||||||
#import "FBSDKViewHierarchy.h"
|
#import "FBSDKViewHierarchy.h"
|
||||||
|
|
||||||
#define ReactNativeEventNameKey @"eventName"
|
#define ReactNativeTargetKey @"target"
|
||||||
#define ReactNativeViewTagKey @"viewTag"
|
#define ReactNativeTouchEndEventName @"topTouchEnd"
|
||||||
#define ReactNativeTouchEndEventName @"touchEnd"
|
|
||||||
|
|
||||||
#define ReactNativeClassRCTTextView @"RCTTextView"
|
#define ReactNativeClassRCTTextView "RCTTextView"
|
||||||
#define ReactNativeClassRCTImageView @"RCTImageVIew"
|
#define ReactNativeClassRCTImageView "RCTImageVIew"
|
||||||
#define ReactNativeClassRCTEventDispatcher @"RCTEventDispatcher"
|
#define ReactNativeClassRCTEventDispatcher "RCTEventDispatcher"
|
||||||
#define ReactNativeClassRCTTouchEvent @"RCTTouchEvent"
|
#define ReactNativeClassRCTTouchEvent "RCTTouchEvent"
|
||||||
|
|
||||||
static void fb_dispatch_on_main_thread(dispatch_block_t block) {
|
static void fb_dispatch_on_main_thread(dispatch_block_t block) {
|
||||||
dispatch_async(dispatch_get_main_queue(), block);
|
dispatch_async(dispatch_get_main_queue(), block);
|
||||||
@ -59,7 +60,7 @@ static void fb_dispatch_on_default_thread(dispatch_block_t block) {
|
|||||||
- (id)init {
|
- (id)init {
|
||||||
self = [super init];
|
self = [super init];
|
||||||
if (self) {
|
if (self) {
|
||||||
isStarted = false;
|
isStarted = NO;
|
||||||
hasReactNative = NO;
|
hasReactNative = NO;
|
||||||
reactBindings = [NSMutableDictionary dictionary];
|
reactBindings = [NSMutableDictionary dictionary];
|
||||||
|
|
||||||
@ -68,12 +69,12 @@ static void fb_dispatch_on_default_thread(dispatch_block_t block) {
|
|||||||
[classes addObject:[UITableView class]];
|
[classes addObject:[UITableView class]];
|
||||||
[classes addObject:[UICollectionView class]];
|
[classes addObject:[UICollectionView class]];
|
||||||
// ReactNative
|
// ReactNative
|
||||||
Class classRCTRootView = NSClassFromString(ReactNativeClassRCTRootView);
|
Class classRCTRootView = objc_lookUpClass(ReactNativeClassRCTRootView);
|
||||||
if (classRCTRootView != nil) {
|
if (classRCTRootView != nil) {
|
||||||
hasReactNative = YES;
|
hasReactNative = YES;
|
||||||
Class classRCTView = NSClassFromString(ReactNativeClassRCTView);
|
Class classRCTView = objc_lookUpClass(ReactNativeClassRCTView);
|
||||||
Class classRCTTextView = NSClassFromString(ReactNativeClassRCTTextView);
|
Class classRCTTextView = objc_lookUpClass(ReactNativeClassRCTTextView);
|
||||||
Class classRCTImageView = NSClassFromString(ReactNativeClassRCTImageView);
|
Class classRCTImageView = objc_lookUpClass(ReactNativeClassRCTImageView);
|
||||||
if (classRCTView) {
|
if (classRCTView) {
|
||||||
[classes addObject:classRCTView];
|
[classes addObject:classRCTView];
|
||||||
}
|
}
|
||||||
@ -121,7 +122,7 @@ static void fb_dispatch_on_default_thread(dispatch_block_t block) {
|
|||||||
if (isStarted) {
|
if (isStarted) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
isStarted = true;
|
isStarted = YES;
|
||||||
|
|
||||||
void (^blockToSuperview)(id view) = ^(id view) {
|
void (^blockToSuperview)(id view) = ^(id view) {
|
||||||
[self matchView:view delegate:nil];
|
[self matchView:view delegate:nil];
|
||||||
@ -132,45 +133,47 @@ static void fb_dispatch_on_default_thread(dispatch_block_t block) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
[FBSDKSwizzler swizzleSelector:@selector(didMoveToSuperview)
|
[FBSDKSwizzler swizzleSelector:@selector(didMoveToSuperview)
|
||||||
onClass:[UIControl class]
|
onClass:[UIControl class]
|
||||||
withBlock:blockToSuperview named:@"map_control"];
|
withBlock:blockToSuperview named:@"map_control"];
|
||||||
[FBSDKSwizzler swizzleSelector:@selector(didMoveToWindow)
|
[FBSDKSwizzler swizzleSelector:@selector(didMoveToWindow)
|
||||||
onClass:[UIControl class]
|
onClass:[UIControl class]
|
||||||
withBlock:blockToWindow named:@"map_control"];
|
withBlock:blockToWindow named:@"map_control"];
|
||||||
|
|
||||||
|
|
||||||
// ReactNative
|
// ReactNative
|
||||||
if (hasReactNative) { // If app is built via ReactNative
|
if (hasReactNative) { // If app is built via ReactNative
|
||||||
Class classRCTView = NSClassFromString(ReactNativeClassRCTView);
|
Class classRCTView = objc_lookUpClass(ReactNativeClassRCTView);
|
||||||
Class classRCTTextView = NSClassFromString(ReactNativeClassRCTTextView);
|
Class classRCTTextView = objc_lookUpClass(ReactNativeClassRCTTextView);
|
||||||
Class classRCTImageView = NSClassFromString(ReactNativeClassRCTImageView);
|
Class classRCTImageView = objc_lookUpClass(ReactNativeClassRCTImageView);
|
||||||
Class classRCTEventDispatcher = NSClassFromString(ReactNativeClassRCTEventDispatcher);
|
Class classRCTEventDispatcher = objc_lookUpClass(ReactNativeClassRCTEventDispatcher);
|
||||||
|
|
||||||
// All react-native views would be added tp RCTRootView, so no need to check didMoveToWindow
|
// All react-native views would be added tp RCTRootView, so no need to check didMoveToWindow
|
||||||
[FBSDKSwizzler swizzleSelector:@selector(didMoveToSuperview)
|
[FBSDKSwizzler swizzleSelector:@selector(didMoveToSuperview)
|
||||||
onClass:classRCTView
|
onClass:classRCTView
|
||||||
withBlock:blockToSuperview
|
withBlock:blockToSuperview
|
||||||
named:@"match_react_native"];
|
named:@"match_react_native"];
|
||||||
[FBSDKSwizzler swizzleSelector:@selector(didMoveToSuperview)
|
[FBSDKSwizzler swizzleSelector:@selector(didMoveToSuperview)
|
||||||
onClass:classRCTTextView
|
onClass:classRCTTextView
|
||||||
withBlock:blockToSuperview
|
withBlock:blockToSuperview
|
||||||
named:@"match_react_native"];
|
named:@"match_react_native"];
|
||||||
[FBSDKSwizzler swizzleSelector:@selector(didMoveToSuperview)
|
[FBSDKSwizzler swizzleSelector:@selector(didMoveToSuperview)
|
||||||
onClass:classRCTImageView
|
onClass:classRCTImageView
|
||||||
withBlock:blockToSuperview
|
withBlock:blockToSuperview
|
||||||
named:@"match_react_native"];
|
named:@"match_react_native"];
|
||||||
|
|
||||||
[FBSDKSwizzler swizzleSelector:@selector(dispatchEvent:) onClass:classRCTEventDispatcher withBlock:^(id dispatcher, SEL command, id event){
|
[FBSDKSwizzler swizzleSelector:@selector(dispatchEvent:) onClass:classRCTEventDispatcher withBlock:^(id dispatcher, SEL command, id event){
|
||||||
if ([event isKindOfClass:NSClassFromString(ReactNativeClassRCTTouchEvent)]) {
|
if ([event isKindOfClass:objc_lookUpClass(ReactNativeClassRCTTouchEvent)]) {
|
||||||
@try {
|
@try {
|
||||||
NSString *eventName = [event valueForKeyPath:ReactNativeEventNameKey];
|
NSArray<id> *eventArgs = [event arguments];
|
||||||
NSNumber *viewTag = [event valueForKeyPath:ReactNativeViewTagKey];
|
NSString *eventName = eventArgs[0];
|
||||||
|
NSArray<NSDictionary *> *touches = eventArgs[1];
|
||||||
if ([eventName isEqualToString:ReactNativeTouchEndEventName]
|
if (eventName && touches && [eventName isEqualToString:ReactNativeTouchEndEventName]) {
|
||||||
&& nil != viewTag) {
|
for (NSDictionary<NSString *, id> *touch in touches) {
|
||||||
FBSDKEventBinding *eventBinding = [self->reactBindings objectForKey:viewTag];
|
NSNumber *targetTag = touch[ReactNativeTargetKey];
|
||||||
if (eventBinding) {
|
FBSDKEventBinding *eventBinding = self->reactBindings[targetTag];
|
||||||
[eventBinding trackEvent:nil];
|
if (eventBinding) {
|
||||||
|
[eventBinding trackEvent:nil];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -193,9 +196,9 @@ static void fb_dispatch_on_default_thread(dispatch_block_t block) {
|
|||||||
[self matchView:tableView delegate:delegate];
|
[self matchView:tableView delegate:delegate];
|
||||||
};
|
};
|
||||||
[FBSDKSwizzler swizzleSelector:@selector(setDelegate:)
|
[FBSDKSwizzler swizzleSelector:@selector(setDelegate:)
|
||||||
onClass:[UITableView class]
|
onClass:[UITableView class]
|
||||||
withBlock:tableViewBlock
|
withBlock:tableViewBlock
|
||||||
named:@"match_table_view"];
|
named:@"match_table_view"];
|
||||||
// UICollectionView
|
// UICollectionView
|
||||||
void (^collectionViewBlock)(UICollectionView *collectionView,
|
void (^collectionViewBlock)(UICollectionView *collectionView,
|
||||||
SEL cmd,
|
SEL cmd,
|
||||||
@ -208,9 +211,9 @@ static void fb_dispatch_on_default_thread(dispatch_block_t block) {
|
|||||||
[self matchView:collectionView delegate:delegate];
|
[self matchView:collectionView delegate:delegate];
|
||||||
};
|
};
|
||||||
[FBSDKSwizzler swizzleSelector:@selector(setDelegate:)
|
[FBSDKSwizzler swizzleSelector:@selector(setDelegate:)
|
||||||
onClass:[UICollectionView class]
|
onClass:[UICollectionView class]
|
||||||
withBlock:collectionViewBlock
|
withBlock:collectionViewBlock
|
||||||
named:@"handle_collection_view"];
|
named:@"handle_collection_view"];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)rematchBindings {
|
- (void)rematchBindings {
|
||||||
@ -284,12 +287,17 @@ static void fb_dispatch_on_default_thread(dispatch_block_t block) {
|
|||||||
}
|
}
|
||||||
} else if (self->hasReactNative
|
} else if (self->hasReactNative
|
||||||
&& [view respondsToSelector:@selector(reactTag)]) {
|
&& [view respondsToSelector:@selector(reactTag)]) {
|
||||||
NSNumber *reactTag = [view performSelector:@selector(reactTag)];
|
|
||||||
for (FBSDKEventBinding *binding in self->eventBindings) {
|
for (FBSDKEventBinding *binding in self->eventBindings) {
|
||||||
if ([FBSDKEventBinding isPath:binding.path matchViewPath:path]) {
|
if ([FBSDKEventBinding isPath:binding.path matchViewPath:path]) {
|
||||||
fb_dispatch_on_main_thread(^{
|
fb_dispatch_on_main_thread(^{
|
||||||
if (reactTag && [reactTag isKindOfClass:[NSNumber class]]) {
|
// React Native touchable event is targeted at first subview,
|
||||||
[self->reactBindings setObject:binding forKey:reactTag];
|
// so extract the first subview and set the binding for it
|
||||||
|
UIView *reactView = view.subviews.firstObject;
|
||||||
|
if (reactView) {
|
||||||
|
NSNumber *reactTag = [FBSDKViewHierarchy getViewReactTag:reactView];
|
||||||
|
if (reactTag != nil) {
|
||||||
|
self->reactBindings[reactTag] = binding;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
@ -310,7 +318,7 @@ static void fb_dispatch_on_default_thread(dispatch_block_t block) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (matchedBindings.count > 0) {
|
if (matchedBindings.count > 0) {
|
||||||
NSArray *bindings = [matchedBindings allObjects];
|
NSArray *bindings = matchedBindings.allObjects;
|
||||||
void (^block)(id, SEL, id, id) = ^(id target, SEL command, UITableView *tableView, NSIndexPath *indexPath) {
|
void (^block)(id, SEL, id, id) = ^(id target, SEL command, UITableView *tableView, NSIndexPath *indexPath) {
|
||||||
fb_dispatch_on_main_thread(^{
|
fb_dispatch_on_main_thread(^{
|
||||||
for (FBSDKEventBinding *binding in bindings) {
|
for (FBSDKEventBinding *binding in bindings) {
|
||||||
@ -324,9 +332,9 @@ static void fb_dispatch_on_default_thread(dispatch_block_t block) {
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
[FBSDKSwizzler swizzleSelector:@selector(tableView:didSelectRowAtIndexPath:)
|
[FBSDKSwizzler swizzleSelector:@selector(tableView:didSelectRowAtIndexPath:)
|
||||||
onClass:[delegate class]
|
onClass:[delegate class]
|
||||||
withBlock:block
|
withBlock:block
|
||||||
named:@"handle_table_view"];
|
named:@"handle_table_view"];
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
} else if ([view isKindOfClass:[UICollectionView class]]
|
} else if ([view isKindOfClass:[UICollectionView class]]
|
||||||
@ -344,7 +352,7 @@ static void fb_dispatch_on_default_thread(dispatch_block_t block) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (matchedBindings.count > 0) {
|
if (matchedBindings.count > 0) {
|
||||||
NSArray *bindings = [matchedBindings allObjects];
|
NSArray *bindings = matchedBindings.allObjects;
|
||||||
void (^block)(id, SEL, id, id) = ^(id target, SEL command, UICollectionView *collectionView, NSIndexPath *indexPath) {
|
void (^block)(id, SEL, id, id) = ^(id target, SEL command, UICollectionView *collectionView, NSIndexPath *indexPath) {
|
||||||
fb_dispatch_on_main_thread(^{
|
fb_dispatch_on_main_thread(^{
|
||||||
for (FBSDKEventBinding *binding in bindings) {
|
for (FBSDKEventBinding *binding in bindings) {
|
||||||
@ -358,9 +366,9 @@ static void fb_dispatch_on_default_thread(dispatch_block_t block) {
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
[FBSDKSwizzler swizzleSelector:@selector(collectionView:didSelectItemAtIndexPath:)
|
[FBSDKSwizzler swizzleSelector:@selector(collectionView:didSelectItemAtIndexPath:)
|
||||||
onClass:[delegate class]
|
onClass:[delegate class]
|
||||||
withBlock:block
|
withBlock:block
|
||||||
named:@"handle_collection_view"];
|
named:@"handle_collection_view"];
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@ -22,12 +22,17 @@
|
|||||||
@interface FBSDKViewHierarchy : NSObject
|
@interface FBSDKViewHierarchy : NSObject
|
||||||
|
|
||||||
+ (NSObject *)getParent:(NSObject *)obj;
|
+ (NSObject *)getParent:(NSObject *)obj;
|
||||||
+ (NSArray *)getChildren:(NSObject *)obj;
|
+ (NSArray<NSObject *> *)getChildren:(NSObject *)obj;
|
||||||
+ (NSArray *)getPath:(NSObject *)obj;
|
+ (NSArray<NSObject *> *)getPath:(NSObject *)obj;
|
||||||
|
+ (NSMutableDictionary<NSString *, id> *)getDetailAttributesOf:(NSObject *)obj;
|
||||||
|
|
||||||
+ (NSString *)getText:(NSObject *)obj;
|
+ (NSString *)getText:(NSObject *)obj;
|
||||||
+ (NSString *)getHint:(NSObject *)obj;
|
+ (NSString *)getHint:(NSObject *)obj;
|
||||||
|
+ (NSIndexPath *)getIndexPath:(NSObject *)obj;
|
||||||
|
+ (NSUInteger)getClassBitmask:(NSObject *)obj;
|
||||||
+ (UITableView *)getParentTableView:(UIView *)cell;
|
+ (UITableView *)getParentTableView:(UIView *)cell;
|
||||||
+ (UICollectionView *)getParentCollectionView:(UIView *)cell;
|
+ (UICollectionView *)getParentCollectionView:(UIView *)cell;
|
||||||
|
+ (NSInteger)getTag:(NSObject *)obj;
|
||||||
|
+ (NSNumber *)getViewReactTag:(UIView *)view;
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|||||||
@ -28,9 +28,33 @@
|
|||||||
|
|
||||||
#define MAX_VIEW_HIERARCHY_LEVEL 35
|
#define MAX_VIEW_HIERARCHY_LEVEL 35
|
||||||
|
|
||||||
|
typedef NS_ENUM(NSUInteger, FBCodelessClassBitmask) {
|
||||||
|
/*! Indicates that the class is subclass of UIControl */
|
||||||
|
FBCodelessClassBitmaskUIControl = 1 << 3,
|
||||||
|
/*! Indicates that the class is subclass of UIControl */
|
||||||
|
FBCodelessClassBitmaskUIButton = 1 << 4,
|
||||||
|
/*! Indicates that the class is ReactNative Button */
|
||||||
|
FBCodelessClassBitmaskReactNativeButton = 1 << 6,
|
||||||
|
/*! Indicates that the class is UITableViewCell */
|
||||||
|
FBCodelessClassBitmaskUITableViewCell = 1 << 7,
|
||||||
|
/*! Indicates that the class is UICollectionViewCell */
|
||||||
|
FBCodelessClassBitmaskUICollectionViewCell = 1 << 8,
|
||||||
|
/*! Indicates that the class is UILabel */
|
||||||
|
FBCodelessClassBitmaskLabel = 1 << 10,
|
||||||
|
/*! Indicates that the class is UITextView or UITextField*/
|
||||||
|
FBCodelessClassBitmaskInput = 1 << 11,
|
||||||
|
/*! Indicates that the class is UIPicker*/
|
||||||
|
FBCodelessClassBitmaskPicker = 1 << 12,
|
||||||
|
/*! Indicates that the class is UISwitch*/
|
||||||
|
FBCodelessClassBitmaskSwitch = 1 << 13,
|
||||||
|
/*! Indicates that the class is UIViewController*/
|
||||||
|
FBCodelessClassBitmaskUIViewController = 1 << 17,
|
||||||
|
};
|
||||||
|
|
||||||
@implementation FBSDKViewHierarchy
|
@implementation FBSDKViewHierarchy
|
||||||
|
|
||||||
+ (NSArray*)getChildren:(NSObject*)obj {
|
+ (NSArray*)getChildren:(NSObject*)obj
|
||||||
|
{
|
||||||
if ([obj isKindOfClass:[UIControl class]]) {
|
if ([obj isKindOfClass:[UIControl class]]) {
|
||||||
return nil;
|
return nil;
|
||||||
}
|
}
|
||||||
@ -40,7 +64,7 @@
|
|||||||
// children of window should be viewcontroller
|
// children of window should be viewcontroller
|
||||||
if ([obj isKindOfClass:[UIWindow class]]) {
|
if ([obj isKindOfClass:[UIWindow class]]) {
|
||||||
UIViewController *rootVC = ((UIWindow *)obj).rootViewController;
|
UIViewController *rootVC = ((UIWindow *)obj).rootViewController;
|
||||||
NSArray *subviews = [(UIWindow *)obj subviews];
|
NSArray<UIView *> *subviews = ((UIWindow *)obj).subviews;
|
||||||
for (UIView *child in subviews) {
|
for (UIView *child in subviews) {
|
||||||
if (child != rootVC.view) {
|
if (child != rootVC.view) {
|
||||||
UIViewController *vc = [FBSDKViewHierarchy getParentViewController:child];
|
UIViewController *vc = [FBSDKViewHierarchy getParentViewController:child];
|
||||||
@ -56,7 +80,7 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if ([obj isKindOfClass:[UIView class]]) {
|
} else if ([obj isKindOfClass:[UIView class]]) {
|
||||||
NSArray *subviews = [[(UIView *)obj subviews] copy];
|
NSArray<UIView *> *subviews = [((UIView *)obj).subviews copy];
|
||||||
for (UIView *child in subviews) {
|
for (UIView *child in subviews) {
|
||||||
UIViewController *vc = [FBSDKViewHierarchy getParentViewController:child];
|
UIViewController *vc = [FBSDKViewHierarchy getParentViewController:child];
|
||||||
if (vc && vc.view == child) {
|
if (vc && vc.view == child) {
|
||||||
@ -66,8 +90,8 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if ([obj isKindOfClass:[UINavigationController class]]) {
|
} else if ([obj isKindOfClass:[UINavigationController class]]) {
|
||||||
UIViewController *vc = [(UINavigationController*)obj visibleViewController];
|
UIViewController *vc = ((UINavigationController*)obj).visibleViewController;
|
||||||
UIViewController *tc = [(UINavigationController*)obj topViewController];
|
UIViewController *tc = ((UINavigationController*)obj).topViewController;
|
||||||
NSArray *nextChildren = [FBSDKViewHierarchy getChildren:((UIViewController*)obj).view];
|
NSArray *nextChildren = [FBSDKViewHierarchy getChildren:((UIViewController*)obj).view];
|
||||||
for (NSObject *child in nextChildren) {
|
for (NSObject *child in nextChildren) {
|
||||||
if (tc && [self isView:child superViewOfView:tc.view]) {
|
if (tc && [self isView:child superViewOfView:tc.view]) {
|
||||||
@ -91,7 +115,7 @@
|
|||||||
[children addObject:vc];
|
[children addObject:vc];
|
||||||
}
|
}
|
||||||
} else if ([obj isKindOfClass:[UITabBarController class]]) {
|
} else if ([obj isKindOfClass:[UITabBarController class]]) {
|
||||||
UIViewController *vc = [(UITabBarController *)obj selectedViewController];
|
UIViewController *vc = ((UITabBarController *)obj).selectedViewController;
|
||||||
NSArray *nextChildren = [FBSDKViewHierarchy getChildren:((UIViewController*)obj).view];
|
NSArray *nextChildren = [FBSDKViewHierarchy getChildren:((UIViewController*)obj).view];
|
||||||
for (NSObject *child in nextChildren) {
|
for (NSObject *child in nextChildren) {
|
||||||
if (vc && [self isView:child superViewOfView:vc.view]) {
|
if (vc && [self isView:child superViewOfView:vc.view]) {
|
||||||
@ -116,7 +140,7 @@
|
|||||||
[children addObjectsFromArray:nextChildren];
|
[children addObjectsFromArray:nextChildren];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (NSObject *child in [vc childViewControllers]) {
|
for (NSObject *child in vc.childViewControllers) {
|
||||||
[children addObject:child];
|
[children addObject:child];
|
||||||
}
|
}
|
||||||
UIViewController *presentedVC = vc.presentedViewController;
|
UIViewController *presentedVC = vc.presentedViewController;
|
||||||
@ -130,7 +154,7 @@
|
|||||||
+ (NSObject *)getParent:(NSObject *)obj
|
+ (NSObject *)getParent:(NSObject *)obj
|
||||||
{
|
{
|
||||||
if ([obj isKindOfClass:[UIView class]]) {
|
if ([obj isKindOfClass:[UIView class]]) {
|
||||||
UIView *superview = [(UIView *)obj superview];
|
UIView *superview = ((UIView *)obj).superview;
|
||||||
UIViewController *superviewViewController = [FBSDKViewHierarchy
|
UIViewController *superviewViewController = [FBSDKViewHierarchy
|
||||||
getParentViewController:superview];
|
getParentViewController:superview];
|
||||||
if (superviewViewController && superviewViewController.view == superview) {
|
if (superviewViewController && superviewViewController.view == superview) {
|
||||||
@ -142,10 +166,10 @@
|
|||||||
}
|
}
|
||||||
else if ([obj isKindOfClass:[UIViewController class]]) {
|
else if ([obj isKindOfClass:[UIViewController class]]) {
|
||||||
UIViewController *vc = (UIViewController *)obj;
|
UIViewController *vc = (UIViewController *)obj;
|
||||||
UIViewController *parentVC = [vc parentViewController];
|
UIViewController *parentVC = vc.parentViewController;
|
||||||
UIViewController *presentingVC = [vc presentingViewController];
|
UIViewController *presentingVC = vc.presentingViewController;
|
||||||
UINavigationController *nav = [vc navigationController];
|
UINavigationController *nav = vc.navigationController;
|
||||||
UITabBarController *tab = [vc tabBarController];
|
UITabBarController *tab = vc.tabBarController;
|
||||||
|
|
||||||
if (nav) {
|
if (nav) {
|
||||||
return nav;
|
return nav;
|
||||||
@ -159,7 +183,7 @@
|
|||||||
return parentVC;
|
return parentVC;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (presentingVC && [presentingVC presentedViewController] == vc) {
|
if (presentingVC && presentingVC.presentedViewController == vc) {
|
||||||
return presentingVC;
|
return presentingVC;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -172,11 +196,13 @@
|
|||||||
return nil;
|
return nil;
|
||||||
}
|
}
|
||||||
|
|
||||||
+ (NSArray *)getPath:(NSObject *)obj {
|
+ (NSArray *)getPath:(NSObject *)obj
|
||||||
|
{
|
||||||
return [FBSDKViewHierarchy getPath:obj limit:MAX_VIEW_HIERARCHY_LEVEL];
|
return [FBSDKViewHierarchy getPath:obj limit:MAX_VIEW_HIERARCHY_LEVEL];
|
||||||
}
|
}
|
||||||
|
|
||||||
+ (NSArray *)getPath:(NSObject *)obj limit:(int)limit {
|
+ (NSArray *)getPath:(NSObject *)obj limit:(int)limit
|
||||||
|
{
|
||||||
if (!obj || limit <= 0) {
|
if (!obj || limit <= 0) {
|
||||||
return nil;
|
return nil;
|
||||||
}
|
}
|
||||||
@ -191,61 +217,7 @@
|
|||||||
path = [NSMutableArray array];
|
path = [NSMutableArray array];
|
||||||
}
|
}
|
||||||
|
|
||||||
NSMutableDictionary *componentInfo = [NSMutableDictionary dictionary];
|
NSDictionary *componentInfo = [FBSDKViewHierarchy getAttributesOf:obj parent:parent];
|
||||||
[componentInfo setObject:NSStringFromClass([obj class])
|
|
||||||
forKey:CODELESS_MAPPING_CLASS_NAME_KEY];
|
|
||||||
|
|
||||||
NSString *text = [FBSDKViewHierarchy getText:obj];
|
|
||||||
if (text) {
|
|
||||||
[componentInfo setObject:text forKey:CODELESS_MAPPING_TEXT_KEY];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (parent != nil) {
|
|
||||||
NSArray *children = [FBSDKViewHierarchy getChildren:parent];
|
|
||||||
NSUInteger index = [children indexOfObject:obj];
|
|
||||||
if (index != NSNotFound) {
|
|
||||||
[componentInfo setObject:@(index)
|
|
||||||
forKey:CODELESS_MAPPING_INDEX_KEY];
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
[componentInfo setObject:@0 forKey:CODELESS_MAPPING_INDEX_KEY];
|
|
||||||
}
|
|
||||||
|
|
||||||
if ([obj isKindOfClass:[UIView class]]) {
|
|
||||||
[componentInfo setObject:@(((UIView *)obj).tag)
|
|
||||||
forKey:CODELESS_MAPPING_TAG_KEY];
|
|
||||||
|
|
||||||
// Handle UITableViewCell & UICollectionViewCell
|
|
||||||
if ([obj isKindOfClass:[UITableViewCell class]]) {
|
|
||||||
UITableView *tableView = [FBSDKViewHierarchy getParentTableView:(UIView *)obj];
|
|
||||||
NSIndexPath *indexPath = [tableView indexPathForCell:(UITableViewCell *)obj];
|
|
||||||
if (indexPath) {
|
|
||||||
[componentInfo setObject:@(indexPath.section)
|
|
||||||
forKey:CODELESS_MAPPING_SECTION_KEY];
|
|
||||||
[componentInfo setObject:@(indexPath.row)
|
|
||||||
forKey:CODELESS_MAPPING_ROW_KEY];
|
|
||||||
}
|
|
||||||
} else if ([obj isKindOfClass:[UICollectionViewCell class]]) {
|
|
||||||
UICollectionView *collectionView = [FBSDKViewHierarchy getParentCollectionView:(UIView *)obj];
|
|
||||||
NSIndexPath *indexPath = [collectionView indexPathForCell:(UICollectionViewCell *)obj];
|
|
||||||
if (indexPath) {
|
|
||||||
[componentInfo setObject:@(indexPath.section)
|
|
||||||
forKey:CODELESS_MAPPING_SECTION_KEY];
|
|
||||||
[componentInfo setObject:@(indexPath.row)
|
|
||||||
forKey:CODELESS_MAPPING_ROW_KEY];
|
|
||||||
}
|
|
||||||
} else if ([obj isKindOfClass:[UITextField class]]) {
|
|
||||||
NSString *hint = [FBSDKViewHierarchy getHint:obj];
|
|
||||||
if (hint) {
|
|
||||||
[componentInfo setObject:hint forKey:CODELESS_MAPPING_HINT_KEY];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if ([obj isKindOfClass:[UINavigationController class]]) {
|
|
||||||
NSString *hint = [FBSDKViewHierarchy getHint:obj];
|
|
||||||
if (hint) {
|
|
||||||
[componentInfo setObject:hint forKey:CODELESS_MAPPING_HINT_KEY];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
FBSDKCodelessPathComponent *pathComponent = [[FBSDKCodelessPathComponent alloc]
|
FBSDKCodelessPathComponent *pathComponent = [[FBSDKCodelessPathComponent alloc]
|
||||||
initWithJSON:componentInfo];
|
initWithJSON:componentInfo];
|
||||||
@ -254,18 +226,114 @@
|
|||||||
return [NSArray arrayWithArray:path];
|
return [NSArray arrayWithArray:path];
|
||||||
}
|
}
|
||||||
|
|
||||||
+ (NSString *)getText:(NSObject *)obj {
|
+ (NSDictionary<NSString *, id> *)getAttributesOf:(NSObject *)obj parent:(NSObject *)parent
|
||||||
|
{
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
NSString *hint = [FBSDKViewHierarchy getHint:obj];
|
||||||
|
if (hint) {
|
||||||
|
componentInfo[CODELESS_MAPPING_HINT_KEY] = hint;
|
||||||
|
}
|
||||||
|
|
||||||
|
NSIndexPath *indexPath = [FBSDKViewHierarchy getIndexPath:obj];
|
||||||
|
if (indexPath) {
|
||||||
|
componentInfo[CODELESS_MAPPING_SECTION_KEY] = @(indexPath.section);
|
||||||
|
componentInfo[CODELESS_MAPPING_ROW_KEY] = @(indexPath.row);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (parent != nil) {
|
||||||
|
NSArray *children = [FBSDKViewHierarchy getChildren:parent];
|
||||||
|
NSUInteger index = [children indexOfObject:obj];
|
||||||
|
if (index != NSNotFound) {
|
||||||
|
componentInfo[CODELESS_MAPPING_INDEX_KEY] = @(index);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
componentInfo[CODELESS_MAPPING_INDEX_KEY] = @0;
|
||||||
|
}
|
||||||
|
|
||||||
|
componentInfo[CODELESS_VIEW_TREE_TAG_KEY] = @([FBSDKViewHierarchy getTag:obj]);
|
||||||
|
|
||||||
|
return [componentInfo copy];
|
||||||
|
}
|
||||||
|
|
||||||
|
+ (NSMutableDictionary<NSString *, id> *)getDetailAttributesOf:(NSObject *)obj
|
||||||
|
{
|
||||||
|
if (!obj) {
|
||||||
|
return nil;
|
||||||
|
}
|
||||||
|
|
||||||
|
NSObject *parent = [FBSDKViewHierarchy getParent:obj];
|
||||||
|
|
||||||
|
NSDictionary *simpleAttributes = [FBSDKViewHierarchy getAttributesOf:obj parent:parent];
|
||||||
|
|
||||||
|
NSMutableDictionary *result = [NSMutableDictionary dictionaryWithDictionary:simpleAttributes];
|
||||||
|
|
||||||
|
NSString *className = NSStringFromClass([obj class]);
|
||||||
|
result[CODELESS_VIEW_TREE_CLASS_NAME_KEY] = className;
|
||||||
|
|
||||||
|
NSUInteger classBitmask = [FBSDKViewHierarchy getClassBitmask:obj];
|
||||||
|
result[CODELESS_VIEW_TREE_CLASS_TYPE_BIT_MASK_KEY] = [NSString stringWithFormat:@"%lu", (unsigned long)classBitmask];
|
||||||
|
|
||||||
|
if ([obj isKindOfClass:[UIControl class]]) {
|
||||||
|
// Get actions of UIControl
|
||||||
|
UIControl *control = (UIControl *)obj;
|
||||||
|
NSMutableSet *actions = [NSMutableSet set];
|
||||||
|
NSSet *targets = control.allTargets;
|
||||||
|
for (NSObject *target in targets) {
|
||||||
|
NSArray *ary = [control actionsForTarget:target forControlEvent:0];
|
||||||
|
if (ary.count > 0) {
|
||||||
|
[actions addObjectsFromArray:ary];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (targets.count > 0) {
|
||||||
|
result[CODELESS_VIEW_TREE_ACTIONS_KEY] = actions.allObjects;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
result[CODELESS_VIEW_TREE_DIMENSION_KEY] = [FBSDKViewHierarchy getDimensionOf:obj];
|
||||||
|
|
||||||
|
NSDictionary<NSString *, id> *textStyle = [FBSDKViewHierarchy getTextStyle:obj];
|
||||||
|
if (textStyle) {
|
||||||
|
result[CODELESS_VIEW_TREE_TEXT_STYLE_KEY] = textStyle;
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ (NSIndexPath *)getIndexPath:(NSObject *)obj
|
||||||
|
{
|
||||||
|
NSIndexPath *indexPath = nil;
|
||||||
|
|
||||||
|
if ([obj isKindOfClass:[UITableViewCell class]]) {
|
||||||
|
UITableView *tableView = [FBSDKViewHierarchy getParentTableView:(UIView *)obj];
|
||||||
|
indexPath = [tableView indexPathForCell:(UITableViewCell *)obj];
|
||||||
|
} else if ([obj isKindOfClass:[UICollectionViewCell class]]) {
|
||||||
|
UICollectionView *collectionView = [FBSDKViewHierarchy getParentCollectionView:(UIView *)obj];
|
||||||
|
indexPath = [collectionView indexPathForCell:(UICollectionViewCell *)obj];
|
||||||
|
}
|
||||||
|
|
||||||
|
return indexPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ (NSString *)getText:(NSObject *)obj
|
||||||
|
{
|
||||||
NSString *text = nil;
|
NSString *text = nil;
|
||||||
|
|
||||||
if ([obj isKindOfClass:[UIButton class]]) {
|
if ([obj isKindOfClass:[UIButton class]]) {
|
||||||
text = [(UIButton *)obj currentTitle];
|
text = ((UIButton *)obj).currentTitle;
|
||||||
} else if ([obj isKindOfClass:[UITextView class]] ||
|
} else if ([obj isKindOfClass:[UITextView class]] ||
|
||||||
[obj isKindOfClass:[UITextField class]] ||
|
[obj isKindOfClass:[UITextField class]] ||
|
||||||
[obj isKindOfClass:[UILabel class]]) {
|
[obj isKindOfClass:[UILabel class]]) {
|
||||||
text = [(UILabel *)obj text];
|
text = ((UILabel *)obj).text;
|
||||||
} else if ([obj isKindOfClass:[UIPickerView class]]) {
|
} else if ([obj isKindOfClass:[UIPickerView class]]) {
|
||||||
UIPickerView *picker = (UIPickerView *)obj;
|
UIPickerView *picker = (UIPickerView *)obj;
|
||||||
NSInteger sections = [picker numberOfComponents];
|
NSInteger sections = picker.numberOfComponents;
|
||||||
NSMutableArray *titles = [NSMutableArray array];
|
NSMutableArray *titles = [NSMutableArray array];
|
||||||
|
|
||||||
for (NSInteger i = 0; i < sections; i++) {
|
for (NSInteger i = 0; i < sections; i++) {
|
||||||
@ -276,9 +344,9 @@
|
|||||||
title = [picker.delegate pickerView:picker titleForRow:row forComponent:i];
|
title = [picker.delegate pickerView:picker titleForRow:row forComponent:i];
|
||||||
} else if ([picker.delegate
|
} else if ([picker.delegate
|
||||||
respondsToSelector:@selector(pickerView:attributedTitleForRow:forComponent:)]) {
|
respondsToSelector:@selector(pickerView:attributedTitleForRow:forComponent:)]) {
|
||||||
title = [[picker.delegate
|
title = [picker.delegate
|
||||||
pickerView:picker
|
pickerView:picker
|
||||||
attributedTitleForRow:row forComponent:i] string];
|
attributedTitleForRow:row forComponent:i].string;
|
||||||
}
|
}
|
||||||
[titles addObject:title ?: @""];
|
[titles addObject:title ?: @""];
|
||||||
}
|
}
|
||||||
@ -291,23 +359,23 @@
|
|||||||
} else if ([obj isKindOfClass:[UIDatePicker class]]) {
|
} else if ([obj isKindOfClass:[UIDatePicker class]]) {
|
||||||
UIDatePicker *picker = (UIDatePicker *)obj;
|
UIDatePicker *picker = (UIDatePicker *)obj;
|
||||||
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
|
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
|
||||||
[formatter setDateFormat:@"yyyy-MM-dd HH:mm:ssZ"];
|
formatter.dateFormat = @"yyyy-MM-dd HH:mm:ssZ";
|
||||||
text = [formatter stringFromDate:picker.date];
|
text = [formatter stringFromDate:picker.date];
|
||||||
} else if ([obj isKindOfClass:NSClassFromString(@"RCTTextView")]) {
|
} else if ([obj isKindOfClass:objc_lookUpClass("RCTTextView")]) {
|
||||||
NSTextStorage *textStorage = [FBSDKAppEventsUtility getVariable:@"_textStorage"
|
NSTextStorage *textStorage = [FBSDKAppEventsUtility getVariable:@"_textStorage"
|
||||||
fromInstance:obj];
|
fromInstance:obj];
|
||||||
if (textStorage) {
|
if (textStorage) {
|
||||||
text = [textStorage string];
|
text = textStorage.string;
|
||||||
}
|
}
|
||||||
} else if ([obj isKindOfClass:NSClassFromString(@"RCTBaseTextInputView")]) {
|
} else if ([obj isKindOfClass:objc_lookUpClass("RCTBaseTextInputView")]) {
|
||||||
NSAttributedString *attributedText = [FBSDKAppEventsUtility getVariable:@"attributedText"
|
NSAttributedString *attributedText = [FBSDKAppEventsUtility getVariable:@"attributedText"
|
||||||
fromInstance:obj];
|
fromInstance:obj];
|
||||||
text = [attributedText string];
|
text = attributedText.string;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ([obj conformsToProtocol:@protocol(UITextInput)]) {
|
if ([obj conformsToProtocol:@protocol(UITextInput)]) {
|
||||||
id<UITextInput> input = (id<UITextInput>)obj;
|
id<UITextInput> input = (id<UITextInput>)obj;
|
||||||
if ([input isSecureTextEntry]) {
|
if (input.secureTextEntry) {
|
||||||
text = nil;
|
text = nil;
|
||||||
} else {
|
} else {
|
||||||
switch (input.keyboardType) {
|
switch (input.keyboardType) {
|
||||||
@ -320,16 +388,50 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ([FBSDKAppEventsUtility isSensitiveUserData:text]) {
|
||||||
|
return nil;
|
||||||
|
}
|
||||||
|
|
||||||
return text.length > 0 ? text : nil;
|
return text.length > 0 ? text : nil;
|
||||||
}
|
}
|
||||||
|
|
||||||
+ (NSString *)getHint:(NSObject *)obj {
|
+ (NSDictionary<NSString *, id> *)getTextStyle:(NSObject *)obj
|
||||||
|
{
|
||||||
|
UIFont *font = nil;
|
||||||
|
if ([obj isKindOfClass:[UIButton class]]) {
|
||||||
|
font = ((UIButton *)obj).titleLabel.font;
|
||||||
|
} else if ([obj isKindOfClass:[UILabel class]]) {
|
||||||
|
font = ((UILabel *)obj).font;
|
||||||
|
} else if ([obj isKindOfClass:[UITextField class]]) {
|
||||||
|
font = ((UITextField *)obj).font;
|
||||||
|
} else if ([obj isKindOfClass:[UITextView class]]) {
|
||||||
|
font = ((UITextView *)obj).font;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (font) {
|
||||||
|
UIFontDescriptorSymbolicTraits traits = font.fontDescriptor.symbolicTraits;
|
||||||
|
BOOL isBold = (traits & UIFontDescriptorTraitBold) != 0;
|
||||||
|
BOOL isItalic = (traits & UIFontDescriptorTraitItalic) != 0;
|
||||||
|
CGFloat fontSize = font.pointSize;
|
||||||
|
|
||||||
|
return @{
|
||||||
|
CODELESS_VIEW_TREE_TEXT_IS_BOLD_KEY: @(isBold),
|
||||||
|
CODELESS_VIEW_TREE_TEXT_IS_ITALIC_KEY: @(isItalic),
|
||||||
|
CODELESS_VIEW_TREE_TEXT_SIZE_KEY: @(fontSize)
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ (NSString *)getHint:(NSObject *)obj
|
||||||
|
{
|
||||||
NSString *hint = nil;
|
NSString *hint = nil;
|
||||||
|
|
||||||
if ([obj isKindOfClass:[UITextField class]]) {
|
if ([obj isKindOfClass:[UITextField class]]) {
|
||||||
hint = [(UITextField *)obj placeholder];
|
hint = ((UITextField *)obj).placeholder;
|
||||||
} else if ([obj isKindOfClass:[UINavigationController class]]) {
|
} else if ([obj isKindOfClass:[UINavigationController class]]) {
|
||||||
UIViewController *top = [(UINavigationController *)obj topViewController];
|
UIViewController *top = ((UINavigationController *)obj).topViewController;
|
||||||
if (top) {
|
if (top) {
|
||||||
hint = NSStringFromClass([top class]);
|
hint = NSStringFromClass([top class]);
|
||||||
}
|
}
|
||||||
@ -338,7 +440,86 @@
|
|||||||
return hint.length > 0 ? hint : nil;
|
return hint.length > 0 ? hint : nil;
|
||||||
}
|
}
|
||||||
|
|
||||||
+ (BOOL)isView:(NSObject *)obj1 superViewOfView:(UIView *)obj2 {
|
+ (NSUInteger)getClassBitmask:(NSObject *)obj
|
||||||
|
{
|
||||||
|
NSUInteger bitmask = 0;
|
||||||
|
|
||||||
|
if ([obj isKindOfClass:[UIView class]]) {
|
||||||
|
if ([obj isKindOfClass:[UIControl class]]) {
|
||||||
|
bitmask |= FBCodelessClassBitmaskUIControl;
|
||||||
|
if ([obj isKindOfClass:[UIButton class]]) {
|
||||||
|
bitmask |= FBCodelessClassBitmaskUIButton;
|
||||||
|
} else if ([obj isKindOfClass:[UISwitch class]]) {
|
||||||
|
bitmask |= FBCodelessClassBitmaskSwitch;
|
||||||
|
}else if ([obj isKindOfClass:[UIDatePicker class]]) {
|
||||||
|
bitmask |= FBCodelessClassBitmaskPicker;
|
||||||
|
}
|
||||||
|
} else if ([obj isKindOfClass:[UITableViewCell class]]) {
|
||||||
|
bitmask |= FBCodelessClassBitmaskUITableViewCell;
|
||||||
|
} else if ([obj isKindOfClass:[UICollectionViewCell class]]) {
|
||||||
|
bitmask |= FBCodelessClassBitmaskUICollectionViewCell;
|
||||||
|
} else if ([obj isKindOfClass:[UIPickerView class]]) {
|
||||||
|
bitmask |= FBCodelessClassBitmaskPicker;
|
||||||
|
} else if ([obj isKindOfClass:[UILabel class]]) {
|
||||||
|
bitmask |= FBCodelessClassBitmaskLabel;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ([FBSDKViewHierarchy isRCTButton:((UIView *)obj)]) {
|
||||||
|
bitmask |= FBCodelessClassBitmaskReactNativeButton;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check selector of UITextInput protocol instead of checking conformsToProtocol
|
||||||
|
if ([obj respondsToSelector:@selector(textInRange:)]) {
|
||||||
|
bitmask |= FBCodelessClassBitmaskInput;
|
||||||
|
}
|
||||||
|
} else if ([obj isKindOfClass:[UIViewController class]]) {
|
||||||
|
bitmask |= FBCodelessClassBitmaskUIViewController;
|
||||||
|
}
|
||||||
|
|
||||||
|
return bitmask;
|
||||||
|
}
|
||||||
|
|
||||||
|
#pragma clang diagnostic push
|
||||||
|
#pragma clang diagnostic ignored "-Wundeclared-selector"
|
||||||
|
+ (BOOL)isRCTButton:(UIView *)view
|
||||||
|
{
|
||||||
|
if (view == nil) {
|
||||||
|
return NO;
|
||||||
|
}
|
||||||
|
|
||||||
|
Class classRCTView = objc_lookUpClass(ReactNativeClassRCTView);
|
||||||
|
if (classRCTView && [view isKindOfClass:classRCTView] &&
|
||||||
|
[view respondsToSelector:@selector(reactTagAtPoint:)] &&
|
||||||
|
[view respondsToSelector:@selector(reactTag)] &&
|
||||||
|
view.userInteractionEnabled) {
|
||||||
|
NSNumber *reactTag = [view performSelector:@selector(reactTagAtPoint:)
|
||||||
|
withObject:[NSValue valueWithCGPoint:view.frame.origin]];
|
||||||
|
// We get the reactTag at upper left of the view and thus check with its first subview
|
||||||
|
UIView *subView = view.subviews.firstObject;
|
||||||
|
NSNumber *subViewReactTag = [FBSDKViewHierarchy getViewReactTag:subView];
|
||||||
|
if (reactTag != nil && subViewReactTag != nil && ![subView isKindOfClass:classRCTView] && [reactTag isEqualToNumber:subViewReactTag]) {
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return NO;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ (NSNumber *)getViewReactTag:(UIView *)view
|
||||||
|
{
|
||||||
|
if (view != nil && [view respondsToSelector:@selector(reactTag)]) {
|
||||||
|
NSNumber *reactTag = [view performSelector:@selector(reactTag)];
|
||||||
|
if (reactTag != nil && [reactTag isKindOfClass:[NSNumber class]]) {
|
||||||
|
return reactTag;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil;
|
||||||
|
}
|
||||||
|
#pragma clang diagnostic pop
|
||||||
|
|
||||||
|
+ (BOOL)isView:(NSObject *)obj1 superViewOfView:(UIView *)obj2
|
||||||
|
{
|
||||||
if (![obj1 isKindOfClass:[UIView class]]
|
if (![obj1 isKindOfClass:[UIView class]]
|
||||||
|| ![obj2 isKindOfClass:[UIView class]]) {
|
|| ![obj2 isKindOfClass:[UIView class]]) {
|
||||||
return NO;
|
return NO;
|
||||||
@ -347,7 +528,7 @@
|
|||||||
UIView *view2 = (UIView *)obj2;
|
UIView *view2 = (UIView *)obj2;
|
||||||
UIView *superview = view2;
|
UIView *superview = view2;
|
||||||
while (superview) {
|
while (superview) {
|
||||||
superview = [superview superview];
|
superview = superview.superview;
|
||||||
if (superview == view1) {
|
if (superview == view1) {
|
||||||
return YES;
|
return YES;
|
||||||
}
|
}
|
||||||
@ -356,11 +537,12 @@
|
|||||||
return NO;
|
return NO;
|
||||||
}
|
}
|
||||||
|
|
||||||
+ (UIViewController *)getParentViewController:(UIView *)view {
|
+ (UIViewController *)getParentViewController:(UIView *)view
|
||||||
|
{
|
||||||
UIResponder *parentResponder = view;
|
UIResponder *parentResponder = view;
|
||||||
|
|
||||||
while (parentResponder) {
|
while (parentResponder) {
|
||||||
parentResponder = [parentResponder nextResponder];
|
parentResponder = parentResponder.nextResponder;
|
||||||
if ([parentResponder isKindOfClass:[UIViewController class]]) {
|
if ([parentResponder isKindOfClass:[UIViewController class]]) {
|
||||||
return (UIViewController *)parentResponder;
|
return (UIViewController *)parentResponder;
|
||||||
}
|
}
|
||||||
@ -369,26 +551,66 @@
|
|||||||
return nil;
|
return nil;
|
||||||
}
|
}
|
||||||
|
|
||||||
+ (UITableView *)getParentTableView:(UIView *)cell {
|
+ (UITableView *)getParentTableView:(UIView *)cell
|
||||||
|
{
|
||||||
UIView *superview = cell.superview;
|
UIView *superview = cell.superview;
|
||||||
while (superview) {
|
while (superview) {
|
||||||
if ([superview isKindOfClass:[UITableView class]]) {
|
if ([superview isKindOfClass:[UITableView class]]) {
|
||||||
return (UITableView *)superview;
|
return (UITableView *)superview;
|
||||||
}
|
}
|
||||||
superview = [superview superview];
|
superview = superview.superview;
|
||||||
}
|
}
|
||||||
return nil;
|
return nil;
|
||||||
}
|
}
|
||||||
|
|
||||||
+ (UICollectionView *)getParentCollectionView:(UIView *)cell {
|
+ (UICollectionView *)getParentCollectionView:(UIView *)cell
|
||||||
|
{
|
||||||
UIView *superview = cell.superview;
|
UIView *superview = cell.superview;
|
||||||
while (superview) {
|
while (superview) {
|
||||||
if ([superview isKindOfClass:[UICollectionView class]]) {
|
if ([superview isKindOfClass:[UICollectionView class]]) {
|
||||||
return (UICollectionView *)superview;
|
return (UICollectionView *)superview;
|
||||||
}
|
}
|
||||||
superview = [superview superview];
|
superview = superview.superview;
|
||||||
}
|
}
|
||||||
return nil;
|
return nil;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
+ (NSInteger)getTag:(NSObject *)obj
|
||||||
|
{
|
||||||
|
if ([obj isKindOfClass:[UIView class]]) {
|
||||||
|
return ((UIView *)obj).tag;
|
||||||
|
} else if ([obj isKindOfClass:[UIViewController class]]) {
|
||||||
|
return ((UIViewController *)obj).view.tag;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ (NSDictionary<NSString *, NSNumber *> *)getDimensionOf:(NSObject *)obj
|
||||||
|
{
|
||||||
|
UIView *view = nil;
|
||||||
|
|
||||||
|
if ([obj isKindOfClass:[UIView class]]) {
|
||||||
|
view = (UIView *)obj;
|
||||||
|
} else if ([obj isKindOfClass:[UIViewController class]]) {
|
||||||
|
view = ((UIViewController *)obj).view;
|
||||||
|
}
|
||||||
|
|
||||||
|
CGRect frame = view.frame;
|
||||||
|
CGPoint offset = CGPointZero;
|
||||||
|
|
||||||
|
if ([view isKindOfClass:[UIScrollView class]])
|
||||||
|
offset = ((UIScrollView *)view).contentOffset;
|
||||||
|
|
||||||
|
return @{
|
||||||
|
CODELESS_VIEW_TREE_TOP_KEY: @((int)frame.origin.y),
|
||||||
|
CODELESS_VIEW_TREE_LEFT_KEY: @((int)frame.origin.x),
|
||||||
|
CODELESS_VIEW_TREE_WIDTH_KEY: @((int)frame.size.width),
|
||||||
|
CODELESS_VIEW_TREE_HEIGHT_KEY: @((int)frame.size.height),
|
||||||
|
CODELESS_VIEW_TREE_OFFSET_X_KEY: @((int)offset.x),
|
||||||
|
CODELESS_VIEW_TREE_OFFSET_Y_KEY: @((int)offset.y),
|
||||||
|
CODELESS_VIEW_TREE_VISIBILITY_KEY: view.isHidden ? @4 : @0
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|||||||
@ -17,7 +17,6 @@
|
|||||||
// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
#import <FBSDKCoreKit/FBSDKAppEvents.h>
|
#import <FBSDKCoreKit/FBSDKAppEvents.h>
|
||||||
#import <FBSDKCoreKit/FBSDKMacros.h>
|
|
||||||
|
|
||||||
#import "FBSDKAppEventsUtility.h"
|
#import "FBSDKAppEventsUtility.h"
|
||||||
|
|
||||||
@ -25,178 +24,178 @@
|
|||||||
|
|
||||||
// Internally known event names
|
// Internally known event names
|
||||||
|
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventNamePurchased;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventNamePurchased;
|
||||||
|
|
||||||
/** Use to log that the share dialog was launched */
|
/** Use to log that the share dialog was launched */
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventNameShareSheetLaunch;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventNameShareSheetLaunch;
|
||||||
|
|
||||||
/** Use to log that the share dialog was dismissed */
|
/** Use to log that the share dialog was dismissed */
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventNameShareSheetDismiss;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventNameShareSheetDismiss;
|
||||||
|
|
||||||
/** Use to log that the permissions UI was launched */
|
/** Use to log that the permissions UI was launched */
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventNamePermissionsUILaunch;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventNamePermissionsUILaunch;
|
||||||
|
|
||||||
/** Use to log that the permissions UI was dismissed */
|
/** Use to log that the permissions UI was dismissed */
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventNamePermissionsUIDismiss;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventNamePermissionsUIDismiss;
|
||||||
|
|
||||||
/** Use to log that the login view was used */
|
/** Use to log that the login view was used */
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventNameLoginViewUsage;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventNameLoginViewUsage;
|
||||||
|
|
||||||
/*! Use to log that the share tray launched. */
|
/*! Use to log that the share tray launched. */
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventNameShareTrayDidLaunch;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventNameShareTrayDidLaunch;
|
||||||
|
|
||||||
/*! Use to log that the person selected a sharing target. */
|
/*! Use to log that the person selected a sharing target. */
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventNameShareTrayDidSelectActivity;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventNameShareTrayDidSelectActivity;
|
||||||
|
|
||||||
// Internally known event parameters
|
// Internally known event parameters
|
||||||
|
|
||||||
/** String parameter specifying the outcome of a dialog invocation */
|
/** String parameter specifying the outcome of a dialog invocation */
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventParameterDialogOutcome;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventParameterDialogOutcome;
|
||||||
|
|
||||||
/** Parameter key used to specify which application launches this application. */
|
/** Parameter key used to specify which application launches this application. */
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventParameterLaunchSource;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventParameterLaunchSource;
|
||||||
|
|
||||||
/** Use to log the result of a call to FBDialogs presentShareDialogWithParams: */
|
/** Use to log the result of a call to FBDialogs presentShareDialogWithParams: */
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventNameFBDialogsPresentShareDialog;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventNameFBDialogsPresentShareDialog;
|
||||||
|
|
||||||
/** Use to log the result of a call to FBDialogs presentShareDialogWithOpenGraphActionParams: */
|
/** Use to log the result of a call to FBDialogs presentShareDialogWithOpenGraphActionParams: */
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventNameFBDialogsPresentShareDialogOG;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventNameFBDialogsPresentShareDialogOG;
|
||||||
|
|
||||||
/** Use to log the result of a call to FBDialogs presentLikeDialogWithLikeParams: */
|
/** Use to log the result of a call to FBDialogs presentLikeDialogWithLikeParams: */
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventNameFBDialogsPresentLikeDialogOG;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventNameFBDialogsPresentLikeDialogOG;
|
||||||
|
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventNameFBDialogsPresentShareDialogPhoto;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventNameFBDialogsPresentShareDialogPhoto;
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventNameFBDialogsPresentMessageDialog;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventNameFBDialogsPresentMessageDialog;
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventNameFBDialogsPresentMessageDialogPhoto;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventNameFBDialogsPresentMessageDialogPhoto;
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventNameFBDialogsPresentMessageDialogOG;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventNameFBDialogsPresentMessageDialogOG;
|
||||||
|
|
||||||
/** Use to log the start of an auth request that cannot be fulfilled by the token cache */
|
/** Use to log the start of an auth request that cannot be fulfilled by the token cache */
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventNameFBSessionAuthStart;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventNameFBSessionAuthStart;
|
||||||
|
|
||||||
/** Use to log the end of an auth request that was not fulfilled by the token cache */
|
/** Use to log the end of an auth request that was not fulfilled by the token cache */
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventNameFBSessionAuthEnd;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventNameFBSessionAuthEnd;
|
||||||
|
|
||||||
/** Use to log the start of a specific auth method as part of an auth request */
|
/** Use to log the start of a specific auth method as part of an auth request */
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventNameFBSessionAuthMethodStart;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventNameFBSessionAuthMethodStart;
|
||||||
|
|
||||||
/** Use to log the end of the last tried auth method as part of an auth request */
|
/** Use to log the end of the last tried auth method as part of an auth request */
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventNameFBSessionAuthMethodEnd;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventNameFBSessionAuthMethodEnd;
|
||||||
|
|
||||||
/** Use to log the timestamp for the transition to the Facebook native login dialog */
|
/** Use to log the timestamp for the transition to the Facebook native login dialog */
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventNameFBDialogsNativeLoginDialogStart;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventNameFBDialogsNativeLoginDialogStart;
|
||||||
|
|
||||||
/** Use to log the timestamp for the transition back to the app after the Facebook native login dialog */
|
/** Use to log the timestamp for the transition back to the app after the Facebook native login dialog */
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventNameFBDialogsNativeLoginDialogEnd;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventNameFBDialogsNativeLoginDialogEnd;
|
||||||
|
|
||||||
/** Use to log the e2e timestamp metrics for web login */
|
/** Use to log the e2e timestamp metrics for web login */
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventNameFBDialogsWebLoginCompleted;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventNameFBDialogsWebLoginCompleted;
|
||||||
|
|
||||||
/** Use to log the result of the App Switch OS AlertView. Only available on OS >= iOS10 */
|
/** Use to log the result of the App Switch OS AlertView. Only available on OS >= iOS10 */
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventNameFBSessionFASLoginDialogResult;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventNameFBSessionFASLoginDialogResult;
|
||||||
|
|
||||||
/** Use to log the live streaming events from sdk */
|
/** Use to log the live streaming events from sdk */
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventNameFBSDKLiveStreamingStart;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventNameFBSDKLiveStreamingStart;
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventNameFBSDKLiveStreamingStop;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventNameFBSDKLiveStreamingStop;
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventNameFBSDKLiveStreamingPause;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventNameFBSDKLiveStreamingPause;
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventNameFBSDKLiveStreamingResume;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventNameFBSDKLiveStreamingResume;
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventNameFBSDKLiveStreamingError;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventNameFBSDKLiveStreamingError;
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventNameFBSDKLiveStreamingUpdateStatus;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventNameFBSDKLiveStreamingUpdateStatus;
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventNameFBSDKLiveStreamingVideoID;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventNameFBSDKLiveStreamingVideoID;
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventNameFBSDKLiveStreamingMic;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventNameFBSDKLiveStreamingMic;
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventNameFBSDKLiveStreamingCamera;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventNameFBSDKLiveStreamingCamera;
|
||||||
|
|
||||||
/** Use to log the results of a share dialog */
|
/** Use to log the results of a share dialog */
|
||||||
FBSDK_EXTERN NSString *const FBSDLAppEventNameFBSDKEventShareDialogResult;
|
FOUNDATION_EXPORT NSString *const FBSDLAppEventNameFBSDKEventShareDialogResult;
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventNameFBSDKEventMessengerShareDialogResult;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventNameFBSDKEventMessengerShareDialogResult;
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventNameFBSDKEventAppInviteShareDialogResult;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventNameFBSDKEventAppInviteShareDialogResult;
|
||||||
|
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventNameFBSDKEventShareDialogShow;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventNameFBSDKEventShareDialogShow;
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventNameFBSDKEventMessengerShareDialogShow;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventNameFBSDKEventMessengerShareDialogShow;
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventNameFBSDKEventAppInviteShareDialogShow;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventNameFBSDKEventAppInviteShareDialogShow;
|
||||||
|
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventParameterDialogMode;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventParameterDialogMode;
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventParameterDialogShareContentType;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventParameterDialogShareContentType;
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventParameterDialogShareContentUUID;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventParameterDialogShareContentUUID;
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventParameterDialogShareContentPageID;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventParameterDialogShareContentPageID;
|
||||||
|
|
||||||
/*! Use to log parameters for share tray use */
|
/*! Use to log parameters for share tray use */
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventParameterShareTrayActivityName;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventParameterShareTrayActivityName;
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventParameterShareTrayResult;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventParameterShareTrayResult;
|
||||||
|
|
||||||
/*! Use to log parameters for live streaming*/
|
/*! Use to log parameters for live streaming*/
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventParameterLiveStreamingPrevStatus;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventParameterLiveStreamingPrevStatus;
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventParameterLiveStreamingStatus;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventParameterLiveStreamingStatus;
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventParameterLiveStreamingError;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventParameterLiveStreamingError;
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventParameterLiveStreamingVideoID;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventParameterLiveStreamingVideoID;
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventParameterLiveStreamingMicEnabled;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventParameterLiveStreamingMicEnabled;
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventParameterLiveStreamingCameraEnabled;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventParameterLiveStreamingCameraEnabled;
|
||||||
|
|
||||||
// Internally known event parameter values
|
// Internally known event parameter values
|
||||||
|
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventsDialogOutcomeValue_Completed;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventsDialogOutcomeValue_Completed;
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventsDialogOutcomeValue_Cancelled;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventsDialogOutcomeValue_Cancelled;
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventsDialogOutcomeValue_Failed;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventsDialogOutcomeValue_Failed;
|
||||||
|
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventsDialogShareContentTypeOpenGraph;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventsDialogShareContentTypeOpenGraph;
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventsDialogShareContentTypeStatus;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventsDialogShareContentTypeStatus;
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventsDialogShareContentTypePhoto;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventsDialogShareContentTypePhoto;
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventsDialogShareContentTypeVideo;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventsDialogShareContentTypeVideo;
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventsDialogShareContentTypeCamera;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventsDialogShareContentTypeCamera;
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventsDialogShareContentTypeMessengerGenericTemplate;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventsDialogShareContentTypeMessengerGenericTemplate;
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventsDialogShareContentTypeMessengerMediaTemplate;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventsDialogShareContentTypeMessengerMediaTemplate;
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventsDialogShareContentTypeMessengerOpenGraphMusicTemplate;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventsDialogShareContentTypeMessengerOpenGraphMusicTemplate;
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventsDialogShareContentTypeUnknown;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventsDialogShareContentTypeUnknown;
|
||||||
|
|
||||||
|
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventsDialogShareModeAutomatic;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventsDialogShareModeAutomatic;
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventsDialogShareModeBrowser;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventsDialogShareModeBrowser;
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventsDialogShareModeNative;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventsDialogShareModeNative;
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventsDialogShareModeShareSheet;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventsDialogShareModeShareSheet;
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventsDialogShareModeWeb;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventsDialogShareModeWeb;
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventsDialogShareModeFeedBrowser;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventsDialogShareModeFeedBrowser;
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventsDialogShareModeFeedWeb;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventsDialogShareModeFeedWeb;
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventsDialogShareModeUnknown;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventsDialogShareModeUnknown;
|
||||||
|
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventsNativeLoginDialogStartTime;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventsNativeLoginDialogStartTime;
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventsNativeLoginDialogEndTime;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventsNativeLoginDialogEndTime;
|
||||||
|
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventsWebLoginE2E;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventsWebLoginE2E;
|
||||||
|
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventNameFBSDKLikeButtonImpression;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventNameFBSDKLikeButtonImpression;
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventNameFBSDKLoginButtonImpression;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventNameFBSDKLoginButtonImpression;
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventNameFBSDKSendButtonImpression;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventNameFBSDKSendButtonImpression;
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventNameFBSDKShareButtonImpression;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventNameFBSDKShareButtonImpression;
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventNameFBSDKLiveStreamingButtonImpression;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventNameFBSDKLiveStreamingButtonImpression;
|
||||||
|
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventNameFBSDKSmartLoginService;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventNameFBSDKSmartLoginService;
|
||||||
|
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventNameFBSDKLikeButtonDidTap;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventNameFBSDKLikeButtonDidTap;
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventNameFBSDKLoginButtonDidTap;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventNameFBSDKLoginButtonDidTap;
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventNameFBSDKSendButtonDidTap;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventNameFBSDKSendButtonDidTap;
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventNameFBSDKShareButtonDidTap;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventNameFBSDKShareButtonDidTap;
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventNameFBSDKLiveStreamingButtonDidTap;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventNameFBSDKLiveStreamingButtonDidTap;
|
||||||
|
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventNameFBSDKLikeControlDidDisable;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventNameFBSDKLikeControlDidDisable;
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventNameFBSDKLikeControlDidLike;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventNameFBSDKLikeControlDidLike;
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventNameFBSDKLikeControlDidPresentDialog;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventNameFBSDKLikeControlDidPresentDialog;
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventNameFBSDKLikeControlDidTap;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventNameFBSDKLikeControlDidTap;
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventNameFBSDKLikeControlDidUnlike;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventNameFBSDKLikeControlDidUnlike;
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventNameFBSDKLikeControlError;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventNameFBSDKLikeControlError;
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventNameFBSDKLikeControlImpression;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventNameFBSDKLikeControlImpression;
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventNameFBSDKLikeControlNetworkUnavailable;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventNameFBSDKLikeControlNetworkUnavailable;
|
||||||
|
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventParameterDialogErrorMessage;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventParameterDialogErrorMessage;
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventParameterLogTime;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventParameterLogTime;
|
||||||
|
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventsWKWebViewMessagesHandlerKey;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventsWKWebViewMessagesHandlerKey;
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventsWKWebViewMessagesActionKey;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventsWKWebViewMessagesActionKey;
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventsWKWebViewMessagesEventKey;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventsWKWebViewMessagesEventKey;
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventsWKWebViewMessagesParamsKey;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventsWKWebViewMessagesParamsKey;
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventsWKWebViewMessagesPixelTrackKey;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventsWKWebViewMessagesPixelTrackKey;
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventsWKWebViewMessagesPixelTrackCustomKey;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventsWKWebViewMessagesPixelTrackCustomKey;
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventsWKWebViewMessagesPixelTrackSingleKey;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventsWKWebViewMessagesPixelTrackSingleKey;
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventsWKWebViewMessagesPixelTrackSingleCustomKey;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventsWKWebViewMessagesPixelTrackSingleCustomKey;
|
||||||
FBSDK_EXTERN NSString *const FBSDKAppEventsWKWebViewMessagesPixelIDKey;
|
FOUNDATION_EXPORT NSString *const FBSDKAppEventsWKWebViewMessagesPixelIDKey;
|
||||||
|
|
||||||
@interface FBSDKAppEvents (Internal)
|
@interface FBSDKAppEvents (Internal)
|
||||||
|
|
||||||
|
|||||||
@ -147,7 +147,7 @@ static const u_int FB_GIGABYTE = 1024 * 1024 * 1024; // bytes
|
|||||||
_shortVersion = [mainBundle objectForInfoDictionaryKey:@"CFBundleShortVersionString"];
|
_shortVersion = [mainBundle objectForInfoDictionaryKey:@"CFBundleShortVersionString"];
|
||||||
|
|
||||||
// Locale stuff
|
// Locale stuff
|
||||||
_language = [[NSLocale currentLocale] localeIdentifier];
|
_language = [NSLocale currentLocale].localeIdentifier;
|
||||||
|
|
||||||
// Device stuff
|
// Device stuff
|
||||||
UIDevice *device = [UIDevice currentDevice];
|
UIDevice *device = [UIDevice currentDevice];
|
||||||
@ -165,7 +165,7 @@ static const u_int FB_GIGABYTE = 1024 * 1024 * 1024; // bytes
|
|||||||
_machine = @(systemInfo.machine);
|
_machine = @(systemInfo.machine);
|
||||||
|
|
||||||
// Disk space stuff
|
// Disk space stuff
|
||||||
float totalDiskSpace = [[FBSDKAppEventsDeviceInfo _getTotalDiskSpace] floatValue];
|
float totalDiskSpace = [FBSDKAppEventsDeviceInfo _getTotalDiskSpace].floatValue;
|
||||||
_totalDiskSpaceGB = (unsigned long long)round(totalDiskSpace / FB_GIGABYTE);
|
_totalDiskSpaceGB = (unsigned long long)round(totalDiskSpace / FB_GIGABYTE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -194,7 +194,7 @@ static const u_int FB_GIGABYTE = 1024 * 1024 * 1024; // bytes
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Remaining disk space
|
// Remaining disk space
|
||||||
float remainingDiskSpace = [[FBSDKAppEventsDeviceInfo _getRemainingDiskSpace] floatValue];
|
float remainingDiskSpace = [FBSDKAppEventsDeviceInfo _getRemainingDiskSpace].floatValue;
|
||||||
unsigned long long newRemainingDiskSpaceGB = (unsigned long long)round(remainingDiskSpace / FB_GIGABYTE);
|
unsigned long long newRemainingDiskSpaceGB = (unsigned long long)round(remainingDiskSpace / FB_GIGABYTE);
|
||||||
if (_remainingDiskSpaceGB != newRemainingDiskSpaceGB) {
|
if (_remainingDiskSpaceGB != newRemainingDiskSpaceGB) {
|
||||||
_remainingDiskSpaceGB = newRemainingDiskSpaceGB;
|
_remainingDiskSpaceGB = newRemainingDiskSpaceGB;
|
||||||
@ -237,14 +237,14 @@ static const u_int FB_GIGABYTE = 1024 * 1024 * 1024; // bytes
|
|||||||
{
|
{
|
||||||
NSDictionary *attrs = [[[NSFileManager alloc] init] attributesOfFileSystemForPath:NSHomeDirectory()
|
NSDictionary *attrs = [[[NSFileManager alloc] init] attributesOfFileSystemForPath:NSHomeDirectory()
|
||||||
error:nil];
|
error:nil];
|
||||||
return [attrs objectForKey:NSFileSystemSize];
|
return attrs[NSFileSystemSize];
|
||||||
}
|
}
|
||||||
|
|
||||||
+ (NSNumber *)_getRemainingDiskSpace
|
+ (NSNumber *)_getRemainingDiskSpace
|
||||||
{
|
{
|
||||||
NSDictionary *attrs = [[[NSFileManager alloc] init] attributesOfFileSystemForPath:NSHomeDirectory()
|
NSDictionary *attrs = [[[NSFileManager alloc] init] attributesOfFileSystemForPath:NSHomeDirectory()
|
||||||
error:nil];
|
error:nil];
|
||||||
return [attrs objectForKey:NSFileSystemFreeSize];
|
return attrs[NSFileSystemFreeSize];
|
||||||
}
|
}
|
||||||
|
|
||||||
+ (uint)_coreCount
|
+ (uint)_coreCount
|
||||||
@ -270,8 +270,8 @@ static const u_int FB_GIGABYTE = 1024 * 1024 * 1024; // bytes
|
|||||||
#else
|
#else
|
||||||
// Dynamically load class for this so calling app doesn't need to link framework in.
|
// Dynamically load class for this so calling app doesn't need to link framework in.
|
||||||
CTTelephonyNetworkInfo *networkInfo = [[fbsdkdfl_CTTelephonyNetworkInfoClass() alloc] init];
|
CTTelephonyNetworkInfo *networkInfo = [[fbsdkdfl_CTTelephonyNetworkInfoClass() alloc] init];
|
||||||
CTCarrier *carrier = [networkInfo subscriberCellularProvider];
|
CTCarrier *carrier = networkInfo.subscriberCellularProvider;
|
||||||
return [carrier carrierName] ?: @"NoCarrier";
|
return carrier.carrierName ?: @"NoCarrier";
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -21,16 +21,18 @@
|
|||||||
// this type is not thread safe.
|
// this type is not thread safe.
|
||||||
@interface FBSDKAppEventsState : NSObject<NSCopying, NSSecureCoding>
|
@interface FBSDKAppEventsState : NSObject<NSCopying, NSSecureCoding>
|
||||||
|
|
||||||
@property (readonly, copy) NSArray *events;
|
@property (nonatomic, readonly, copy) NSArray *events;
|
||||||
@property (readonly, assign) NSUInteger numSkipped;
|
@property (nonatomic, readonly, assign) NSUInteger numSkipped;
|
||||||
@property (readonly, copy) NSString *tokenString;
|
@property (nonatomic, readonly, copy) NSString *tokenString;
|
||||||
@property (readonly, copy) NSString *appID;
|
@property (nonatomic, readonly, copy) NSString *appID;
|
||||||
|
@property (nonatomic, readonly) BOOL areAllEventsImplicit;
|
||||||
|
|
||||||
|
- (instancetype)init NS_UNAVAILABLE;
|
||||||
|
+ (instancetype)new NS_UNAVAILABLE;
|
||||||
- (instancetype)initWithToken:(NSString *)tokenString appID:(NSString *)appID NS_DESIGNATED_INITIALIZER;
|
- (instancetype)initWithToken:(NSString *)tokenString appID:(NSString *)appID NS_DESIGNATED_INITIALIZER;
|
||||||
|
|
||||||
- (void)addEvent:(NSDictionary *)eventDictionary isImplicit:(BOOL)isImplicit;
|
- (void)addEvent:(NSDictionary *)eventDictionary isImplicit:(BOOL)isImplicit;
|
||||||
- (void)addEventsFromAppEventState:(FBSDKAppEventsState *)appEventsState;
|
- (void)addEventsFromAppEventState:(FBSDKAppEventsState *)appEventsState;
|
||||||
- (BOOL)areAllEventsImplicit;
|
|
||||||
- (BOOL)isCompatibleWithAppEventsState:(FBSDKAppEventsState *)appEventsState;
|
- (BOOL)isCompatibleWithAppEventsState:(FBSDKAppEventsState *)appEventsState;
|
||||||
- (BOOL)isCompatibleWithTokenString:(NSString *)tokenString appID:(NSString *)appID;
|
- (BOOL)isCompatibleWithTokenString:(NSString *)tokenString appID:(NSString *)appID;
|
||||||
- (NSString *)JSONStringForEvents:(BOOL)includeImplicitEvents;
|
- (NSString *)JSONStringForEvents:(BOOL)includeImplicitEvents;
|
||||||
|
|||||||
@ -19,7 +19,6 @@
|
|||||||
#import "FBSDKAppEventsState.h"
|
#import "FBSDKAppEventsState.h"
|
||||||
|
|
||||||
#import "FBSDKInternalUtility.h"
|
#import "FBSDKInternalUtility.h"
|
||||||
#import "FBSDKMacros.h"
|
|
||||||
|
|
||||||
#define FBSDK_APPEVENTSTATE_ISIMPLICIT_KEY @"isImplicit"
|
#define FBSDK_APPEVENTSTATE_ISIMPLICIT_KEY @"isImplicit"
|
||||||
|
|
||||||
@ -37,12 +36,6 @@
|
|||||||
NSMutableArray *_mutableEvents;
|
NSMutableArray *_mutableEvents;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (instancetype)init
|
|
||||||
{
|
|
||||||
FBSDK_NOT_DESIGNATED_INITIALIZER(initWithToken:appID:);
|
|
||||||
return [self initWithToken:nil appID:nil];
|
|
||||||
}
|
|
||||||
|
|
||||||
- (instancetype)initWithToken:(NSString *)tokenString appID:(NSString *)appID
|
- (instancetype)initWithToken:(NSString *)tokenString appID:(NSString *)appID
|
||||||
{
|
{
|
||||||
if ((self = [super init])) {
|
if ((self = [super init])) {
|
||||||
|
|||||||
@ -1,118 +0,0 @@
|
|||||||
// Copyright (c) 2014-present, Facebook, Inc. All rights reserved.
|
|
||||||
//
|
|
||||||
// You are hereby granted a non-exclusive, worldwide, royalty-free license to use,
|
|
||||||
// copy, modify, and distribute this software in source code or binary form for use
|
|
||||||
// in connection with the web services and APIs provided by Facebook.
|
|
||||||
//
|
|
||||||
// As with any software that integrates with the Facebook platform, your use of
|
|
||||||
// this software is subject to the Facebook Developer Principles and Policies
|
|
||||||
// [http://developers.facebook.com/policy/]. This copyright notice shall be
|
|
||||||
// included in all copies or substantial portions of the software.
|
|
||||||
//
|
|
||||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
|
||||||
// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
|
||||||
// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
|
||||||
// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
||||||
// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
|
|
||||||
#import "FBSDKAppEventsUninstall.h"
|
|
||||||
|
|
||||||
#import <objc/runtime.h>
|
|
||||||
|
|
||||||
#import <UIKit/UIKit.h>
|
|
||||||
#import <UserNotifications/UserNotifications.h>
|
|
||||||
|
|
||||||
#import "FBSDKAppEventsUtility.h"
|
|
||||||
#import "FBSDKGraphRequest.h"
|
|
||||||
#import "FBSDKLogger.h"
|
|
||||||
#import "FBSDKServerConfigurationManager.h"
|
|
||||||
#import "FBSDKSettings.h"
|
|
||||||
#import "FBSDKSwizzler.h"
|
|
||||||
|
|
||||||
#define UNINSTALL_TRACKING_DEVICE_ID_KEY @"device_id"
|
|
||||||
#define UNINSTALL_TRACKING_PLATFORM_KEY @"platform"
|
|
||||||
#define UNINSTALL_TRACKING_DEVICE_TOKEN_KEY @"device_token"
|
|
||||||
#define UNINSTALL_TRACKING_TOKEN_ENDPOINT @"app_push_device_token"
|
|
||||||
|
|
||||||
@implementation FBSDKAppEventsUninstall
|
|
||||||
|
|
||||||
+ (void)load
|
|
||||||
{
|
|
||||||
[FBSDKAppEventsUninstall installSwizzler];
|
|
||||||
}
|
|
||||||
|
|
||||||
+ (NSString *)stringWithDeviceToken:(NSData *)deviceToken {
|
|
||||||
const char *data = [deviceToken bytes];
|
|
||||||
NSMutableString *token = [NSMutableString string];
|
|
||||||
|
|
||||||
for (NSUInteger i = 0; i < [deviceToken length]; i++) {
|
|
||||||
[token appendFormat:@"%02.2hhX", data[i]];
|
|
||||||
}
|
|
||||||
|
|
||||||
return [token copy];
|
|
||||||
}
|
|
||||||
|
|
||||||
+ (void)installSwizzler
|
|
||||||
{
|
|
||||||
Class cls = [[UIApplication sharedApplication].delegate class];
|
|
||||||
SEL selector = @selector(application:didRegisterForRemoteNotificationsWithDeviceToken:);
|
|
||||||
BOOL hasMethod = class_getInstanceMethod(cls, selector) != nil;
|
|
||||||
void (^block)(id) = ^(NSData *deviceToken) {
|
|
||||||
NSString *tokenString = [self stringWithDeviceToken:deviceToken];
|
|
||||||
[FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorInformational
|
|
||||||
logEntry:[NSString stringWithFormat:@"Register token from Swizzling: %@", tokenString]];
|
|
||||||
// try upload token immediately after receiving it from swizzling
|
|
||||||
[self updateAndUploadToken:tokenString];
|
|
||||||
};
|
|
||||||
|
|
||||||
if (!hasMethod)
|
|
||||||
{
|
|
||||||
void (^registerBlock)(id, id, id) = ^(id _, id __, NSData *deviceToken)
|
|
||||||
{
|
|
||||||
block(deviceToken);
|
|
||||||
};
|
|
||||||
IMP imp = imp_implementationWithBlock(registerBlock);
|
|
||||||
struct objc_method_description desc = protocol_getMethodDescription(@protocol(UIApplicationDelegate),
|
|
||||||
selector, NO, YES);
|
|
||||||
const char *types = desc.types;
|
|
||||||
class_addMethod(cls, selector, imp, types);
|
|
||||||
} else
|
|
||||||
{
|
|
||||||
void (^registerBlock)(id, SEL, id, id) = ^(id _, SEL __, id ___, NSData *deviceToken)
|
|
||||||
{
|
|
||||||
block(deviceToken);
|
|
||||||
};
|
|
||||||
[FBSDKSwizzler swizzleSelector:selector
|
|
||||||
onClass:cls
|
|
||||||
withBlock:registerBlock
|
|
||||||
named:@"map_control"];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Token is updated when (changed OR not uploaded)
|
|
||||||
// Token is uploaded when enabled AND (changed OR not uploaded)
|
|
||||||
+ (void)updateAndUploadToken:(NSString *)tokenString
|
|
||||||
{
|
|
||||||
if (!tokenString) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
[FBSDKServerConfigurationManager loadServerConfigurationWithCompletionBlock:^(FBSDKServerConfiguration *serverConfiguration, NSError *error) {
|
|
||||||
if (serverConfiguration.uninstallTrackingEnabled) {
|
|
||||||
FBSDKGraphRequest *request = [[FBSDKGraphRequest alloc]
|
|
||||||
initWithGraphPath:[NSString stringWithFormat:@"%@/%@",
|
|
||||||
[FBSDKSettings appID], UNINSTALL_TRACKING_TOKEN_ENDPOINT]
|
|
||||||
parameters:@{
|
|
||||||
UNINSTALL_TRACKING_DEVICE_TOKEN_KEY: tokenString,
|
|
||||||
UNINSTALL_TRACKING_PLATFORM_KEY: @"ios",
|
|
||||||
// advertiserID could be 0s if user select limit ad tracking
|
|
||||||
UNINSTALL_TRACKING_DEVICE_ID_KEY: [FBSDKAppEventsUtility advertiserID]?:@""
|
|
||||||
}
|
|
||||||
HTTPMethod:@"POST"];
|
|
||||||
[request startWithCompletionHandler:nil];
|
|
||||||
}
|
|
||||||
}];
|
|
||||||
}
|
|
||||||
|
|
||||||
@end
|
|
||||||
@ -39,6 +39,9 @@ typedef NS_ENUM(NSUInteger, FBSDKAppEventsFlushReason)
|
|||||||
|
|
||||||
@interface FBSDKAppEventsUtility : NSObject
|
@interface FBSDKAppEventsUtility : NSObject
|
||||||
|
|
||||||
|
- (instancetype)init NS_UNAVAILABLE;
|
||||||
|
+ (instancetype)new NS_UNAVAILABLE;
|
||||||
|
|
||||||
+ (NSMutableDictionary *)activityParametersDictionaryForEvent:(NSString *)eventCategory
|
+ (NSMutableDictionary *)activityParametersDictionaryForEvent:(NSString *)eventCategory
|
||||||
implicitEventsOnly:(BOOL)implicitEventsOnly
|
implicitEventsOnly:(BOOL)implicitEventsOnly
|
||||||
shouldAccessAdvertisingID:(BOOL)shouldAccessAdvertisingID;
|
shouldAccessAdvertisingID:(BOOL)shouldAccessAdvertisingID;
|
||||||
@ -55,5 +58,7 @@ typedef NS_ENUM(NSUInteger, FBSDKAppEventsFlushReason)
|
|||||||
+ (BOOL)validateIdentifier:(NSString *)identifier;
|
+ (BOOL)validateIdentifier:(NSString *)identifier;
|
||||||
+ (id)getVariable:(NSString *)variableName fromInstance:(NSObject *)instance;
|
+ (id)getVariable:(NSString *)variableName fromInstance:(NSObject *)instance;
|
||||||
+ (NSNumber *)getNumberValue:(NSString *)text;
|
+ (NSNumber *)getNumberValue:(NSString *)text;
|
||||||
|
+ (BOOL)isDebugBuild;
|
||||||
|
+ (BOOL)isSensitiveUserData:(NSString *)text;
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|||||||
@ -30,7 +30,6 @@
|
|||||||
#import "FBSDKError.h"
|
#import "FBSDKError.h"
|
||||||
#import "FBSDKInternalUtility.h"
|
#import "FBSDKInternalUtility.h"
|
||||||
#import "FBSDKLogger.h"
|
#import "FBSDKLogger.h"
|
||||||
#import "FBSDKMacros.h"
|
|
||||||
#import "FBSDKSettings.h"
|
#import "FBSDKSettings.h"
|
||||||
#import "FBSDKTimeSpentData.h"
|
#import "FBSDKTimeSpentData.h"
|
||||||
|
|
||||||
@ -46,8 +45,10 @@
|
|||||||
NSMutableDictionary *parameters = [NSMutableDictionary dictionary];
|
NSMutableDictionary *parameters = [NSMutableDictionary dictionary];
|
||||||
parameters[@"event"] = eventCategory;
|
parameters[@"event"] = eventCategory;
|
||||||
|
|
||||||
|
#if __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_7_0
|
||||||
NSString *attributionID = [[self class] attributionID]; // Only present on iOS 6 and below.
|
NSString *attributionID = [[self class] attributionID]; // Only present on iOS 6 and below.
|
||||||
[FBSDKInternalUtility dictionary:parameters setObject:attributionID forKey:@"attribution"];
|
[FBSDKInternalUtility dictionary:parameters setObject:attributionID forKey:@"attribution"];
|
||||||
|
#endif
|
||||||
|
|
||||||
if (!implicitEventsOnly && shouldAccessAdvertisingID) {
|
if (!implicitEventsOnly && shouldAccessAdvertisingID) {
|
||||||
NSString *advertiserID = [[self class] advertiserID];
|
NSString *advertiserID = [[self class] advertiserID];
|
||||||
@ -59,10 +60,10 @@
|
|||||||
FBSDKAdvertisingTrackingStatus advertisingTrackingStatus = [[self class] advertisingTrackingStatus];
|
FBSDKAdvertisingTrackingStatus advertisingTrackingStatus = [[self class] advertisingTrackingStatus];
|
||||||
if (advertisingTrackingStatus != FBSDKAdvertisingTrackingUnspecified) {
|
if (advertisingTrackingStatus != FBSDKAdvertisingTrackingUnspecified) {
|
||||||
BOOL allowed = (advertisingTrackingStatus == FBSDKAdvertisingTrackingAllowed);
|
BOOL allowed = (advertisingTrackingStatus == FBSDKAdvertisingTrackingAllowed);
|
||||||
parameters[@"advertiser_tracking_enabled"] = [@(allowed) stringValue];
|
parameters[@"advertiser_tracking_enabled"] = @(allowed).stringValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
parameters[@"application_tracking_enabled"] = [@(!FBSDKSettings.limitEventAndDataUsage) stringValue];
|
parameters[@"application_tracking_enabled"] = @(!FBSDKSettings.limitEventAndDataUsage).stringValue;
|
||||||
|
|
||||||
NSString *userID = [FBSDKAppEvents userID];
|
NSString *userID = [FBSDKAppEvents userID];
|
||||||
if (userID) {
|
if (userID) {
|
||||||
@ -81,8 +82,8 @@
|
|||||||
dispatch_once(&fetchBundleOnce, ^{
|
dispatch_once(&fetchBundleOnce, ^{
|
||||||
NSBundle *mainBundle = [NSBundle mainBundle];
|
NSBundle *mainBundle = [NSBundle mainBundle];
|
||||||
urlSchemes = [[NSMutableArray alloc] init];
|
urlSchemes = [[NSMutableArray alloc] init];
|
||||||
for (NSDictionary *fields in [mainBundle objectForInfoDictionaryKey:@"CFBundleURLTypes"]) {
|
for (NSDictionary<NSString *, id> *fields in [mainBundle objectForInfoDictionaryKey:@"CFBundleURLTypes"]) {
|
||||||
NSArray *schemesForType = [fields objectForKey:@"CFBundleURLSchemes"];
|
NSArray<NSString *> *schemesForType = fields[@"CFBundleURLSchemes"];
|
||||||
if (schemesForType) {
|
if (schemesForType) {
|
||||||
[urlSchemes addObjectsFromArray:schemesForType];
|
[urlSchemes addObjectsFromArray:schemesForType];
|
||||||
}
|
}
|
||||||
@ -90,8 +91,7 @@
|
|||||||
});
|
});
|
||||||
|
|
||||||
if (urlSchemes.count > 0) {
|
if (urlSchemes.count > 0) {
|
||||||
[parameters setObject:[FBSDKInternalUtility JSONStringForObject:urlSchemes error:NULL invalidObjectHandler:NULL]
|
parameters[@"url_schemes"] = [FBSDKInternalUtility JSONStringForObject:urlSchemes error:NULL invalidObjectHandler:NULL];
|
||||||
forKey:@"url_schemes"];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return parameters;
|
return parameters;
|
||||||
@ -99,12 +99,16 @@
|
|||||||
|
|
||||||
+ (NSString *)advertiserID
|
+ (NSString *)advertiserID
|
||||||
{
|
{
|
||||||
|
if (![[FBSDKSettings advertiserIDCollectionEnabled] boolValue]) {
|
||||||
|
return nil;
|
||||||
|
}
|
||||||
|
|
||||||
NSString *result = nil;
|
NSString *result = nil;
|
||||||
|
|
||||||
Class ASIdentifierManagerClass = fbsdkdfl_ASIdentifierManagerClass();
|
Class ASIdentifierManagerClass = fbsdkdfl_ASIdentifierManagerClass();
|
||||||
if ([ASIdentifierManagerClass class]) {
|
if ([ASIdentifierManagerClass class]) {
|
||||||
ASIdentifierManager *manager = [ASIdentifierManagerClass sharedManager];
|
ASIdentifierManager *manager = [ASIdentifierManagerClass sharedManager];
|
||||||
result = [[manager advertisingIdentifier] UUIDString];
|
result = manager.advertisingIdentifier.UUIDString;
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
@ -121,7 +125,7 @@
|
|||||||
if ([ASIdentifierManagerClass class]) {
|
if ([ASIdentifierManagerClass class]) {
|
||||||
ASIdentifierManager *manager = [ASIdentifierManagerClass sharedManager];
|
ASIdentifierManager *manager = [ASIdentifierManagerClass sharedManager];
|
||||||
if (manager) {
|
if (manager) {
|
||||||
status = [manager isAdvertisingTrackingEnabled] ? FBSDKAdvertisingTrackingAllowed : FBSDKAdvertisingTrackingDisallowed;
|
status = manager.advertisingTrackingEnabled ? FBSDKAdvertisingTrackingAllowed : FBSDKAdvertisingTrackingDisallowed;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -138,7 +142,7 @@
|
|||||||
// Generate a new anonymous ID. Create as a UUID, but then prepend the fairly
|
// Generate a new anonymous ID. Create as a UUID, but then prepend the fairly
|
||||||
// arbitrary 'XZ' to the front so it's easily distinguishable from IDFA's which
|
// arbitrary 'XZ' to the front so it's easily distinguishable from IDFA's which
|
||||||
// will only contain hex.
|
// will only contain hex.
|
||||||
result = [NSString stringWithFormat:@"XZ%@", [[NSUUID UUID] UUIDString]];
|
result = [NSString stringWithFormat:@"XZ%@", [NSUUID UUID].UUIDString];
|
||||||
|
|
||||||
[self persistAnonymousID:result];
|
[self persistAnonymousID:result];
|
||||||
}
|
}
|
||||||
@ -150,7 +154,7 @@
|
|||||||
#if TARGET_OS_TV
|
#if TARGET_OS_TV
|
||||||
return nil;
|
return nil;
|
||||||
#else
|
#else
|
||||||
return [[UIPasteboard pasteboardWithName:@"fb_app_attribution" create:NO] string];
|
return [UIPasteboard pasteboardWithName:@"fb_app_attribution" create:NO].string;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -214,7 +218,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
[FBSDKLogger singleShotLogEntry:behaviorToLog logEntry:msg];
|
[FBSDKLogger singleShotLogEntry:behaviorToLog logEntry:msg];
|
||||||
NSError *error = [FBSDKError errorWithCode:FBSDKAppEventsFlushErrorCode message:msg];
|
NSError *error = [NSError fbErrorWithCode:FBSDKErrorAppEventsFlush message:msg];
|
||||||
[[NSNotificationCenter defaultCenter] postNotificationName:FBSDKAppEventsLoggingResultNotification object:error];
|
[[NSNotificationCenter defaultCenter] postNotificationName:FBSDKAppEventsLoggingResultNotification object:error];
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -297,7 +301,7 @@ restOfStringCharacterSet:(NSCharacterSet *)restOfStringCharacterSet
|
|||||||
{
|
{
|
||||||
NSSearchPathDirectory directory = NSLibraryDirectory;
|
NSSearchPathDirectory directory = NSLibraryDirectory;
|
||||||
NSArray *paths = NSSearchPathForDirectoriesInDomains(directory, NSUserDomainMask, YES);
|
NSArray *paths = NSSearchPathForDirectoriesInDomains(directory, NSUserDomainMask, YES);
|
||||||
NSString *docDirectory = [paths objectAtIndex:0];
|
NSString *docDirectory = paths[0];
|
||||||
return [docDirectory stringByAppendingPathComponent:filename];
|
return [docDirectory stringByAppendingPathComponent:filename];
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -309,7 +313,7 @@ restOfStringCharacterSet:(NSCharacterSet *)restOfStringCharacterSet
|
|||||||
encoding:NSASCIIStringEncoding
|
encoding:NSASCIIStringEncoding
|
||||||
error:nil];
|
error:nil];
|
||||||
NSDictionary *results = [FBSDKInternalUtility objectForJSONString:content error:NULL];
|
NSDictionary *results = [FBSDKInternalUtility objectForJSONString:content error:NULL];
|
||||||
return [results objectForKey:FBSDK_APPEVENTSUTILITY_ANONYMOUSID_KEY];
|
return results[FBSDK_APPEVENTSUTILITY_ANONYMOUSID_KEY];
|
||||||
}
|
}
|
||||||
|
|
||||||
// Given a candidate token (which may be nil), find the real token to string to use.
|
// Given a candidate token (which may be nil), find the real token to string to use.
|
||||||
@ -337,11 +341,11 @@ restOfStringCharacterSet:(NSCharacterSet *)restOfStringCharacterSet
|
|||||||
|
|
||||||
+ (long)unixTimeNow
|
+ (long)unixTimeNow
|
||||||
{
|
{
|
||||||
return (long)round([[NSDate date] timeIntervalSince1970]);
|
return (long)round([NSDate date].timeIntervalSince1970);
|
||||||
}
|
}
|
||||||
|
|
||||||
+ (id)getVariable:(NSString *)variableName fromInstance:(NSObject *)instance {
|
+ (id)getVariable:(NSString *)variableName fromInstance:(NSObject *)instance {
|
||||||
Ivar ivar = class_getInstanceVariable([instance class], [variableName UTF8String]);
|
Ivar ivar = class_getInstanceVariable([instance class], variableName.UTF8String);
|
||||||
if (ivar != NULL) {
|
if (ivar != NULL) {
|
||||||
const char *encoding = ivar_getTypeEncoding(ivar);
|
const char *encoding = ivar_getTypeEncoding(ivar);
|
||||||
if (encoding != NULL && encoding[0] == '@') {
|
if (encoding != NULL && encoding[0] == '@') {
|
||||||
@ -376,17 +380,95 @@ restOfStringCharacterSet:(NSCharacterSet *)restOfStringCharacterSet
|
|||||||
|
|
||||||
value = [formatter numberFromString:validText];
|
value = [formatter numberFromString:validText];
|
||||||
if (nil == value) {
|
if (nil == value) {
|
||||||
value = @([validText floatValue]);
|
value = @(validText.floatValue);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (instancetype)init
|
+ (BOOL)isDebugBuild {
|
||||||
|
#if TARGET_IPHONE_SIMULATOR
|
||||||
|
return YES;
|
||||||
|
#else
|
||||||
|
BOOL isDevelopment = NO;
|
||||||
|
|
||||||
|
// There is no provisioning profile in AppStore Apps.
|
||||||
|
@try
|
||||||
|
{
|
||||||
|
NSData *data = [NSData dataWithContentsOfFile:[NSBundle.mainBundle pathForResource:@"embedded" ofType:@"mobileprovision"]];
|
||||||
|
if (data) {
|
||||||
|
const char *bytes = [data bytes];
|
||||||
|
NSMutableString *profile = [[NSMutableString alloc] initWithCapacity:data.length];
|
||||||
|
for (NSUInteger i = 0; i < data.length; i++) {
|
||||||
|
[profile appendFormat:@"%c", bytes[i]];
|
||||||
|
}
|
||||||
|
// Look for debug value, if detected we're in a development build.
|
||||||
|
NSString *cleared = [[profile componentsSeparatedByCharactersInSet:NSCharacterSet.whitespaceAndNewlineCharacterSet] componentsJoinedByString:@""];
|
||||||
|
isDevelopment = ([cleared rangeOfString:@"<key>get-task-allow</key><true/>"].length > 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
return isDevelopment;
|
||||||
|
}
|
||||||
|
@catch(NSException *exception)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return NO;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
+ (BOOL)isSensitiveUserData:(NSString *)text
|
||||||
{
|
{
|
||||||
FBSDK_NO_DESIGNATED_INITIALIZER();
|
if (0 == text.length) {
|
||||||
return nil;
|
return NO;
|
||||||
|
}
|
||||||
|
|
||||||
|
return [self isEmailAddress:text] || [self isCreditCardNumber:text];
|
||||||
|
}
|
||||||
|
|
||||||
|
+ (BOOL)isCreditCardNumber:(NSString *)text
|
||||||
|
{
|
||||||
|
text = [[text componentsSeparatedByCharactersInSet:[NSCharacterSet.decimalDigitCharacterSet invertedSet]] componentsJoinedByString:@""];
|
||||||
|
|
||||||
|
if (text.doubleValue == 0) {
|
||||||
|
return NO;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (text.length < 9 || text.length > 21) {
|
||||||
|
return NO;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char *chars = [text cStringUsingEncoding:NSUTF8StringEncoding];
|
||||||
|
if (NULL == chars) {
|
||||||
|
return NO;
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOL isOdd = YES;
|
||||||
|
int oddSum = 0;
|
||||||
|
int evenSum = 0;
|
||||||
|
|
||||||
|
for (int i = (int)text.length - 1; i >= 0; i--) {
|
||||||
|
int digit = chars[i] - '0';
|
||||||
|
|
||||||
|
if (isOdd)
|
||||||
|
oddSum += digit;
|
||||||
|
else
|
||||||
|
evenSum += digit / 5 + (2 * digit) % 10;
|
||||||
|
|
||||||
|
isOdd = !isOdd;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ((oddSum + evenSum) % 10 == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
+ (BOOL)isEmailAddress:(NSString *)text
|
||||||
|
{
|
||||||
|
NSString *pattern = @"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}";
|
||||||
|
NSRegularExpression *regex = [[NSRegularExpression alloc] initWithPattern:pattern options:NSRegularExpressionCaseInsensitive error:nil];
|
||||||
|
NSUInteger matches = [regex numberOfMatchesInString:text options:0 range:NSMakeRange(0, [text length])];
|
||||||
|
return matches > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|||||||
@ -32,7 +32,7 @@ NSString *const FBSDKAppEventsWKWebViewMessagesPixelReferralParamKey = @"_fb_pix
|
|||||||
|
|
||||||
if ([message.name isEqualToString:FBSDKAppEventsWKWebViewMessagesHandlerKey]) {
|
if ([message.name isEqualToString:FBSDKAppEventsWKWebViewMessagesHandlerKey]) {
|
||||||
NSString *event = message.body[FBSDKAppEventsWKWebViewMessagesEventKey];
|
NSString *event = message.body[FBSDKAppEventsWKWebViewMessagesEventKey];
|
||||||
if ([event length] > 0) {
|
if (event.length > 0) {
|
||||||
NSString *stringedParams = message.body[FBSDKAppEventsWKWebViewMessagesParamsKey];
|
NSString *stringedParams = message.body[FBSDKAppEventsWKWebViewMessagesParamsKey];
|
||||||
NSMutableDictionary <NSObject *, NSObject *> *params = nil;
|
NSMutableDictionary <NSObject *, NSObject *> *params = nil;
|
||||||
NSError *jsonParseError = nil;
|
NSError *jsonParseError = nil;
|
||||||
@ -52,7 +52,7 @@ NSString *const FBSDKAppEventsWKWebViewMessagesPixelReferralParamKey = @"_fb_pix
|
|||||||
params = [[NSMutableDictionary alloc] initWithObjectsAndKeys:pixelID, FBSDKAppEventsWKWebViewMessagesPixelReferralParamKey, nil];
|
params = [[NSMutableDictionary alloc] initWithObjectsAndKeys:pixelID, FBSDKAppEventsWKWebViewMessagesPixelReferralParamKey, nil];
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
[params setObject:pixelID forKey: FBSDKAppEventsWKWebViewMessagesPixelReferralParamKey];
|
params[FBSDKAppEventsWKWebViewMessagesPixelReferralParamKey] = pixelID;
|
||||||
}
|
}
|
||||||
[FBSDKAppEvents logEvent:event parameters:params];
|
[FBSDKAppEvents logEvent:event parameters:params];
|
||||||
}
|
}
|
||||||
|
|||||||
@ -185,7 +185,7 @@ static NSMutableArray *g_pendingRequestors;
|
|||||||
return @"";
|
return @"";
|
||||||
}
|
}
|
||||||
|
|
||||||
return [inputString length] <= FBSDKMaxParameterValueLength ? inputString : [inputString substringToIndex:FBSDKMaxParameterValueLength];
|
return inputString.length <= FBSDKMaxParameterValueLength ? inputString : [inputString substringToIndex:FBSDKMaxParameterValueLength];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)logTransactionEvent:(SKProduct *)product
|
- (void)logTransactionEvent:(SKProduct *)product
|
||||||
@ -194,7 +194,7 @@ static NSMutableArray *g_pendingRequestors;
|
|||||||
NSString *transactionID = nil;
|
NSString *transactionID = nil;
|
||||||
NSString *transactionDate = nil;
|
NSString *transactionDate = nil;
|
||||||
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
|
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
|
||||||
[formatter setDateFormat:@"yyyy-MM-dd HH:mm:ssZ"];
|
formatter.dateFormat = @"yyyy-MM-dd HH:mm:ssZ";
|
||||||
switch (self.transaction.transactionState) {
|
switch (self.transaction.transactionState) {
|
||||||
case SKPaymentTransactionStatePurchasing:
|
case SKPaymentTransactionStatePurchasing:
|
||||||
eventName = FBSDKAppEventNameInitiatedCheckout;
|
eventName = FBSDKAppEventNameInitiatedCheckout;
|
||||||
@ -250,16 +250,16 @@ static NSMutableArray *g_pendingRequestors;
|
|||||||
case SKProductPeriodUnitYear: unit = @"Y"; break;
|
case SKProductPeriodUnitYear: unit = @"Y"; break;
|
||||||
}
|
}
|
||||||
NSString *p = [NSString stringWithFormat:@"P%lu%@", (unsigned long)period.numberOfUnits, unit];
|
NSString *p = [NSString stringWithFormat:@"P%lu%@", (unsigned long)period.numberOfUnits, unit];
|
||||||
[eventParameters setObject:p forKey:FBSDKAppEventParameterNameSubscriptionPeriod];
|
eventParameters[FBSDKAppEventParameterNameSubscriptionPeriod] = p;
|
||||||
[eventParameters setObject:@"subs" forKey:FBSDKAppEventParameterNameInAppPurchaseType];
|
eventParameters[FBSDKAppEventParameterNameInAppPurchaseType] = @"subs";
|
||||||
} else {
|
} else {
|
||||||
[eventParameters setObject:@"inapp" forKey:FBSDKAppEventParameterNameInAppPurchaseType];
|
eventParameters[FBSDKAppEventParameterNameInAppPurchaseType] = @"inapp";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
if (transactionID) {
|
if (transactionID) {
|
||||||
[eventParameters setObject:transactionID forKey:FBSDKAppEventParameterNameTransactionID];
|
eventParameters[FBSDKAppEventParameterNameTransactionID] = transactionID;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -314,7 +314,7 @@ static NSMutableArray *g_pendingRequestors;
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
[eventParameters setObject:@"1" forKey:FBSDKAppEventParameterImplicitlyLoggedPurchase];
|
eventParameters[FBSDKAppEventParameterImplicitlyLoggedPurchase] = @"1";
|
||||||
[FBSDKAppEvents logEvent:eventName
|
[FBSDKAppEvents logEvent:eventName
|
||||||
valueToSum:valueToSum
|
valueToSum:valueToSum
|
||||||
parameters:eventParameters];
|
parameters:eventParameters];
|
||||||
@ -328,7 +328,7 @@ static NSMutableArray *g_pendingRequestors;
|
|||||||
|
|
||||||
// Fetch the current receipt for this application.
|
// Fetch the current receipt for this application.
|
||||||
- (NSData*)fetchDeviceReceipt {
|
- (NSData*)fetchDeviceReceipt {
|
||||||
NSURL *receiptURL = [[NSBundle bundleForClass:[self class]] appStoreReceiptURL];
|
NSURL *receiptURL = [NSBundle bundleForClass:[self class]].appStoreReceiptURL;
|
||||||
NSData *receipt = [NSData dataWithContentsOfURL:receiptURL];
|
NSData *receipt = [NSData dataWithContentsOfURL:receiptURL];
|
||||||
return receipt;
|
return receipt;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -18,9 +18,7 @@
|
|||||||
|
|
||||||
#import <Foundation/Foundation.h>
|
#import <Foundation/Foundation.h>
|
||||||
|
|
||||||
#import <FBSDKCoreKit/FBSDKMacros.h>
|
FOUNDATION_EXPORT NSString *const FBSDKTimeSpentFilename;
|
||||||
|
|
||||||
FBSDK_EXTERN NSString *const FBSDKTimeSpentFilename;
|
|
||||||
|
|
||||||
// Class to encapsulate persisting of time spent data collected by [FBSDKAppEvents activateApp]. The activate app App Event is
|
// Class to encapsulate persisting of time spent data collected by [FBSDKAppEvents activateApp]. The activate app App Event is
|
||||||
// logged when restore: is called with sufficient time since the last deactivation.
|
// logged when restore: is called with sufficient time since the last deactivation.
|
||||||
|
|||||||
@ -192,7 +192,7 @@ static const long INACTIVE_SECONDS_QUANTA[] =
|
|||||||
if (!content) {
|
if (!content) {
|
||||||
|
|
||||||
// Nothing persisted, so this is the first launch.
|
// Nothing persisted, so this is the first launch.
|
||||||
_sessionID = [[NSUUID UUID] UUIDString];
|
_sessionID = [NSUUID UUID].UUIDString;
|
||||||
_secondsSpentInCurrentSession = 0;
|
_secondsSpentInCurrentSession = 0;
|
||||||
_numInterruptionsInCurrentSession = 0;
|
_numInterruptionsInCurrentSession = 0;
|
||||||
_lastSuspendTime = 0;
|
_lastSuspendTime = 0;
|
||||||
@ -205,12 +205,12 @@ static const long INACTIVE_SECONDS_QUANTA[] =
|
|||||||
|
|
||||||
NSDictionary *results = [FBSDKInternalUtility objectForJSONString:content error:NULL];
|
NSDictionary *results = [FBSDKInternalUtility objectForJSONString:content error:NULL];
|
||||||
|
|
||||||
_lastSuspendTime = [[results objectForKey:FBSDKTimeSpentPersistKeyLastSuspendTime] longValue];
|
_lastSuspendTime = [results[FBSDKTimeSpentPersistKeyLastSuspendTime] longValue];
|
||||||
|
|
||||||
_timeSinceLastSuspend = now - _lastSuspendTime;
|
_timeSinceLastSuspend = now - _lastSuspendTime;
|
||||||
_secondsSpentInCurrentSession = [[results objectForKey:FBSDKTimeSpentPersistKeySessionSecondsSpent] intValue];
|
_secondsSpentInCurrentSession = [results[FBSDKTimeSpentPersistKeySessionSecondsSpent] intValue];
|
||||||
_sessionID = results[FBSDKTimeSpentPersistKeySessionID] ? : [[NSUUID UUID] UUIDString];
|
_sessionID = results[FBSDKTimeSpentPersistKeySessionID] ? : [NSUUID UUID].UUIDString;
|
||||||
_numInterruptionsInCurrentSession = [[results objectForKey:FBSDKTimeSpentPersistKeySessionNumInterruptions] intValue];
|
_numInterruptionsInCurrentSession = [results[FBSDKTimeSpentPersistKeySessionNumInterruptions] intValue];
|
||||||
_shouldLogActivateEvent = (_timeSinceLastSuspend > [FBSDKServerConfigurationManager cachedServerConfiguration].sessionTimoutInterval);
|
_shouldLogActivateEvent = (_timeSinceLastSuspend > [FBSDKServerConfigurationManager cachedServerConfiguration].sessionTimoutInterval);
|
||||||
|
|
||||||
// Other than the first launch, we always log the last session's deactivate with this session's activate.
|
// Other than the first launch, we always log the last session's deactivate with this session's activate.
|
||||||
@ -237,7 +237,7 @@ static const long INACTIVE_SECONDS_QUANTA[] =
|
|||||||
// We've logged the session stats, now reset.
|
// We've logged the session stats, now reset.
|
||||||
_secondsSpentInCurrentSession = 0;
|
_secondsSpentInCurrentSession = 0;
|
||||||
_numInterruptionsInCurrentSession = 0;
|
_numInterruptionsInCurrentSession = 0;
|
||||||
_sessionID = [[NSUUID UUID] UUIDString];
|
_sessionID = [NSUUID UUID].UUIDString;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_shouldLogActivateEvent) {
|
if (_shouldLogActivateEvent) {
|
||||||
|
|||||||
@ -18,8 +18,6 @@
|
|||||||
|
|
||||||
#import <Foundation/Foundation.h>
|
#import <Foundation/Foundation.h>
|
||||||
|
|
||||||
#import <FBSDKCoreKit/FBSDKMacros.h>
|
|
||||||
|
|
||||||
@interface FBSDKUserDataStore : NSObject
|
@interface FBSDKUserDataStore : NSObject
|
||||||
|
|
||||||
+ (void)initStore;
|
+ (void)initStore;
|
||||||
|
|||||||
@ -18,10 +18,9 @@
|
|||||||
|
|
||||||
#import "FBSDKUserDataStore.h"
|
#import "FBSDKUserDataStore.h"
|
||||||
|
|
||||||
#import <FBSDKSettings.h>
|
|
||||||
|
|
||||||
#import "FBSDKAppEventsUtility.h"
|
#import "FBSDKAppEventsUtility.h"
|
||||||
#import "FBSDKLogger.h"
|
#import "FBSDKLogger.h"
|
||||||
|
#import "FBSDKSettings.h"
|
||||||
#import "FBSDKUtility.h"
|
#import "FBSDKUtility.h"
|
||||||
|
|
||||||
#define USER_DATA_KEY @"com.facebook.appevents.UserDataStore.userData"
|
#define USER_DATA_KEY @"com.facebook.appevents.UserDataStore.userData"
|
||||||
@ -144,7 +143,7 @@ static volatile bool initialized = false;
|
|||||||
return nil;
|
return nil;
|
||||||
}
|
}
|
||||||
|
|
||||||
NSMutableDictionary *encryptUserData = [NSMutableDictionary dictionaryWithCapacity:[ud count]];
|
NSMutableDictionary<NSString *, id> *encryptUserData = [NSMutableDictionary dictionaryWithCapacity:ud.count];
|
||||||
|
|
||||||
for (NSString *key in ud){
|
for (NSString *key in ud){
|
||||||
NSString *const value = ud[key];
|
NSString *const value = ud[key];
|
||||||
@ -174,7 +173,7 @@ static volatile bool initialized = false;
|
|||||||
|
|
||||||
+ (NSString *)encryptData:(NSString *)data
|
+ (NSString *)encryptData:(NSString *)data
|
||||||
{
|
{
|
||||||
if (data == nil || [data length] == 0){
|
if (data == nil || data.length == 0){
|
||||||
return nil;
|
return nil;
|
||||||
}
|
}
|
||||||
return [FBSDKUtility SHA256Hash:data];
|
return [FBSDKUtility SHA256Hash:data];
|
||||||
@ -186,7 +185,7 @@ static volatile bool initialized = false;
|
|||||||
|| [type isEqualToString:FBSDKLastName] || [type isEqualToString:FBSDKCity]
|
|| [type isEqualToString:FBSDKLastName] || [type isEqualToString:FBSDKCity]
|
||||||
|| [type isEqualToString:FBSDKState] || [type isEqualToString:FBSDKCountry]) {
|
|| [type isEqualToString:FBSDKState] || [type isEqualToString:FBSDKCountry]) {
|
||||||
normalizedData = [data stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
|
normalizedData = [data stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
|
||||||
normalizedData = [normalizedData lowercaseString];
|
normalizedData = normalizedData.lowercaseString;
|
||||||
} else if ([type isEqualToString:FBSDKPhone]){
|
} else if ([type isEqualToString:FBSDKPhone]){
|
||||||
NSError *error = nil;
|
NSError *error = nil;
|
||||||
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"[^0-9]"
|
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"[^0-9]"
|
||||||
@ -195,13 +194,13 @@ static volatile bool initialized = false;
|
|||||||
];
|
];
|
||||||
normalizedData = [regex stringByReplacingMatchesInString:data
|
normalizedData = [regex stringByReplacingMatchesInString:data
|
||||||
options:0
|
options:0
|
||||||
range:NSMakeRange(0, [data length])
|
range:NSMakeRange(0, data.length)
|
||||||
withTemplate:@""
|
withTemplate:@""
|
||||||
];
|
];
|
||||||
} else if ([type isEqualToString:FBSDKGender]){
|
} else if ([type isEqualToString:FBSDKGender]){
|
||||||
NSString *temp = [data stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
|
NSString *temp = [data stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
|
||||||
temp = [temp lowercaseString];
|
temp = temp.lowercaseString;
|
||||||
normalizedData = [temp length] > 0 ? [temp substringToIndex:1]: @"";
|
normalizedData = temp.length > 0 ? [temp substringToIndex:1]: @"";
|
||||||
}
|
}
|
||||||
|
|
||||||
return normalizedData;
|
return normalizedData;
|
||||||
@ -210,7 +209,7 @@ static volatile bool initialized = false;
|
|||||||
+ (BOOL)maybeSHA256Hashed:(NSString *)data
|
+ (BOOL)maybeSHA256Hashed:(NSString *)data
|
||||||
{
|
{
|
||||||
NSRange range = [data rangeOfString:@"[A-Fa-f0-9]{64}" options:NSRegularExpressionSearch];
|
NSRange range = [data rangeOfString:@"[A-Fa-f0-9]{64}" options:NSRegularExpressionSearch];
|
||||||
return ([data length] == 64) && (range.location != NSNotFound);
|
return (data.length == 64) && (range.location != NSNotFound);
|
||||||
}
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|||||||
@ -21,7 +21,16 @@
|
|||||||
#import "FBSDKAppEvents+Internal.h"
|
#import "FBSDKAppEvents+Internal.h"
|
||||||
#import "FBSDKTimeSpentData.h"
|
#import "FBSDKTimeSpentData.h"
|
||||||
|
|
||||||
static NSString *const BoltsMeasurementEventNotificationName = @"com.parse.bolts.measurement_event";
|
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0
|
||||||
|
|
||||||
|
static NSNotificationName const BoltsMeasurementEventNotification = @"com.parse.bolts.measurement_event";
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
static NSString *const BoltsMeasurementEventNotification = @"com.parse.bolts.measurement_event";
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
static NSString *const BoltsMeasurementEventName = @"event_name";
|
static NSString *const BoltsMeasurementEventName = @"event_name";
|
||||||
static NSString *const BoltsMeasurementEventArgs = @"event_args";
|
static NSString *const BoltsMeasurementEventArgs = @"event_args";
|
||||||
static NSString *const BoltsMeasurementEventPrefix = @"bf_";
|
static NSString *const BoltsMeasurementEventPrefix = @"bf_";
|
||||||
@ -37,7 +46,7 @@ static NSString *const BoltsMeasurementEventPrefix = @"bf_";
|
|||||||
NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
|
NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
|
||||||
[center addObserver:defaultListener
|
[center addObserver:defaultListener
|
||||||
selector:@selector(logFBAppEventForNotification:)
|
selector:@selector(logFBAppEventForNotification:)
|
||||||
name:BoltsMeasurementEventNotificationName
|
name:BoltsMeasurementEventNotification
|
||||||
object:nil];
|
object:nil];
|
||||||
});
|
});
|
||||||
return defaultListener;
|
return defaultListener;
|
||||||
@ -59,7 +68,7 @@ static NSString *const BoltsMeasurementEventPrefix = @"bf_";
|
|||||||
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"[^0-9a-zA-Z _-]" options:0 error:&error];
|
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"[^0-9a-zA-Z _-]" options:0 error:&error];
|
||||||
NSString *safeKey = [regex stringByReplacingMatchesInString:key
|
NSString *safeKey = [regex stringByReplacingMatchesInString:key
|
||||||
options:0
|
options:0
|
||||||
range:NSMakeRange(0, [key length])
|
range:NSMakeRange(0, key.length)
|
||||||
withTemplate:@"-"];
|
withTemplate:@"-"];
|
||||||
safeKey = [safeKey stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@" -"]];
|
safeKey = [safeKey stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@" -"]];
|
||||||
logData[safeKey] = eventArgs[key];
|
logData[safeKey] = eventArgs[key];
|
||||||
|
|||||||
@ -18,12 +18,7 @@
|
|||||||
|
|
||||||
#import "FBSDKBase64.h"
|
#import "FBSDKBase64.h"
|
||||||
|
|
||||||
#import "FBSDKMacros.h"
|
|
||||||
|
|
||||||
@implementation FBSDKBase64
|
@implementation FBSDKBase64
|
||||||
{
|
|
||||||
BOOL _optionsEnabled;
|
|
||||||
}
|
|
||||||
|
|
||||||
static FBSDKBase64 *_decoder;
|
static FBSDKBase64 *_decoder;
|
||||||
static FBSDKBase64 *_encoder;
|
static FBSDKBase64 *_encoder;
|
||||||
@ -33,11 +28,8 @@ static FBSDKBase64 *_encoder;
|
|||||||
+ (void)initialize
|
+ (void)initialize
|
||||||
{
|
{
|
||||||
if (self == [FBSDKBase64 class]) {
|
if (self == [FBSDKBase64 class]) {
|
||||||
BOOL optionsEnabled;
|
_decoder = [[FBSDKBase64 alloc] init];
|
||||||
optionsEnabled = [NSData instancesRespondToSelector:@selector(initWithBase64EncodedString:options:)];
|
_encoder = [[FBSDKBase64 alloc] init];
|
||||||
_decoder = [[FBSDKBase64 alloc] initWithOptionsEnabled:optionsEnabled];
|
|
||||||
optionsEnabled = [NSData instancesRespondToSelector:@selector(base64EncodedStringWithOptions:)];
|
|
||||||
_encoder = [[FBSDKBase64 alloc] initWithOptionsEnabled:optionsEnabled];
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -63,20 +55,6 @@ static FBSDKBase64 *_encoder;
|
|||||||
|
|
||||||
#pragma mark - Object Lifecycle
|
#pragma mark - Object Lifecycle
|
||||||
|
|
||||||
- (instancetype)init
|
|
||||||
{
|
|
||||||
FBSDK_NOT_DESIGNATED_INITIALIZER(initWithOptionsEnabled:);
|
|
||||||
return nil;
|
|
||||||
}
|
|
||||||
|
|
||||||
- (instancetype)initWithOptionsEnabled:(BOOL)optionsEnabled
|
|
||||||
{
|
|
||||||
if ((self = [super init])) {
|
|
||||||
_optionsEnabled = optionsEnabled;
|
|
||||||
}
|
|
||||||
return self;
|
|
||||||
}
|
|
||||||
|
|
||||||
#pragma mark - Implementation Methods
|
#pragma mark - Implementation Methods
|
||||||
|
|
||||||
- (NSData *)decodeAsData:(NSString *)string
|
- (NSData *)decodeAsData:(NSString *)string
|
||||||
@ -91,14 +69,8 @@ static FBSDKBase64 *_encoder;
|
|||||||
needPadding = 4 - needPadding;
|
needPadding = 4 - needPadding;
|
||||||
string = [string stringByPaddingToLength:string.length+needPadding withString:@"=" startingAtIndex:0];
|
string = [string stringByPaddingToLength:string.length+needPadding withString:@"=" startingAtIndex:0];
|
||||||
}
|
}
|
||||||
if (_optionsEnabled) {
|
|
||||||
return [[NSData alloc] initWithBase64EncodedString:string options:NSDataBase64DecodingIgnoreUnknownCharacters];
|
return [[NSData alloc] initWithBase64EncodedString:string options:NSDataBase64DecodingIgnoreUnknownCharacters];
|
||||||
} else {
|
|
||||||
#pragma clang diagnostic push
|
|
||||||
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
|
|
||||||
return [[NSData alloc] initWithBase64Encoding:string];
|
|
||||||
#pragma clang diagnostic pop
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
- (NSString *)decodeAsString:(NSString *)string
|
- (NSString *)decodeAsString:(NSString *)string
|
||||||
@ -115,14 +87,8 @@ static FBSDKBase64 *_encoder;
|
|||||||
if (!data) {
|
if (!data) {
|
||||||
return nil;
|
return nil;
|
||||||
}
|
}
|
||||||
if (_optionsEnabled) {
|
|
||||||
return [data base64EncodedStringWithOptions:0];
|
return [data base64EncodedStringWithOptions:0];
|
||||||
} else {
|
|
||||||
#pragma clang diagnostic push
|
|
||||||
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
|
|
||||||
return [data base64Encoding];
|
|
||||||
#pragma clang diagnostic pop
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
- (NSString *)encodeString:(NSString *)string
|
- (NSString *)encodeString:(NSString *)string
|
||||||
|
|||||||
@ -22,6 +22,9 @@
|
|||||||
|
|
||||||
@interface FBSDKBridgeAPICrypto : NSObject
|
@interface FBSDKBridgeAPICrypto : NSObject
|
||||||
|
|
||||||
|
- (instancetype)init NS_UNAVAILABLE;
|
||||||
|
+ (instancetype)new NS_UNAVAILABLE;
|
||||||
|
|
||||||
+ (void)addCipherKeyToQueryParameters:(NSMutableDictionary *)queryParameters;
|
+ (void)addCipherKeyToQueryParameters:(NSMutableDictionary *)queryParameters;
|
||||||
+ (NSDictionary *)decryptResponseForRequest:(FBSDKBridgeAPIRequest *)request
|
+ (NSDictionary *)decryptResponseForRequest:(FBSDKBridgeAPIRequest *)request
|
||||||
queryParameters:(NSDictionary *)queryParameters
|
queryParameters:(NSDictionary *)queryParameters
|
||||||
|
|||||||
@ -23,7 +23,6 @@
|
|||||||
#import "FBSDKCrypto.h"
|
#import "FBSDKCrypto.h"
|
||||||
#import "FBSDKError.h"
|
#import "FBSDKError.h"
|
||||||
#import "FBSDKInternalUtility.h"
|
#import "FBSDKInternalUtility.h"
|
||||||
#import "FBSDKMacros.h"
|
|
||||||
#import "FBSDKSettings.h"
|
#import "FBSDKSettings.h"
|
||||||
#import "FBSDKUtility.h"
|
#import "FBSDKUtility.h"
|
||||||
|
|
||||||
@ -58,7 +57,7 @@ static NSString *g_cipherKey = nil;
|
|||||||
NSDictionary *userInfo = @{
|
NSDictionary *userInfo = @{
|
||||||
FBSDKErrorArgumentValueKey: queryParameters,
|
FBSDKErrorArgumentValueKey: queryParameters,
|
||||||
};
|
};
|
||||||
*errorRef = [FBSDKError errorWithCode:FBSDKEncryptionErrorCode
|
*errorRef = [NSError fbErrorWithCode:FBSDKErrorEncryption
|
||||||
userInfo:userInfo
|
userInfo:userInfo
|
||||||
message:@"Error decrypting incoming query parameters."
|
message:@"Error decrypting incoming query parameters."
|
||||||
underlyingError:nil];
|
underlyingError:nil];
|
||||||
@ -66,7 +65,7 @@ static NSString *g_cipherKey = nil;
|
|||||||
return nil;
|
return nil;
|
||||||
}
|
}
|
||||||
NSArray *additionalSignedDataArray = @[
|
NSArray *additionalSignedDataArray = @[
|
||||||
[[NSBundle mainBundle] bundleIdentifier],
|
[NSBundle mainBundle].bundleIdentifier,
|
||||||
[FBSDKSettings appID] ?: @"",
|
[FBSDKSettings appID] ?: @"",
|
||||||
@"bridge",
|
@"bridge",
|
||||||
request.methodName ?: @"",
|
request.methodName ?: @"",
|
||||||
@ -88,7 +87,7 @@ static NSString *g_cipherKey = nil;
|
|||||||
@"version": additionalSignedDataArray[4],
|
@"version": additionalSignedDataArray[4],
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
*errorRef = [FBSDKError errorWithCode:FBSDKEncryptionErrorCode
|
*errorRef = [NSError fbErrorWithCode:FBSDKErrorEncryption
|
||||||
userInfo:userInfo
|
userInfo:userInfo
|
||||||
message:@"Error decrypting incoming query parameters."
|
message:@"Error decrypting incoming query parameters."
|
||||||
underlyingError:nil];
|
underlyingError:nil];
|
||||||
@ -107,14 +106,6 @@ static NSString *g_cipherKey = nil;
|
|||||||
[self _resetCipherKey];
|
[self _resetCipherKey];
|
||||||
}
|
}
|
||||||
|
|
||||||
#pragma mark - Object Lifecycle
|
|
||||||
|
|
||||||
- (instancetype)init
|
|
||||||
{
|
|
||||||
FBSDK_NO_DESIGNATED_INITIALIZER();
|
|
||||||
return nil;
|
|
||||||
}
|
|
||||||
|
|
||||||
#pragma mark - Helper Methods
|
#pragma mark - Helper Methods
|
||||||
|
|
||||||
+ (NSString *)_cipherKey
|
+ (NSString *)_cipherKey
|
||||||
|
|||||||
@ -18,15 +18,13 @@
|
|||||||
|
|
||||||
#import <Foundation/Foundation.h>
|
#import <Foundation/Foundation.h>
|
||||||
|
|
||||||
#import <FBSDKCoreKit/FBSDKMacros.h>
|
|
||||||
|
|
||||||
#import "FBSDKBridgeAPIProtocolType.h"
|
#import "FBSDKBridgeAPIProtocolType.h"
|
||||||
|
|
||||||
@class FBSDKBridgeAPIRequest;
|
@class FBSDKBridgeAPIRequest;
|
||||||
|
|
||||||
FBSDK_EXTERN NSString *const FBSDKBridgeAPIAppIDKey;
|
FOUNDATION_EXPORT NSString *const FBSDKBridgeAPIAppIDKey;
|
||||||
FBSDK_EXTERN NSString *const FBSDKBridgeAPISchemeSuffixKey;
|
FOUNDATION_EXPORT NSString *const FBSDKBridgeAPISchemeSuffixKey;
|
||||||
FBSDK_EXTERN NSString *const FBSDKBridgeAPIVersionKey;
|
FOUNDATION_EXPORT NSString *const FBSDKBridgeAPIVersionKey;
|
||||||
|
|
||||||
@protocol FBSDKBridgeAPIProtocol <NSObject>
|
@protocol FBSDKBridgeAPIProtocol <NSObject>
|
||||||
|
|
||||||
|
|||||||
@ -24,6 +24,8 @@
|
|||||||
|
|
||||||
@interface FBSDKBridgeAPIRequest : NSObject <FBSDKCopying>
|
@interface FBSDKBridgeAPIRequest : NSObject <FBSDKCopying>
|
||||||
|
|
||||||
|
- (instancetype)init NS_UNAVAILABLE;
|
||||||
|
+ (instancetype)new NS_UNAVAILABLE;
|
||||||
+ (instancetype)bridgeAPIRequestWithProtocolType:(FBSDKBridgeAPIProtocolType)protocolType
|
+ (instancetype)bridgeAPIRequestWithProtocolType:(FBSDKBridgeAPIProtocolType)protocolType
|
||||||
scheme:(NSString *)scheme
|
scheme:(NSString *)scheme
|
||||||
methodName:(NSString *)methodName
|
methodName:(NSString *)methodName
|
||||||
|
|||||||
@ -24,7 +24,6 @@
|
|||||||
#import "FBSDKBridgeAPIProtocolWebV1.h"
|
#import "FBSDKBridgeAPIProtocolWebV1.h"
|
||||||
#import "FBSDKBridgeAPIProtocolWebV2.h"
|
#import "FBSDKBridgeAPIProtocolWebV2.h"
|
||||||
#import "FBSDKInternalUtility.h"
|
#import "FBSDKInternalUtility.h"
|
||||||
#import "FBSDKMacros.h"
|
|
||||||
#import "FBSDKSettings.h"
|
#import "FBSDKSettings.h"
|
||||||
#import "FBSDKUtility.h"
|
#import "FBSDKUtility.h"
|
||||||
|
|
||||||
@ -94,23 +93,11 @@ NSString *const FBSDKBridgeAPIVersionKey = @"version";
|
|||||||
_parameters = [parameters copy];
|
_parameters = [parameters copy];
|
||||||
_userInfo = [userInfo copy];
|
_userInfo = [userInfo copy];
|
||||||
|
|
||||||
_actionID = [[NSUUID UUID] UUIDString];
|
_actionID = [NSUUID UUID].UUIDString;
|
||||||
}
|
}
|
||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (instancetype)init
|
|
||||||
{
|
|
||||||
FBSDK_NOT_DESIGNATED_INITIALIZER(initWithProtocol:protocolType:scheme:methodName:methodVersion:parameters:userInfo:);
|
|
||||||
return [self initWithProtocol:nil
|
|
||||||
protocolType:FBSDKBridgeAPIProtocolTypeWeb
|
|
||||||
scheme:nil
|
|
||||||
methodName:nil
|
|
||||||
methodVersion:nil
|
|
||||||
parameters:nil
|
|
||||||
userInfo:nil];
|
|
||||||
}
|
|
||||||
|
|
||||||
#pragma mark - Public Methods
|
#pragma mark - Public Methods
|
||||||
|
|
||||||
- (NSURL *)requestURL:(NSError *__autoreleasing *)errorRef
|
- (NSURL *)requestURL:(NSError *__autoreleasing *)errorRef
|
||||||
|
|||||||
@ -24,6 +24,9 @@
|
|||||||
|
|
||||||
@interface FBSDKBridgeAPIResponse : NSObject <FBSDKCopying>
|
@interface FBSDKBridgeAPIResponse : NSObject <FBSDKCopying>
|
||||||
|
|
||||||
|
- (instancetype)init NS_UNAVAILABLE;
|
||||||
|
+ (instancetype)new NS_UNAVAILABLE;
|
||||||
|
|
||||||
+ (instancetype)bridgeAPIResponseWithRequest:(FBSDKBridgeAPIRequest *)request error:(NSError *)error;
|
+ (instancetype)bridgeAPIResponseWithRequest:(FBSDKBridgeAPIRequest *)request error:(NSError *)error;
|
||||||
+ (instancetype)bridgeAPIResponseWithRequest:(FBSDKBridgeAPIRequest *)request
|
+ (instancetype)bridgeAPIResponseWithRequest:(FBSDKBridgeAPIRequest *)request
|
||||||
responseURL:(NSURL *)responseURL
|
responseURL:(NSURL *)responseURL
|
||||||
|
|||||||
@ -23,7 +23,6 @@
|
|||||||
#import "FBSDKBridgeAPIProtocolType.h"
|
#import "FBSDKBridgeAPIProtocolType.h"
|
||||||
#import "FBSDKBridgeAPIRequest+Private.h"
|
#import "FBSDKBridgeAPIRequest+Private.h"
|
||||||
#import "FBSDKInternalUtility.h"
|
#import "FBSDKInternalUtility.h"
|
||||||
#import "FBSDKMacros.h"
|
|
||||||
#import "FBSDKTypeUtility.h"
|
#import "FBSDKTypeUtility.h"
|
||||||
#import "FBSDKUtility.h"
|
#import "FBSDKUtility.h"
|
||||||
|
|
||||||
@ -119,12 +118,6 @@ NS_DESIGNATED_INITIALIZER;
|
|||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (instancetype)init
|
|
||||||
{
|
|
||||||
FBSDK_NOT_DESIGNATED_INITIALIZER(initWithRequest:responseParameters:cancelled:error:);
|
|
||||||
return [self initWithRequest:nil responseParameters:nil cancelled:NO error:nil];
|
|
||||||
}
|
|
||||||
|
|
||||||
#pragma mark - NSCopying
|
#pragma mark - NSCopying
|
||||||
|
|
||||||
- (id)copyWithZone:(NSZone *)zone
|
- (id)copyWithZone:(NSZone *)zone
|
||||||
|
|||||||
@ -18,8 +18,6 @@
|
|||||||
|
|
||||||
#import <UIKit/UIKit.h>
|
#import <UIKit/UIKit.h>
|
||||||
|
|
||||||
#import <FBSDKCoreKit/FBSDKMacros.h>
|
|
||||||
|
|
||||||
#import "FBSDKBridgeAPIProtocol.h"
|
#import "FBSDKBridgeAPIProtocol.h"
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
@ -28,7 +26,7 @@ typedef struct
|
|||||||
__unsafe_unretained NSString *methodArgs;
|
__unsafe_unretained NSString *methodArgs;
|
||||||
__unsafe_unretained NSString *methodVersion;
|
__unsafe_unretained NSString *methodVersion;
|
||||||
} FBSDKBridgeAPIProtocolNativeV1OutputKeysStruct;
|
} FBSDKBridgeAPIProtocolNativeV1OutputKeysStruct;
|
||||||
FBSDK_EXTERN const FBSDKBridgeAPIProtocolNativeV1OutputKeysStruct FBSDKBridgeAPIProtocolNativeV1OutputKeys;
|
FOUNDATION_EXPORT const FBSDKBridgeAPIProtocolNativeV1OutputKeysStruct FBSDKBridgeAPIProtocolNativeV1OutputKeys;
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
@ -37,24 +35,27 @@ typedef struct
|
|||||||
__unsafe_unretained NSString *appName;
|
__unsafe_unretained NSString *appName;
|
||||||
__unsafe_unretained NSString *sdkVersion;
|
__unsafe_unretained NSString *sdkVersion;
|
||||||
} FBSDKBridgeAPIProtocolNativeV1BridgeParameterOutputKeysStruct;
|
} FBSDKBridgeAPIProtocolNativeV1BridgeParameterOutputKeysStruct;
|
||||||
FBSDK_EXTERN const FBSDKBridgeAPIProtocolNativeV1BridgeParameterOutputKeysStruct FBSDKBridgeAPIProtocolNativeV1BridgeParameterOutputKeys;
|
FOUNDATION_EXPORT const FBSDKBridgeAPIProtocolNativeV1BridgeParameterOutputKeysStruct FBSDKBridgeAPIProtocolNativeV1BridgeParameterOutputKeys;
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
__unsafe_unretained NSString *bridgeArgs;
|
__unsafe_unretained NSString *bridgeArgs;
|
||||||
__unsafe_unretained NSString *methodResults;
|
__unsafe_unretained NSString *methodResults;
|
||||||
} FBSDKBridgeAPIProtocolNativeV1InputKeysStruct;
|
} FBSDKBridgeAPIProtocolNativeV1InputKeysStruct;
|
||||||
FBSDK_EXTERN const FBSDKBridgeAPIProtocolNativeV1InputKeysStruct FBSDKBridgeAPIProtocolNativeV1InputKeys;
|
FOUNDATION_EXPORT const FBSDKBridgeAPIProtocolNativeV1InputKeysStruct FBSDKBridgeAPIProtocolNativeV1InputKeys;
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
__unsafe_unretained NSString *actionID;
|
__unsafe_unretained NSString *actionID;
|
||||||
__unsafe_unretained NSString *error;
|
__unsafe_unretained NSString *error;
|
||||||
} FBSDKBridgeAPIProtocolNativeV1BridgeParameterInputKeysStruct;
|
} FBSDKBridgeAPIProtocolNativeV1BridgeParameterInputKeysStruct;
|
||||||
FBSDK_EXTERN const FBSDKBridgeAPIProtocolNativeV1BridgeParameterInputKeysStruct FBSDKBridgeAPIProtocolNativeV1BridgeParameterInputKeys;
|
FOUNDATION_EXPORT const FBSDKBridgeAPIProtocolNativeV1BridgeParameterInputKeysStruct FBSDKBridgeAPIProtocolNativeV1BridgeParameterInputKeys;
|
||||||
|
|
||||||
@interface FBSDKBridgeAPIProtocolNativeV1 : NSObject <FBSDKBridgeAPIProtocol>
|
@interface FBSDKBridgeAPIProtocolNativeV1 : NSObject <FBSDKBridgeAPIProtocol>
|
||||||
|
|
||||||
|
- (instancetype)init NS_UNAVAILABLE;
|
||||||
|
+ (instancetype)new NS_UNAVAILABLE;
|
||||||
|
|
||||||
- (instancetype)initWithAppScheme:(NSString *)appScheme;
|
- (instancetype)initWithAppScheme:(NSString *)appScheme;
|
||||||
- (instancetype)initWithAppScheme:(NSString *)appScheme
|
- (instancetype)initWithAppScheme:(NSString *)appScheme
|
||||||
pasteboard:(UIPasteboard *)pasteboard
|
pasteboard:(UIPasteboard *)pasteboard
|
||||||
|
|||||||
@ -20,8 +20,6 @@
|
|||||||
|
|
||||||
#import <UIKit/UIKit.h>
|
#import <UIKit/UIKit.h>
|
||||||
|
|
||||||
#import <FBSDKCoreKit/FBSDKMacros.h>
|
|
||||||
|
|
||||||
#import "FBSDKApplicationDelegate+Internal.h"
|
#import "FBSDKApplicationDelegate+Internal.h"
|
||||||
#import "FBSDKBase64.h"
|
#import "FBSDKBase64.h"
|
||||||
#import "FBSDKBridgeAPIRequest.h"
|
#import "FBSDKBridgeAPIRequest.h"
|
||||||
@ -125,12 +123,6 @@ static const struct
|
|||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (instancetype)init
|
|
||||||
{
|
|
||||||
FBSDK_NOT_DESIGNATED_INITIALIZER(initWithAppScheme:);
|
|
||||||
return [self initWithAppScheme:nil];
|
|
||||||
}
|
|
||||||
|
|
||||||
#pragma mark - FBSDKBridgeAPIProtocol
|
#pragma mark - FBSDKBridgeAPIProtocol
|
||||||
|
|
||||||
- (NSURL *)requestURLWithActionID:(NSString *)actionID
|
- (NSURL *)requestURLWithActionID:(NSString *)actionID
|
||||||
@ -140,28 +132,33 @@ static const struct
|
|||||||
parameters:(NSDictionary *)parameters
|
parameters:(NSDictionary *)parameters
|
||||||
error:(NSError *__autoreleasing *)errorRef
|
error:(NSError *__autoreleasing *)errorRef
|
||||||
{
|
{
|
||||||
NSString *host = @"dialog";
|
NSString *const host = @"dialog";
|
||||||
NSString *path = [@"/" stringByAppendingString:methodName];
|
NSString *const path = [@"/" stringByAppendingString:methodName];
|
||||||
|
|
||||||
NSMutableDictionary *queryParameters = [[NSMutableDictionary alloc] init];
|
NSMutableDictionary<NSString *, id> *const queryParameters = [[NSMutableDictionary alloc] init];
|
||||||
[FBSDKInternalUtility dictionary:queryParameters setObject:methodVersion
|
[FBSDKInternalUtility dictionary:queryParameters setObject:methodVersion
|
||||||
forKey:FBSDKBridgeAPIProtocolNativeV1OutputKeys.methodVersion];
|
forKey:FBSDKBridgeAPIProtocolNativeV1OutputKeys.methodVersion];
|
||||||
|
|
||||||
if ([parameters count]) {
|
if (parameters.count) {
|
||||||
NSString *parametersString = [self _JSONStringForObject:parameters enablePasteboard:YES error:errorRef];
|
NSString *const parametersString = [self _JSONStringForObject:parameters enablePasteboard:YES error:errorRef];
|
||||||
if (!parametersString) {
|
if (!parametersString) {
|
||||||
return nil;
|
return nil;
|
||||||
}
|
}
|
||||||
|
NSString *const escapedParametersString = [parametersString stringByReplacingOccurrencesOfString:@"&"
|
||||||
|
withString:@"%26"
|
||||||
|
options:NSCaseInsensitiveSearch
|
||||||
|
range:NSMakeRange(0,
|
||||||
|
parametersString.length)];
|
||||||
[FBSDKInternalUtility dictionary:queryParameters
|
[FBSDKInternalUtility dictionary:queryParameters
|
||||||
setObject:parametersString
|
setObject:escapedParametersString
|
||||||
forKey:FBSDKBridgeAPIProtocolNativeV1OutputKeys.methodArgs];
|
forKey:FBSDKBridgeAPIProtocolNativeV1OutputKeys.methodArgs];
|
||||||
}
|
}
|
||||||
|
|
||||||
NSDictionary *bridgeParameters = [self _bridgeParametersWithActionID:actionID error:errorRef];
|
NSDictionary<NSString *, id> *const bridgeParameters = [self _bridgeParametersWithActionID:actionID error:errorRef];
|
||||||
if (!bridgeParameters) {
|
if (!bridgeParameters) {
|
||||||
return nil;
|
return nil;
|
||||||
}
|
}
|
||||||
NSString *bridgeParametersString = [self _JSONStringForObject:bridgeParameters enablePasteboard:NO error:errorRef];
|
NSString *const bridgeParametersString = [self _JSONStringForObject:bridgeParameters enablePasteboard:NO error:errorRef];
|
||||||
if (!bridgeParametersString) {
|
if (!bridgeParametersString) {
|
||||||
return nil;
|
return nil;
|
||||||
}
|
}
|
||||||
@ -194,7 +191,7 @@ static const struct
|
|||||||
bridgeParameters = [FBSDKTypeUtility dictionaryValue:bridgeParameters];
|
bridgeParameters = [FBSDKTypeUtility dictionaryValue:bridgeParameters];
|
||||||
if (!bridgeParameters) {
|
if (!bridgeParameters) {
|
||||||
if (error && (errorRef != NULL)) {
|
if (error && (errorRef != NULL)) {
|
||||||
*errorRef = [FBSDKError invalidArgumentErrorWithName:FBSDKBridgeAPIProtocolNativeV1InputKeys.bridgeArgs
|
*errorRef = [NSError fbInvalidArgumentErrorWithName:FBSDKBridgeAPIProtocolNativeV1InputKeys.bridgeArgs
|
||||||
value:bridgeParametersJSON
|
value:bridgeParametersJSON
|
||||||
message:@"Invalid bridge_args."
|
message:@"Invalid bridge_args."
|
||||||
underlyingError:error];
|
underlyingError:error];
|
||||||
@ -219,7 +216,7 @@ static const struct
|
|||||||
NSDictionary *resultParameters = [FBSDKInternalUtility objectForJSONString:resultParametersJSON error:&error];
|
NSDictionary *resultParameters = [FBSDKInternalUtility objectForJSONString:resultParametersJSON error:&error];
|
||||||
if (!resultParameters) {
|
if (!resultParameters) {
|
||||||
if (errorRef != NULL) {
|
if (errorRef != NULL) {
|
||||||
*errorRef = [FBSDKError invalidArgumentErrorWithName:FBSDKBridgeAPIProtocolNativeV1InputKeys.methodResults
|
*errorRef = [NSError fbInvalidArgumentErrorWithName:FBSDKBridgeAPIProtocolNativeV1InputKeys.methodResults
|
||||||
value:resultParametersJSON
|
value:resultParametersJSON
|
||||||
message:@"Invalid method_results."
|
message:@"Invalid method_results."
|
||||||
underlyingError:error];
|
underlyingError:error];
|
||||||
@ -243,7 +240,7 @@ static const struct
|
|||||||
NSArray *files = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleIcons"]
|
NSArray *files = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleIcons"]
|
||||||
[@"CFBundlePrimaryIcon"]
|
[@"CFBundlePrimaryIcon"]
|
||||||
[@"CFBundleIconFiles"];
|
[@"CFBundleIconFiles"];
|
||||||
if (![files count]) {
|
if (!files.count) {
|
||||||
return nil;
|
return nil;
|
||||||
}
|
}
|
||||||
return [UIImage imageNamed:files[0]];
|
return [UIImage imageNamed:files[0]];
|
||||||
@ -271,7 +268,7 @@ static const struct
|
|||||||
NSString *domain = [FBSDKTypeUtility stringValue:dictionary[FBSDKBridgeAPIProtocolNativeV1ErrorKeys.domain]] ?:
|
NSString *domain = [FBSDKTypeUtility stringValue:dictionary[FBSDKBridgeAPIProtocolNativeV1ErrorKeys.domain]] ?:
|
||||||
FBSDKErrorDomain;
|
FBSDKErrorDomain;
|
||||||
NSInteger code = [FBSDKTypeUtility integerValue:dictionary[FBSDKBridgeAPIProtocolNativeV1ErrorKeys.code]] ?:
|
NSInteger code = [FBSDKTypeUtility integerValue:dictionary[FBSDKBridgeAPIProtocolNativeV1ErrorKeys.code]] ?:
|
||||||
FBSDKUnknownErrorCode;
|
FBSDKErrorUnknown;
|
||||||
NSDictionary *userInfo = [FBSDKTypeUtility dictionaryValue:dictionary[FBSDKBridgeAPIProtocolNativeV1ErrorKeys.userInfo]];
|
NSDictionary *userInfo = [FBSDKTypeUtility dictionaryValue:dictionary[FBSDKBridgeAPIProtocolNativeV1ErrorKeys.userInfo]];
|
||||||
return [NSError errorWithDomain:domain code:code userInfo:userInfo];
|
return [NSError errorWithDomain:domain code:code userInfo:userInfo];
|
||||||
}
|
}
|
||||||
@ -315,7 +312,7 @@ static const struct
|
|||||||
}
|
}
|
||||||
return dictionary;
|
return dictionary;
|
||||||
} else if ([invalidObject isKindOfClass:[NSURL class]]) {
|
} else if ([invalidObject isKindOfClass:[NSURL class]]) {
|
||||||
return [(NSURL *)invalidObject absoluteString];
|
return ((NSURL *)invalidObject).absoluteString;
|
||||||
}
|
}
|
||||||
return invalidObject;
|
return invalidObject;
|
||||||
}];
|
}];
|
||||||
|
|||||||
@ -24,7 +24,6 @@
|
|||||||
#import "FBSDKBridgeAPIRequest.h"
|
#import "FBSDKBridgeAPIRequest.h"
|
||||||
#import "FBSDKError.h"
|
#import "FBSDKError.h"
|
||||||
#import "FBSDKInternalUtility.h"
|
#import "FBSDKInternalUtility.h"
|
||||||
#import "FBSDKMacros.h"
|
|
||||||
#import "FBSDKSettings.h"
|
#import "FBSDKSettings.h"
|
||||||
#import "FBSDKTypeUtility.h"
|
#import "FBSDKTypeUtility.h"
|
||||||
|
|
||||||
@ -82,7 +81,7 @@
|
|||||||
}
|
}
|
||||||
default:{
|
default:{
|
||||||
if (errorRef != NULL) {
|
if (errorRef != NULL) {
|
||||||
*errorRef = [FBSDKError errorWithCode:errorCode
|
*errorRef = [NSError fbErrorWithCode:errorCode
|
||||||
message:[FBSDKTypeUtility stringValue:queryParameters[@"error_message"]]];
|
message:[FBSDKTypeUtility stringValue:queryParameters[@"error_message"]]];
|
||||||
}
|
}
|
||||||
return nil;
|
return nil;
|
||||||
@ -95,7 +94,7 @@
|
|||||||
NSDictionary *bridgeParameters = [FBSDKInternalUtility objectForJSONString:bridgeParametersJSON error:&error];
|
NSDictionary *bridgeParameters = [FBSDKInternalUtility objectForJSONString:bridgeParametersJSON error:&error];
|
||||||
if (!bridgeParameters) {
|
if (!bridgeParameters) {
|
||||||
if (error && (errorRef != NULL)) {
|
if (error && (errorRef != NULL)) {
|
||||||
*errorRef = [FBSDKError invalidArgumentErrorWithName:FBSDK_BRIDGE_API_PROTOCOL_WEB_V1_BRIDGE_ARGS_KEY
|
*errorRef = [NSError fbInvalidArgumentErrorWithName:FBSDK_BRIDGE_API_PROTOCOL_WEB_V1_BRIDGE_ARGS_KEY
|
||||||
value:bridgeParametersJSON
|
value:bridgeParametersJSON
|
||||||
message:nil
|
message:nil
|
||||||
underlyingError:error];
|
underlyingError:error];
|
||||||
|
|||||||
@ -83,7 +83,7 @@
|
|||||||
FBSDKDialogConfiguration *dialogConfiguration = [serverConfiguration dialogConfigurationForDialogName:methodName];
|
FBSDKDialogConfiguration *dialogConfiguration = [serverConfiguration dialogConfigurationForDialogName:methodName];
|
||||||
if (!dialogConfiguration) {
|
if (!dialogConfiguration) {
|
||||||
if (errorRef != NULL) {
|
if (errorRef != NULL) {
|
||||||
*errorRef = [FBSDKError errorWithCode:FBSDKDialogUnavailableErrorCode message:nil];
|
*errorRef = [NSError fbErrorWithCode:FBSDKErrorDialogUnavailable message:nil];
|
||||||
}
|
}
|
||||||
return nil;
|
return nil;
|
||||||
}
|
}
|
||||||
@ -98,7 +98,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
NSMutableDictionary *queryParameters = [[FBSDKUtility dictionaryWithQueryString:requestURL.query] mutableCopy];
|
NSMutableDictionary *queryParameters = [[FBSDKUtility dictionaryWithQueryString:requestURL.query] mutableCopy];
|
||||||
queryParameters[@"ios_bundle_id"] = [[NSBundle mainBundle] bundleIdentifier];
|
queryParameters[@"ios_bundle_id"] = [NSBundle mainBundle].bundleIdentifier;
|
||||||
NSURL *redirectURL = [self _redirectURLWithActionID:nil methodName:methodName error:errorRef];
|
NSURL *redirectURL = [self _redirectURLWithActionID:nil methodName:methodName error:errorRef];
|
||||||
if (!redirectURL) {
|
if (!redirectURL) {
|
||||||
return nil;
|
return nil;
|
||||||
|
|||||||
@ -28,7 +28,7 @@
|
|||||||
static const uint8_t kFBSDK_CRYPTO_CURRENT_VERSION = 1;
|
static const uint8_t kFBSDK_CRYPTO_CURRENT_VERSION = 1;
|
||||||
static const uint8_t kFBSDK_CRYPTO_CURRENT_MASTER_KEY_LENGTH = 16;
|
static const uint8_t kFBSDK_CRYPTO_CURRENT_MASTER_KEY_LENGTH = 16;
|
||||||
|
|
||||||
FBSDK_STATIC_INLINE void FBSDKCryptoWriteIntBigEndian(uint8_t *buffer, uint32_t value)
|
static inline void FBSDKCryptoWriteIntBigEndian(uint8_t *buffer, uint32_t value)
|
||||||
{
|
{
|
||||||
buffer[3] = (uint8_t)(value & 0xff);
|
buffer[3] = (uint8_t)(value & 0xff);
|
||||||
buffer[2] = (uint8_t)((value >> 8) & 0xff);
|
buffer[2] = (uint8_t)((value >> 8) & 0xff);
|
||||||
@ -36,7 +36,7 @@ FBSDK_STATIC_INLINE void FBSDKCryptoWriteIntBigEndian(uint8_t *buffer, uint32_t
|
|||||||
buffer[0] = (uint8_t)((value >> 24) & 0xff);
|
buffer[0] = (uint8_t)((value >> 24) & 0xff);
|
||||||
}
|
}
|
||||||
|
|
||||||
FBSDK_STATIC_INLINE void FBSDKCryptoBlankData(NSData *data)
|
static inline void FBSDKCryptoBlankData(NSData *data)
|
||||||
{
|
{
|
||||||
if (!data) {
|
if (!data) {
|
||||||
return;
|
return;
|
||||||
@ -45,7 +45,7 @@ FBSDK_STATIC_INLINE void FBSDKCryptoBlankData(NSData *data)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Note: the following simple derivation function is NOT suitable for passwords or weak keys
|
// Note: the following simple derivation function is NOT suitable for passwords or weak keys
|
||||||
FBSDK_STATIC_INLINE NSData *FBSDKCryptoMakeSubKey(uint8_t *key, size_t len, uint32_t idx)
|
static inline NSData *FBSDKCryptoMakeSubKey(uint8_t *key, size_t len, uint32_t idx)
|
||||||
{
|
{
|
||||||
if (!key || len < 10) {
|
if (!key || len < 10) {
|
||||||
return nil;
|
return nil;
|
||||||
@ -78,7 +78,7 @@ FBSDK_STATIC_INLINE NSData *FBSDKCryptoMakeSubKey(uint8_t *key, size_t len, uint
|
|||||||
NSData *masterKeyData = [FBSDKCrypto randomBytes:kFBSDK_CRYPTO_CURRENT_MASTER_KEY_LENGTH + 1];
|
NSData *masterKeyData = [FBSDKCrypto randomBytes:kFBSDK_CRYPTO_CURRENT_MASTER_KEY_LENGTH + 1];
|
||||||
|
|
||||||
// force the first byte to be the crypto version
|
// force the first byte to be the crypto version
|
||||||
uint8_t *first = (uint8_t *) [masterKeyData bytes];
|
uint8_t *first = (uint8_t *)masterKeyData.bytes;
|
||||||
*first = kFBSDK_CRYPTO_CURRENT_VERSION;
|
*first = kFBSDK_CRYPTO_CURRENT_VERSION;
|
||||||
|
|
||||||
NSString *masterKey = [FBSDKBase64 encodeData:masterKeyData];
|
NSString *masterKey = [FBSDKBase64 encodeData:masterKeyData];
|
||||||
@ -111,8 +111,8 @@ FBSDK_STATIC_INLINE NSData *FBSDKCryptoMakeSubKey(uint8_t *key, size_t len, uint
|
|||||||
{
|
{
|
||||||
if ((self = [super init])) {
|
if ((self = [super init])) {
|
||||||
NSData *masterKeyData = [FBSDKBase64 decodeAsData:masterKey];
|
NSData *masterKeyData = [FBSDKBase64 decodeAsData:masterKey];
|
||||||
NSUInteger len = [masterKeyData length];
|
NSUInteger len = masterKeyData.length;
|
||||||
uint8_t *first = (uint8_t *) [masterKeyData bytes];
|
uint8_t *first = (uint8_t *)masterKeyData.bytes;
|
||||||
|
|
||||||
if (len == 0 || first == nil || *first != kFBSDK_CRYPTO_CURRENT_VERSION) {
|
if (len == 0 || first == nil || *first != kFBSDK_CRYPTO_CURRENT_VERSION) {
|
||||||
// only one version supported at the moment
|
// only one version supported at the moment
|
||||||
|
|||||||
@ -25,9 +25,9 @@
|
|||||||
|
|
||||||
+ (instancetype)recoveryAttempterFromConfiguration:(FBSDKErrorRecoveryConfiguration *)configuration
|
+ (instancetype)recoveryAttempterFromConfiguration:(FBSDKErrorRecoveryConfiguration *)configuration
|
||||||
{
|
{
|
||||||
if (configuration.errorCategory == FBSDKGraphRequestErrorCategoryTransient) {
|
if (configuration.errorCategory == FBSDKGraphRequestErrorTransient) {
|
||||||
return [[_FBSDKTemporaryErrorRecoveryAttempter alloc] init];
|
return [[_FBSDKTemporaryErrorRecoveryAttempter alloc] init];
|
||||||
} else if (configuration.errorCategory == FBSDKGraphRequestErrorCategoryOther) {
|
} else if (configuration.errorCategory == FBSDKGraphRequestErrorOther) {
|
||||||
return nil;
|
return nil;
|
||||||
}
|
}
|
||||||
if ([configuration.recoveryActionName isEqualToString:@"login"]) {
|
if ([configuration.recoveryActionName isEqualToString:@"login"]) {
|
||||||
|
|||||||
@ -19,11 +19,18 @@
|
|||||||
#import <Foundation/Foundation.h>
|
#import <Foundation/Foundation.h>
|
||||||
|
|
||||||
#import <FBSDKCoreKit/FBSDKApplicationDelegate.h>
|
#import <FBSDKCoreKit/FBSDKApplicationDelegate.h>
|
||||||
#import <FBSDKCoreKit/FBSDKMacros.h>
|
|
||||||
|
|
||||||
#import "FBSDKCoreKit+Internal.h"
|
#import "FBSDKCoreKit+Internal.h"
|
||||||
|
|
||||||
FBSDK_EXTERN NSString *const FBSDKApplicationDidBecomeActiveNotification;
|
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0
|
||||||
|
|
||||||
|
FOUNDATION_EXPORT NSNotificationName const FBSDKApplicationDidBecomeActiveNotification;
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
FOUNDATION_EXPORT NSString *const FBSDKApplicationDidBecomeActiveNotification;
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
@class FBSDKApplicationCall;
|
@class FBSDKApplicationCall;
|
||||||
|
|
||||||
|
|||||||
@ -79,7 +79,7 @@
|
|||||||
{
|
{
|
||||||
NSURL *fileURL = [self _fileURL:errorRef];
|
NSURL *fileURL = [self _fileURL:errorRef];
|
||||||
|
|
||||||
if (![_fileManager fileExistsAtPath:[fileURL path]]) {
|
if (![_fileManager fileExistsAtPath:fileURL.path]) {
|
||||||
NSData *data = [[self class] data];
|
NSData *data = [[self class] data];
|
||||||
if (![data writeToURL:fileURL options:NSDataWritingAtomic error:errorRef]) {
|
if (![data writeToURL:fileURL options:NSDataWritingAtomic error:errorRef]) {
|
||||||
return NO;
|
return NO;
|
||||||
|
|||||||
@ -23,6 +23,7 @@
|
|||||||
#if !TARGET_OS_TV
|
#if !TARGET_OS_TV
|
||||||
#import "AppEvents/Codeless/FBSDKViewHierarchy.h"
|
#import "AppEvents/Codeless/FBSDKViewHierarchy.h"
|
||||||
#import "AppEvents/Codeless/FBSDKCodelessMacros.h"
|
#import "AppEvents/Codeless/FBSDKCodelessMacros.h"
|
||||||
|
#import "AppEvents/Codeless/FBSDKCodelessIndexer.h"
|
||||||
#import "BridgeAPI/FBSDKBridgeAPIProtocol.h"
|
#import "BridgeAPI/FBSDKBridgeAPIProtocol.h"
|
||||||
#import "BridgeAPI/FBSDKBridgeAPIProtocolType.h"
|
#import "BridgeAPI/FBSDKBridgeAPIProtocolType.h"
|
||||||
#import "BridgeAPI/FBSDKBridgeAPIRequest.h"
|
#import "BridgeAPI/FBSDKBridgeAPIRequest.h"
|
||||||
|
|||||||
@ -54,9 +54,8 @@ static NSMapTable *g_mdnsAdvertisementServices;
|
|||||||
struct utsname systemInfo;
|
struct utsname systemInfo;
|
||||||
uname(&systemInfo);
|
uname(&systemInfo);
|
||||||
NSDictionary *deviceInfo = @{
|
NSDictionary *deviceInfo = @{
|
||||||
FBSDK_DEVICE_INFO_DEVICE: [NSString stringWithCString:systemInfo.machine
|
FBSDK_DEVICE_INFO_DEVICE: @(systemInfo.machine),
|
||||||
encoding:NSUTF8StringEncoding],
|
FBSDK_DEVICE_INFO_MODEL: [UIDevice currentDevice].model,
|
||||||
FBSDK_DEVICE_INFO_MODEL: [[UIDevice currentDevice] model],
|
|
||||||
};
|
};
|
||||||
NSError *err;
|
NSError *err;
|
||||||
NSData *jsonDeviceInfo = [NSJSONSerialization dataWithJSONObject:deviceInfo
|
NSData *jsonDeviceInfo = [NSJSONSerialization dataWithJSONObject:deviceInfo
|
||||||
|
|||||||
@ -20,8 +20,6 @@
|
|||||||
#import <Foundation/Foundation.h>
|
#import <Foundation/Foundation.h>
|
||||||
#import <QuartzCore/QuartzCore.h>
|
#import <QuartzCore/QuartzCore.h>
|
||||||
|
|
||||||
#import <FBSDKCoreKit/FBSDKMacros.h>
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
||||||
This class provides a way to load constants and methods from Apple Frameworks in a dynamic
|
This class provides a way to load constants and methods from Apple Frameworks in a dynamic
|
||||||
@ -32,6 +30,9 @@
|
|||||||
*/
|
*/
|
||||||
@interface FBSDKDynamicFrameworkLoader : NSObject
|
@interface FBSDKDynamicFrameworkLoader : NSObject
|
||||||
|
|
||||||
|
- (instancetype)init NS_UNAVAILABLE;
|
||||||
|
+ (instancetype)new NS_UNAVAILABLE;
|
||||||
|
|
||||||
#pragma mark - Security Constants
|
#pragma mark - Security Constants
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -130,105 +131,105 @@
|
|||||||
#pragma mark - Security APIs
|
#pragma mark - Security APIs
|
||||||
|
|
||||||
// These are local wrappers around the corresponding methods in Security/SecRandom.h
|
// These are local wrappers around the corresponding methods in Security/SecRandom.h
|
||||||
FBSDK_EXTERN int fbsdkdfl_SecRandomCopyBytes(SecRandomRef rnd, size_t count, uint8_t *bytes);
|
FOUNDATION_EXPORT int fbsdkdfl_SecRandomCopyBytes(SecRandomRef rnd, size_t count, uint8_t *bytes);
|
||||||
|
|
||||||
// These are local wrappers around Keychain API
|
// These are local wrappers around Keychain API
|
||||||
FBSDK_EXTERN OSStatus fbsdkdfl_SecItemUpdate(CFDictionaryRef query, CFDictionaryRef attributesToUpdate);
|
FOUNDATION_EXPORT OSStatus fbsdkdfl_SecItemUpdate(CFDictionaryRef query, CFDictionaryRef attributesToUpdate);
|
||||||
FBSDK_EXTERN OSStatus fbsdkdfl_SecItemAdd(CFDictionaryRef attributes, CFTypeRef *result);
|
FOUNDATION_EXPORT OSStatus fbsdkdfl_SecItemAdd(CFDictionaryRef attributes, CFTypeRef *result);
|
||||||
FBSDK_EXTERN OSStatus fbsdkdfl_SecItemCopyMatching(CFDictionaryRef query, CFTypeRef *result);
|
FOUNDATION_EXPORT OSStatus fbsdkdfl_SecItemCopyMatching(CFDictionaryRef query, CFTypeRef *result);
|
||||||
FBSDK_EXTERN OSStatus fbsdkdfl_SecItemDelete(CFDictionaryRef query);
|
FOUNDATION_EXPORT OSStatus fbsdkdfl_SecItemDelete(CFDictionaryRef query);
|
||||||
|
|
||||||
#pragma mark - Social Constants
|
#pragma mark - Social Constants
|
||||||
|
|
||||||
FBSDK_EXTERN NSString *fbsdkdfl_SLServiceTypeFacebook(void);
|
FOUNDATION_EXPORT NSString *fbsdkdfl_SLServiceTypeFacebook(void);
|
||||||
FBSDK_EXTERN NSString *fbsdkdfl_SLServiceTypeTwitter(void);
|
FOUNDATION_EXPORT NSString *fbsdkdfl_SLServiceTypeTwitter(void);
|
||||||
|
|
||||||
#pragma mark - Social Classes
|
#pragma mark - Social Classes
|
||||||
|
|
||||||
FBSDK_EXTERN Class fbsdkdfl_SLComposeViewControllerClass(void);
|
FOUNDATION_EXPORT Class fbsdkdfl_SLComposeViewControllerClass(void);
|
||||||
|
|
||||||
#pragma mark - MessageUI Classes
|
#pragma mark - MessageUI Classes
|
||||||
|
|
||||||
FBSDK_EXTERN Class fbsdkdfl_MFMailComposeViewControllerClass(void);
|
FOUNDATION_EXPORT Class fbsdkdfl_MFMailComposeViewControllerClass(void);
|
||||||
FBSDK_EXTERN Class fbsdkdfl_MFMessageComposeViewControllerClass(void);
|
FOUNDATION_EXPORT Class fbsdkdfl_MFMessageComposeViewControllerClass(void);
|
||||||
|
|
||||||
#pragma mark - QuartzCore Classes
|
#pragma mark - QuartzCore Classes
|
||||||
|
|
||||||
FBSDK_EXTERN Class fbsdkdfl_CATransactionClass(void);
|
FOUNDATION_EXPORT Class fbsdkdfl_CATransactionClass(void);
|
||||||
|
|
||||||
#pragma mark - QuartzCore APIs
|
#pragma mark - QuartzCore APIs
|
||||||
|
|
||||||
// These are local wrappers around the corresponding transform methods from QuartzCore.framework/CATransform3D.h
|
// These are local wrappers around the corresponding transform methods from QuartzCore.framework/CATransform3D.h
|
||||||
FBSDK_EXTERN CATransform3D fbsdkdfl_CATransform3DMakeScale (CGFloat sx, CGFloat sy, CGFloat sz);
|
FOUNDATION_EXPORT CATransform3D fbsdkdfl_CATransform3DMakeScale (CGFloat sx, CGFloat sy, CGFloat sz);
|
||||||
FBSDK_EXTERN CATransform3D fbsdkdfl_CATransform3DMakeTranslation (CGFloat tx, CGFloat ty, CGFloat tz);
|
FOUNDATION_EXPORT CATransform3D fbsdkdfl_CATransform3DMakeTranslation (CGFloat tx, CGFloat ty, CGFloat tz);
|
||||||
FBSDK_EXTERN CATransform3D fbsdkdfl_CATransform3DConcat (CATransform3D a, CATransform3D b);
|
FOUNDATION_EXPORT CATransform3D fbsdkdfl_CATransform3DConcat (CATransform3D a, CATransform3D b);
|
||||||
|
|
||||||
FBSDK_EXTERN const CATransform3D fbsdkdfl_CATransform3DIdentity;
|
FOUNDATION_EXPORT const CATransform3D fbsdkdfl_CATransform3DIdentity;
|
||||||
|
|
||||||
#pragma mark - AudioToolbox APIs
|
#pragma mark - AudioToolbox APIs
|
||||||
|
|
||||||
// These are local wrappers around the corresponding methods in AudioToolbox/AudioToolbox.h
|
// These are local wrappers around the corresponding methods in AudioToolbox/AudioToolbox.h
|
||||||
FBSDK_EXTERN OSStatus fbsdkdfl_AudioServicesCreateSystemSoundID(CFURLRef inFileURL, SystemSoundID *outSystemSoundID);
|
FOUNDATION_EXPORT OSStatus fbsdkdfl_AudioServicesCreateSystemSoundID(CFURLRef inFileURL, SystemSoundID *outSystemSoundID);
|
||||||
FBSDK_EXTERN OSStatus fbsdkdfl_AudioServicesDisposeSystemSoundID(SystemSoundID inSystemSoundID);
|
FOUNDATION_EXPORT OSStatus fbsdkdfl_AudioServicesDisposeSystemSoundID(SystemSoundID inSystemSoundID);
|
||||||
FBSDK_EXTERN void fbsdkdfl_AudioServicesPlaySystemSound(SystemSoundID inSystemSoundID);
|
FOUNDATION_EXPORT void fbsdkdfl_AudioServicesPlaySystemSound(SystemSoundID inSystemSoundID);
|
||||||
|
|
||||||
#pragma mark - AdSupport Classes
|
#pragma mark - AdSupport Classes
|
||||||
|
|
||||||
FBSDK_EXTERN Class fbsdkdfl_ASIdentifierManagerClass(void);
|
FOUNDATION_EXPORT Class fbsdkdfl_ASIdentifierManagerClass(void);
|
||||||
|
|
||||||
#pragma mark - SafariServices Classes
|
#pragma mark - SafariServices Classes
|
||||||
|
|
||||||
FBSDK_EXTERN Class fbsdkdfl_SFSafariViewControllerClass(void);
|
FOUNDATION_EXPORT Class fbsdkdfl_SFSafariViewControllerClass(void);
|
||||||
FBSDK_EXTERN Class fbsdkdfl_SFAuthenticationSessionClass(void);
|
FOUNDATION_EXPORT Class fbsdkdfl_SFAuthenticationSessionClass(void);
|
||||||
|
|
||||||
#pragma mark - Accounts Constants
|
#pragma mark - Accounts Constants
|
||||||
|
|
||||||
FBSDK_EXTERN NSString *fbsdkdfl_ACFacebookAppIdKey(void);
|
FOUNDATION_EXPORT NSString *fbsdkdfl_ACFacebookAppIdKey(void);
|
||||||
FBSDK_EXTERN NSString *fbsdkdfl_ACFacebookAudienceEveryone(void);
|
FOUNDATION_EXPORT NSString *fbsdkdfl_ACFacebookAudienceEveryone(void);
|
||||||
FBSDK_EXTERN NSString *fbsdkdfl_ACFacebookAudienceFriends(void);
|
FOUNDATION_EXPORT NSString *fbsdkdfl_ACFacebookAudienceFriends(void);
|
||||||
FBSDK_EXTERN NSString *fbsdkdfl_ACFacebookAudienceKey(void);
|
FOUNDATION_EXPORT NSString *fbsdkdfl_ACFacebookAudienceKey(void);
|
||||||
FBSDK_EXTERN NSString *fbsdkdfl_ACFacebookAudienceOnlyMe(void);
|
FOUNDATION_EXPORT NSString *fbsdkdfl_ACFacebookAudienceOnlyMe(void);
|
||||||
FBSDK_EXTERN NSString *fbsdkdfl_ACFacebookPermissionsKey(void);
|
FOUNDATION_EXPORT NSString *fbsdkdfl_ACFacebookPermissionsKey(void);
|
||||||
|
|
||||||
#pragma mark - Accounts Classes
|
#pragma mark - Accounts Classes
|
||||||
|
|
||||||
FBSDK_EXTERN Class fbsdkdfl_ACAccountStoreClass(void);
|
FOUNDATION_EXPORT Class fbsdkdfl_ACAccountStoreClass(void);
|
||||||
|
|
||||||
#pragma mark - StoreKit classes
|
#pragma mark - StoreKit classes
|
||||||
|
|
||||||
FBSDK_EXTERN Class fbsdkdfl_SKPaymentQueueClass(void);
|
FOUNDATION_EXPORT Class fbsdkdfl_SKPaymentQueueClass(void);
|
||||||
FBSDK_EXTERN Class fbsdkdfl_SKProductsRequestClass(void);
|
FOUNDATION_EXPORT Class fbsdkdfl_SKProductsRequestClass(void);
|
||||||
|
|
||||||
#pragma mark - AssetsLibrary Classes
|
#pragma mark - AssetsLibrary Classes
|
||||||
|
|
||||||
FBSDK_EXTERN Class fbsdkdfl_ALAssetsLibraryClass(void);
|
FOUNDATION_EXPORT Class fbsdkdfl_ALAssetsLibraryClass(void);
|
||||||
|
|
||||||
#pragma mark - CoreTelephony Classes
|
#pragma mark - CoreTelephony Classes
|
||||||
|
|
||||||
FBSDK_EXTERN Class fbsdkdfl_CTTelephonyNetworkInfoClass(void);
|
FOUNDATION_EXPORT Class fbsdkdfl_CTTelephonyNetworkInfoClass(void);
|
||||||
|
|
||||||
#pragma mark - CoreImage
|
#pragma mark - CoreImage
|
||||||
|
|
||||||
FBSDK_EXTERN Class fbsdkdfl_CIImageClass(void);
|
FOUNDATION_EXPORT Class fbsdkdfl_CIImageClass(void);
|
||||||
FBSDK_EXTERN Class fbsdkdfl_CIFilterClass(void);
|
FOUNDATION_EXPORT Class fbsdkdfl_CIFilterClass(void);
|
||||||
FBSDK_EXTERN NSString *fbsdkdfl_kCIInputImageKey(void);
|
FOUNDATION_EXPORT NSString *fbsdkdfl_kCIInputImageKey(void);
|
||||||
FBSDK_EXTERN NSString *fbsdkdfl_kCIInputRadiusKey(void);
|
FOUNDATION_EXPORT NSString *fbsdkdfl_kCIInputRadiusKey(void);
|
||||||
FBSDK_EXTERN NSString *fbsdkdfl_kCIOutputImageKey(void);
|
FOUNDATION_EXPORT NSString *fbsdkdfl_kCIOutputImageKey(void);
|
||||||
|
|
||||||
#pragma mark - Photos.framework
|
#pragma mark - Photos.framework
|
||||||
|
|
||||||
FBSDK_EXTERN Class fbsdkdfl_PHPhotoLibrary(void);
|
FOUNDATION_EXPORT Class fbsdkdfl_PHPhotoLibrary(void);
|
||||||
FBSDK_EXTERN Class fbsdkdfl_PHAssetChangeRequest(void);
|
FOUNDATION_EXPORT Class fbsdkdfl_PHAssetChangeRequest(void);
|
||||||
|
|
||||||
#pragma mark - MobileCoreServices
|
#pragma mark - MobileCoreServices
|
||||||
|
|
||||||
FBSDK_EXTERN CFStringRef fbsdkdfl_UTTypeCopyPreferredTagWithClass(CFStringRef inUTI,
|
FOUNDATION_EXPORT CFStringRef fbsdkdfl_UTTypeCopyPreferredTagWithClass(CFStringRef inUTI,
|
||||||
CFStringRef inTagClass);
|
CFStringRef inTagClass);
|
||||||
FBSDK_EXTERN CFStringRef fbsdkdfl_kUTTagClassMIMEType(void);
|
FOUNDATION_EXPORT CFStringRef fbsdkdfl_kUTTagClassMIMEType(void);
|
||||||
FBSDK_EXTERN CFStringRef fbsdkdfl_kUTTypeJPEG(void);
|
FOUNDATION_EXPORT CFStringRef fbsdkdfl_kUTTypeJPEG(void);
|
||||||
FBSDK_EXTERN CFStringRef fbsdkdfl_kUTTypePNG(void);
|
FOUNDATION_EXPORT CFStringRef fbsdkdfl_kUTTypePNG(void);
|
||||||
|
|
||||||
#pragma mark - WebKit Classes
|
#pragma mark - WebKit Classes
|
||||||
|
|
||||||
FBSDK_EXTERN Class fbsdkdfl_WKWebViewClass(void);
|
FOUNDATION_EXPORT Class fbsdkdfl_WKWebViewClass(void);
|
||||||
FBSDK_EXTERN Class fbsdkdfl_WKUserScriptClass(void);
|
FOUNDATION_EXPORT Class fbsdkdfl_WKUserScriptClass(void);
|
||||||
|
|||||||
@ -18,39 +18,76 @@
|
|||||||
|
|
||||||
#import <Foundation/Foundation.h>
|
#import <Foundation/Foundation.h>
|
||||||
|
|
||||||
@interface FBSDKError : NSObject
|
@interface NSError (FBSDKError)
|
||||||
|
|
||||||
+ (NSString *)errorDomain;
|
+ (NSError *)fbErrorWithCode:(NSInteger)code message:(NSString *)message;
|
||||||
|
+ (NSError *)fbErrorWithDomain:(NSErrorDomain)domain
|
||||||
|
code:(NSInteger)code
|
||||||
|
message:(NSString *)message;
|
||||||
|
|
||||||
+ (BOOL)errorIsNetworkError:(NSError *)error;
|
+ (NSError *)fbErrorWithCode:(NSInteger)code
|
||||||
|
message:(NSString *)message
|
||||||
|
underlyingError:(NSError *)underlyingError;
|
||||||
|
|
||||||
+ (NSError *)errorWithCode:(NSInteger)code message:(NSString *)message;
|
+ (NSError *)fbErrorWithDomain:(NSErrorDomain)domain
|
||||||
+ (NSError *)errorWithCode:(NSInteger)code message:(NSString *)message underlyingError:(NSError *)underlyingError;
|
code:(NSInteger)code
|
||||||
+ (NSError *)errorWithCode:(NSInteger)code
|
message:(NSString *)message
|
||||||
userInfo:(NSDictionary *)userInfo
|
underlyingError:(NSError *)underlyingError;
|
||||||
message:(NSString *)message
|
|
||||||
underlyingError:(NSError *)underlyingError;
|
|
||||||
|
|
||||||
+ (NSError *)invalidArgumentErrorWithName:(NSString *)name value:(id)value message:(NSString *)message;
|
+ (NSError *)fbErrorWithCode:(NSInteger)code
|
||||||
+ (NSError *)invalidArgumentErrorWithName:(NSString *)name
|
userInfo:(NSDictionary<NSErrorUserInfoKey, id> *)userInfo
|
||||||
value:(id)value
|
message:(NSString *)message
|
||||||
message:(NSString *)message
|
underlyingError:(NSError *)underlyingError;
|
||||||
underlyingError:(NSError *)underlyingError;
|
|
||||||
+ (NSError *)invalidCollectionErrorWithName:(NSString *)name
|
+ (NSError *)fbErrorWithDomain:(NSErrorDomain)domain
|
||||||
collection:(id<NSFastEnumeration>)collection
|
code:(NSInteger)code
|
||||||
item:(id)item
|
userInfo:(NSDictionary<NSErrorUserInfoKey, id> *)userInfo
|
||||||
|
message:(NSString *)message
|
||||||
|
underlyingError:(NSError *)underlyingError;
|
||||||
|
|
||||||
|
+ (NSError *)fbInvalidArgumentErrorWithName:(NSString *)name
|
||||||
|
value:(id)value
|
||||||
message:(NSString *)message;
|
message:(NSString *)message;
|
||||||
+ (NSError *)invalidCollectionErrorWithName:(NSString *)name
|
|
||||||
collection:(id<NSFastEnumeration>)collection
|
+ (NSError *)fbInvalidArgumentErrorWithDomain:(NSErrorDomain)domain
|
||||||
item:(id)item
|
name:(NSString *)name
|
||||||
|
value:(id)value
|
||||||
|
message:(NSString *)message;
|
||||||
|
|
||||||
|
+ (NSError *)fbInvalidArgumentErrorWithName:(NSString *)name
|
||||||
|
value:(id)value
|
||||||
message:(NSString *)message
|
message:(NSString *)message
|
||||||
underlyingError:(NSError *)underlyingError;
|
underlyingError:(NSError *)underlyingError;
|
||||||
|
|
||||||
+ (NSError *)requiredArgumentErrorWithName:(NSString *)name message:(NSString *)message;
|
+ (NSError *)fbInvalidArgumentErrorWithDomain:(NSErrorDomain)domain
|
||||||
+ (NSError *)requiredArgumentErrorWithName:(NSString *)name
|
name:(NSString *)name
|
||||||
message:(NSString *)message
|
value:(id)value
|
||||||
underlyingError:(NSError *)underlyingError;
|
message:(NSString *)message
|
||||||
|
underlyingError:(NSError *)underlyingError;
|
||||||
|
|
||||||
+ (NSError *)unknownErrorWithMessage:(NSString *)message;
|
+ (NSError *)fbInvalidCollectionErrorWithName:(NSString *)name
|
||||||
|
collection:(id<NSFastEnumeration>)collection
|
||||||
|
item:(id)item
|
||||||
|
message:(NSString *)message;
|
||||||
|
|
||||||
|
+ (NSError *)fbInvalidCollectionErrorWithName:(NSString *)name
|
||||||
|
collection:(id<NSFastEnumeration>)collection
|
||||||
|
item:(id)item
|
||||||
|
message:(NSString *)message
|
||||||
|
underlyingError:(NSError *)underlyingError;
|
||||||
|
|
||||||
|
+ (NSError *)fbRequiredArgumentErrorWithName:(NSString *)name message:(NSString *)message;
|
||||||
|
+ (NSError *)fbRequiredArgumentErrorWithDomain:(NSErrorDomain)domain
|
||||||
|
name:(NSString *)name
|
||||||
|
message:(NSString *)message;
|
||||||
|
|
||||||
|
+ (NSError *)fbRequiredArgumentErrorWithName:(NSString *)name
|
||||||
|
message:(NSString *)message
|
||||||
|
underlyingError:(NSError *)underlyingError;
|
||||||
|
|
||||||
|
+ (NSError *)fbUnknownErrorWithMessage:(NSString *)message;
|
||||||
|
|
||||||
|
@property (nonatomic, assign, readonly, getter=isNetworkError) BOOL networkError
|
||||||
|
NS_SWIFT_NAME(isNetworkError);
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|||||||
@ -22,27 +22,18 @@
|
|||||||
#import "FBSDKInternalUtility.h"
|
#import "FBSDKInternalUtility.h"
|
||||||
#import "FBSDKTypeUtility.h"
|
#import "FBSDKTypeUtility.h"
|
||||||
|
|
||||||
@implementation FBSDKError
|
@implementation NSError (FBSDKError)
|
||||||
|
|
||||||
#pragma mark - Class Methods
|
#pragma mark - Class Methods
|
||||||
|
|
||||||
+ (NSString *)errorDomain
|
- (BOOL)isNetworkError
|
||||||
{
|
{
|
||||||
return FBSDKErrorDomain;
|
NSError *innerError = self.userInfo[NSUnderlyingErrorKey];
|
||||||
}
|
if (innerError && innerError.isNetworkError) {
|
||||||
|
|
||||||
+ (BOOL)errorIsNetworkError:(NSError *)error
|
|
||||||
{
|
|
||||||
if (error == nil) {
|
|
||||||
return NO;
|
|
||||||
}
|
|
||||||
|
|
||||||
NSError *innerError = error.userInfo[NSUnderlyingErrorKey];
|
|
||||||
if ([self errorIsNetworkError:innerError]) {
|
|
||||||
return YES;
|
return YES;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (error.code) {
|
switch (self.code) {
|
||||||
case NSURLErrorTimedOut:
|
case NSURLErrorTimedOut:
|
||||||
case NSURLErrorCannotFindHost:
|
case NSURLErrorCannotFindHost:
|
||||||
case NSURLErrorCannotConnectToHost:
|
case NSURLErrorCannotConnectToHost:
|
||||||
@ -58,37 +49,85 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
+ (NSError *)errorWithCode:(NSInteger)code message:(NSString *)message
|
+ (NSError *)fbErrorWithCode:(NSInteger)code message:(NSString *)message
|
||||||
{
|
{
|
||||||
return [self errorWithCode:code message:message underlyingError:nil];
|
return [self fbErrorWithCode:code message:message underlyingError:nil];
|
||||||
}
|
}
|
||||||
|
|
||||||
+ (NSError *)errorWithCode:(NSInteger)code message:(NSString *)message underlyingError:(NSError *)underlyingError
|
+ (NSError *)fbErrorWithDomain:(NSErrorDomain)domain
|
||||||
|
code:(NSInteger)code
|
||||||
|
message:(NSString *)message
|
||||||
{
|
{
|
||||||
return [self errorWithCode:code userInfo:nil message:message underlyingError:underlyingError];
|
return [self fbErrorWithDomain:domain code:code message:message underlyingError:nil];
|
||||||
}
|
}
|
||||||
|
|
||||||
+ (NSError *)errorWithCode:(NSInteger)code
|
+ (NSError *)fbErrorWithCode:(NSInteger)code message:(NSString *)message underlyingError:(NSError *)underlyingError
|
||||||
userInfo:(NSDictionary *)userInfo
|
{
|
||||||
message:(NSString *)message
|
return [self fbErrorWithCode:code userInfo:nil message:message underlyingError:underlyingError];
|
||||||
underlyingError:(NSError *)underlyingError
|
}
|
||||||
|
|
||||||
|
+ (NSError *)fbErrorWithDomain:(NSErrorDomain)domain
|
||||||
|
code:(NSInteger)code
|
||||||
|
message:(NSString *)message
|
||||||
|
underlyingError:(NSError *)underlyingError
|
||||||
|
{
|
||||||
|
return [self fbErrorWithDomain:domain code:code userInfo:@{} message:message underlyingError:underlyingError];
|
||||||
|
}
|
||||||
|
|
||||||
|
+ (NSError *)fbErrorWithCode:(NSInteger)code
|
||||||
|
userInfo:(NSDictionary<NSErrorUserInfoKey, id> *)userInfo
|
||||||
|
message:(NSString *)message
|
||||||
|
underlyingError:(NSError *)underlyingError
|
||||||
|
{
|
||||||
|
return [self fbErrorWithDomain:FBSDKErrorDomain code:code userInfo:userInfo message:message underlyingError:underlyingError];
|
||||||
|
}
|
||||||
|
|
||||||
|
+ (NSError *)fbErrorWithDomain:(NSErrorDomain)domain
|
||||||
|
code:(NSInteger)code
|
||||||
|
userInfo:(NSDictionary<NSErrorUserInfoKey,id> *)userInfo
|
||||||
|
message:(NSString *)message
|
||||||
|
underlyingError:(NSError *)underlyingError
|
||||||
{
|
{
|
||||||
NSMutableDictionary *fullUserInfo = [[NSMutableDictionary alloc] initWithDictionary:userInfo];
|
NSMutableDictionary *fullUserInfo = [[NSMutableDictionary alloc] initWithDictionary:userInfo];
|
||||||
[FBSDKInternalUtility dictionary:fullUserInfo setObject:message forKey:FBSDKErrorDeveloperMessageKey];
|
[FBSDKInternalUtility dictionary:fullUserInfo setObject:message forKey:FBSDKErrorDeveloperMessageKey];
|
||||||
[FBSDKInternalUtility dictionary:fullUserInfo setObject:underlyingError forKey:NSUnderlyingErrorKey];
|
[FBSDKInternalUtility dictionary:fullUserInfo setObject:underlyingError forKey:NSUnderlyingErrorKey];
|
||||||
userInfo = ([fullUserInfo count] ? [fullUserInfo copy] : nil);
|
userInfo = fullUserInfo.count ? [fullUserInfo copy] : nil;
|
||||||
return [[NSError alloc] initWithDomain:[self errorDomain] code:code userInfo:userInfo];
|
return [[NSError alloc] initWithDomain:domain code:code userInfo:userInfo];
|
||||||
}
|
}
|
||||||
|
|
||||||
+ (NSError *)invalidArgumentErrorWithName:(NSString *)name value:(id)value message:(NSString *)message
|
+ (NSError *)fbInvalidArgumentErrorWithName:(NSString *)name value:(id)value message:(NSString *)message
|
||||||
{
|
{
|
||||||
return [self invalidArgumentErrorWithName:name value:value message:message underlyingError:nil];
|
return [self fbInvalidArgumentErrorWithName:name value:value message:message underlyingError:nil];
|
||||||
}
|
}
|
||||||
|
|
||||||
+ (NSError *)invalidArgumentErrorWithName:(NSString *)name
|
+ (NSError *)fbInvalidArgumentErrorWithDomain:(NSErrorDomain)domain
|
||||||
value:(id)value
|
name:(NSString *)name
|
||||||
message:(NSString *)message
|
value:(id)value
|
||||||
underlyingError:(NSError *)underlyingError
|
message:(NSString *)message
|
||||||
|
{
|
||||||
|
return [self fbInvalidArgumentErrorWithDomain:domain
|
||||||
|
name:name
|
||||||
|
value:value
|
||||||
|
message:message
|
||||||
|
underlyingError:nil];
|
||||||
|
}
|
||||||
|
|
||||||
|
+ (NSError *)fbInvalidArgumentErrorWithName:(NSString *)name
|
||||||
|
value:(id)value
|
||||||
|
message:(NSString *)message
|
||||||
|
underlyingError:(NSError *)underlyingError
|
||||||
|
{
|
||||||
|
return [self fbInvalidArgumentErrorWithDomain:FBSDKErrorDomain
|
||||||
|
name:name
|
||||||
|
value:value
|
||||||
|
message:message
|
||||||
|
underlyingError:underlyingError];
|
||||||
|
}
|
||||||
|
+ (NSError *)fbInvalidArgumentErrorWithDomain:(NSErrorDomain)domain
|
||||||
|
name:(NSString *)name
|
||||||
|
value:(id)value
|
||||||
|
message:(NSString *)message
|
||||||
|
underlyingError:(NSError *)underlyingError
|
||||||
{
|
{
|
||||||
if (!message) {
|
if (!message) {
|
||||||
message = [[NSString alloc] initWithFormat:@"Invalid value for %@: %@", name, value];
|
message = [[NSString alloc] initWithFormat:@"Invalid value for %@: %@", name, value];
|
||||||
@ -96,25 +135,26 @@
|
|||||||
NSMutableDictionary *userInfo = [[NSMutableDictionary alloc] init];
|
NSMutableDictionary *userInfo = [[NSMutableDictionary alloc] init];
|
||||||
[FBSDKInternalUtility dictionary:userInfo setObject:name forKey:FBSDKErrorArgumentNameKey];
|
[FBSDKInternalUtility dictionary:userInfo setObject:name forKey:FBSDKErrorArgumentNameKey];
|
||||||
[FBSDKInternalUtility dictionary:userInfo setObject:value forKey:FBSDKErrorArgumentValueKey];
|
[FBSDKInternalUtility dictionary:userInfo setObject:value forKey:FBSDKErrorArgumentValueKey];
|
||||||
return [self errorWithCode:FBSDKInvalidArgumentErrorCode
|
return [self fbErrorWithDomain:domain
|
||||||
userInfo:userInfo
|
code:FBSDKErrorInvalidArgument
|
||||||
message:message
|
userInfo:userInfo
|
||||||
underlyingError:underlyingError];
|
message:message
|
||||||
|
underlyingError:underlyingError];
|
||||||
}
|
}
|
||||||
|
|
||||||
+ (NSError *)invalidCollectionErrorWithName:(NSString *)name
|
+ (NSError *)fbInvalidCollectionErrorWithName:(NSString *)name
|
||||||
collection:(id<NSFastEnumeration>)collection
|
collection:(id<NSFastEnumeration>)collection
|
||||||
item:(id)item
|
item:(id)item
|
||||||
message:(NSString *)message
|
message:(NSString *)message
|
||||||
{
|
{
|
||||||
return [self invalidCollectionErrorWithName:name collection:collection item:item message:message underlyingError:nil];
|
return [self fbInvalidCollectionErrorWithName:name collection:collection item:item message:message underlyingError:nil];
|
||||||
}
|
}
|
||||||
|
|
||||||
+ (NSError *)invalidCollectionErrorWithName:(NSString *)name
|
+ (NSError *)fbInvalidCollectionErrorWithName:(NSString *)name
|
||||||
collection:(id<NSFastEnumeration>)collection
|
collection:(id<NSFastEnumeration>)collection
|
||||||
item:(id)item
|
item:(id)item
|
||||||
message:(NSString *)message
|
message:(NSString *)message
|
||||||
underlyingError:(NSError *)underlyingError
|
underlyingError:(NSError *)underlyingError
|
||||||
{
|
{
|
||||||
if (!message) {
|
if (!message) {
|
||||||
message = [[NSString alloc] initWithFormat:@"Invalid item (%@) found in collection for %@: %@", item, name, collection];
|
message = [[NSString alloc] initWithFormat:@"Invalid item (%@) found in collection for %@: %@", item, name, collection];
|
||||||
@ -123,41 +163,43 @@
|
|||||||
[FBSDKInternalUtility dictionary:userInfo setObject:name forKey:FBSDKErrorArgumentNameKey];
|
[FBSDKInternalUtility dictionary:userInfo setObject:name forKey:FBSDKErrorArgumentNameKey];
|
||||||
[FBSDKInternalUtility dictionary:userInfo setObject:item forKey:FBSDKErrorArgumentValueKey];
|
[FBSDKInternalUtility dictionary:userInfo setObject:item forKey:FBSDKErrorArgumentValueKey];
|
||||||
[FBSDKInternalUtility dictionary:userInfo setObject:collection forKey:FBSDKErrorArgumentCollectionKey];
|
[FBSDKInternalUtility dictionary:userInfo setObject:collection forKey:FBSDKErrorArgumentCollectionKey];
|
||||||
return [self errorWithCode:FBSDKInvalidArgumentErrorCode
|
return [self fbErrorWithCode:FBSDKErrorInvalidArgument
|
||||||
userInfo:userInfo
|
userInfo:userInfo
|
||||||
message:message
|
message:message
|
||||||
underlyingError:underlyingError];
|
underlyingError:underlyingError];
|
||||||
}
|
}
|
||||||
|
|
||||||
+ (NSError *)requiredArgumentErrorWithName:(NSString *)name message:(NSString *)message
|
+ (NSError *)fbRequiredArgumentErrorWithName:(NSString *)name message:(NSString *)message
|
||||||
{
|
{
|
||||||
return [self requiredArgumentErrorWithName:name message:message underlyingError:nil];
|
return [self fbRequiredArgumentErrorWithName:name message:message underlyingError:nil];
|
||||||
}
|
}
|
||||||
|
|
||||||
+ (NSError *)requiredArgumentErrorWithName:(NSString *)name
|
+ (NSError *)fbRequiredArgumentErrorWithDomain:(NSErrorDomain)domain
|
||||||
message:(NSString *)message
|
name:(NSString *)name
|
||||||
underlyingError:(NSError *)underlyingError
|
message:(NSString *)message
|
||||||
{
|
{
|
||||||
if (!message) {
|
if (!message) {
|
||||||
message = [[NSString alloc] initWithFormat:@"Value for %@ is required.", name];
|
message = [[NSString alloc] initWithFormat:@"Value for %@ is required.", name];
|
||||||
}
|
}
|
||||||
return [self invalidArgumentErrorWithName:name value:nil message:message underlyingError:underlyingError];
|
return [self fbInvalidArgumentErrorWithDomain:domain name:name value:nil message:message underlyingError:nil];
|
||||||
}
|
}
|
||||||
|
|
||||||
+ (NSError *)unknownErrorWithMessage:(NSString *)message
|
+ (NSError *)fbRequiredArgumentErrorWithName:(NSString *)name
|
||||||
|
message:(NSString *)message
|
||||||
|
underlyingError:(NSError *)underlyingError
|
||||||
{
|
{
|
||||||
return [self errorWithCode:FBSDKUnknownErrorCode
|
if (!message) {
|
||||||
userInfo:nil
|
message = [[NSString alloc] initWithFormat:@"Value for %@ is required.", name];
|
||||||
message:message
|
}
|
||||||
underlyingError:nil];
|
return [self fbInvalidArgumentErrorWithName:name value:nil message:message underlyingError:underlyingError];
|
||||||
}
|
}
|
||||||
|
|
||||||
#pragma mark - Object Lifecycle
|
+ (NSError *)fbUnknownErrorWithMessage:(NSString *)message
|
||||||
|
|
||||||
- (instancetype)init
|
|
||||||
{
|
{
|
||||||
FBSDK_NO_DESIGNATED_INITIALIZER();
|
return [self fbErrorWithCode:FBSDKErrorUnknown
|
||||||
return nil;
|
userInfo:nil
|
||||||
|
message:message
|
||||||
|
underlyingError:nil];
|
||||||
}
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|||||||
@ -36,6 +36,9 @@ typedef NS_ENUM(int32_t, FBSDKUIKitVersion)
|
|||||||
|
|
||||||
@interface FBSDKInternalUtility : NSObject
|
@interface FBSDKInternalUtility : NSObject
|
||||||
|
|
||||||
|
- (instancetype)init NS_UNAVAILABLE;
|
||||||
|
+ (instancetype)new NS_UNAVAILABLE;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Constructs the scheme for apps that come to the current app through the bridge.
|
Constructs the scheme for apps that come to the current app through the bridge.
|
||||||
*/
|
*/
|
||||||
@ -344,6 +347,11 @@ setJSONStringForObject:(id)object
|
|||||||
*/
|
*/
|
||||||
+ (BOOL)areAllPermissionsPublishPermissions:(NSSet *)permissions;
|
+ (BOOL)areAllPermissionsPublishPermissions:(NSSet *)permissions;
|
||||||
|
|
||||||
|
/*
|
||||||
|
Checks if the app is Unity.
|
||||||
|
*/
|
||||||
|
+ (BOOL)isUnity;
|
||||||
|
|
||||||
#pragma mark - FB Apps Installed
|
#pragma mark - FB Apps Installed
|
||||||
|
|
||||||
+ (BOOL)isFacebookAppInstalled;
|
+ (BOOL)isFacebookAppInstalled;
|
||||||
|
|||||||
@ -24,7 +24,7 @@
|
|||||||
|
|
||||||
#import "FBSDKCoreKit+Internal.h"
|
#import "FBSDKCoreKit+Internal.h"
|
||||||
#import "FBSDKError.h"
|
#import "FBSDKError.h"
|
||||||
#import "FBSDKMacros.h"
|
#import "FBSDKSettings+Internal.h"
|
||||||
#import "FBSDKSettings.h"
|
#import "FBSDKSettings.h"
|
||||||
#import "FBSDKUtility.h"
|
#import "FBSDKUtility.h"
|
||||||
|
|
||||||
@ -103,9 +103,9 @@ typedef NS_ENUM(NSUInteger, FBSDKInternalUtilityVersionShift)
|
|||||||
+ (id)convertRequestValue:(id)value
|
+ (id)convertRequestValue:(id)value
|
||||||
{
|
{
|
||||||
if ([value isKindOfClass:[NSNumber class]]) {
|
if ([value isKindOfClass:[NSNumber class]]) {
|
||||||
value = [(NSNumber *)value stringValue];
|
value = ((NSNumber *)value).stringValue;
|
||||||
} else if ([value isKindOfClass:[NSURL class]]) {
|
} else if ([value isKindOfClass:[NSURL class]]) {
|
||||||
value = [(NSURL *)value absoluteString];
|
value = ((NSURL *)value).absoluteString;
|
||||||
}
|
}
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
@ -136,7 +136,7 @@ setJSONStringForObject:(id)object
|
|||||||
+ (void)dictionary:(NSMutableDictionary *)dictionary setObject:(id)object forKey:(id<NSCopying>)key
|
+ (void)dictionary:(NSMutableDictionary *)dictionary setObject:(id)object forKey:(id<NSCopying>)key
|
||||||
{
|
{
|
||||||
if (object && key) {
|
if (object && key) {
|
||||||
[dictionary setObject:object forKey:key];
|
dictionary[key] = object;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -177,23 +177,23 @@ setJSONStringForObject:(id)object
|
|||||||
defaultVersion:(NSString *)defaultVersion
|
defaultVersion:(NSString *)defaultVersion
|
||||||
error:(NSError *__autoreleasing *)errorRef
|
error:(NSError *__autoreleasing *)errorRef
|
||||||
{
|
{
|
||||||
if ([hostPrefix length] && ![hostPrefix hasSuffix:@"."]) {
|
if (hostPrefix.length && ![hostPrefix hasSuffix:@"."]) {
|
||||||
hostPrefix = [hostPrefix stringByAppendingString:@"."];
|
hostPrefix = [hostPrefix stringByAppendingString:@"."];
|
||||||
}
|
}
|
||||||
|
|
||||||
NSString *host = @"facebook.com";
|
NSString *host = @"facebook.com";
|
||||||
NSString *domainPart = [FBSDKSettings facebookDomainPart];
|
NSString *domainPart = [FBSDKSettings facebookDomainPart];
|
||||||
if ([domainPart length]) {
|
if (domainPart.length) {
|
||||||
host = [[NSString alloc] initWithFormat:@"%@.%@", domainPart, host];
|
host = [[NSString alloc] initWithFormat:@"%@.%@", domainPart, host];
|
||||||
}
|
}
|
||||||
host = [NSString stringWithFormat:@"%@%@", hostPrefix ?: @"", host ?: @""];
|
host = [NSString stringWithFormat:@"%@%@", hostPrefix ?: @"", host ?: @""];
|
||||||
|
|
||||||
NSString *version = defaultVersion ?: [FBSDKSettings graphAPIVersion];
|
NSString *version = defaultVersion ?: [FBSDKSettings graphAPIVersion];
|
||||||
if ([version length]) {
|
if (version.length) {
|
||||||
version = [@"/" stringByAppendingString:version];
|
version = [@"/" stringByAppendingString:version];
|
||||||
}
|
}
|
||||||
|
|
||||||
if ([path length]) {
|
if (path.length) {
|
||||||
NSScanner *versionScanner = [[NSScanner alloc] initWithString:path];
|
NSScanner *versionScanner = [[NSScanner alloc] initWithString:path];
|
||||||
if ([versionScanner scanString:@"/v" intoString:NULL] &&
|
if ([versionScanner scanString:@"/v" intoString:NULL] &&
|
||||||
[versionScanner scanInteger:NULL] &&
|
[versionScanner scanInteger:NULL] &&
|
||||||
@ -220,7 +220,7 @@ setJSONStringForObject:(id)object
|
|||||||
|
|
||||||
+ (BOOL)isBrowserURL:(NSURL *)URL
|
+ (BOOL)isBrowserURL:(NSURL *)URL
|
||||||
{
|
{
|
||||||
NSString *scheme = [URL.scheme lowercaseString];
|
NSString *scheme = URL.scheme.lowercaseString;
|
||||||
return ([scheme isEqualToString:@"http"] || [scheme isEqualToString:@"https"]);
|
return ([scheme isEqualToString:@"http"] || [scheme isEqualToString:@"https"]);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -247,7 +247,7 @@ setJSONStringForObject:(id)object
|
|||||||
static dispatch_once_t getVersionOnce;
|
static dispatch_once_t getVersionOnce;
|
||||||
dispatch_once(&getVersionOnce, ^{
|
dispatch_once(&getVersionOnce, ^{
|
||||||
int32_t linkTimeVersion = NSVersionOfLinkTimeLibrary("UIKit");
|
int32_t linkTimeVersion = NSVersionOfLinkTimeLibrary("UIKit");
|
||||||
linkTimeMajorVersion = ((MAX(linkTimeVersion, 0) & FBSDKInternalUtilityMajorVersionMask) >> FBSDKInternalUtilityMajorVersionShift);
|
linkTimeMajorVersion = [self getMajorVersionFromFullLibraryVersion:linkTimeVersion];
|
||||||
});
|
});
|
||||||
return (version <= linkTimeMajorVersion);
|
return (version <= linkTimeMajorVersion);
|
||||||
}
|
}
|
||||||
@ -258,11 +258,24 @@ setJSONStringForObject:(id)object
|
|||||||
static dispatch_once_t getVersionOnce;
|
static dispatch_once_t getVersionOnce;
|
||||||
dispatch_once(&getVersionOnce, ^{
|
dispatch_once(&getVersionOnce, ^{
|
||||||
int32_t runTimeVersion = NSVersionOfRunTimeLibrary("UIKit");
|
int32_t runTimeVersion = NSVersionOfRunTimeLibrary("UIKit");
|
||||||
runTimeMajorVersion = ((MAX(runTimeVersion, 0) & FBSDKInternalUtilityMajorVersionMask) >> FBSDKInternalUtilityMajorVersionShift);
|
runTimeMajorVersion = [self getMajorVersionFromFullLibraryVersion:runTimeVersion];
|
||||||
});
|
});
|
||||||
return (version <= runTimeMajorVersion);
|
return (version <= runTimeMajorVersion);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
+ (int32_t)getMajorVersionFromFullLibraryVersion:(int32_t)version
|
||||||
|
{
|
||||||
|
// Negative values returned by NSVersionOfRunTimeLibrary/NSVersionOfLinkTimeLibrary
|
||||||
|
// are still valid version numbers, as long as it's not -1.
|
||||||
|
// After bitshift by 16, the negatives become valid positive major version number.
|
||||||
|
// We ran into this first time with iOS 12.
|
||||||
|
if (version != -1) {
|
||||||
|
return ((version & FBSDKInternalUtilityMajorVersionMask) >> FBSDKInternalUtilityMajorVersionShift);
|
||||||
|
} else {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
+ (NSString *)JSONStringForObject:(id)object
|
+ (NSString *)JSONStringForObject:(id)object
|
||||||
error:(NSError *__autoreleasing *)errorRef
|
error:(NSError *__autoreleasing *)errorRef
|
||||||
invalidObjectHandler:(id(^)(id object, BOOL *stop))invalidObjectHandler
|
invalidObjectHandler:(id(^)(id object, BOOL *stop))invalidObjectHandler
|
||||||
@ -271,7 +284,7 @@ setJSONStringForObject:(id)object
|
|||||||
object = [self _convertObjectToJSONObject:object invalidObjectHandler:invalidObjectHandler stop:NULL];
|
object = [self _convertObjectToJSONObject:object invalidObjectHandler:invalidObjectHandler stop:NULL];
|
||||||
if (![NSJSONSerialization isValidJSONObject:object]) {
|
if (![NSJSONSerialization isValidJSONObject:object]) {
|
||||||
if (errorRef != NULL) {
|
if (errorRef != NULL) {
|
||||||
*errorRef = [FBSDKError invalidArgumentErrorWithName:@"object"
|
*errorRef = [NSError fbInvalidArgumentErrorWithName:@"object"
|
||||||
value:object
|
value:object
|
||||||
message:@"Invalid object for JSON serialization."];
|
message:@"Invalid object for JSON serialization."];
|
||||||
}
|
}
|
||||||
@ -348,7 +361,7 @@ setJSONStringForObject:(id)object
|
|||||||
NSMutableString *queryString = [[NSMutableString alloc] init];
|
NSMutableString *queryString = [[NSMutableString alloc] init];
|
||||||
__block BOOL hasParameters = NO;
|
__block BOOL hasParameters = NO;
|
||||||
if (dictionary) {
|
if (dictionary) {
|
||||||
NSMutableArray *keys = [[dictionary allKeys] mutableCopy];
|
NSMutableArray<NSString *> *keys = [dictionary.allKeys mutableCopy];
|
||||||
// remove non-string keys, as they are not valid
|
// remove non-string keys, as they are not valid
|
||||||
[keys filterUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) {
|
[keys filterUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) {
|
||||||
return [evaluatedObject isKindOfClass:[NSString class]];
|
return [evaluatedObject isKindOfClass:[NSString class]];
|
||||||
@ -379,7 +392,7 @@ setJSONStringForObject:(id)object
|
|||||||
if (errorRef != NULL) {
|
if (errorRef != NULL) {
|
||||||
*errorRef = nil;
|
*errorRef = nil;
|
||||||
}
|
}
|
||||||
return ([queryString length] ? [queryString copy] : nil);
|
return (queryString.length ? [queryString copy] : nil);
|
||||||
}
|
}
|
||||||
|
|
||||||
+ (BOOL)shouldManuallyAdjustOrientation
|
+ (BOOL)shouldManuallyAdjustOrientation
|
||||||
@ -399,13 +412,13 @@ setJSONStringForObject:(id)object
|
|||||||
}
|
}
|
||||||
|
|
||||||
NSString *queryString = nil;
|
NSString *queryString = nil;
|
||||||
if ([queryParameters count]) {
|
if (queryParameters.count) {
|
||||||
NSError *queryStringError;
|
NSError *queryStringError;
|
||||||
queryString = [@"?" stringByAppendingString:[FBSDKUtility queryStringWithDictionary:queryParameters
|
queryString = [@"?" stringByAppendingString:[FBSDKUtility queryStringWithDictionary:queryParameters
|
||||||
error:&queryStringError]];
|
error:&queryStringError]];
|
||||||
if (!queryString) {
|
if (!queryString) {
|
||||||
if (errorRef != NULL) {
|
if (errorRef != NULL) {
|
||||||
*errorRef = [FBSDKError invalidArgumentErrorWithName:@"queryParameters"
|
*errorRef = [NSError fbInvalidArgumentErrorWithName:@"queryParameters"
|
||||||
value:queryParameters
|
value:queryParameters
|
||||||
message:nil
|
message:nil
|
||||||
underlyingError:queryStringError];
|
underlyingError:queryStringError];
|
||||||
@ -424,7 +437,7 @@ setJSONStringForObject:(id)object
|
|||||||
if (URL) {
|
if (URL) {
|
||||||
*errorRef = nil;
|
*errorRef = nil;
|
||||||
} else {
|
} else {
|
||||||
*errorRef = [FBSDKError unknownErrorWithMessage:@"Unknown error building URL."];
|
*errorRef = [NSError fbUnknownErrorWithMessage:@"Unknown error building URL."];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return URL;
|
return URL;
|
||||||
@ -451,7 +464,7 @@ static NSMapTable *_transientObjects;
|
|||||||
if (!_transientObjects) {
|
if (!_transientObjects) {
|
||||||
_transientObjects = [[NSMapTable alloc] init];
|
_transientObjects = [[NSMapTable alloc] init];
|
||||||
}
|
}
|
||||||
NSUInteger count = [(NSNumber *)[_transientObjects objectForKey:object] unsignedIntegerValue];
|
NSUInteger count = ((NSNumber *)[_transientObjects objectForKey:object]).unsignedIntegerValue;
|
||||||
[_transientObjects setObject:@(count + 1) forKey:object];
|
[_transientObjects setObject:@(count + 1) forKey:object];
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -461,7 +474,7 @@ static NSMapTable *_transientObjects;
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
NSAssert([NSThread isMainThread], @"Must be called from the main thread!");
|
NSAssert([NSThread isMainThread], @"Must be called from the main thread!");
|
||||||
NSUInteger count = [(NSNumber *)[_transientObjects objectForKey:object] unsignedIntegerValue];
|
NSUInteger count = ((NSNumber *)[_transientObjects objectForKey:object]).unsignedIntegerValue;
|
||||||
if (count == 1) {
|
if (count == 1) {
|
||||||
[_transientObjects removeObjectForKey:object];
|
[_transientObjects removeObjectForKey:object];
|
||||||
} else if (count != 0) {
|
} else if (count != 0) {
|
||||||
@ -514,14 +527,6 @@ static NSMapTable *_transientObjects;
|
|||||||
return [self _canOpenURLScheme:FBSDK_CANOPENURL_MSQRD_PLAYER];
|
return [self _canOpenURLScheme:FBSDK_CANOPENURL_MSQRD_PLAYER];
|
||||||
}
|
}
|
||||||
|
|
||||||
#pragma mark - Object Lifecycle
|
|
||||||
|
|
||||||
- (instancetype)init
|
|
||||||
{
|
|
||||||
FBSDK_NO_DESIGNATED_INITIALIZER();
|
|
||||||
return nil;
|
|
||||||
}
|
|
||||||
|
|
||||||
#pragma mark - Helper Methods
|
#pragma mark - Helper Methods
|
||||||
|
|
||||||
+ (NSComparisonResult)_compareOperatingSystemVersion:(NSOperatingSystemVersion)version1
|
+ (NSComparisonResult)_compareOperatingSystemVersion:(NSOperatingSystemVersion)version1
|
||||||
@ -552,7 +557,7 @@ static NSMapTable *_transientObjects;
|
|||||||
if ([object isKindOfClass:[NSString class]] || [object isKindOfClass:[NSNumber class]]) {
|
if ([object isKindOfClass:[NSString class]] || [object isKindOfClass:[NSNumber class]]) {
|
||||||
// good to go, keep the object
|
// good to go, keep the object
|
||||||
} else if ([object isKindOfClass:[NSURL class]]) {
|
} else if ([object isKindOfClass:[NSURL class]]) {
|
||||||
object = [(NSURL *)object absoluteString];
|
object = ((NSURL *)object).absoluteString;
|
||||||
} else if ([object isKindOfClass:[NSDictionary class]]) {
|
} else if ([object isKindOfClass:[NSDictionary class]]) {
|
||||||
NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] init];
|
NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] init];
|
||||||
[(NSDictionary *)object enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *dictionaryStop) {
|
[(NSDictionary *)object enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *dictionaryStop) {
|
||||||
@ -684,7 +689,7 @@ static NSMapTable *_transientObjects;
|
|||||||
static NSArray *urlTypes = nil;
|
static NSArray *urlTypes = nil;
|
||||||
|
|
||||||
dispatch_once(&fetchBundleOnce, ^{
|
dispatch_once(&fetchBundleOnce, ^{
|
||||||
urlTypes = [[[NSBundle mainBundle] infoDictionary] valueForKey:@"CFBundleURLTypes"];
|
urlTypes = [[NSBundle mainBundle].infoDictionary valueForKey:@"CFBundleURLTypes"];
|
||||||
});
|
});
|
||||||
for (NSDictionary *urlType in urlTypes) {
|
for (NSDictionary *urlType in urlTypes) {
|
||||||
NSArray *urlSchemes = [urlType valueForKey:@"CFBundleURLSchemes"];
|
NSArray *urlSchemes = [urlType valueForKey:@"CFBundleURLSchemes"];
|
||||||
@ -724,7 +729,7 @@ static NSMapTable *_transientObjects;
|
|||||||
static NSArray *schemes = nil;
|
static NSArray *schemes = nil;
|
||||||
|
|
||||||
dispatch_once(&fetchBundleOnce, ^{
|
dispatch_once(&fetchBundleOnce, ^{
|
||||||
schemes = [[[NSBundle mainBundle] infoDictionary] valueForKey:@"LSApplicationQueriesSchemes"];
|
schemes = [[NSBundle mainBundle].infoDictionary valueForKey:@"LSApplicationQueriesSchemes"];
|
||||||
});
|
});
|
||||||
|
|
||||||
return [schemes containsObject:urlScheme];
|
return [schemes containsObject:urlScheme];
|
||||||
@ -772,4 +777,13 @@ static NSMapTable *_transientObjects;
|
|||||||
return clazz;
|
return clazz;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
+ (BOOL)isUnity
|
||||||
|
{
|
||||||
|
NSString *userAgentSuffix = [FBSDKSettings userAgentSuffix];
|
||||||
|
if (userAgentSuffix != nil && [userAgentSuffix rangeOfString:@"Unity"].location != NSNotFound) {
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
return NO;
|
||||||
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|||||||
@ -87,7 +87,7 @@ static NSMutableDictionary *g_startTimesWithTags = nil;
|
|||||||
|
|
||||||
- (void)appendKey:(NSString *)key value:(NSString *)value
|
- (void)appendKey:(NSString *)key value:(NSString *)value
|
||||||
{
|
{
|
||||||
if (_isActive && [value length]) {
|
if (_isActive && value.length) {
|
||||||
[_internalContents appendFormat:@" %@:\t%@\n", key, value];
|
[_internalContents appendFormat:@" %@:\t%@\n", key, value];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -98,7 +98,7 @@ static NSMutableDictionary *g_startTimesWithTags = nil;
|
|||||||
|
|
||||||
for (NSString *key in [g_stringsToReplace keyEnumerator]) {
|
for (NSString *key in [g_stringsToReplace keyEnumerator]) {
|
||||||
[_internalContents replaceOccurrencesOfString:key
|
[_internalContents replaceOccurrencesOfString:key
|
||||||
withString:[g_stringsToReplace objectForKey:key]
|
withString:g_stringsToReplace[key]
|
||||||
options:NSLiteralSearch
|
options:NSLiteralSearch
|
||||||
range:NSMakeRange(0, _internalContents.length)];
|
range:NSMakeRange(0, _internalContents.length)];
|
||||||
}
|
}
|
||||||
@ -158,8 +158,8 @@ static NSMutableDictionary *g_startTimesWithTags = nil;
|
|||||||
// Start time of this "timestampTag" is stashed in the dictionary.
|
// Start time of this "timestampTag" is stashed in the dictionary.
|
||||||
// Treat the incoming object tag simply as an address, since it's only used to identify during lifetime. If
|
// Treat the incoming object tag simply as an address, since it's only used to identify during lifetime. If
|
||||||
// we send in as an object, the dictionary will try to copy it.
|
// we send in as an object, the dictionary will try to copy it.
|
||||||
NSNumber *tagAsNumber = [NSNumber numberWithUnsignedLong:(unsigned long)(__bridge void *)timestampTag];
|
NSNumber *tagAsNumber = @((unsigned long)(__bridge void *)timestampTag);
|
||||||
NSNumber *startTimeNumber = [g_startTimesWithTags objectForKey:tagAsNumber];
|
NSNumber *startTimeNumber = g_startTimesWithTags[tagAsNumber];
|
||||||
|
|
||||||
// Only log if there's been an associated start time.
|
// Only log if there's been an associated start time.
|
||||||
if (startTimeNumber) {
|
if (startTimeNumber) {
|
||||||
@ -193,8 +193,7 @@ static NSMutableDictionary *g_startTimesWithTags = nil;
|
|||||||
// Treat the incoming object tag simply as an address, since it's only used to identify during lifetime. If
|
// Treat the incoming object tag simply as an address, since it's only used to identify during lifetime. If
|
||||||
// we send in as an object, the dictionary will try to copy it.
|
// we send in as an object, the dictionary will try to copy it.
|
||||||
unsigned long tagAsNumber = (unsigned long)(__bridge void *)timestampTag;
|
unsigned long tagAsNumber = (unsigned long)(__bridge void *)timestampTag;
|
||||||
[g_startTimesWithTags setObject:@(currTime)
|
g_startTimesWithTags[@(tagAsNumber)] = @(currTime);
|
||||||
forKey:[NSNumber numberWithUnsignedLong:tagAsNumber]];
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -204,7 +203,7 @@ static NSMutableDictionary *g_startTimesWithTags = nil;
|
|||||||
|
|
||||||
// Strings sent in here never get cleaned up, but that's OK, don't ever expect too many.
|
// Strings sent in here never get cleaned up, but that's OK, don't ever expect too many.
|
||||||
|
|
||||||
if ([[FBSDKSettings loggingBehavior] count] > 0) { // otherwise there's no logging.
|
if ([FBSDKSettings loggingBehavior].count > 0) { // otherwise there's no logging.
|
||||||
|
|
||||||
if (!g_stringsToReplace) {
|
if (!g_stringsToReplace) {
|
||||||
g_stringsToReplace = [[NSMutableDictionary alloc] init];
|
g_stringsToReplace = [[NSMutableDictionary alloc] init];
|
||||||
|
|||||||
@ -21,6 +21,9 @@
|
|||||||
|
|
||||||
@interface FBSDKMath : NSObject
|
@interface FBSDKMath : NSObject
|
||||||
|
|
||||||
|
- (instancetype)init NS_UNAVAILABLE;
|
||||||
|
+ (instancetype)new NS_UNAVAILABLE;
|
||||||
|
|
||||||
+ (CGPoint)ceilForPoint:(CGPoint)value;
|
+ (CGPoint)ceilForPoint:(CGPoint)value;
|
||||||
+ (CGSize)ceilForSize:(CGSize)value;
|
+ (CGSize)ceilForSize:(CGSize)value;
|
||||||
+ (CGPoint)floorForPoint:(CGPoint)value;
|
+ (CGPoint)floorForPoint:(CGPoint)value;
|
||||||
|
|||||||
@ -25,8 +25,6 @@
|
|||||||
|
|
||||||
#import <UIKit/UIKit.h>
|
#import <UIKit/UIKit.h>
|
||||||
|
|
||||||
#import "FBSDKMacros.h"
|
|
||||||
|
|
||||||
@implementation FBSDKMath
|
@implementation FBSDKMath
|
||||||
|
|
||||||
#pragma mark - Class Methods
|
#pragma mark - Class Methods
|
||||||
@ -148,12 +146,4 @@
|
|||||||
return hash;
|
return hash;
|
||||||
}
|
}
|
||||||
|
|
||||||
#pragma mark - Object Lifecycle
|
|
||||||
|
|
||||||
- (instancetype)init
|
|
||||||
{
|
|
||||||
FBSDK_NO_DESIGNATED_INITIALIZER();
|
|
||||||
return nil;
|
|
||||||
}
|
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|||||||
@ -191,9 +191,9 @@ static void (*fb_swizzledMethods[MAX_ARGS - MIN_ARGS + 1])() = {fb_swizzledMetho
|
|||||||
IMP swizzledMethod = (IMP)fb_swizzledMethods[numArgs - 2];
|
IMP swizzledMethod = (IMP)fb_swizzledMethods[numArgs - 2];
|
||||||
// Check whether the first parameter is integer
|
// Check whether the first parameter is integer
|
||||||
if (4 == numArgs) {
|
if (4 == numArgs) {
|
||||||
NSString *firstType = [NSString stringWithUTF8String:method_copyArgumentType(aMethod, 2)];
|
NSString *firstType = @(method_copyArgumentType(aMethod, 2));
|
||||||
NSString *integerTypes = @"islq";
|
NSString *integerTypes = @"islq";
|
||||||
if ([integerTypes containsString:[firstType lowercaseString]]) {
|
if ([integerTypes containsString:firstType.lowercaseString]) {
|
||||||
swizzledMethod = (IMP)fb_swizzleMethod_4_io;
|
swizzledMethod = (IMP)fb_swizzleMethod_4_io;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -30,6 +30,28 @@ typedef void (^FBSDKGraphRequestAccessToAccountsHandler)(NSString *oauthToken, N
|
|||||||
*/
|
*/
|
||||||
@interface FBSDKSystemAccountStoreAdapter : NSObject
|
@interface FBSDKSystemAccountStoreAdapter : NSObject
|
||||||
|
|
||||||
|
/*
|
||||||
|
s gets the oauth token stored in the account store credential, if available. If not empty,
|
||||||
|
this implies user has granted access.
|
||||||
|
*/
|
||||||
|
@property (nonatomic, readonly, copy) NSString *accessTokenString;
|
||||||
|
|
||||||
|
/*
|
||||||
|
Gets or sets the flag indicating if the next requestAccess call should block
|
||||||
|
on a renew call.
|
||||||
|
*/
|
||||||
|
@property (nonatomic, assign) BOOL forceBlockingRenew;
|
||||||
|
|
||||||
|
/*
|
||||||
|
A convenience getter to the Facebook account type in the account store, if available.
|
||||||
|
*/
|
||||||
|
@property (strong, nonatomic, readonly) ACAccountType *accountType;
|
||||||
|
|
||||||
|
/*
|
||||||
|
The singleton instance.
|
||||||
|
*/
|
||||||
|
@property (class, nonatomic, strong) FBSDKSystemAccountStoreAdapter *sharedInstance;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Requests access to the device's Facebook account for the given parameters.
|
Requests access to the device's Facebook account for the given parameters.
|
||||||
@param permissions the permissions
|
@param permissions the permissions
|
||||||
@ -51,31 +73,4 @@ typedef void (^FBSDKGraphRequestAccessToAccountsHandler)(NSString *oauthToken, N
|
|||||||
*/
|
*/
|
||||||
- (void)renewSystemAuthorization:(void(^)(ACAccountCredentialRenewResult result, NSError *error))handler;
|
- (void)renewSystemAuthorization:(void(^)(ACAccountCredentialRenewResult result, NSError *error))handler;
|
||||||
|
|
||||||
/*
|
|
||||||
s gets the oauth token stored in the account store credential, if available. If not empty,
|
|
||||||
this implies user has granted access.
|
|
||||||
*/
|
|
||||||
- (NSString *)accessTokenString;
|
|
||||||
|
|
||||||
/*
|
|
||||||
Gets the singleton instance.
|
|
||||||
*/
|
|
||||||
+ (FBSDKSystemAccountStoreAdapter *)sharedInstance;
|
|
||||||
|
|
||||||
/*
|
|
||||||
Sets the singleton instance, typically only for unit tests
|
|
||||||
*/
|
|
||||||
+ (void)setSharedInstance:(FBSDKSystemAccountStoreAdapter *)instance;
|
|
||||||
|
|
||||||
/*
|
|
||||||
Gets or sets the flag indicating if the next requestAccess call should block
|
|
||||||
on a renew call.
|
|
||||||
*/
|
|
||||||
@property (nonatomic, assign) BOOL forceBlockingRenew;
|
|
||||||
|
|
||||||
/*
|
|
||||||
A convenience getter to the Facebook account type in the account store, if available.
|
|
||||||
*/
|
|
||||||
@property (strong, nonatomic, readonly) ACAccountType *accountType;
|
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|||||||
@ -99,7 +99,7 @@ static FBSDKSystemAccountStoreAdapter *_singletonInstance = nil;
|
|||||||
if (self.accountType && self.accountType.accessGranted) {
|
if (self.accountType && self.accountType.accessGranted) {
|
||||||
NSArray *fbAccounts = [self.accountStore accountsWithAccountType:self.accountType];
|
NSArray *fbAccounts = [self.accountStore accountsWithAccountType:self.accountType];
|
||||||
if (fbAccounts.count > 0) {
|
if (fbAccounts.count > 0) {
|
||||||
id account = [fbAccounts objectAtIndex:0];
|
id account = fbAccounts[0];
|
||||||
id credential = [account credential];
|
id credential = [account credential];
|
||||||
|
|
||||||
return [credential oauthToken];
|
return [credential oauthToken];
|
||||||
@ -137,11 +137,9 @@ static FBSDKSystemAccountStoreAdapter *_singletonInstance = nil;
|
|||||||
}
|
}
|
||||||
|
|
||||||
// construct access options
|
// construct access options
|
||||||
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
|
NSDictionary<NSString *, id> *options = @{fbsdkdfl_ACFacebookAppIdKey(): appID,
|
||||||
appID, fbsdkdfl_ACFacebookAppIdKey(),
|
fbsdkdfl_ACFacebookPermissionsKey(): permissions.allObjects,
|
||||||
[permissions allObjects], fbsdkdfl_ACFacebookPermissionsKey(),
|
fbsdkdfl_ACFacebookAudienceKey(): defaultAudience};
|
||||||
defaultAudience, fbsdkdfl_ACFacebookAudienceKey(), // must end on this key/value due to audience possibly being nil
|
|
||||||
nil];
|
|
||||||
|
|
||||||
if (self.forceBlockingRenew
|
if (self.forceBlockingRenew
|
||||||
&& [self.accountStore accountsWithAccountType:self.accountType].count > 0) {
|
&& [self.accountStore accountsWithAccountType:self.accountType].count > 0) {
|
||||||
@ -171,7 +169,7 @@ static FBSDKSystemAccountStoreAdapter *_singletonInstance = nil;
|
|||||||
{
|
{
|
||||||
if (!self.accountType) {
|
if (!self.accountType) {
|
||||||
if (handler) {
|
if (handler) {
|
||||||
handler(nil, [FBSDKError errorWithCode:FBSDKUnknownErrorCode message:@"Invalid request to account store"]);
|
handler(nil, [NSError fbErrorWithCode:FBSDKErrorUnknown message:@"Invalid request to account store"]);
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -200,7 +198,7 @@ static FBSDKSystemAccountStoreAdapter *_singletonInstance = nil;
|
|||||||
if (granted) {
|
if (granted) {
|
||||||
NSArray *fbAccounts = [self.accountStore accountsWithAccountType:self.accountType];
|
NSArray *fbAccounts = [self.accountStore accountsWithAccountType:self.accountType];
|
||||||
if (fbAccounts.count > 0) {
|
if (fbAccounts.count > 0) {
|
||||||
account = [fbAccounts objectAtIndex:0];
|
account = fbAccounts[0];
|
||||||
|
|
||||||
id credential = [account credential];
|
id credential = [account credential];
|
||||||
|
|
||||||
@ -233,11 +231,11 @@ static FBSDKSystemAccountStoreAdapter *_singletonInstance = nil;
|
|||||||
if (self.accountStore && self.accountType && self.accountType.accessGranted) {
|
if (self.accountStore && self.accountType && self.accountType.accessGranted) {
|
||||||
NSArray *fbAccounts = [self.accountStore accountsWithAccountType:self.accountType];
|
NSArray *fbAccounts = [self.accountStore accountsWithAccountType:self.accountType];
|
||||||
id account;
|
id account;
|
||||||
if (fbAccounts && [fbAccounts count] > 0 &&
|
if (fbAccounts && fbAccounts.count > 0 &&
|
||||||
(account = [fbAccounts objectAtIndex:0])) {
|
(account = fbAccounts[0])) {
|
||||||
|
|
||||||
FBSDKAccessToken *currentToken = [FBSDKAccessToken currentAccessToken];
|
FBSDKAccessToken *currentToken = [FBSDKAccessToken currentAccessToken];
|
||||||
if (![currentToken.tokenString isEqualToString:[self accessTokenString]]) {
|
if (![currentToken.tokenString isEqualToString:self.accessTokenString]) {
|
||||||
currentToken = nil;
|
currentToken = nil;
|
||||||
}
|
}
|
||||||
[self.accountStore renewCredentialsForAccount:account completion:^(ACAccountCredentialRenewResult renewResult, NSError *error) {
|
[self.accountStore renewCredentialsForAccount:account completion:^(ACAccountCredentialRenewResult renewResult, NSError *error) {
|
||||||
@ -252,8 +250,9 @@ static FBSDKSystemAccountStoreAdapter *_singletonInstance = nil;
|
|||||||
[currentToken isEqual:[FBSDKAccessToken currentAccessToken]]) {
|
[currentToken isEqual:[FBSDKAccessToken currentAccessToken]]) {
|
||||||
// account store renewals can change the stored oauth token so we need to update the currentAccessToken
|
// account store renewals can change the stored oauth token so we need to update the currentAccessToken
|
||||||
// so future comparisons to -[ accessTokenString] work correctly (e.g., error recovery).
|
// so future comparisons to -[ accessTokenString] work correctly (e.g., error recovery).
|
||||||
FBSDKAccessToken *updatedToken = [[FBSDKAccessToken alloc] initWithTokenString:[self accessTokenString]
|
FBSDKAccessToken *updatedToken = [[FBSDKAccessToken alloc] initWithTokenString:self.accessTokenString
|
||||||
permissions:[currentToken.permissions allObjects] declinedPermissions:[currentToken.declinedPermissions allObjects]
|
permissions:currentToken.permissions.allObjects
|
||||||
|
declinedPermissions:currentToken.declinedPermissions.allObjects
|
||||||
appID:currentToken.appID
|
appID:currentToken.appID
|
||||||
userID:currentToken.userID
|
userID:currentToken.userID
|
||||||
expirationDate:[NSDate distantFuture]
|
expirationDate:[NSDate distantFuture]
|
||||||
|
|||||||
@ -18,8 +18,6 @@
|
|||||||
|
|
||||||
#import <Foundation/Foundation.h>
|
#import <Foundation/Foundation.h>
|
||||||
|
|
||||||
#import <FBSDKCoreKit/FBSDKMacros.h>
|
|
||||||
|
|
||||||
typedef NS_ENUM(NSInteger, FBSDKTriStateBOOL)
|
typedef NS_ENUM(NSInteger, FBSDKTriStateBOOL)
|
||||||
{
|
{
|
||||||
FBSDKTriStateBOOLValueUnknown = -1,
|
FBSDKTriStateBOOLValueUnknown = -1,
|
||||||
@ -27,6 +25,6 @@ typedef NS_ENUM(NSInteger, FBSDKTriStateBOOL)
|
|||||||
FBSDKTriStateBOOLValueYES = 1,
|
FBSDKTriStateBOOLValueYES = 1,
|
||||||
};
|
};
|
||||||
|
|
||||||
FBSDK_EXTERN FBSDKTriStateBOOL FBSDKTriStateBOOLFromBOOL(BOOL value);
|
FOUNDATION_EXPORT FBSDKTriStateBOOL FBSDKTriStateBOOLFromBOOL(BOOL value);
|
||||||
FBSDK_EXTERN FBSDKTriStateBOOL FBSDKTriStateBOOLFromNSNumber(NSNumber *value);
|
FOUNDATION_EXPORT FBSDKTriStateBOOL FBSDKTriStateBOOLFromNSNumber(NSNumber *value);
|
||||||
FBSDK_EXTERN BOOL BOOLFromFBSDKTriStateBOOL(FBSDKTriStateBOOL value, BOOL defaultValue);
|
FOUNDATION_EXPORT BOOL BOOLFromFBSDKTriStateBOOL(FBSDKTriStateBOOL value, BOOL defaultValue);
|
||||||
|
|||||||
@ -26,7 +26,7 @@ FBSDKTriStateBOOL FBSDKTriStateBOOLFromBOOL(BOOL value)
|
|||||||
FBSDKTriStateBOOL FBSDKTriStateBOOLFromNSNumber(NSNumber *value)
|
FBSDKTriStateBOOL FBSDKTriStateBOOLFromNSNumber(NSNumber *value)
|
||||||
{
|
{
|
||||||
return ([value isKindOfClass:[NSNumber class]] ?
|
return ([value isKindOfClass:[NSNumber class]] ?
|
||||||
FBSDKTriStateBOOLFromBOOL([value boolValue]) :
|
FBSDKTriStateBOOLFromBOOL(value.boolValue) :
|
||||||
FBSDKTriStateBOOLValueUnknown);
|
FBSDKTriStateBOOLValueUnknown);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -20,6 +20,9 @@
|
|||||||
|
|
||||||
@interface FBSDKTypeUtility : NSObject
|
@interface FBSDKTypeUtility : NSObject
|
||||||
|
|
||||||
|
- (instancetype)init NS_UNAVAILABLE;
|
||||||
|
+ (instancetype)new NS_UNAVAILABLE;
|
||||||
|
|
||||||
+ (NSArray *)arrayValue:(id)object;
|
+ (NSArray *)arrayValue:(id)object;
|
||||||
+ (BOOL)boolValue:(id)object;
|
+ (BOOL)boolValue:(id)object;
|
||||||
+ (NSDictionary *)dictionaryValue:(id)object;
|
+ (NSDictionary *)dictionaryValue:(id)object;
|
||||||
|
|||||||
@ -18,8 +18,6 @@
|
|||||||
|
|
||||||
#import "FBSDKTypeUtility.h"
|
#import "FBSDKTypeUtility.h"
|
||||||
|
|
||||||
#import "FBSDKMacros.h"
|
|
||||||
|
|
||||||
@implementation FBSDKTypeUtility
|
@implementation FBSDKTypeUtility
|
||||||
|
|
||||||
#pragma mark - Class Methods
|
#pragma mark - Class Methods
|
||||||
@ -33,10 +31,10 @@
|
|||||||
{
|
{
|
||||||
if ([object isKindOfClass:[NSNumber class]]) {
|
if ([object isKindOfClass:[NSNumber class]]) {
|
||||||
// @0 or @NO returns NO, otherwise YES
|
// @0 or @NO returns NO, otherwise YES
|
||||||
return [(NSNumber *)object boolValue];
|
return ((NSNumber *)object).boolValue;
|
||||||
} else if ([object isKindOfClass:[NSString class]]) {
|
} else if ([object isKindOfClass:[NSString class]]) {
|
||||||
// Returns YES on encountering one of "Y", "y", "T", "t", or a digit 1-9, otherwise NO
|
// Returns YES on encountering one of "Y", "y", "T", "t", or a digit 1-9, otherwise NO
|
||||||
return [(NSString *)object boolValue];
|
return ((NSString *)object).boolValue;
|
||||||
} else {
|
} else {
|
||||||
return ([self objectValue:object] != nil);
|
return ([self objectValue:object] != nil);
|
||||||
}
|
}
|
||||||
@ -50,9 +48,9 @@
|
|||||||
+ (NSInteger)integerValue:(id)object
|
+ (NSInteger)integerValue:(id)object
|
||||||
{
|
{
|
||||||
if ([object isKindOfClass:[NSNumber class]]) {
|
if ([object isKindOfClass:[NSNumber class]]) {
|
||||||
return [(NSNumber *)object integerValue];
|
return ((NSNumber *)object).integerValue;
|
||||||
} else if ([object isKindOfClass:[NSString class]]) {
|
} else if ([object isKindOfClass:[NSString class]]) {
|
||||||
return [(NSString *)object integerValue];
|
return ((NSString *)object).integerValue;
|
||||||
} else {
|
} else {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -68,9 +66,9 @@
|
|||||||
if ([object isKindOfClass:[NSString class]]) {
|
if ([object isKindOfClass:[NSString class]]) {
|
||||||
return (NSString *)object;
|
return (NSString *)object;
|
||||||
} else if ([object isKindOfClass:[NSNumber class]]) {
|
} else if ([object isKindOfClass:[NSNumber class]]) {
|
||||||
return [(NSNumber *)object stringValue];
|
return ((NSNumber *)object).stringValue;
|
||||||
} else if ([object isKindOfClass:[NSURL class]]) {
|
} else if ([object isKindOfClass:[NSURL class]]) {
|
||||||
return [(NSURL *)object absoluteString];
|
return ((NSURL *)object).absoluteString;
|
||||||
} else {
|
} else {
|
||||||
return nil;
|
return nil;
|
||||||
}
|
}
|
||||||
@ -79,9 +77,9 @@
|
|||||||
+ (NSTimeInterval)timeIntervalValue:(id)object
|
+ (NSTimeInterval)timeIntervalValue:(id)object
|
||||||
{
|
{
|
||||||
if ([object isKindOfClass:[NSNumber class]]) {
|
if ([object isKindOfClass:[NSNumber class]]) {
|
||||||
return [(NSNumber *)object doubleValue];
|
return ((NSNumber *)object).doubleValue;
|
||||||
} else if ([object isKindOfClass:[NSString class]]) {
|
} else if ([object isKindOfClass:[NSString class]]) {
|
||||||
return [(NSString *)object doubleValue];
|
return ((NSString *)object).doubleValue;
|
||||||
} else {
|
} else {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -90,7 +88,7 @@
|
|||||||
+ (NSUInteger)unsignedIntegerValue:(id)object
|
+ (NSUInteger)unsignedIntegerValue:(id)object
|
||||||
{
|
{
|
||||||
if ([object isKindOfClass:[NSNumber class]]) {
|
if ([object isKindOfClass:[NSNumber class]]) {
|
||||||
return [(NSNumber *)object unsignedIntegerValue];
|
return ((NSNumber *)object).unsignedIntegerValue;
|
||||||
} else {
|
} else {
|
||||||
// there is no direct support for strings containing unsigned values > NSIntegerMax - not worth writing ourselves
|
// there is no direct support for strings containing unsigned values > NSIntegerMax - not worth writing ourselves
|
||||||
// right now, so just cap unsigned values at NSIntegerMax until we have a need for larger
|
// right now, so just cap unsigned values at NSIntegerMax until we have a need for larger
|
||||||
@ -113,14 +111,6 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#pragma mark - Object Lifecycle
|
|
||||||
|
|
||||||
- (instancetype)init
|
|
||||||
{
|
|
||||||
FBSDK_NO_DESIGNATED_INITIALIZER();
|
|
||||||
return nil;
|
|
||||||
}
|
|
||||||
|
|
||||||
#pragma mark - Helper Methods
|
#pragma mark - Helper Methods
|
||||||
|
|
||||||
+ (id)_objectValue:(id)object ofClass:(Class)expectedClass
|
+ (id)_objectValue:(id)object ofClass:(Class)expectedClass
|
||||||
|
|||||||
@ -46,8 +46,9 @@ typedef NS_OPTIONS(NSUInteger, FBSDKGraphRequestFlags)
|
|||||||
// out of context of any user action.
|
// out of context of any user action.
|
||||||
@property (nonatomic, assign) FBSDKGraphRequestFlags flags;
|
@property (nonatomic, assign) FBSDKGraphRequestFlags flags;
|
||||||
|
|
||||||
- (BOOL)isGraphErrorRecoveryDisabled;
|
@property (nonatomic, readonly, getter=isGraphErrorRecoveryDisabled) BOOL graphErrorRecoveryDisabled;
|
||||||
- (BOOL)hasAttachments;
|
@property (nonatomic, readonly) BOOL hasAttachments;
|
||||||
|
|
||||||
+ (BOOL)isAttachment:(id)item;
|
+ (BOOL)isAttachment:(id)item;
|
||||||
+ (NSString *)serializeURL:(NSString *)baseUrl
|
+ (NSString *)serializeURL:(NSString *)baseUrl
|
||||||
params:(NSDictionary *)params
|
params:(NSDictionary *)params
|
||||||
|
|||||||
@ -18,22 +18,24 @@
|
|||||||
|
|
||||||
#import "FBSDKGraphRequestBody.h"
|
#import "FBSDKGraphRequestBody.h"
|
||||||
|
|
||||||
|
#import "FBSDKCrypto.h"
|
||||||
#import "FBSDKGraphRequestDataAttachment.h"
|
#import "FBSDKGraphRequestDataAttachment.h"
|
||||||
#import "FBSDKLogger.h"
|
#import "FBSDKLogger.h"
|
||||||
#import "FBSDKSettings.h"
|
#import "FBSDKSettings.h"
|
||||||
|
|
||||||
#define kStringBoundary @"3i2ndDfv2rTHiSisAbouNdArYfORhtTPEefj3q2f"
|
|
||||||
#define kNewline @"\r\n"
|
#define kNewline @"\r\n"
|
||||||
|
|
||||||
@implementation FBSDKGraphRequestBody
|
@implementation FBSDKGraphRequestBody
|
||||||
{
|
{
|
||||||
NSMutableData *_data;
|
NSMutableData *_data;
|
||||||
NSMutableDictionary *_json;
|
NSMutableDictionary *_json;
|
||||||
|
NSString *_stringBoundary;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (instancetype)init
|
- (instancetype)init
|
||||||
{
|
{
|
||||||
if ((self = [super init])) {
|
if ((self = [super init])) {
|
||||||
|
_stringBoundary = [FBSDKCrypto randomString:32];
|
||||||
_data = [[NSMutableData alloc] init];
|
_data = [[NSMutableData alloc] init];
|
||||||
_json = [NSMutableDictionary dictionary];
|
_json = [NSMutableDictionary dictionary];
|
||||||
}
|
}
|
||||||
@ -46,14 +48,14 @@
|
|||||||
if (_json) {
|
if (_json) {
|
||||||
return @"application/json";
|
return @"application/json";
|
||||||
} else {
|
} else {
|
||||||
return [NSString stringWithFormat:@"multipart/form-data; boundary=%@",kStringBoundary];
|
return [NSString stringWithFormat:@"multipart/form-data; boundary=%@", _stringBoundary];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)appendUTF8:(NSString *)utf8
|
- (void)appendUTF8:(NSString *)utf8
|
||||||
{
|
{
|
||||||
if (![_data length]) {
|
if (!_data.length) {
|
||||||
NSString *headerUTF8 = [NSString stringWithFormat:@"--%@%@", kStringBoundary, kNewline];
|
NSString *headerUTF8 = [NSString stringWithFormat:@"--%@%@", _stringBoundary, kNewline];
|
||||||
NSData *headerData = [headerUTF8 dataUsingEncoding:NSUTF8StringEncoding];
|
NSData *headerData = [headerUTF8 dataUsingEncoding:NSUTF8StringEncoding];
|
||||||
[_data appendData:headerData];
|
[_data appendData:headerData];
|
||||||
}
|
}
|
||||||
@ -69,7 +71,7 @@
|
|||||||
[self appendUTF8:value];
|
[self appendUTF8:value];
|
||||||
}];
|
}];
|
||||||
if (key && value) {
|
if (key && value) {
|
||||||
[_json setObject:value forKey:key];
|
_json[key] = value;
|
||||||
}
|
}
|
||||||
[logger appendFormat:@"\n %@:\t%@", key, (NSString *)value];
|
[logger appendFormat:@"\n %@:\t%@", key, (NSString *)value];
|
||||||
}
|
}
|
||||||
@ -83,7 +85,7 @@
|
|||||||
[self->_data appendData:data];
|
[self->_data appendData:data];
|
||||||
}];
|
}];
|
||||||
_json = nil;
|
_json = nil;
|
||||||
[logger appendFormat:@"\n %@:\t<Image - %lu kB>", key, (unsigned long)([data length] / 1024)];
|
[logger appendFormat:@"\n %@:\t<Image - %lu kB>", key, (unsigned long)(data.length / 1024)];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)appendWithKey:(NSString *)key
|
- (void)appendWithKey:(NSString *)key
|
||||||
@ -94,7 +96,7 @@
|
|||||||
[self->_data appendData:data];
|
[self->_data appendData:data];
|
||||||
}];
|
}];
|
||||||
_json = nil;
|
_json = nil;
|
||||||
[logger appendFormat:@"\n %@:\t<Data - %lu kB>", key, (unsigned long)([data length] / 1024)];
|
[logger appendFormat:@"\n %@:\t<Data - %lu kB>", key, (unsigned long)(data.length / 1024)];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)appendWithKey:(NSString *)key
|
- (void)appendWithKey:(NSString *)key
|
||||||
@ -108,7 +110,7 @@
|
|||||||
[self->_data appendData:data];
|
[self->_data appendData:data];
|
||||||
}];
|
}];
|
||||||
_json = nil;
|
_json = nil;
|
||||||
[logger appendFormat:@"\n %@:\t<Data - %lu kB>", key, (unsigned long)([data length] / 1024)];
|
[logger appendFormat:@"\n %@:\t<Data - %lu kB>", key, (unsigned long)(data.length / 1024)];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (NSData *)data
|
- (NSData *)data
|
||||||
@ -147,7 +149,7 @@
|
|||||||
if (contentBlock != NULL) {
|
if (contentBlock != NULL) {
|
||||||
contentBlock();
|
contentBlock();
|
||||||
}
|
}
|
||||||
[self appendUTF8:[[NSString alloc] initWithFormat:@"%@--%@%@", kNewline, kStringBoundary, kNewline]];
|
[self appendUTF8:[[NSString alloc] initWithFormat:@"%@--%@%@", kNewline, _stringBoundary, kNewline]];
|
||||||
}
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|||||||
@ -29,6 +29,9 @@
|
|||||||
@property (nonatomic, copy) FBSDKGraphRequestHandler completionHandler;
|
@property (nonatomic, copy) FBSDKGraphRequestHandler completionHandler;
|
||||||
@property (nonatomic, copy) NSDictionary *batchParameters;
|
@property (nonatomic, copy) NSDictionary *batchParameters;
|
||||||
|
|
||||||
|
- (instancetype)init NS_UNAVAILABLE;
|
||||||
|
+ (instancetype)new NS_UNAVAILABLE;
|
||||||
|
|
||||||
- (instancetype)initWithRequest:(FBSDKGraphRequest *)request
|
- (instancetype)initWithRequest:(FBSDKGraphRequest *)request
|
||||||
completionHandler:(FBSDKGraphRequestHandler)handler
|
completionHandler:(FBSDKGraphRequestHandler)handler
|
||||||
batchParameters:(NSDictionary *)batchParameters
|
batchParameters:(NSDictionary *)batchParameters
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user