You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
/* * Copyright 2019 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 "FIRInstanceIDUtilities.h"
#if TARGET_OS_IOS || TARGET_OS_TV #import <UIKit/UIKit.h> #endif #import <sys/utsname.h>
#import <FirebaseCore/FIROptions.h> #import <GoogleUtilities/GULUserDefaults.h> #import "FIRInstanceID.h" #import "FIRInstanceIDConstants.h" #import "FIRInstanceIDLogger.h"
// Convert the macro to a string #define STR_EXPAND(x) #x #define STR(x) STR_EXPAND(x)
static NSString *const kFIRInstanceIDAPNSSandboxPrefix = @"s_"; static NSString *const kFIRInstanceIDAPNSProdPrefix = @"p_";
/// FIRMessaging Class that responds to the FIRMessaging SDK version selector. /// Verify at runtime if the class exists and implements the required method. NSString *const kFIRInstanceIDFCMSDKClassString = @"FIRMessaging";
/// FIRMessaging selector that returns the current FIRMessaging library version. static NSString *const kFIRInstanceIDFCMSDKVersionSelectorString = @"FIRMessagingSDKVersion";
/// FIRMessaging selector that returns the current device locale. static NSString *const kFIRInstanceIDFCMSDKLocaleSelectorString = @"FIRMessagingSDKCurrentLocale";
NSString *const kFIRInstanceIDUserDefaultsKeyLocale = @"com.firebase.instanceid.user_defaults.locale"; // locale key stored in GULUserDefaults
/// Static values which will be populated once retrieved using /// |FIRInstanceIDRetrieveEnvironmentInfoFromFirebaseCore|. static NSString *operatingSystemVersion; static NSString *hardwareDeviceModel;
#pragma mark - URL Helpers
NSString *FIRInstanceIDRegisterServer() { return @"https://fcmtoken.googleapis.com/register"; }
#pragma mark - Time
int64_t FIRInstanceIDCurrentTimestampInSeconds() { return (int64_t)[[NSDate date] timeIntervalSince1970]; }
int64_t FIRInstanceIDCurrentTimestampInMilliseconds() { return (int64_t)(FIRInstanceIDCurrentTimestampInSeconds() * 1000.0); }
#pragma mark - App Info
NSString *FIRInstanceIDCurrentAppVersion() { NSString *version = [[NSBundle mainBundle] infoDictionary][@"CFBundleShortVersionString"]; if (![version length]) { return @""; } return version; }
NSString *FIRInstanceIDAppIdentifier() { NSString *bundleIdentifier = [[NSBundle mainBundle] bundleIdentifier]; if (!bundleIdentifier.length) { FIRInstanceIDLoggerError(kFIRInstanceIDMessageCodeUtilitiesMissingBundleIdentifier, @"The mainBundle's bundleIdentifier returned '%@'. Bundle identifier " @"expected to be non-empty.", bundleIdentifier); return @""; } return bundleIdentifier; }
NSString *FIRInstanceIDFirebaseAppID() { return [FIROptions defaultOptions].googleAppID; }
#pragma mark - Device Info // Get the device model from Firebase Core's App Environment Util NSString *FIRInstanceIDDeviceModel() { static dispatch_once_t once; dispatch_once(&once, ^{ struct utsname systemInfo; if (uname(&systemInfo) == 0) { hardwareDeviceModel = [NSString stringWithUTF8String:systemInfo.machine]; } }); return hardwareDeviceModel; }
// Get the system version from Firebase Core's App Environment Util NSString *FIRInstanceIDOperatingSystemVersion() { #if TARGET_OS_IOS || TARGET_OS_TV return [UIDevice currentDevice].systemVersion; #elif TARGET_OS_OSX return [NSProcessInfo processInfo].operatingSystemVersionString; #endif }
BOOL FIRInstanceIDHasLocaleChanged() { NSString *lastLocale = [[GULUserDefaults standardUserDefaults] stringForKey:kFIRInstanceIDUserDefaultsKeyLocale]; NSString *currentLocale = FIRInstanceIDCurrentLocale(); if (lastLocale) { if ([currentLocale isEqualToString:lastLocale]) { return NO; } } return YES; }
#pragma mark - Helpers
BOOL FIRInstanceIDIsValidGCMScope(NSString *scope) { return [scope compare:kFIRInstanceIDScopeFirebaseMessaging options:NSCaseInsensitiveSearch] == NSOrderedSame; }
NSString *FIRInstanceIDStringForAPNSDeviceToken(NSData *deviceToken) { NSMutableString *APNSToken = [NSMutableString string]; unsigned char *bytes = (unsigned char *)[deviceToken bytes]; for (int i = 0; i < (int)deviceToken.length; i++) { [APNSToken appendFormat:@"%02x", bytes[i]]; } return APNSToken; }
NSString *FIRInstanceIDAPNSTupleStringForTokenAndServerType(NSData *deviceToken, BOOL isSandbox) { if (deviceToken == nil) { // A nil deviceToken leads to an invalid tuple string, so return nil. return nil; } NSString *prefix = isSandbox ? kFIRInstanceIDAPNSSandboxPrefix : kFIRInstanceIDAPNSProdPrefix; NSString *APNSString = FIRInstanceIDStringForAPNSDeviceToken(deviceToken); NSString *APNSTupleString = [NSString stringWithFormat:@"%@%@", prefix, APNSString];
return APNSTupleString; }
#pragma mark - GCM Helpers
NSString *FIRInstanceIDCurrentGCMVersion() { Class versionClass = NSClassFromString(kFIRInstanceIDFCMSDKClassString); SEL versionSelector = NSSelectorFromString(kFIRInstanceIDFCMSDKVersionSelectorString); if ([versionClass respondsToSelector:versionSelector]) { IMP getVersionIMP = [versionClass methodForSelector:versionSelector]; NSString *(*getVersion)(id, SEL) = (void *)getVersionIMP; return getVersion(versionClass, versionSelector); } return nil; }
NSString *FIRInstanceIDCurrentLocale() { Class localeClass = NSClassFromString(kFIRInstanceIDFCMSDKClassString); SEL localeSelector = NSSelectorFromString(kFIRInstanceIDFCMSDKLocaleSelectorString);
if ([localeClass respondsToSelector:localeSelector]) { IMP getLocaleIMP = [localeClass methodForSelector:localeSelector]; NSString *(*getLocale)(id, SEL) = (void *)getLocaleIMP; NSString *fcmLocale = getLocale(localeClass, localeSelector); if (fcmLocale != nil) { return fcmLocale; } }
NSString *systemLanguage = [[NSLocale preferredLanguages] firstObject]; if (systemLanguage != nil) { return systemLanguage; }
if (@available(macOS 10.12, iOS 10.0, *)) { return [NSLocale currentLocale].languageCode; } else { return nil; } }
|