@@ -65,11 +65,9 @@ - (id)init {
6565 return self;
6666}
6767
68- - (NSString *)vendorId
69- {
68+ - (NSString *)vendorId {
7069 @synchronized (self) {
7170 if (_vendorId) return _vendorId;
72-
7371 /*
7472 * https://developer.apple.com/documentation/uikit/uidevice/1620059-identifierforvendor
7573 * BNCSystemObserver.getVendorId is based on UIDevice.identifierForVendor. Note from the
@@ -179,59 +177,71 @@ + (NSString*) systemBuildVersion {
179177 return version;
180178}
181179
182-
183180+ (NSString *) userAgentString {
184-
185- static NSString * browserUserAgentString = nil ;
186- void (^setBrowserUserAgent)(void ) = ^() {
187- if (!browserUserAgentString) {
188- browserUserAgentString =
189- [[[UIWebView alloc ]
190- initWithFrame: CGRectZero]
191- stringByEvaluatingJavaScriptFromString: @" navigator.userAgent" ];
192- BNCPreferenceHelper *preferences = [BNCPreferenceHelper preferenceHelper ];
193- preferences.browserUserAgentString = browserUserAgentString;
194- preferences.lastSystemBuildVersion = self.systemBuildVersion ;
195- BNCLogDebugSDK (@" userAgentString: '%@ '." , browserUserAgentString);
196- }
181+
182+ static NSString * brn_browserUserAgentString = nil ;
183+
184+ void (^setBrowserUserAgent)(void ) = ^() {
185+ @synchronized (self) {
186+ if (!brn_browserUserAgentString) {
187+ brn_browserUserAgentString =
188+ [[[UIWebView alloc ]
189+ initWithFrame: CGRectZero]
190+ stringByEvaluatingJavaScriptFromString: @" navigator.userAgent" ];
191+ BNCPreferenceHelper *preferences = [BNCPreferenceHelper preferenceHelper ];
192+ preferences.browserUserAgentString = brn_browserUserAgentString;
193+ preferences.lastSystemBuildVersion = self.systemBuildVersion ;
194+ BNCLogDebugSDK (@" userAgentString: '%@ '." , brn_browserUserAgentString);
195+ }
196+ }
197197 };
198198
199- // We only get the string once per app run:
199+ NSString * (^browserUserAgent)(void ) = ^ NSString * () {
200+ @synchronized (self) {
201+ return brn_browserUserAgentString;
202+ }
203+ };
204+
205+ @synchronized (self) {
206+ // We only get the string once per app run:
200207
201- if (browserUserAgentString )
202- return browserUserAgentString ;
208+ if (brn_browserUserAgentString )
209+ return brn_browserUserAgentString ;
203210
204- // Did we cache it?
211+ // Did we cache it?
205212
206- BNCPreferenceHelper *preferences = [BNCPreferenceHelper preferenceHelper ];
207- if (preferences.browserUserAgentString &&
208- preferences.lastSystemBuildVersion &&
209- [preferences.lastSystemBuildVersion isEqualToString: self .systemBuildVersion]) {
210- browserUserAgentString = [preferences.browserUserAgentString copy ];
211- return browserUserAgentString;
212- }
213+ BNCPreferenceHelper *preferences = [BNCPreferenceHelper preferenceHelper ];
214+ if (preferences.browserUserAgentString &&
215+ preferences.lastSystemBuildVersion &&
216+ [preferences.lastSystemBuildVersion isEqualToString: self .systemBuildVersion]) {
217+ brn_browserUserAgentString = [preferences.browserUserAgentString copy ];
218+ return brn_browserUserAgentString;
219+ }
220+
221+ // Make sure this executes on the main thread.
222+ // Uses an implied lock through dispatch_queues: This can deadlock if mis-used!
213223
214- // Make sure this executes on the main thread.
215- // Uses an implied lock through dispatch_queues: This can deadlock if mis-used!
224+ if (NSThread .isMainThread ) {
225+ setBrowserUserAgent ();
226+ return brn_browserUserAgentString;
227+ }
216228
217- if (NSThread .isMainThread ) {
218- setBrowserUserAgent ();
219- return browserUserAgentString;
220- }
229+ }
221230
222231 // Different case for iOS 7.0:
223232 if ([UIDevice currentDevice ].systemVersion .floatValue < 8.0 ) {
233+ BNCLogDebugSDK (@" Getting iOS 7 UserAgent." );
224234 dispatch_sync (dispatch_get_main_queue (), ^ {
225235 setBrowserUserAgent ();
226236 });
227- return browserUserAgentString;
237+ BNCLogDebugSDK (@" Got iOS 7 UserAgent." );
238+ return browserUserAgent ();
228239 }
229240
230- // Wait and yield to prevent deadlock:
231-
232- int retries = 10 ;
233- int64_t timeoutDelta = (dispatch_time_t )((long double )NSEC_PER_SEC * (long double )0.100 );
234- while (!browserUserAgentString && retries > 0 ) {
241+ // Wait and yield to prevent deadlock:
242+ int retries = 10 ;
243+ int64_t timeoutDelta = (dispatch_time_t )((long double )NSEC_PER_SEC * (long double )0.100 );
244+ while (!browserUserAgent () && retries > 0 ) {
235245
236246 dispatch_block_t agentBlock = dispatch_block_create_with_qos_class (
237247 DISPATCH_BLOCK_DETACHED | DISPATCH_BLOCK_ENFORCE_QOS_CLASS,
@@ -243,11 +253,13 @@ + (NSString*) userAgentString {
243253 });
244254 dispatch_async (dispatch_get_main_queue (), agentBlock);
245255
246- dispatch_time_t timeoutTime = dispatch_time (DISPATCH_TIME_NOW, timeoutDelta);
256+ dispatch_time_t timeoutTime = dispatch_time (DISPATCH_TIME_NOW, timeoutDelta);
247257 dispatch_block_wait (agentBlock, timeoutTime);
248- retries--;
249- }
250- return browserUserAgentString;
258+ retries--;
259+ }
260+ BNCLogDebugSDK (@" Retries: %d " , 10 -retries);
261+
262+ return browserUserAgent ();
251263}
252264
253265@end
0 commit comments