| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700 |
- /*
- * Copyright 2018 Google
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
- #import <TargetConditionals.h>
- #if TARGET_OS_IOS
- #import <Foundation/Foundation.h>
- #import "FirebaseDynamicLinks/Sources/FDLURLComponents/FDLURLComponents+Private.h"
- #import "FirebaseDynamicLinks/Sources/FDLURLComponents/FIRDynamicLinkComponentsKeyProvider.h"
- #import "FirebaseDynamicLinks/Sources/Public/FirebaseDynamicLinks/FDLURLComponents.h"
- #import "FirebaseDynamicLinks/Sources/Logging/FDLLogging.h"
- #import "FirebaseDynamicLinks/Sources/Utilities/FDLUtilities.h"
- // Label exceptions from FDL.
- NSString *const kFirebaseDurableDeepLinkErrorDomain = @"com.firebase.durabledeeplink";
- /// The exact behavior of dict[key] = value is unclear when value is nil. This function safely adds
- /// the key-value pair to the dictionary, even when value is nil.
- /// This function will treat empty string in the same way as nil.
- NS_INLINE void FDLSafelyAddKeyValuePairToDictionary(NSString *key,
- NSString *stringValue,
- NSMutableDictionary *dictionary) {
- if (stringValue != nil && stringValue.length > 0) {
- dictionary[key] = stringValue;
- } else {
- [dictionary removeObjectForKey:key];
- }
- }
- @implementation FIRDynamicLinkGoogleAnalyticsParameters {
- NSMutableDictionary<NSString *, NSString *> *_dictionary;
- }
- static NSString *const kFDLUTMSourceKey = @"utm_source";
- static NSString *const kFDLUTMMediumKey = @"utm_medium";
- static NSString *const kFDLUTMCampaignKey = @"utm_campaign";
- static NSString *const kFDLUTMTermKey = @"utm_term";
- static NSString *const kFDLUTMContentKey = @"utm_content";
- + (instancetype)parameters {
- return [[self alloc] init];
- }
- + (instancetype)parametersWithSource:(NSString *)source
- medium:(NSString *)medium
- campaign:(NSString *)campaign {
- return [[self alloc] initWithSource:source medium:medium campaign:campaign];
- }
- - (instancetype)init {
- self = [super init];
- if (self) {
- _dictionary = [NSMutableDictionary dictionary];
- }
- return self;
- }
- - (instancetype)initWithSource:(NSString *)source
- medium:(NSString *)medium
- campaign:(NSString *)campaign {
- self = [self init];
- if (self) {
- FDLSafelyAddKeyValuePairToDictionary(kFDLUTMSourceKey, [source copy], _dictionary);
- FDLSafelyAddKeyValuePairToDictionary(kFDLUTMMediumKey, [medium copy], _dictionary);
- FDLSafelyAddKeyValuePairToDictionary(kFDLUTMCampaignKey, [campaign copy], _dictionary);
- }
- return self;
- }
- - (void)setSource:(NSString *)source {
- FDLSafelyAddKeyValuePairToDictionary(kFDLUTMSourceKey, [source copy], _dictionary);
- }
- - (NSString *)source {
- return _dictionary[kFDLUTMSourceKey];
- }
- - (void)setMedium:(NSString *)medium {
- FDLSafelyAddKeyValuePairToDictionary(kFDLUTMMediumKey, [medium copy], _dictionary);
- }
- - (NSString *)medium {
- return _dictionary[kFDLUTMMediumKey];
- }
- - (void)setCampaign:(NSString *)campaign {
- FDLSafelyAddKeyValuePairToDictionary(kFDLUTMCampaignKey, [campaign copy], _dictionary);
- }
- - (NSString *)campaign {
- return _dictionary[kFDLUTMCampaignKey];
- }
- - (void)setTerm:(NSString *)term {
- FDLSafelyAddKeyValuePairToDictionary(kFDLUTMTermKey, [term copy], _dictionary);
- }
- - (NSString *)term {
- return _dictionary[kFDLUTMTermKey];
- }
- - (void)setContent:(NSString *)content {
- FDLSafelyAddKeyValuePairToDictionary(kFDLUTMContentKey, [content copy], _dictionary);
- }
- - (NSString *)content {
- return _dictionary[kFDLUTMContentKey];
- }
- - (NSDictionary<NSString *, NSString *> *)dictionaryRepresentation {
- return [_dictionary copy];
- }
- @end
- @implementation FIRDynamicLinkIOSParameters {
- NSMutableDictionary<NSString *, NSString *> *_dictionary;
- }
- static NSString *const kFDLIOSBundleIdentifierKey = @"ibi";
- static NSString *const kFDLIOSAppStoreIdentifierKey = @"isi";
- static NSString *const kFDLIOSFallbackURLKey = @"ifl";
- static NSString *const kFDLIOSCustomURLSchemeKey = @"ius";
- static NSString *const kFDLIOSMinimumVersionKey = @"imv";
- static NSString *const kFDLIOSIPadBundleIdentifierKey = @"ipbi";
- static NSString *const kFDLIOSIPadFallbackURLKey = @"ipfl";
- + (instancetype)parametersWithBundleID:(NSString *)bundleID {
- return [[self alloc] initWithBundleID:bundleID];
- }
- - (instancetype)initWithBundleID:(NSString *)bundleID {
- self = [super init];
- if (self) {
- _dictionary = [NSMutableDictionary dictionary];
- FDLSafelyAddKeyValuePairToDictionary(kFDLIOSBundleIdentifierKey, [bundleID copy], _dictionary);
- }
- return self;
- }
- - (NSString *)bundleID {
- return _dictionary[kFDLIOSBundleIdentifierKey];
- }
- - (void)setAppStoreID:(NSString *)appStoreID {
- FDLSafelyAddKeyValuePairToDictionary(kFDLIOSAppStoreIdentifierKey, [appStoreID copy],
- _dictionary);
- }
- - (NSString *)appStoreID {
- return _dictionary[kFDLIOSAppStoreIdentifierKey];
- }
- - (void)setFallbackURL:(NSURL *)fallbackURL {
- FDLSafelyAddKeyValuePairToDictionary(kFDLIOSFallbackURLKey, fallbackURL.absoluteString,
- _dictionary);
- }
- - (NSURL *)fallbackURL {
- NSString *fallbackURLString = _dictionary[kFDLIOSFallbackURLKey];
- return fallbackURLString != nil ? [NSURL URLWithString:fallbackURLString] : nil;
- }
- - (void)setCustomScheme:(NSString *)customScheme {
- FDLSafelyAddKeyValuePairToDictionary(kFDLIOSCustomURLSchemeKey, [customScheme copy], _dictionary);
- }
- - (NSString *)customScheme {
- return _dictionary[kFDLIOSCustomURLSchemeKey];
- }
- - (void)setMinimumAppVersion:(NSString *)minimumAppVersion {
- FDLSafelyAddKeyValuePairToDictionary(kFDLIOSMinimumVersionKey, [minimumAppVersion copy],
- _dictionary);
- }
- - (NSString *)minimumAppVersion {
- return _dictionary[kFDLIOSMinimumVersionKey];
- }
- - (void)setIPadBundleID:(NSString *)iPadBundleID {
- FDLSafelyAddKeyValuePairToDictionary(kFDLIOSIPadBundleIdentifierKey, [iPadBundleID copy],
- _dictionary);
- }
- - (NSString *)iPadBundleID {
- return _dictionary[kFDLIOSIPadBundleIdentifierKey];
- }
- - (void)setIPadFallbackURL:(NSURL *)iPadFallbackURL {
- FDLSafelyAddKeyValuePairToDictionary(kFDLIOSIPadFallbackURLKey, iPadFallbackURL.absoluteString,
- _dictionary);
- }
- - (NSURL *)iPadFallbackURL {
- NSString *fallbackURLString = _dictionary[kFDLIOSIPadFallbackURLKey];
- return fallbackURLString != nil ? [NSURL URLWithString:fallbackURLString] : nil;
- }
- - (NSDictionary<NSString *, NSString *> *)dictionaryRepresentation {
- return [_dictionary copy];
- }
- @end
- @implementation FIRDynamicLinkItunesConnectAnalyticsParameters {
- NSMutableDictionary<NSString *, NSString *> *_dictionary;
- }
- static NSString *const kFDLITunesConnectAffiliateTokeyKey = @"at";
- static NSString *const kFDLITunesConnectCampaignTokenKey = @"ct";
- static NSString *const kFDLITunesConnectProviderTokenKey = @"pt";
- + (instancetype)parameters {
- return [[self alloc] init];
- }
- - (instancetype)init {
- self = [super init];
- if (self) {
- _dictionary = [NSMutableDictionary dictionary];
- }
- return self;
- }
- - (void)setAffiliateToken:(NSString *)affiliateToken {
- FDLSafelyAddKeyValuePairToDictionary(kFDLITunesConnectAffiliateTokeyKey, [affiliateToken copy],
- _dictionary);
- }
- - (NSString *)affiliateToken {
- return _dictionary[kFDLITunesConnectAffiliateTokeyKey];
- }
- - (void)setCampaignToken:(NSString *)campaignToken {
- FDLSafelyAddKeyValuePairToDictionary(kFDLITunesConnectCampaignTokenKey, [campaignToken copy],
- _dictionary);
- }
- - (NSString *)campaignToken {
- return _dictionary[kFDLITunesConnectCampaignTokenKey];
- }
- - (void)setProviderToken:(NSString *)providerToken {
- FDLSafelyAddKeyValuePairToDictionary(kFDLITunesConnectProviderTokenKey, [providerToken copy],
- _dictionary);
- }
- - (NSString *)providerToken {
- return _dictionary[kFDLITunesConnectProviderTokenKey];
- }
- - (NSDictionary<NSString *, NSString *> *)dictionaryRepresentation {
- return [_dictionary copy];
- }
- @end
- @implementation FIRDynamicLinkAndroidParameters {
- NSMutableDictionary<NSString *, NSString *> *_dictionary;
- }
- static NSString *const kFDLAndroidMinimumVersionKey = @"amv";
- static NSString *const kFDLAndroidFallbackURLKey = @"afl";
- static NSString *const kFDLAndroidPackageNameKey = @"apn";
- + (instancetype)parametersWithPackageName:(NSString *)packageName {
- return [[self alloc] initWithPackageName:packageName];
- }
- - (instancetype)initWithPackageName:(NSString *)packageName {
- self = [super init];
- if (self) {
- _dictionary = [NSMutableDictionary dictionary];
- FDLSafelyAddKeyValuePairToDictionary(kFDLAndroidPackageNameKey, packageName, _dictionary);
- }
- return self;
- }
- - (NSString *)packageName {
- return _dictionary[kFDLAndroidPackageNameKey];
- }
- - (void)setMinimumVersion:(NSInteger)minimumVersion {
- _dictionary[kFDLAndroidMinimumVersionKey] = @(minimumVersion).stringValue;
- }
- - (NSInteger)minimumVersion {
- return _dictionary[kFDLAndroidMinimumVersionKey].integerValue;
- }
- - (void)setFallbackURL:(NSURL *)fallbackURL {
- FDLSafelyAddKeyValuePairToDictionary(kFDLAndroidFallbackURLKey, fallbackURL.absoluteString,
- _dictionary);
- }
- - (NSURL *)fallbackURL {
- NSString *fallbackURLString = _dictionary[kFDLAndroidFallbackURLKey];
- return fallbackURLString != nil ? [NSURL URLWithString:fallbackURLString] : nil;
- }
- - (NSDictionary<NSString *, NSString *> *)dictionaryRepresentation {
- return [_dictionary copy];
- }
- @end
- @implementation FIRDynamicLinkSocialMetaTagParameters {
- NSMutableDictionary<NSString *, NSString *> *_dictionary;
- }
- static NSString *const kFDLSocialTitleKey = @"st";
- static NSString *const kFDLSocialDescriptionKey = @"sd";
- static NSString *const kFDLSocialImageURLKey = @"si";
- + (instancetype)parameters {
- return [[self alloc] init];
- }
- - (instancetype)init {
- self = [super init];
- if (self) {
- _dictionary = [NSMutableDictionary dictionary];
- }
- return self;
- }
- - (void)setTitle:(NSString *)title {
- FDLSafelyAddKeyValuePairToDictionary(kFDLSocialTitleKey, [title copy], _dictionary);
- }
- - (NSString *)title {
- return _dictionary[kFDLSocialTitleKey];
- }
- - (void)setDescriptionText:(NSString *)descriptionText {
- FDLSafelyAddKeyValuePairToDictionary(kFDLSocialDescriptionKey, [descriptionText copy],
- _dictionary);
- }
- - (NSString *)descriptionText {
- return _dictionary[kFDLSocialDescriptionKey];
- }
- - (void)setImageURL:(NSURL *)imageURL {
- FDLSafelyAddKeyValuePairToDictionary(kFDLSocialImageURLKey, imageURL.absoluteString, _dictionary);
- }
- - (NSURL *)imageURL {
- NSString *imageURLString = _dictionary[kFDLSocialImageURLKey];
- return imageURLString != nil ? [NSURL URLWithString:imageURLString] : nil;
- }
- - (NSDictionary<NSString *, NSString *> *)dictionaryRepresentation {
- return [_dictionary copy];
- }
- @end
- @implementation FIRDynamicLinkNavigationInfoParameters {
- NSMutableDictionary<NSString *, NSString *> *_dictionary;
- }
- static NSString *const kFDLNavigationInfoForceRedirectKey = @"efr";
- + (instancetype)parameters {
- return [[self alloc] init];
- }
- - (instancetype)init {
- self = [super init];
- if (self) {
- _dictionary = [NSMutableDictionary dictionary];
- }
- return self;
- }
- - (BOOL)isForcedRedirectEnabled {
- return [_dictionary[kFDLNavigationInfoForceRedirectKey] boolValue];
- }
- - (void)setForcedRedirectEnabled:(BOOL)forcedRedirectEnabled {
- FDLSafelyAddKeyValuePairToDictionary(kFDLNavigationInfoForceRedirectKey,
- forcedRedirectEnabled ? @"1" : @"0", _dictionary);
- }
- - (NSDictionary<NSString *, NSString *> *)dictionaryRepresentation {
- return [_dictionary copy];
- }
- @end
- @implementation FIRDynamicLinkOtherPlatformParameters {
- NSMutableDictionary<NSString *, NSString *> *_dictionary;
- }
- static NSString *const kFDLOtherPlatformParametersFallbackURLKey = @"ofl";
- + (instancetype)parameters {
- return [[self alloc] init];
- }
- - (instancetype)init {
- self = [super init];
- if (self) {
- _dictionary = [NSMutableDictionary dictionary];
- }
- return self;
- }
- - (NSURL *)fallbackUrl {
- NSString *fallbackURLString = _dictionary[kFDLOtherPlatformParametersFallbackURLKey];
- return fallbackURLString != nil ? [NSURL URLWithString:fallbackURLString] : nil;
- }
- - (void)setFallbackUrl:(NSURL *)fallbackUrl {
- FDLSafelyAddKeyValuePairToDictionary(kFDLOtherPlatformParametersFallbackURLKey,
- fallbackUrl.absoluteString, _dictionary);
- }
- - (NSDictionary<NSString *, NSString *> *)dictionaryRepresentation {
- return [_dictionary copy];
- }
- @end
- @implementation FIRDynamicLinkComponentsOptions
- + (instancetype)options {
- return [[self alloc] init];
- }
- // This is implemented to silence the 'not implemented' warning.
- - (instancetype)init {
- return [super init];
- }
- @end
- @implementation FIRDynamicLinkComponents
- #pragma mark Deprecated Initializers.
- + (instancetype)componentsWithLink:(NSURL *)link domain:(NSString *)domain {
- return [[self alloc] initWithLink:link domain:domain];
- }
- - (instancetype)initWithLink:(NSURL *)link domain:(NSString *)domain {
- NSURL *domainURL = [NSURL URLWithString:domain];
- if (domainURL.scheme) {
- FDLLog(FDLLogLevelWarning, FDLLogIdentifierSetupWarnHTTPSScheme,
- @"You have supplied a domain with a scheme. Please enter a domain name without the "
- @"scheme.");
- }
- NSString *domainURIPrefix = [NSString stringWithFormat:@"https://%@", domain];
- self = [super init];
- if (self) {
- _link = link;
- _domain = domainURIPrefix;
- }
- return self;
- }
- #pragma mark Initializers.
- + (instancetype)componentsWithLink:(NSURL *)link domainURIPrefix:(NSString *)domainURIPrefix {
- return [[self alloc] initWithLink:link domainURIPrefix:domainURIPrefix];
- }
- - (instancetype)initWithLink:(NSURL *)link domainURIPrefix:(NSString *)domainURIPrefix {
- self = [super init];
- if (self) {
- _link = link;
- /// Must be a URL that conforms to RFC 2396.
- NSURL *domainURIPrefixURL = [NSURL URLWithString:domainURIPrefix];
- if (!domainURIPrefixURL) {
- FDLLog(FDLLogLevelError, FDLLogIdentifierSetupInvalidDomainURIPrefix,
- @"Invalid domainURIPrefix. Please input a valid URL.");
- return nil;
- }
- if (![[domainURIPrefixURL.scheme lowercaseString] isEqualToString:@"https"]) {
- FDLLog(FDLLogLevelError, FDLLogIdentifierSetupInvalidDomainURIPrefixScheme,
- @"Invalid domainURIPrefix scheme. Scheme needs to be https");
- return nil;
- }
- _domain = [domainURIPrefix copy];
- }
- return self;
- }
- + (void)shortenURL:(NSURL *)url
- options:(FIRDynamicLinkComponentsOptions *)options
- completion:(FIRDynamicLinkShortenerCompletion)completion {
- if (![FIRDynamicLinkComponentsKeyProvider APIKey]) {
- NSError *error = [NSError
- errorWithDomain:kFirebaseDurableDeepLinkErrorDomain
- code:0
- userInfo:@{
- NSLocalizedFailureReasonErrorKey : NSLocalizedString(
- @"API key is missing.", @"Error reason message when API key is missing"),
- }];
- completion(nil, nil, error);
- return;
- }
- NSURLRequest *request = [self shorteningRequestForLongURL:url options:options];
- if (!request) {
- NSError *error = [NSError errorWithDomain:kFirebaseDurableDeepLinkErrorDomain
- code:0
- userInfo:nil];
- completion(nil, nil, error);
- return;
- }
- [self sendHTTPRequest:request
- completion:^(NSData *_Nullable data, NSError *_Nullable error) {
- NSURL *shortURL;
- NSArray *warnings;
- if (data != nil && error == nil) {
- NSError *deserializationError;
- id JSONObject = [NSJSONSerialization JSONObjectWithData:data
- options:0
- error:&deserializationError];
- if ([JSONObject isKindOfClass:[NSDictionary class]]) {
- if ([JSONObject[@"shortLink"] isKindOfClass:[NSString class]]) {
- shortURL = [NSURL URLWithString:JSONObject[@"shortLink"]];
- } else {
- if ([JSONObject[@"error"] isKindOfClass:[NSDictionary class]]) {
- NSMutableDictionary *errorUserInfo = [[NSMutableDictionary alloc] init];
- NSDictionary *errorDictionary = JSONObject[@"error"];
- if ([errorDictionary[@"message"] isKindOfClass:[NSString class]]) {
- errorUserInfo[NSLocalizedFailureReasonErrorKey] =
- errorDictionary[@"message"];
- }
- if ([errorDictionary[@"status"] isKindOfClass:[NSString class]]) {
- errorUserInfo[@"remoteStatus"] = errorDictionary[@"status"];
- }
- if (errorDictionary[@"code"] &&
- [errorDictionary[@"code"] isKindOfClass:[NSNumber class]]) {
- errorUserInfo[@"remoteErrorCode"] = errorDictionary[@"code"];
- }
- error = [NSError errorWithDomain:kFirebaseDurableDeepLinkErrorDomain
- code:0
- userInfo:errorUserInfo];
- }
- }
- if ([JSONObject[@"warning"] isKindOfClass:[NSArray class]]) {
- NSArray *warningsServer = JSONObject[@"warning"];
- NSMutableArray *warningsTmp =
- [NSMutableArray arrayWithCapacity:[warningsServer count]];
- for (NSDictionary *warningServer in warningsServer) {
- if ([warningServer[@"warningMessage"] isKindOfClass:[NSString class]]) {
- [warningsTmp addObject:warningServer[@"warningMessage"]];
- }
- }
- if ([warningsTmp count] > 0) {
- warnings = [warningsTmp copy];
- }
- }
- } else if (deserializationError) {
- error = [NSError
- errorWithDomain:kFirebaseDurableDeepLinkErrorDomain
- code:0
- userInfo:@{
- NSLocalizedFailureReasonErrorKey : NSLocalizedString(
- @"Unrecognized server response",
- @"Error reason message when server response can't be parsed"),
- NSUnderlyingErrorKey : deserializationError,
- }];
- }
- }
- if (!shortURL && !error) {
- // provide generic error message if we have no additional details about failure
- error = [NSError errorWithDomain:kFirebaseDurableDeepLinkErrorDomain
- code:0
- userInfo:nil];
- }
- dispatch_async(dispatch_get_main_queue(), ^{
- completion(shortURL, warnings, error);
- });
- }];
- }
- - (void)shortenWithCompletion:(FIRDynamicLinkShortenerCompletion)completion {
- NSURL *url = [self url];
- if (!url) {
- NSError *error = [NSError errorWithDomain:kFirebaseDurableDeepLinkErrorDomain
- code:0
- userInfo:@{
- NSLocalizedFailureReasonErrorKey : NSLocalizedString(
- @"Unable to produce long URL",
- @"Error reason when long url can't be produced"),
- }];
- completion(nil, nil, error);
- return;
- }
- return [FIRDynamicLinkComponents shortenURL:url options:_options completion:completion];
- }
- - (NSURL *)url {
- static NSString *const kFDLURLComponentsLinkKey = @"link";
- NSMutableDictionary *queryDictionary =
- [NSMutableDictionary dictionaryWithObject:self.link.absoluteString
- forKey:kFDLURLComponentsLinkKey];
- void (^addEntriesFromDictionaryRepresentingConformerToDictionary)(id<FDLDictionaryRepresenting>) =
- ^(id<FDLDictionaryRepresenting> _Nullable dictionaryRepresentingConformer) {
- NSDictionary *dictionary = dictionaryRepresentingConformer.dictionaryRepresentation;
- if (dictionary.count > 0) {
- [queryDictionary addEntriesFromDictionary:dictionary];
- }
- };
- addEntriesFromDictionaryRepresentingConformerToDictionary(_analyticsParameters);
- addEntriesFromDictionaryRepresentingConformerToDictionary(_socialMetaTagParameters);
- addEntriesFromDictionaryRepresentingConformerToDictionary(_iOSParameters);
- addEntriesFromDictionaryRepresentingConformerToDictionary(_iTunesConnectParameters);
- addEntriesFromDictionaryRepresentingConformerToDictionary(_androidParameters);
- addEntriesFromDictionaryRepresentingConformerToDictionary(_navigationInfoParameters);
- addEntriesFromDictionaryRepresentingConformerToDictionary(_otherPlatformParameters);
- NSString *queryString = FIRDLURLQueryStringFromDictionary(queryDictionary);
- NSString *urlString = [NSString stringWithFormat:@"%@/%@", _domain, queryString];
- return [NSURL URLWithString:urlString];
- }
- #pragma mark Helper Methods
- + (void)sendHTTPRequest:(NSURLRequest *)request
- completion:(void (^)(NSData *_Nullable data, NSError *_Nullable error))completion {
- NSURLSession *session = [NSURLSession sharedSession];
- NSURLSessionDataTask *task =
- [session dataTaskWithRequest:request
- completionHandler:^(NSData *_Nullable data, NSURLResponse *_Nullable response,
- NSError *_Nullable error) {
- completion(data, error);
- }];
- [task resume];
- }
- + (NSURLRequest *)shorteningRequestForLongURL:(NSURL *)url
- options:(nullable FIRDynamicLinkComponentsOptions *)options {
- if (!url) {
- return nil;
- }
- static NSString *const kFDLURLShortenerAPIHost = @"https://firebasedynamiclinks.googleapis.com";
- static NSString *const kFDLURLShortenerAPIPath = @"/v1/shortLinks";
- static NSString *const kFDLURLShortenerAPIQuery = @"?key=";
- NSString *apiKey = [FIRDynamicLinkComponentsKeyProvider APIKey];
- NSString *postURLString =
- [NSString stringWithFormat:@"%@%@%@%@", kFDLURLShortenerAPIHost, kFDLURLShortenerAPIPath,
- kFDLURLShortenerAPIQuery, apiKey];
- NSURL *postURL = [NSURL URLWithString:postURLString];
- NSMutableDictionary *payloadDictionary =
- [NSMutableDictionary dictionaryWithObject:url.absoluteString forKey:@"longDynamicLink"];
- switch (options.pathLength) {
- case FIRShortDynamicLinkPathLengthShort:
- payloadDictionary[@"suffix"] = @{@"option" : @"SHORT"};
- break;
- case FIRShortDynamicLinkPathLengthUnguessable:
- payloadDictionary[@"suffix"] = @{@"option" : @"UNGUESSABLE"};
- break;
- default:
- break;
- }
- NSData *payload = [NSJSONSerialization dataWithJSONObject:payloadDictionary options:0 error:0];
- NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:postURL];
- request.HTTPMethod = @"POST";
- request.HTTPBody = payload;
- [request setValue:[NSBundle mainBundle].bundleIdentifier
- forHTTPHeaderField:@"X-Ios-Bundle-Identifier"];
- NSString *contentType = @"application/json";
- [request setValue:contentType forHTTPHeaderField:@"Accept"];
- [request setValue:contentType forHTTPHeaderField:@"Content-Type"];
- return [request copy];
- }
- @end
- #endif // TARGET_OS_IOS
|