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.
132 lines
4.3 KiB
132 lines
4.3 KiB
/*
|
|
* Copyright 2017 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 "FIRMessagingCheckinService.h"
|
|
|
|
#import "FIRMessagingUtilities.h"
|
|
#import "NSError+FIRMessaging.h"
|
|
|
|
@interface FIRMessagingCheckinService ()
|
|
|
|
// This property is of type FIRInstanceIDCheckinPreferences, if InstanceID was directly linkable
|
|
@property(nonatomic, readwrite, strong) id checkinPreferences;
|
|
|
|
@end
|
|
|
|
@implementation FIRMessagingCheckinService;
|
|
|
|
#pragma mark - Reflection-Based Getter Functions
|
|
|
|
// Encapsulates the -hasValidCheckinInfo method of FIRInstanceIDCheckinPreferences
|
|
BOOL FIRMessagingCheckinService_hasValidCheckinInfo(id checkinPreferences) {
|
|
SEL hasValidCheckinInfoSelector = NSSelectorFromString(@"hasValidCheckinInfo");
|
|
if (![checkinPreferences respondsToSelector:hasValidCheckinInfoSelector]) {
|
|
// Can't check hasValidCheckinInfo
|
|
return NO;
|
|
}
|
|
|
|
// Since hasValidCheckinInfo returns a BOOL, use NSInvocation
|
|
NSMethodSignature *methodSignature =
|
|
[[checkinPreferences class] instanceMethodSignatureForSelector:hasValidCheckinInfoSelector];
|
|
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:methodSignature];
|
|
invocation.selector = hasValidCheckinInfoSelector;
|
|
invocation.target = checkinPreferences;
|
|
[invocation invoke];
|
|
BOOL returnValue;
|
|
[invocation getReturnValue:&returnValue];
|
|
return returnValue;
|
|
}
|
|
|
|
// Returns a non-scalar (id) object based on the property name
|
|
id FIRMessagingCheckinService_propertyNamed(id checkinPreferences, NSString *propertyName) {
|
|
SEL propertyGetterSelector = NSSelectorFromString(propertyName);
|
|
if ([checkinPreferences respondsToSelector:propertyGetterSelector]) {
|
|
#pragma clang diagnostic push
|
|
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
|
|
return [checkinPreferences performSelector:propertyGetterSelector];
|
|
#pragma clang diagnostic pop
|
|
}
|
|
return nil;
|
|
}
|
|
|
|
#pragma mark - Methods
|
|
|
|
- (BOOL)tryToLoadPrefetchedCheckinPreferences {
|
|
Class instanceIDClass = NSClassFromString(@"FIRInstanceID");
|
|
if (!instanceIDClass) {
|
|
// InstanceID is not linked
|
|
return NO;
|
|
}
|
|
|
|
// [FIRInstanceID instanceID]
|
|
SEL instanceIDSelector = NSSelectorFromString(@"instanceID");
|
|
if (![instanceIDClass respondsToSelector:instanceIDSelector]) {
|
|
return NO;
|
|
}
|
|
#pragma clang diagnostic push
|
|
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
|
|
id instanceID = [instanceIDClass performSelector:instanceIDSelector];
|
|
#pragma clang diagnostic pop
|
|
if (!instanceID) {
|
|
// Instance ID singleton not available
|
|
return NO;
|
|
}
|
|
|
|
// [[FIRInstanceID instanceID] cachedCheckinPreferences]
|
|
SEL cachedCheckinPrefsSelector = NSSelectorFromString(@"cachedCheckinPreferences");
|
|
if (![instanceID respondsToSelector:cachedCheckinPrefsSelector]) {
|
|
// cachedCheckinPreferences is not accessible
|
|
return NO;
|
|
}
|
|
#pragma clang diagnostic push
|
|
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
|
|
id checkinPreferences = [instanceID performSelector:cachedCheckinPrefsSelector];
|
|
#pragma clang diagnostic pop
|
|
if (!checkinPreferences) {
|
|
// No cached checkin prefs
|
|
return NO;
|
|
}
|
|
|
|
BOOL hasValidInfo = FIRMessagingCheckinService_hasValidCheckinInfo(checkinPreferences);
|
|
if (hasValidInfo) {
|
|
self.checkinPreferences = checkinPreferences;
|
|
}
|
|
return hasValidInfo;
|
|
}
|
|
|
|
#pragma mark - API
|
|
|
|
- (NSString *)deviceAuthID {
|
|
return FIRMessagingCheckinService_propertyNamed(self.checkinPreferences, @"deviceID");
|
|
}
|
|
|
|
- (NSString *)secretToken {
|
|
return FIRMessagingCheckinService_propertyNamed(self.checkinPreferences, @"secretToken");
|
|
}
|
|
|
|
- (NSString *)versionInfo {
|
|
return FIRMessagingCheckinService_propertyNamed(self.checkinPreferences, @"versionInfo");
|
|
}
|
|
|
|
- (NSString *)digest {
|
|
return FIRMessagingCheckinService_propertyNamed(self.checkinPreferences, @"digest");
|
|
}
|
|
|
|
- (BOOL)hasValidCheckinInfo {
|
|
return FIRMessagingCheckinService_hasValidCheckinInfo(self.checkinPreferences);
|
|
}
|
|
|
|
@end
|