Production logging & sign up error handling

This commit is contained in:
Frederic Jacobs 2014-06-30 17:14:33 +02:00
parent 6c2f33a6d5
commit c69747e48b
9 changed files with 240 additions and 60 deletions

View File

@ -6,3 +6,4 @@ pod 'UICKeyChainStore', '~> 1.0.5'
pod 'OpenSSL', '~> 1.0.108'
pod 'MMDrawerController', '~> 0.5.0'
pod 'libPhoneNumber-iOS', '~> 0.7'
pod 'CocoaLumberjack'

View File

@ -3426,6 +3426,174 @@
/* End PBXVariantGroup section */
/* Begin XCBuildConfiguration section */
B6B9EB4D196190F5009024F0 /* Ad-Hoc Distribution */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_SECURITY_FLOATLOOPCOUNTER = YES;
CLANG_ANALYZER_SECURITY_INSECUREAPI_RAND = YES;
CLANG_ANALYZER_SECURITY_INSECUREAPI_STRCPY = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "compiler-default";
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_IMPLICIT_SIGN_CONVERSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_OBJC_RECEIVER_WEAK = YES;
CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = YES;
CLANG_WARN__ARC_BRIDGE_CAST_NONARC = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
CODE_SIGN_IDENTITY = "";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
COPY_PHASE_STRIP = NO;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_DYNAMIC_NO_PIC = NO;
GCC_GENERATE_TEST_COVERAGE_FILES = NO;
GCC_INSTRUMENT_PROGRAM_FLOW_ARCS = NO;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
);
GCC_SYMBOLS_PRIVATE_EXTERN = NO;
GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES;
GCC_TREAT_INCOMPATIBLE_POINTER_TYPE_WARNINGS_AS_ERRORS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = YES;
GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = YES;
GCC_WARN_ABOUT_MISSING_NEWLINE = YES;
GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES;
GCC_WARN_ABOUT_POINTER_SIGNEDNESS = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES;
GCC_WARN_ALLOW_INCOMPLETE_PROTOCOL = YES;
GCC_WARN_CHECK_SWITCH_STATEMENTS = YES;
GCC_WARN_FOUR_CHARACTER_CONSTANTS = YES;
GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES;
GCC_WARN_MISSING_PARENTHESES = YES;
GCC_WARN_MULTIPLE_DEFINITION_TYPES_FOR_SELECTOR = YES;
GCC_WARN_SHADOW = YES;
GCC_WARN_SIGN_COMPARE = YES;
GCC_WARN_STRICT_SELECTOR_MATCH = YES;
GCC_WARN_TYPECHECK_CALLS_TO_PRINTF = YES;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES;
GCC_WARN_UNKNOWN_PRAGMAS = YES;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_LABEL = YES;
GCC_WARN_UNUSED_VALUE = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
HEADER_SEARCH_PATHS = "";
IPHONEOS_DEPLOYMENT_TARGET = 7.0;
ONLY_ACTIVE_ARCH = NO;
OTHER_CFLAGS = "-fobjc-arc-exceptions";
PROVISIONING_PROFILE = "";
"PROVISIONING_PROFILE[sdk=iphoneos*]" = "";
SDKROOT = iphoneos;
VALIDATE_PRODUCT = YES;
};
name = "Ad-Hoc Distribution";
};
B6B9EB4E196190F5009024F0 /* Ad-Hoc Distribution */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = C71793B33D9C45079F74487E /* Pods.xcconfig */;
buildSettings = {
CODE_SIGN_IDENTITY = "";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
CURRENT_PROJECT_VERSION = 1;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
"\"$(SRCROOT)\"",
);
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = "Signal/Signal-Prefix.pch";
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
HAVE_CONFIG_H,
);
GCC_STRICT_ALIASING = NO;
GCC_WARN_MULTIPLE_DEFINITION_TYPES_FOR_SELECTOR = NO;
GCC_WARN_STRICT_SELECTOR_MATCH = YES;
GCC_WARN_UNDECLARED_SELECTOR = YES;
HEADER_SEARCH_PATHS = (
"$(inherited)",
"\"${SRCROOT}/RedPhone/lib/speex/include\"",
"\"${SRCROOT}/RedPhone/lib/ogg/include\"",
"\"${SRCROOT}/RedPhone/lib/debug/include\"",
"\"$(SRCROOT)/libtommath\"",
"\"$(SRCROOT)/libtomcrypt/headers\"",
"\"$(SRCROOT)/spandsp/spandsp/spandsp\"",
"\"$(SRCROOT)/MMDrawerController\"",
"\"$(SRCROOT)/Libraries\"/**",
);
INFOPLIST_FILE = "$(SRCROOT)/Signal/Signal-Info.plist";
IPHONEOS_DEPLOYMENT_TARGET = 7.0;
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
"$(SRCROOT)",
);
LLVM_LTO = NO;
OTHER_LDFLAGS = "$(inherited)";
PRODUCT_NAME = Signal;
PROVISIONING_PROFILE = "B26CF658-AD7F-4F4C-B94F-74884941DF87";
SDKROOT = iphoneos;
TARGETED_DEVICE_FAMILY = 1;
TEST_AFTER_BUILD = YES;
VALID_ARCHS = "arm64 armv7 armv7s i386";
WRAPPER_EXTENSION = app;
};
name = "Ad-Hoc Distribution";
};
B6B9EB4F196190F5009024F0 /* Ad-Hoc Distribution */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = C71793B33D9C45079F74487E /* Pods.xcconfig */;
buildSettings = {
BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/Signal.app/Signal";
FRAMEWORK_SEARCH_PATHS = (
"\"$(SDKROOT)/Developer/Library/Frameworks\"",
"\"$(DEVELOPER_LIBRARY_DIR)/Frameworks\"",
);
GCC_GENERATE_TEST_COVERAGE_FILES = NO;
GCC_INSTRUMENT_PROGRAM_FLOW_ARCS = YES;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = "Signal/Signal-Prefix.pch";
GCC_VERSION = "";
GCC_WARN_MULTIPLE_DEFINITION_TYPES_FOR_SELECTOR = NO;
GCC_WARN_STRICT_SELECTOR_MATCH = YES;
GCC_WARN_UNDECLARED_SELECTOR = YES;
HEADER_SEARCH_PATHS = (
"${PODS_HEADERS_SEARCH_PATHS}",
"$(inherited)",
"\"${SRCROOT}/Signal/lib/speex/include\"",
"\"${SRCROOT}/Signal/lib/ogg/include\"",
"\"${SRCROOT}/Signal/lib/debug/include\"",
"\"$(SRCROOT)/libtommath\"",
"\"$(SRCROOT)/libtomcrypt/headers\"",
"\"$(SRCROOT)/spandsp/spandsp/spandsp\"",
"\"$(SRCROOT)/Libraries\"/**",
);
INFOPLIST_FILE = "Signal/test/Supporting Files/SignalTests-Info.plist";
IPHONEOS_DEPLOYMENT_TARGET = 7.0;
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
"$(SRCROOT)",
);
OTHER_LDFLAGS = (
"-ObjC",
"$(inherited)",
);
PRODUCT_NAME = SignalTests;
TEST_HOST = "$(BUNDLE_LOADER)";
VALID_ARCHS = "arm64 armv7s armv7 i386";
WRAPPER_EXTENSION = octest;
};
name = "Ad-Hoc Distribution";
};
D221A0BA169C9E5F00537ABF /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
@ -3446,14 +3614,14 @@
CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = YES;
CLANG_WARN__ARC_BRIDGE_CAST_NONARC = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
CODE_SIGN_IDENTITY = "iPhone Distribution";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
CODE_SIGN_IDENTITY = "iPhone Developer";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = NO;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_DYNAMIC_NO_PIC = NO;
GCC_GENERATE_TEST_COVERAGE_FILES = NO;
GCC_INSTRUMENT_PROGRAM_FLOW_ARCS = NO;
GCC_OPTIMIZATION_LEVEL = 3;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
@ -3489,14 +3657,14 @@
IPHONEOS_DEPLOYMENT_TARGET = 7.0;
ONLY_ACTIVE_ARCH = YES;
OTHER_CFLAGS = "-fobjc-arc-exceptions";
PROVISIONING_PROFILE = "25E52683-9ADD-415E-A1E0-63A1C7ECF872";
"PROVISIONING_PROFILE[sdk=iphoneos*]" = "25E52683-9ADD-415E-A1E0-63A1C7ECF872";
PROVISIONING_PROFILE = "";
"PROVISIONING_PROFILE[sdk=iphoneos*]" = "";
SDKROOT = iphoneos;
VALIDATE_PRODUCT = YES;
};
name = Debug;
};
D221A0BB169C9E5F00537ABF /* Release */ = {
D221A0BB169C9E5F00537ABF /* App Store Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
@ -3516,12 +3684,13 @@
CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = YES;
CLANG_WARN__ARC_BRIDGE_CAST_NONARC = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
CODE_SIGN_IDENTITY = "iPhone Distribution";
CODE_SIGN_IDENTITY = "iPhone Developer";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
COPY_PHASE_STRIP = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_GENERATE_TEST_COVERAGE_FILES = NO;
GCC_INSTRUMENT_PROGRAM_FLOW_ARCS = NO;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES;
GCC_TREAT_INCOMPATIBLE_POINTER_TYPE_WARNINGS_AS_ERRORS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
@ -3555,25 +3724,25 @@
"-DNS_BLOCK_ASSERTIONS=1",
"-fobjc-arc-exceptions",
);
PROVISIONING_PROFILE = "25E52683-9ADD-415E-A1E0-63A1C7ECF872";
"PROVISIONING_PROFILE[sdk=iphoneos*]" = "25E52683-9ADD-415E-A1E0-63A1C7ECF872";
PROVISIONING_PROFILE = "";
"PROVISIONING_PROFILE[sdk=iphoneos*]" = "";
SDKROOT = iphoneos;
VALIDATE_PRODUCT = YES;
};
name = Release;
name = "App Store Release";
};
D221A0BD169C9E5F00537ABF /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = C71793B33D9C45079F74487E /* Pods.xcconfig */;
buildSettings = {
CODE_SIGN_IDENTITY = "iPhone Developer";
CODE_SIGN_IDENTITY = "";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
CURRENT_PROJECT_VERSION = 1;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
"\"$(SRCROOT)\"",
);
GCC_OPTIMIZATION_LEVEL = 0;
GCC_OPTIMIZATION_LEVEL = 3;
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = "Signal/Signal-Prefix.pch";
GCC_PREPROCESSOR_DEFINITIONS = (
@ -3614,11 +3783,11 @@
};
name = Debug;
};
D221A0BE169C9E5F00537ABF /* Release */ = {
D221A0BE169C9E5F00537ABF /* App Store Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = C71793B33D9C45079F74487E /* Pods.xcconfig */;
buildSettings = {
CODE_SIGN_IDENTITY = "iPhone Developer";
CODE_SIGN_IDENTITY = "";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
CURRENT_PROJECT_VERSION = 1;
FRAMEWORK_SEARCH_PATHS = (
@ -3653,14 +3822,14 @@
LLVM_LTO = NO;
OTHER_LDFLAGS = "$(inherited)";
PRODUCT_NAME = Signal;
PROVISIONING_PROFILE = "";
PROVISIONING_PROFILE = "7214A823-1F7A-4460-82D8-D89CA511CEA6";
SDKROOT = iphoneos;
TARGETED_DEVICE_FAMILY = 1;
TEST_AFTER_BUILD = YES;
VALID_ARCHS = "arm64 armv7 armv7s i386";
WRAPPER_EXTENSION = app;
};
name = Release;
name = "App Store Release";
};
D221A0C0169C9E5F00537ABF /* Debug */ = {
isa = XCBuildConfiguration;
@ -3708,7 +3877,7 @@
};
name = Debug;
};
D221A0C1169C9E5F00537ABF /* Release */ = {
D221A0C1169C9E5F00537ABF /* App Store Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = C71793B33D9C45079F74487E /* Pods.xcconfig */;
buildSettings = {
@ -3752,7 +3921,7 @@
VALID_ARCHS = "arm64 armv7s armv7 i386";
WRAPPER_EXTENSION = octest;
};
name = Release;
name = "App Store Release";
};
/* End XCBuildConfiguration section */
@ -3761,28 +3930,31 @@
isa = XCConfigurationList;
buildConfigurations = (
D221A0BA169C9E5F00537ABF /* Debug */,
D221A0BB169C9E5F00537ABF /* Release */,
B6B9EB4D196190F5009024F0 /* Ad-Hoc Distribution */,
D221A0BB169C9E5F00537ABF /* App Store Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
defaultConfigurationName = "App Store Release";
};
D221A0BC169C9E5F00537ABF /* Build configuration list for PBXNativeTarget "Signal" */ = {
isa = XCConfigurationList;
buildConfigurations = (
D221A0BD169C9E5F00537ABF /* Debug */,
D221A0BE169C9E5F00537ABF /* Release */,
B6B9EB4E196190F5009024F0 /* Ad-Hoc Distribution */,
D221A0BE169C9E5F00537ABF /* App Store Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
defaultConfigurationName = "App Store Release";
};
D221A0BF169C9E5F00537ABF /* Build configuration list for PBXNativeTarget "SignalTests" */ = {
isa = XCConfigurationList;
buildConfigurations = (
D221A0C0169C9E5F00537ABF /* Debug */,
D221A0C1169C9E5F00537ABF /* Release */,
B6B9EB4F196190F5009024F0 /* Ad-Hoc Distribution */,
D221A0C1169C9E5F00537ABF /* App Store Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
defaultConfigurationName = "App Store Release";
};
/* End XCConfigurationList section */
};

View File

@ -7,4 +7,12 @@
#ifdef __OBJC__
#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
#import <CocoaLumberjack/DDLog.h>
#ifdef DEBUG
static const int ddLogLevel = LOG_LEVEL_VERBOSE;
#else
static const int ddLogLevel = LOG_LEVEL_WARN;
#endif
#endif

View File

@ -16,6 +16,11 @@
#import "Util.h"
#import <UICKeyChainStore/UICKeyChainStore.h>
#pragma mark Logging - Production logging wants us to write some logs to a file in case we need it for debugging.
#import <CocoaLumberjack/DDTTYLogger.h>
#import <CocoaLumberjack/DDFileLogger.h>
#define kSignalVersionKey @"SignalUpdateVersionKey"
#ifdef __APPLE__
@ -68,6 +73,13 @@
}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[DDLog addLogger:[DDTTYLogger sharedInstance]];
DDFileLogger *fileLogger = [[DDFileLogger alloc] init];
fileLogger.rollingFrequency = 60 * 60 * 24; // 24 hour rolling.
fileLogger.logFileManager.maximumNumberOfLogFiles = 3; // Keep three days of logs.
[DDLog addLogger:fileLogger];
[self performUpdateCheck];
[self disableCallLogBackup];
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

View File

@ -116,6 +116,10 @@
#define ANSWER_CALL_BUTTON_TITLE NSLocalizedString(@"ANSWER_CALL_BUTTON_TITLE", @"")
#define REJECT_CALL_BUTTON_TITLE NSLocalizedString(@"REJECT_CALL_BUTTON_TITLE", @"")
#define REGISTER_ERROR_ALERT_VIEW_TITLE NSLocalizedString(@"REGISTRATION_ERROR", @"")
#define REGISTER_ERROR_ALERT_VIEW_BODY NSLocalizedString(@"REGISTRATION_BODY", @"")
#define REGISTER_ERROR_ALERT_VIEW_DISMISS NSLocalizedString(@"OK", @"")
#pragma mark - Invite Users
#define INVITE_USERS_ACTION_SHEET_TITLE NSLocalizedString(@"INVITE_USERS_ACTION_SHEET_TITLE", @"");
@ -133,7 +137,6 @@
#define TIMEOUT NSLocalizedString(@"TIMEOUT",@"")
#define TIMEOUT_CONTACTS_DETAIL NSLocalizedString(@"TIMEOUT_CONTACTS_DETAIL", @"")
NSDictionary* makeCallProgressLocalizedTextDictionary(void);
NSDictionary* makeCallTerminationLocalizedTextDictionary(void);

View File

@ -17,8 +17,6 @@
@property (nonatomic, strong) IBOutlet UILabel *countryCodeLabel;
@property (nonatomic, strong) IBOutlet UILabel *countryNameLabel;
@property (nonatomic, strong) IBOutlet UITextField *challengeTextField;
@property (nonatomic, strong) IBOutlet UILabel *registerErrorLabel;
@property (nonatomic, strong) IBOutlet UILabel *challengeErrorLabel;
@property (nonatomic, strong) IBOutlet UIActivityIndicatorView *registerActivityIndicator;
@property (nonatomic, strong) IBOutlet UIActivityIndicatorView *challengeActivityIndicator;
@property (nonatomic, strong) IBOutlet UIScrollView *scrollView;

View File

@ -11,6 +11,8 @@
#import "ThreadManager.h"
#import "Util.h"
#define REGISTER_VIEW_NUMBER 0
#define CHALLENGE_VIEW_NUMBER 1
@ -36,11 +38,6 @@
[super viewDidLoad];
[self populateDefaultCountryNameAndCode];
[futureApnId catchDo:^(id error) {
// todo: remove this; just here for testing purposes to catch apn not being set
_registerErrorLabel.text = [error description];
}];
_scrollView.contentSize = _containerView.bounds.size;
@ -172,12 +169,17 @@
Future* futureFinished = [self asyncRegister:localNumber untilCancelled:[life getToken]];
[_registerActivityIndicator startAnimating];
_registerButton.enabled = NO;
_registerErrorLabel.text = @"";
[futureFinished catchDo:^(id error) {
[_challengeActivityIndicator stopAnimating];
NSError *err = ((NSError*)error);
[_registerActivityIndicator stopAnimating];
_registerButton.enabled = YES;
// todo: localize
_registerErrorLabel.text = [error description];
DDLogError(@"Registration failed with information %@", err.description);
UIAlertView *registrationErrorAV = [[UIAlertView alloc]initWithTitle:REGISTER_ERROR_ALERT_VIEW_TITLE message:REGISTER_ERROR_ALERT_VIEW_BODY delegate:nil cancelButtonTitle:REGISTER_ERROR_ALERT_VIEW_DISMISS otherButtonTitles:nil, nil];
[registrationErrorAV show];
}];
}
@ -194,20 +196,18 @@
Future *futureDone = [HttpManager asyncOkResponseFromMasterServer:verifyRequest
unlessCancelled:nil
andErrorHandler:[Environment errorNoter]];
_challengeErrorLabel.text = @"";
[futureDone catchDo:^(id error) {
if ([error isKindOfClass:[HttpResponse class]]) {
HttpResponse* badResponse = error;
if ([badResponse getStatusCode] == 401) {
// @todo: human readable, localizable
_challengeErrorLabel.text = @"Incorrect Challenge Code";
UIAlertView *incorrectChallengeCodeAV = [[UIAlertView alloc]initWithTitle:@"Registration error" message:@"The challenge code you entered is incorrect." delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
[incorrectChallengeCodeAV show];
return;
}
}
[Environment errorNoter](error, @"While Verifying Challenge.", NO);
// @todo: human readable, localizable
_challengeErrorLabel.text = [NSString stringWithFormat:@"Unexpected failure: %@", error];
#warning add implementation
}];
[futureDone thenDo:^(id result) {

View File

@ -1,14 +1,13 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="4514" systemVersion="13C64" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none">
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="5056" systemVersion="13D65" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none">
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="3747"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="3733"/>
</dependencies>
<objects>
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="RegisterViewController">
<connections>
<outlet property="challengeActivityIndicator" destination="19" id="RXt-hH-5kD"/>
<outlet property="challengeButton" destination="zIb-7d-0em" id="G2W-Ef-bev"/>
<outlet property="challengeErrorLabel" destination="LBW-Ui-MrN" id="beu-jd-o47"/>
<outlet property="challengeNumberLabel" destination="deD-LF-4RO" id="RrX-TJ-m8K"/>
<outlet property="challengeTextField" destination="zgO-84-8qR" id="5uc-Fy-5Jr"/>
<outlet property="containerView" destination="6at-WU-Rlw" id="mLe-aM-qhl"/>
@ -19,7 +18,6 @@
<outlet property="registerActivityIndicator" destination="ZuN-a5-tVs" id="0ut-nh-AIV"/>
<outlet property="registerButton" destination="14" id="18"/>
<outlet property="registerCancelButton" destination="yuJ-T0-mV0" id="5No-Ec-CHs"/>
<outlet property="registerErrorLabel" destination="39" id="rl3-7n-oJN"/>
<outlet property="scrollView" destination="Hwy-85-hms" id="ssk-dZ-0cs"/>
<outlet property="view" destination="1" id="3"/>
<outlet property="voiceChallengeTextLabel" destination="Ofy-FZ-zZt" id="pBC-GW-Z8H"/>
@ -94,13 +92,6 @@
<userDefinedRuntimeAttribute type="string" keyPath="localizationKey" value="REGISTER_TEXTBLOCK"/>
</userDefinedRuntimeAttributes>
</label>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="" textAlignment="right" lineBreakMode="wordWrap" numberOfLines="3" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="39" userLabel="Register Error Label">
<rect key="frame" x="20" y="65" width="281" height="61"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" name="HelveticaNeue-Medium" family="Helvetica Neue" pointSize="13"/>
<color key="textColor" red="1" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
</label>
<view contentMode="scaleToFill" id="3vF-HK-Qbz" userLabel="Phone Number Underline View">
<rect key="frame" x="43" y="367" width="225" height="1"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
@ -185,13 +176,6 @@
<action selector="verifyChallengeTapped" destination="-1" eventType="touchUpInside" id="eMN-6x-T0q"/>
</connections>
</button>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="" textAlignment="center" lineBreakMode="wordWrap" numberOfLines="3" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="LBW-Ui-MrN" userLabel="Challenge Error Label">
<rect key="frame" x="36" y="52" width="263" height="57"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<fontDescription key="fontDescription" name="HelveticaNeue-Medium" family="Helvetica Neue" pointSize="13"/>
<color key="textColor" red="1" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
</label>
<view contentMode="scaleToFill" id="XOE-ev-Vjj" userLabel="Country Code Underline View">
<rect key="frame" x="43" y="366" width="225" height="1"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>

View File

@ -101,6 +101,8 @@
"REGISTER_VALIDATION_ENTER_CODE" = "Validation Code";
"REGISTER_VALIDATION_SENT" = "We sent your validation code";
"REGISTER_WELCOME_TEXT" = "Welcome to Signal";
"REGISTRATION_ERROR" = "Registration Error";
"REGISTRATION_BODY" = "We couldn't reach the Signal server. Please try again.";
"REJECT_CALL_BUTTON_TITLE" = "Reject";
"SETTINGS_ANONYMOUS_FEEDBACK" = "Send Anonymous Feedback";
"SETTINGS_CALL_QUALITY" = "Call Quality";