forked from organicmaps/organicmaps
[ios] add opt-out options to about screen. Update Flurry SDK
This commit is contained in:
parent
d5bc1fcda6
commit
3546fab26b
13 changed files with 404 additions and 39 deletions
|
@ -80,6 +80,8 @@ typedef enum {
|
|||
* @see Flurry#startSession for details on session.
|
||||
*
|
||||
* @param info A dictionary of session information: sessionID, apiKey
|
||||
* @note By default the callback is received on the global_queue with default priority. Optionally users can choose to receive on a specific queue by using
|
||||
* + (void)setDelegate:(nonnull id<FlurryDelegate>)delegate withCallbackQueue:(dispatch_queue_t)flurryCallbackQueue;
|
||||
*/
|
||||
- (void)flurrySessionDidCreateWithInfo:(NSDictionary*)info;
|
||||
|
||||
|
@ -450,9 +452,25 @@ typedef enum {
|
|||
*
|
||||
|
||||
*/
|
||||
+ (void)setDelegate:(id<FlurryDelegate>)delegate;
|
||||
|
||||
+ (void)setDelegate:(nonnull id<FlurryDelegate>)delegate;
|
||||
|
||||
/*!
|
||||
* @brief Set Flurry delegate for callback on session creation with a callback queue.
|
||||
* @since 8.4.4
|
||||
*
|
||||
* @code
|
||||
* - (BOOL) application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
|
||||
{
|
||||
// Optional Flurry startup methods
|
||||
// If self implements protocol, FlurryDelegate
|
||||
[Flurry setDelegate:self withCallbackQueue:queue];
|
||||
// ....
|
||||
}
|
||||
* @endcode
|
||||
*
|
||||
|
||||
*/
|
||||
+ (void)setDelegate:(nonnull id<FlurryDelegate>)delegate withCallbackQueue:(nonnull dispatch_queue_t)flurryCallbackQueue;
|
||||
#if !TARGET_OS_TV
|
||||
/*!
|
||||
* @brief Pauses a Flurry session left running in background.
|
||||
|
@ -689,7 +707,7 @@ typedef enum {
|
|||
/*!
|
||||
* @brief Records an app exception. Commonly used to catch unhandled exceptions.
|
||||
* @since 2.7
|
||||
*
|
||||
*
|
||||
* This method captures an exception for reporting to Flurry. We recommend adding an uncaught
|
||||
* exception listener to capture any exceptions that occur during usage that is not
|
||||
* anticipated by your app.
|
||||
|
@ -719,8 +737,7 @@ typedef enum {
|
|||
/*!
|
||||
* @brief Records an app error.
|
||||
* @since 2.7
|
||||
*
|
||||
* This method captures an error for reporting to Flurry.
|
||||
*
|
||||
*
|
||||
* @see #logError:message:exception: for details on capturing exceptions.
|
||||
*
|
||||
|
@ -737,6 +754,78 @@ typedef enum {
|
|||
*/
|
||||
+ (void)logError:(NSString *)errorID message:(NSString *)message error:(NSError *)error;
|
||||
|
||||
/*!
|
||||
* @brief Records an app exception. Commonly used to catch unhandled exceptions.
|
||||
* @since 8.4.0
|
||||
*
|
||||
* This method captures an exception for reporting to Flurry. We recommend adding an uncaught
|
||||
* exception listener to capture any exceptions that occur during usage that is not
|
||||
* anticipated by your app.
|
||||
*
|
||||
* @see #logError:message:error:withParameters: for details on capturing errors.
|
||||
*
|
||||
* @code
|
||||
* - (void) uncaughtExceptionHandler(NSException *exception)
|
||||
{
|
||||
NSDictionary* crashParameters = [NSDictionary dictionaryWithObjectsAndKeys:@"AppVersion", @"3.2", nil];
|
||||
[Flurry logError:@"Uncaught" message:@"Crash!" exception:exception withParameters:crashParameters];
|
||||
}
|
||||
|
||||
- (void)applicationDidFinishLaunching:(UIApplication *)application
|
||||
{
|
||||
NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler);
|
||||
[Flurry startSession:@"YOUR_API_KEY"];
|
||||
// ....
|
||||
}
|
||||
* @endcode
|
||||
*
|
||||
* @param errorID Name of the error.
|
||||
* @param message The message to associate with the error.
|
||||
* @param exception The exception object to report.
|
||||
* @param parameters Custom parameters associated with the exception
|
||||
*/
|
||||
+ (void)logError:(NSString *)errorID message:(NSString *)message exception:(NSException *)exception withParameters:(NSDictionary*)parameters;
|
||||
|
||||
/*!
|
||||
* @brief Records an app error.
|
||||
* @since 8.4.0
|
||||
* This method captures an error for reporting to Flurry.
|
||||
*
|
||||
* @see #logError:message:exception:withParameters: for details on capturing exceptions.
|
||||
*
|
||||
* @code
|
||||
* - (void) webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error
|
||||
{
|
||||
[Flurry logError:@"WebView No Load" message:[error localizedDescription] error:error];
|
||||
}
|
||||
* @endcode
|
||||
*
|
||||
* @param errorID Name of the error.
|
||||
* @param message The message to associate with the error.
|
||||
* @param error The error object to report.
|
||||
* @param parameters Custom parameters associated with the error
|
||||
*/
|
||||
+ (void)logError:(NSString *)errorID message:(NSString *)message error:(NSError *)error withParameters:(NSDictionary*)parameters;
|
||||
|
||||
/*!
|
||||
* @brief Leave a breadcrumb.
|
||||
* @since 8.4.0
|
||||
* This method captures breadcrumbs of 250 characters. The last 207 recorded
|
||||
* breadcrumbs are included in crash and error logs.
|
||||
* Breadcrumbs are reset at every application launch.
|
||||
*
|
||||
* @code
|
||||
* - (void) webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error
|
||||
{
|
||||
[Flurry leaveBreadcrumb:@"WebView not loading"];
|
||||
}
|
||||
* @endcode
|
||||
*
|
||||
* @param breadcrumb string.
|
||||
*
|
||||
*/
|
||||
+ (void)leaveBreadcrumb:(NSString*)breadcrumb;
|
||||
|
||||
/*!
|
||||
* @brief Records a timed event specified by @c eventName.
|
||||
* @since 2.8.4
|
||||
|
@ -1045,11 +1134,8 @@ typedef enum {
|
|||
* @param verticalAccuracy The accuracy of the altitude value in meters.
|
||||
*
|
||||
*/
|
||||
+ (void)setLatitude:(double)latitude
|
||||
longitude:(double)longitude
|
||||
horizontalAccuracy:(float)horizontalAccuracy
|
||||
verticalAccuracy:(float)verticalAccuracy __attribute__((deprecated));
|
||||
;
|
||||
+ (void)setLatitude:(double)latitude longitude:(double)longitude horizontalAccuracy:(float)horizontalAccuracy verticalAccuracy:(float)verticalAccuracy __attribute__ ((deprecated));;
|
||||
|
||||
|
||||
//@}
|
||||
|
||||
|
@ -1065,8 +1151,7 @@ typedef enum {
|
|||
* prompt users for location permission, we fetch the available location in device daemon.
|
||||
*
|
||||
* @note Only the last location in cache is captured per session. \n
|
||||
* Regardless of accuracy specified, the Flurry SDK will only report location at city level or
|
||||
higher. \n
|
||||
* Regardless of accuracy specified, the Flurry SDK will only report location at city level or higher. \n
|
||||
* Location is aggregated across all users of your app and not available on a per user basis. \n
|
||||
* This information should only be captured if it is germaine to the use of your app.
|
||||
*
|
||||
|
@ -1125,24 +1210,26 @@ typedef enum {
|
|||
* @brief Set session to support background execution.
|
||||
* @since 4.2.2
|
||||
*
|
||||
* Use this method to enable reporting of errors and events when application is
|
||||
* @deprecated since 8.4.0.
|
||||
*
|
||||
* Use this method to enable reporting of errors and events when application is
|
||||
* running in backgorund (such applications have UIBackgroundModes in Info.plist).
|
||||
* You should call #pauseBackgroundSession when appropriate in background mode to
|
||||
* You should call #pauseBackgroundSession when appropriate in background mode to
|
||||
* pause the session (for example when played song completed in background)
|
||||
*
|
||||
* Default value is @c NO
|
||||
*
|
||||
* @see #pauseBackgroundSession for details
|
||||
*
|
||||
* @param setBackgroundSessionEnabled YES to enbale background support and
|
||||
* @param setBackgroundSessionEnabled YES to enbale background support and
|
||||
* continue log events and errors for running session.
|
||||
*/
|
||||
+ (void)setBackgroundSessionEnabled:(BOOL)setBackgroundSessionEnabled;
|
||||
+ (void)setBackgroundSessionEnabled:(BOOL)setBackgroundSessionEnabled __attribute__ ((deprecated));
|
||||
|
||||
/*!
|
||||
* @brief Enable custom event logging.
|
||||
* @since 2.7
|
||||
*
|
||||
*
|
||||
* @deprecated since 7.9.0.
|
||||
* This method will be removed in a future version of the SDK.
|
||||
*
|
||||
|
@ -1151,19 +1238,20 @@ typedef enum {
|
|||
* @param value YES to enable event logging, NO to stop custom logging.
|
||||
*
|
||||
*/
|
||||
+ (void)setEventLoggingEnabled:(BOOL)value __attribute__((deprecated));
|
||||
+ (void)setEventLoggingEnabled:(BOOL)value __attribute__ ((deprecated));
|
||||
|
||||
#if !TARGET_OS_TV
|
||||
/*!
|
||||
* @brief Enables Flurry Pulse
|
||||
* @since 6.3.0
|
||||
*
|
||||
* @deprecated since 8.5.0.
|
||||
* @note: Please see https://developer.yahoo.com/flurry-pulse/ for more details
|
||||
*
|
||||
* @param value YES to enable event logging, NO to stop custom logging.
|
||||
*
|
||||
*/
|
||||
+ (void)setPulseEnabled:(BOOL)value;
|
||||
+ (void)setPulseEnabled:(BOOL)value __attribute__ ((deprecated));
|
||||
#endif
|
||||
|
||||
|
||||
|
@ -1199,8 +1287,7 @@ typedef enum {
|
|||
* @note: Needs a 'required' dependency on StoreKit for this API to function correctly.
|
||||
*
|
||||
* @param transaction an SKPaymentTransaction.
|
||||
* @param statusCallback a callback gettign called when the status of ID that is associated with
|
||||
* the event
|
||||
* @param statusCallback a callback gettign called when the status of ID that is associated with the event
|
||||
*
|
||||
*/
|
||||
+ (void) logPaymentTransaction:(SKPaymentTransaction*)transaction statusCallback:(void(^)(FlurryTransactionRecordStatus))statusCallback;
|
||||
|
@ -1217,9 +1304,10 @@ typedef enum {
|
|||
* @param value YES to enable transaction logging, NO to stop transaction logging.
|
||||
*
|
||||
*/
|
||||
+ (void)setIAPReportingEnabled:(BOOL)value;
|
||||
+ (void) setIAPReportingEnabled:(BOOL)value;
|
||||
#endif
|
||||
|
||||
|
||||
#if TARGET_OS_TV
|
||||
/*!
|
||||
* @brief Registers the TVML's JSContext with the Flurry SDK.
|
||||
|
@ -1259,4 +1347,15 @@ typedef enum {
|
|||
+ (void)registerJSContextWithContext:(JSContext*)jscontext;
|
||||
#endif
|
||||
|
||||
/*!
|
||||
* @brief Open privacy dashboard in Safari Browser async with a completion handler callback
|
||||
* @since 8.5.0
|
||||
*
|
||||
* This method is used to open a web page of privacy dashboard in external browser for user to access and edit their data under the scope of GDPR, in the callback, you are able to check whether privacy dashboard is successfully opened, and apply fallback logics.
|
||||
* @note: Call this method after invoking #startSession:
|
||||
*
|
||||
* @param completionHandler a callback getting called when SDK finishes the attempt to openURL the privacy dashboard, the success boolean provided for checks and fallbacks.
|
||||
*
|
||||
*/
|
||||
+ (void)openPrivacyDashboard:(void(^)(BOOL success))completionHandler;
|
||||
@end
|
||||
|
|
59
iphone/Maps/3party/Flurry/FlurryConsent.h
Executable file
59
iphone/Maps/3party/Flurry/FlurryConsent.h
Executable file
|
@ -0,0 +1,59 @@
|
|||
//
|
||||
// FlurryConsent.h
|
||||
// Flurry
|
||||
//
|
||||
// Created by Ishwarya Iyer on 4/2/18.
|
||||
// Copyright © 2018 Flurry Inc. All rights reserved.
|
||||
//
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
@interface FlurryConsent : NSObject
|
||||
|
||||
@property (nonatomic, assign, readonly) BOOL isGDPRScope;
|
||||
@property (nonatomic, strong, readonly) NSDictionary* consentStrings;
|
||||
|
||||
/*!
|
||||
* @brief Use this api to initialize the FlurryConsent object.
|
||||
* @since 8.5.0
|
||||
*
|
||||
* This api initializes the consent object. This object needs to be registered with the SDK.
|
||||
*
|
||||
* @param isGDPRScope @c YES states that GDPR laws apply
|
||||
* The default value is @c NO
|
||||
*
|
||||
* @param consentStrings NSDictionary* <NSString*,NSString*> => <consent sting format , consent string>.
|
||||
*
|
||||
* @note ConsentStrings must be provided if "isGDPRScope" is set to YES for the consent information to be valid
|
||||
*
|
||||
*/
|
||||
- (FlurryConsent*) initWithGDPRScope:(BOOL)isGDPRScope andConsentStrings:(NSDictionary*)consentStrings;
|
||||
|
||||
|
||||
/*!
|
||||
* @brief Use this api to register/update the consent information with the SDK.
|
||||
* @since 8.5.0
|
||||
*
|
||||
* This api can be called anytime to pass the consent information to the SDK.
|
||||
*
|
||||
* @see FlurrySessionBuilder#withConsent: to register the consent before starting Flurry. \n
|
||||
* FlurryConsent#initWithGDPRScope:andConsentStrings to create the FlurryConsent object
|
||||
*
|
||||
* @param consent The FlurryConsent object which contains the GDPR scope flag and the consent strings
|
||||
*
|
||||
* @return indicates if the consent information provided is valid or not
|
||||
*
|
||||
*/
|
||||
+ (BOOL) updateConsentInformation:(FlurryConsent*)consent;
|
||||
|
||||
/*!
|
||||
* @brief Use this api to get the consent information registered with the SDK.
|
||||
* @since 8.5.0
|
||||
*
|
||||
* This object is immutable. To update the consent a new FlurryConsent object must be created and passed on to the SDK
|
||||
*
|
||||
*/
|
||||
+ (FlurryConsent*) getConsent;
|
||||
|
||||
@end
|
||||
|
|
@ -6,6 +6,10 @@
|
|||
// Copyright © 2016 Flurry Inc. All rights reserved.
|
||||
//
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
#import "FlurryConsent.h"
|
||||
|
||||
|
||||
/*!
|
||||
* @brief Enum for setting up log output level.
|
||||
* @since 4.2.0
|
||||
|
@ -34,6 +38,7 @@ typedef enum {
|
|||
*/
|
||||
- (FlurrySessionBuilder*) withAppVersion:(NSString *)value;
|
||||
|
||||
|
||||
/*!
|
||||
* @brief Set the timeout for expiring a Flurry session.
|
||||
* @since 7.7.0
|
||||
|
@ -94,6 +99,22 @@ typedef enum {
|
|||
*/
|
||||
- (FlurrySessionBuilder*) withShowErrorInLog:(BOOL) value;
|
||||
|
||||
|
||||
/*!
|
||||
* @brief Registers the consent information with the SDK. Consent information is used to determine if the gdpr laws are applicable
|
||||
* @since 8.5.0
|
||||
*
|
||||
* Use this method to pass the consent information to the SDK
|
||||
*
|
||||
* @note This method must be called prior to invoking #startSession:
|
||||
*
|
||||
* @param consent The consent information.
|
||||
* @see (FlurryConsent#initWithGDPRScope:andConsentStrings:)
|
||||
*/
|
||||
|
||||
- (FlurrySessionBuilder*) withConsent:(FlurryConsent*)consent;
|
||||
|
||||
|
||||
#if !TARGET_OS_WATCH
|
||||
/*!
|
||||
* @brief Enables implicit recording of Apple Store transactions.
|
||||
|
@ -105,7 +126,7 @@ typedef enum {
|
|||
*
|
||||
*/
|
||||
|
||||
- (FlurrySessionBuilder *)withIAPReportingEnabled:(BOOL)value;
|
||||
- (FlurrySessionBuilder*) withIAPReportingEnabled:(BOOL) value;
|
||||
|
||||
/*!
|
||||
* @brief Enables opting out of background sessions being counted towards total sessions.
|
||||
|
@ -118,7 +139,10 @@ typedef enum {
|
|||
*
|
||||
*/
|
||||
|
||||
- (FlurrySessionBuilder *)withIncludeBackgroundSessionsInMetrics:(BOOL)value;
|
||||
- (FlurrySessionBuilder*) withIncludeBackgroundSessionsInMetrics:(BOOL) value;
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
#if TARGET_OS_TV
|
||||
|
|
Binary file not shown.
|
@ -2,4 +2,6 @@
|
|||
|
||||
@interface MWMViewController : UIViewController <MWMController>
|
||||
|
||||
@property(nonatomic) IBInspectable NSString * localizedTitle;
|
||||
|
||||
@end
|
||||
|
|
|
@ -14,6 +14,16 @@
|
|||
|
||||
@implementation MWMViewController
|
||||
|
||||
- (NSString *)localizedTitle
|
||||
{
|
||||
return L(self.title);
|
||||
}
|
||||
|
||||
- (void)setLocalizedTitle:(NSString *)localizedTitle
|
||||
{
|
||||
self.title = L(localizedTitle);
|
||||
}
|
||||
|
||||
- (BOOL)prefersStatusBarHidden
|
||||
{
|
||||
return NO;
|
||||
|
|
|
@ -1,20 +1,14 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="13771" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="14109" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
|
||||
<device id="retina4_7" orientation="portrait">
|
||||
<adaptation id="fullscreen"/>
|
||||
</device>
|
||||
<dependencies>
|
||||
<deployment identifier="iOS"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13772"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14088"/>
|
||||
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
|
||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||
</dependencies>
|
||||
<customFonts key="customFonts">
|
||||
<array key="HelveticaNeue.ttc">
|
||||
<string>HelveticaNeue</string>
|
||||
<string>HelveticaNeue-Medium</string>
|
||||
</array>
|
||||
</customFonts>
|
||||
<objects>
|
||||
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
|
||||
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
|
||||
|
|
|
@ -71,7 +71,7 @@ void InitLocalizedStrings()
|
|||
void InitCrashTrackers()
|
||||
{
|
||||
#ifdef OMIM_PRODUCTION
|
||||
if (![MWMSettings statisticsEnabled])
|
||||
if ([MWMSettings crashReportingDisabled])
|
||||
return;
|
||||
|
||||
NSString * fabricKey = @(CRASHLYTICS_IOS_KEY);
|
||||
|
|
|
@ -39,4 +39,7 @@
|
|||
+ (BOOL)isTrackWarningAlertShown;
|
||||
+ (void)setTrackWarningAlertShown:(BOOL)shown;
|
||||
|
||||
+ (BOOL)crashReportingDisabled;
|
||||
+ (void)setCrashReportingDisabled:(BOOL)disabled;
|
||||
|
||||
@end
|
||||
|
|
|
@ -24,6 +24,7 @@ NSString * const kUDAutoNightModeOff = @"AutoNightModeOff";
|
|||
NSString * const kThemeMode = @"ThemeMode";
|
||||
NSString * const kSpotlightLocaleLanguageId = @"SpotlightLocaleLanguageId";
|
||||
NSString * const kUDTrackWarningAlertWasShown = @"TrackWarningAlertWasShown";
|
||||
NSString * const kCrashReportingDisabled = @"CrashReportingDisabled";
|
||||
} // namespace
|
||||
|
||||
@implementation MWMSettings
|
||||
|
@ -194,4 +195,13 @@ NSString * const kUDTrackWarningAlertWasShown = @"TrackWarningAlertWasShown";
|
|||
[ud synchronize];
|
||||
}
|
||||
|
||||
+ (BOOL)crashReportingDisabled
|
||||
{
|
||||
return [[NSUserDefaults standardUserDefaults] boolForKey:kCrashReportingDisabled];
|
||||
}
|
||||
|
||||
+ (void)setCrashReportingDisabled:(BOOL)disabled
|
||||
{
|
||||
[[NSUserDefaults standardUserDefaults] setBool:disabled forKey:kCrashReportingDisabled];
|
||||
}
|
||||
@end
|
||||
|
|
|
@ -161,7 +161,6 @@
|
|||
3486B5161E27AD3B0069C126 /* Framework.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3486B5101E27AD3B0069C126 /* Framework.cpp */; };
|
||||
3486B5191E27AD3B0069C126 /* MWMFrameworkListener.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3486B5131E27AD3B0069C126 /* MWMFrameworkListener.mm */; };
|
||||
3486B51E1E27AD590069C126 /* MWMFrameworkHelper.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3486B51C1E27AD590069C126 /* MWMFrameworkHelper.mm */; };
|
||||
34870B78201732E30085A7F6 /* libFlurry_8.3.4.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 34870B77201732E30085A7F6 /* libFlurry_8.3.4.a */; };
|
||||
3488B0131E9D0AEC0068AFD8 /* AdBanner.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3488B0101E9D0AEC0068AFD8 /* AdBanner.swift */; };
|
||||
3488B0161E9D0AEC0068AFD8 /* AdBanner.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3488B0111E9D0AEC0068AFD8 /* AdBanner.xib */; };
|
||||
3488B01A1E9D0B230068AFD8 /* UIColor+Modifications.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3488B0181E9D0B230068AFD8 /* UIColor+Modifications.swift */; };
|
||||
|
@ -349,6 +348,7 @@
|
|||
4767CDA820AB401000BD8166 /* LinkTextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4767CDA720AB401000BD8166 /* LinkTextView.swift */; };
|
||||
4767CDC120B477BA00BD8166 /* WelcomeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4767CDC020B477BA00BD8166 /* WelcomeViewController.swift */; };
|
||||
47800D1D20BEEE2E00072F42 /* TermsOfUseController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47800D1C20BEEE2E00072F42 /* TermsOfUseController.swift */; };
|
||||
47800D2520C05E3200072F42 /* libFlurry_8.6.1.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 47800D2420C05E3200072F42 /* libFlurry_8.6.1.a */; };
|
||||
4A300ED51C6DCFD400140018 /* countries-strings in Resources */ = {isa = PBXBuildFile; fileRef = 4A300ED31C6DCFD400140018 /* countries-strings */; };
|
||||
56C74C391C74A3BC00B71B9F /* MWMInputEmailValidator.mm in Sources */ = {isa = PBXBuildFile; fileRef = 34ABA62F1C2D58F300FE1BEC /* MWMInputEmailValidator.mm */; };
|
||||
56EE14D11FE804550036F20C /* libtransit.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 56EE14D21FE804550036F20C /* libtransit.a */; };
|
||||
|
@ -958,7 +958,6 @@
|
|||
3486B5141E27AD3B0069C126 /* MWMFrameworkObservers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWMFrameworkObservers.h; sourceTree = "<group>"; };
|
||||
3486B51B1E27AD590069C126 /* MWMFrameworkHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWMFrameworkHelper.h; sourceTree = "<group>"; };
|
||||
3486B51C1E27AD590069C126 /* MWMFrameworkHelper.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MWMFrameworkHelper.mm; sourceTree = "<group>"; };
|
||||
34870B77201732E30085A7F6 /* libFlurry_8.3.4.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libFlurry_8.3.4.a; sourceTree = "<group>"; };
|
||||
3488B0101E9D0AEC0068AFD8 /* AdBanner.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AdBanner.swift; sourceTree = "<group>"; };
|
||||
3488B0111E9D0AEC0068AFD8 /* AdBanner.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = AdBanner.xib; sourceTree = "<group>"; };
|
||||
3488B0181E9D0B230068AFD8 /* UIColor+Modifications.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIColor+Modifications.swift"; sourceTree = "<group>"; };
|
||||
|
@ -1280,6 +1279,8 @@
|
|||
4767CDA720AB401000BD8166 /* LinkTextView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LinkTextView.swift; sourceTree = "<group>"; };
|
||||
4767CDC020B477BA00BD8166 /* WelcomeViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WelcomeViewController.swift; sourceTree = "<group>"; };
|
||||
47800D1C20BEEE2E00072F42 /* TermsOfUseController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TermsOfUseController.swift; sourceTree = "<group>"; };
|
||||
47800D2420C05E3200072F42 /* libFlurry_8.6.1.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libFlurry_8.6.1.a; sourceTree = "<group>"; };
|
||||
47800D2620C05E8700072F42 /* FlurryConsent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FlurryConsent.h; sourceTree = "<group>"; };
|
||||
4A00DBDE1AB704C400113624 /* drules_proto_dark.bin */ = {isa = PBXFileReference; lastKnownFileType = archive.macbinary; name = drules_proto_dark.bin; path = ../../data/drules_proto_dark.bin; sourceTree = "<group>"; };
|
||||
4A23D1561B8B4DD700D4EB6F /* drules_proto_clear.bin */ = {isa = PBXFileReference; lastKnownFileType = archive.macbinary; name = drules_proto_clear.bin; path = ../../data/drules_proto_clear.bin; sourceTree = "<group>"; };
|
||||
4A23D1571B8B4DD700D4EB6F /* resources-6plus_clear */ = {isa = PBXFileReference; lastKnownFileType = folder; name = "resources-6plus_clear"; path = "../../data/resources-6plus_clear"; sourceTree = "<group>"; };
|
||||
|
@ -1774,6 +1775,7 @@
|
|||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
47800D2520C05E3200072F42 /* libFlurry_8.6.1.a in Frameworks */,
|
||||
1DA7908820762CEB008BDD6B /* libopen_location_code.a in Frameworks */,
|
||||
45CBCCBA20590AAB006B55C2 /* libkml.a in Frameworks */,
|
||||
56EE14D11FE804550036F20C /* libtransit.a in Frameworks */,
|
||||
|
@ -1835,7 +1837,6 @@
|
|||
6741AAD31BF356BA002C974C /* librouting.a in Frameworks */,
|
||||
674A7E281C0DA573003D48E1 /* libstb_image.a in Frameworks */,
|
||||
6741AAD41BF356BA002C974C /* libsearch.a in Frameworks */,
|
||||
34870B78201732E30085A7F6 /* libFlurry_8.3.4.a in Frameworks */,
|
||||
6741AAD51BF356BA002C974C /* libstorage.a in Frameworks */,
|
||||
6741AAD61BF356BA002C974C /* libsuccinct.a in Frameworks */,
|
||||
3466A2D41FB1C83C005494D3 /* FacebookShare.framework in Frameworks */,
|
||||
|
@ -2030,9 +2031,10 @@
|
|||
340474E11E08199D00C92850 /* Flurry */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
47800D2420C05E3200072F42 /* libFlurry_8.6.1.a */,
|
||||
47800D2620C05E8700072F42 /* FlurryConsent.h */,
|
||||
340474E21E08199D00C92850 /* Flurry.h */,
|
||||
340474E31E08199D00C92850 /* FlurrySessionBuilder.h */,
|
||||
34870B77201732E30085A7F6 /* libFlurry_8.3.4.a */,
|
||||
);
|
||||
path = Flurry;
|
||||
sourceTree = "<group>";
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
|
||||
extern NSString * const kAlohalyticsTapEventKey;
|
||||
|
||||
@interface MWMAboutController ()
|
||||
@interface MWMAboutController () <SettingsTableViewSwitchCellDelegate>
|
||||
|
||||
@property(weak, nonatomic) IBOutlet UILabel * versionLabel;
|
||||
@property(weak, nonatomic) IBOutlet UILabel * dateLabel;
|
||||
|
@ -20,6 +20,8 @@ extern NSString * const kAlohalyticsTapEventKey;
|
|||
@property(weak, nonatomic) IBOutlet SettingsTableViewLinkCell * osmCell;
|
||||
@property(weak, nonatomic) IBOutlet SettingsTableViewLinkCell * rateCell;
|
||||
@property(weak, nonatomic) IBOutlet SettingsTableViewLinkCell * copyrightCell;
|
||||
@property(weak, nonatomic) IBOutlet SettingsTableViewLinkCell * adsCell;
|
||||
@property(weak, nonatomic) IBOutlet SettingsTableViewSwitchCell * crashlyticsCell;
|
||||
|
||||
@property(nonatomic) IBOutlet UIView * headerView;
|
||||
|
||||
|
@ -43,6 +45,8 @@ extern NSString * const kAlohalyticsTapEventKey;
|
|||
|
||||
auto const dataVersion = GetFramework().GetCurrentDataVersion();
|
||||
self.dateLabel.text = [NSString stringWithFormat:L(@"date"), dataVersion];
|
||||
|
||||
[self.crashlyticsCell configWithDelegate:self title:L(@"opt_out_fabric") isOn:![MWMSettings crashReportingDisabled]];
|
||||
}
|
||||
|
||||
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
|
||||
|
@ -89,4 +93,23 @@ extern NSString * const kAlohalyticsTapEventKey;
|
|||
}
|
||||
}
|
||||
|
||||
#pragma mark - Table view data source
|
||||
|
||||
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
|
||||
{
|
||||
return section == 2 ? L(@"subtittle_opt_out") : nil;
|
||||
}
|
||||
|
||||
- (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section
|
||||
{
|
||||
return section == 2 ? L(@"opt_out_fabric_description") : nil;
|
||||
}
|
||||
|
||||
#pragma mark - SettingsTableViewSwitchCellDelegate
|
||||
|
||||
- (void)switchCell:(SettingsTableViewSwitchCell *)cell didChangeValue:(BOOL)value
|
||||
{
|
||||
[MWMSettings setCrashReportingDisabled:!value];
|
||||
}
|
||||
|
||||
@end
|
||||
|
|
|
@ -1496,10 +1496,83 @@
|
|||
</tableViewCell>
|
||||
</cells>
|
||||
</tableViewSection>
|
||||
<tableViewSection id="riF-80-ZWx">
|
||||
<cells>
|
||||
<tableViewCell contentMode="scaleToFill" selectionStyle="default" accessoryType="disclosureIndicator" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" id="DXH-GS-aHR" customClass="SettingsTableViewLinkCell" customModule="maps_me" customModuleProvider="target">
|
||||
<rect key="frame" x="0.0" y="327" width="375" height="44"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="DXH-GS-aHR" id="hrz-tO-Flm">
|
||||
<rect key="frame" x="0.0" y="0.0" width="341" height="43.5"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<subviews>
|
||||
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Ads" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Ane-Bd-4ya">
|
||||
<rect key="frame" x="16" y="14" width="307" height="15.5"/>
|
||||
<fontDescription key="fontDescription" type="system" pointSize="17"/>
|
||||
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
<nil key="highlightedColor"/>
|
||||
<userDefinedRuntimeAttributes>
|
||||
<userDefinedRuntimeAttribute type="string" keyPath="colorName" value="blackPrimaryText"/>
|
||||
<userDefinedRuntimeAttribute type="string" keyPath="fontName" value="regular17"/>
|
||||
<userDefinedRuntimeAttribute type="string" keyPath="localizedText" value="opt_out_mopub"/>
|
||||
</userDefinedRuntimeAttributes>
|
||||
</label>
|
||||
</subviews>
|
||||
<constraints>
|
||||
<constraint firstItem="Ane-Bd-4ya" firstAttribute="leading" secondItem="hrz-tO-Flm" secondAttribute="leading" constant="16" id="SU8-H0-9YS"/>
|
||||
<constraint firstAttribute="bottomMargin" secondItem="Ane-Bd-4ya" secondAttribute="bottom" constant="3.5" id="Y33-FE-uGt"/>
|
||||
<constraint firstItem="Ane-Bd-4ya" firstAttribute="top" secondItem="hrz-tO-Flm" secondAttribute="topMargin" constant="3" id="bNB-dk-bye"/>
|
||||
<constraint firstAttribute="trailingMargin" secondItem="Ane-Bd-4ya" secondAttribute="trailing" constant="10" id="lNF-2N-TRD"/>
|
||||
</constraints>
|
||||
</tableViewCellContentView>
|
||||
<inset key="separatorInset" minX="0.0" minY="0.0" maxX="0.0" maxY="0.0"/>
|
||||
<connections>
|
||||
<segue destination="Vr8-QW-WhO" kind="show" id="U88-n3-d6K"/>
|
||||
</connections>
|
||||
</tableViewCell>
|
||||
<tableViewCell contentMode="scaleToFill" selectionStyle="none" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="SettingsTableViewSwitchCell" id="6Fq-aj-irU" customClass="SettingsTableViewSwitchCell" customModule="maps_me" customModuleProvider="target">
|
||||
<rect key="frame" x="0.0" y="371" width="375" height="44"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="6Fq-aj-irU" id="nFM-EC-CZC">
|
||||
<rect key="frame" x="0.0" y="0.0" width="375" height="43.5"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<subviews>
|
||||
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Send crash data" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumFontSize="13" translatesAutoresizingMaskIntoConstraints="NO" id="vc4-e7-aiM">
|
||||
<rect key="frame" x="16" y="14" width="278" height="15.5"/>
|
||||
<inset key="insetFor6xAndEarlier" minX="0.0" minY="0.0" maxX="-25" maxY="0.0"/>
|
||||
<fontDescription key="fontDescription" type="system" pointSize="17"/>
|
||||
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
<nil key="highlightedColor"/>
|
||||
<userDefinedRuntimeAttributes>
|
||||
<userDefinedRuntimeAttribute type="string" keyPath="colorName" value="blackPrimaryText"/>
|
||||
<userDefinedRuntimeAttribute type="string" keyPath="fontName" value="regular17"/>
|
||||
</userDefinedRuntimeAttributes>
|
||||
</label>
|
||||
<switch opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" contentHorizontalAlignment="center" contentVerticalAlignment="center" on="YES" translatesAutoresizingMaskIntoConstraints="NO" id="8gZ-CB-BtW">
|
||||
<rect key="frame" x="302" y="6" width="51" height="31"/>
|
||||
<inset key="insetFor6xAndEarlier" minX="3" minY="-2" maxX="-3" maxY="2"/>
|
||||
<color key="onTintColor" red="0.1176470588" green="0.58823529409999997" blue="0.94117647059999998" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||
</switch>
|
||||
</subviews>
|
||||
<constraints>
|
||||
<constraint firstItem="8gZ-CB-BtW" firstAttribute="leading" secondItem="vc4-e7-aiM" secondAttribute="trailing" constant="8" id="FgO-m5-Zx3"/>
|
||||
<constraint firstItem="vc4-e7-aiM" firstAttribute="top" secondItem="nFM-EC-CZC" secondAttribute="topMargin" constant="3" id="Lus-wb-DWd"/>
|
||||
<constraint firstAttribute="bottomMargin" secondItem="vc4-e7-aiM" secondAttribute="bottom" constant="3.5" id="dLc-dl-3Ha"/>
|
||||
<constraint firstItem="8gZ-CB-BtW" firstAttribute="centerY" secondItem="nFM-EC-CZC" secondAttribute="centerY" id="rWh-dF-W9A"/>
|
||||
<constraint firstAttribute="trailingMargin" secondItem="8gZ-CB-BtW" secondAttribute="trailing" constant="8" id="usD-mM-g25"/>
|
||||
<constraint firstItem="vc4-e7-aiM" firstAttribute="leading" secondItem="nFM-EC-CZC" secondAttribute="leading" constant="16" id="vyV-hm-lli"/>
|
||||
</constraints>
|
||||
</tableViewCellContentView>
|
||||
<connections>
|
||||
<outlet property="switchButton" destination="8gZ-CB-BtW" id="3c2-jk-RgL"/>
|
||||
<outlet property="title" destination="vc4-e7-aiM" id="aEp-0l-GXy"/>
|
||||
</connections>
|
||||
</tableViewCell>
|
||||
</cells>
|
||||
</tableViewSection>
|
||||
<tableViewSection id="Vce-Ld-skc">
|
||||
<cells>
|
||||
<tableViewCell contentMode="scaleToFill" selectionStyle="default" accessoryType="disclosureIndicator" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" id="VXa-CM-OXP" customClass="SettingsTableViewLinkCell" customModule="maps_me" customModuleProvider="target">
|
||||
<rect key="frame" x="0.0" y="327" width="375" height="44"/>
|
||||
<rect key="frame" x="0.0" y="451" width="375" height="44"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="VXa-CM-OXP" id="Vot-vJ-3MU">
|
||||
<rect key="frame" x="0.0" y="0.0" width="341" height="43.5"/>
|
||||
|
@ -1535,7 +1608,9 @@
|
|||
</connections>
|
||||
</tableView>
|
||||
<connections>
|
||||
<outlet property="adsCell" destination="DXH-GS-aHR" id="mDN-xH-33S"/>
|
||||
<outlet property="copyrightCell" destination="VXa-CM-OXP" id="FpT-Rr-yha"/>
|
||||
<outlet property="crashlyticsCell" destination="6Fq-aj-irU" id="kYL-C6-PGc"/>
|
||||
<outlet property="facebookCell" destination="AwY-rw-AMm" id="NUh-p9-2t4"/>
|
||||
<outlet property="osmCell" destination="8n2-Bc-3lW" id="igH-Nf-uX5"/>
|
||||
<outlet property="rateCell" destination="jhU-Ha-kE2" id="qi9-Y9-9BP"/>
|
||||
|
@ -1547,6 +1622,70 @@
|
|||
</objects>
|
||||
<point key="canvasLocation" x="1881" y="-3103"/>
|
||||
</scene>
|
||||
<!--View Controller-->
|
||||
<scene sceneID="JNg-xq-OFN">
|
||||
<objects>
|
||||
<viewController id="Vr8-QW-WhO" customClass="MWMViewController" sceneMemberID="viewController">
|
||||
<view key="view" contentMode="scaleToFill" id="cGc-6R-wWa">
|
||||
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Your iOS mobile device may provide a “Limit Ad Tracking” or “Opt out of interest-based advertising” setting." textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="FTV-6u-1B0">
|
||||
<rect key="frame" x="20" y="40" width="335" height="61"/>
|
||||
<fontDescription key="fontDescription" type="system" pointSize="17"/>
|
||||
<nil key="textColor"/>
|
||||
<nil key="highlightedColor"/>
|
||||
<userDefinedRuntimeAttributes>
|
||||
<userDefinedRuntimeAttribute type="string" keyPath="fontName" value="regular14"/>
|
||||
<userDefinedRuntimeAttribute type="string" keyPath="colorName" value="blackSecondaryText"/>
|
||||
<userDefinedRuntimeAttribute type="string" keyPath="localizedText" value="opt_out_help_ios_1"/>
|
||||
</userDefinedRuntimeAttributes>
|
||||
</label>
|
||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="iOS 9 or Higher" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="YRz-ke-XdF">
|
||||
<rect key="frame" x="20" y="121" width="335" height="20.5"/>
|
||||
<fontDescription key="fontDescription" type="system" weight="semibold" pointSize="17"/>
|
||||
<nil key="textColor"/>
|
||||
<nil key="highlightedColor"/>
|
||||
<userDefinedRuntimeAttributes>
|
||||
<userDefinedRuntimeAttribute type="string" keyPath="fontName" value="medium14"/>
|
||||
<userDefinedRuntimeAttribute type="string" keyPath="colorName" value="blackPrimaryText"/>
|
||||
<userDefinedRuntimeAttribute type="string" keyPath="localizedText" value="opt_out_help_ios_2"/>
|
||||
</userDefinedRuntimeAttributes>
|
||||
</label>
|
||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Go to your Settings → Select Privacy → Select Advertising → Enable the “Limit Ad Tracking” setting" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="OMh-3m-tmj">
|
||||
<rect key="frame" x="20" y="141.5" width="335" height="61"/>
|
||||
<fontDescription key="fontDescription" type="system" pointSize="17"/>
|
||||
<nil key="textColor"/>
|
||||
<nil key="highlightedColor"/>
|
||||
<userDefinedRuntimeAttributes>
|
||||
<userDefinedRuntimeAttribute type="string" keyPath="fontName" value="regular14"/>
|
||||
<userDefinedRuntimeAttribute type="string" keyPath="colorName" value="blackSecondaryText"/>
|
||||
<userDefinedRuntimeAttribute type="string" keyPath="localizedText" value="opt_out_help_ios_3"/>
|
||||
</userDefinedRuntimeAttributes>
|
||||
</label>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
<constraints>
|
||||
<constraint firstItem="OMh-3m-tmj" firstAttribute="leading" secondItem="YRz-ke-XdF" secondAttribute="leading" id="1uo-YJ-cfK"/>
|
||||
<constraint firstItem="YRz-ke-XdF" firstAttribute="leading" secondItem="FTV-6u-1B0" secondAttribute="leading" id="FQG-1X-NBJ"/>
|
||||
<constraint firstItem="YRz-ke-XdF" firstAttribute="trailing" secondItem="FTV-6u-1B0" secondAttribute="trailing" id="N2Q-GO-CTO"/>
|
||||
<constraint firstItem="OMh-3m-tmj" firstAttribute="top" secondItem="YRz-ke-XdF" secondAttribute="bottom" id="Nnf-Y8-W8G"/>
|
||||
<constraint firstItem="OMh-3m-tmj" firstAttribute="trailing" secondItem="YRz-ke-XdF" secondAttribute="trailing" id="OX9-3z-jPG"/>
|
||||
<constraint firstItem="FTV-6u-1B0" firstAttribute="leading" secondItem="Olo-Bm-ZYz" secondAttribute="leading" constant="20" id="QEQ-8n-xQw"/>
|
||||
<constraint firstItem="YRz-ke-XdF" firstAttribute="top" secondItem="FTV-6u-1B0" secondAttribute="bottom" constant="20" id="Wkv-Nb-J8z"/>
|
||||
<constraint firstItem="FTV-6u-1B0" firstAttribute="top" secondItem="Olo-Bm-ZYz" secondAttribute="top" constant="20" id="YHC-4q-RUb"/>
|
||||
<constraint firstItem="Olo-Bm-ZYz" firstAttribute="trailing" secondItem="FTV-6u-1B0" secondAttribute="trailing" constant="20" id="bIm-Sb-N7W"/>
|
||||
</constraints>
|
||||
<viewLayoutGuide key="safeArea" id="Olo-Bm-ZYz"/>
|
||||
</view>
|
||||
<userDefinedRuntimeAttributes>
|
||||
<userDefinedRuntimeAttribute type="string" keyPath="localizedTitle" value="opt_out_mopub"/>
|
||||
</userDefinedRuntimeAttributes>
|
||||
</viewController>
|
||||
<placeholder placeholderIdentifier="IBFirstResponder" id="ZAm-mj-EC2" userLabel="First Responder" sceneMemberID="firstResponder"/>
|
||||
</objects>
|
||||
<point key="canvasLocation" x="2577" y="-3104"/>
|
||||
</scene>
|
||||
<!--AuthorizationLoginViewController-->
|
||||
<scene sceneID="Uoe-yB-Kdk">
|
||||
<objects>
|
||||
|
|
Loading…
Add table
Reference in a new issue