Added Android code
[wl-app.git] / iOS / Pods / FirebaseMessaging / Firebase / Messaging / FIRMessagingCheckinService.m
1 /*
2  * Copyright 2017 Google
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 #import "FIRMessagingCheckinService.h"
18
19 #import "FIRMessagingUtilities.h"
20 #import "NSError+FIRMessaging.h"
21
22 @interface FIRMessagingCheckinService ()
23
24 // This property is of type FIRInstanceIDCheckinPreferences, if InstanceID was directly linkable
25 @property(nonatomic, readwrite, strong) id checkinPreferences;
26
27 @end
28
29 @implementation FIRMessagingCheckinService;
30
31 #pragma mark - Reflection-Based Getter Functions
32
33 // Encapsulates the -hasValidCheckinInfo method of FIRInstanceIDCheckinPreferences
34 BOOL FIRMessagingCheckinService_hasValidCheckinInfo(id checkinPreferences) {
35   SEL hasValidCheckinInfoSelector = NSSelectorFromString(@"hasValidCheckinInfo");
36   if (![checkinPreferences respondsToSelector:hasValidCheckinInfoSelector]) {
37     // Can't check hasValidCheckinInfo
38     return NO;
39   }
40
41   // Since hasValidCheckinInfo returns a BOOL, use NSInvocation
42   NSMethodSignature *methodSignature =
43       [[checkinPreferences class] instanceMethodSignatureForSelector:hasValidCheckinInfoSelector];
44   NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:methodSignature];
45   invocation.selector = hasValidCheckinInfoSelector;
46   invocation.target = checkinPreferences;
47   [invocation invoke];
48   BOOL returnValue;
49   [invocation getReturnValue:&returnValue];
50   return returnValue;
51 }
52
53 // Returns a non-scalar (id) object based on the property name
54 id FIRMessagingCheckinService_propertyNamed(id checkinPreferences, NSString *propertyName) {
55   SEL propertyGetterSelector = NSSelectorFromString(propertyName);
56   if ([checkinPreferences respondsToSelector:propertyGetterSelector]) {
57 #pragma clang diagnostic push
58 #pragma clang diagnostic ignored "-Warc-performSelector-leaks"
59     return [checkinPreferences performSelector:propertyGetterSelector];
60 #pragma clang diagnostic pop
61   }
62   return nil;
63 }
64
65 #pragma mark - Methods
66
67 - (BOOL)tryToLoadPrefetchedCheckinPreferences {
68   Class instanceIDClass = NSClassFromString(@"FIRInstanceID");
69   if (!instanceIDClass) {
70     // InstanceID is not linked
71     return NO;
72   }
73
74   // [FIRInstanceID instanceID]
75   SEL instanceIDSelector = NSSelectorFromString(@"instanceID");
76   if (![instanceIDClass respondsToSelector:instanceIDSelector]) {
77     return NO;
78   }
79 #pragma clang diagnostic push
80 #pragma clang diagnostic ignored "-Warc-performSelector-leaks"
81   id instanceID = [instanceIDClass performSelector:instanceIDSelector];
82 #pragma clang diagnostic pop
83   if (!instanceID) {
84     // Instance ID singleton not available
85     return NO;
86   }
87
88   // [[FIRInstanceID instanceID] cachedCheckinPreferences]
89   SEL cachedCheckinPrefsSelector = NSSelectorFromString(@"cachedCheckinPreferences");
90   if (![instanceID respondsToSelector:cachedCheckinPrefsSelector]) {
91     // cachedCheckinPreferences is not accessible
92     return NO;
93   }
94 #pragma clang diagnostic push
95 #pragma clang diagnostic ignored "-Warc-performSelector-leaks"
96   id checkinPreferences = [instanceID performSelector:cachedCheckinPrefsSelector];
97 #pragma clang diagnostic pop
98   if (!checkinPreferences) {
99     // No cached checkin prefs
100     return NO;
101   }
102
103   BOOL hasValidInfo = FIRMessagingCheckinService_hasValidCheckinInfo(checkinPreferences);
104   if (hasValidInfo) {
105     self.checkinPreferences = checkinPreferences;
106   }
107   return hasValidInfo;
108 }
109
110 #pragma mark - API
111
112 - (NSString *)deviceAuthID {
113   return FIRMessagingCheckinService_propertyNamed(self.checkinPreferences, @"deviceID");
114 }
115
116 - (NSString *)secretToken {
117   return FIRMessagingCheckinService_propertyNamed(self.checkinPreferences, @"secretToken");
118 }
119
120 - (NSString *)versionInfo {
121   return FIRMessagingCheckinService_propertyNamed(self.checkinPreferences, @"versionInfo");
122 }
123
124 - (NSString *)digest {
125   return FIRMessagingCheckinService_propertyNamed(self.checkinPreferences, @"digest");
126 }
127
128 - (BOOL)hasValidCheckinInfo {
129   return FIRMessagingCheckinService_hasValidCheckinInfo(self.checkinPreferences);
130 }
131
132 @end