mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-08-01 16:06:59 +00:00
Initial Feedback component
- First implementation on feedback, not finished yet! - Move all components into their own subdirectory - Restructure common delegates into BITHockeyManagerDelegate - Restructure common component methods into new superclass (not finished yet)
This commit is contained in:
parent
5428df4f45
commit
1a71aa2ea5
@ -34,9 +34,10 @@
|
||||
|
||||
@class BITCrashManager;
|
||||
@class BITUpdateManager;
|
||||
@class BITFeedbackManager;
|
||||
|
||||
/**
|
||||
The HockeySDK manager.
|
||||
The HockeySDK manager. Responsible for setup and management of all components
|
||||
|
||||
This is the principal SDK class. It represents the entry point for the HockeySDK. The main promises of the class are initializing the SDK modules, providing access to global properties and to all modules. Initialization is divided into several distinct phases:
|
||||
|
||||
@ -45,7 +46,9 @@
|
||||
3. Start up all modules.
|
||||
|
||||
Example:
|
||||
[[BITHockeyManager sharedHockeyManager] configureWithIdentifier:@"<AppIdentifierFromHockeyApp>" delegate:nil];
|
||||
[[BITHockeyManager sharedHockeyManager]
|
||||
configureWithIdentifier:@"<AppIdentifierFromHockeyApp>"
|
||||
delegate:nil];
|
||||
[[BITHockeyManager sharedHockeyManager] startManager];
|
||||
|
||||
@warning When also using the SDK for updating app versions (AdHoc or Enterprise) and collecting
|
||||
@ -67,16 +70,7 @@
|
||||
|
||||
*/
|
||||
|
||||
@interface BITHockeyManager : NSObject {
|
||||
@private
|
||||
id _delegate;
|
||||
NSString *_appIdentifier;
|
||||
|
||||
BOOL _validAppIdentifier;
|
||||
|
||||
BOOL _startManagerIsInvoked;
|
||||
}
|
||||
|
||||
@interface BITHockeyManager : NSObject
|
||||
|
||||
#pragma mark - Public Methods
|
||||
|
||||
@ -99,7 +93,9 @@
|
||||
implements the optional protocols `BITHockeyManagerDelegate`, `BITCrashManagerDelegate` or
|
||||
`BITUpdateManagerDelegate`.
|
||||
|
||||
[[BITHockeyManager sharedHockeyManager] configureWithIdentifier:@"<AppIdentifierFromHockeyApp>" delegate:nil];
|
||||
[[BITHockeyManager sharedHockeyManager]
|
||||
configureWithIdentifier:@"<AppIdentifierFromHockeyApp>"
|
||||
delegate:nil];
|
||||
|
||||
@see configureWithBetaIdentifier:liveIdentifier:delegate:
|
||||
@see startManager
|
||||
@ -121,9 +117,10 @@
|
||||
And also assign the class that implements the optional protocols `BITHockeyManagerDelegate`,
|
||||
`BITCrashManagerDelegate` or `BITUpdateManagerDelegate`
|
||||
|
||||
[[BITHockeyManager sharedHockeyManager] configureWithBetaIdentifier:@"<AppIdentifierForBetaAppFromHockeyApp>"
|
||||
liveIdentifier:@"<AppIdentifierForLiveAppFromHockeyApp>"
|
||||
delegate:nil];
|
||||
[[BITHockeyManager sharedHockeyManager]
|
||||
configureWithBetaIdentifier:@"<AppIdentifierForBetaAppFromHockeyApp>"
|
||||
liveIdentifier:@"<AppIdentifierForLiveAppFromHockeyApp>"
|
||||
delegate:nil];
|
||||
|
||||
@see configureWithIdentifier:delegate:
|
||||
@see startManager
|
||||
@ -161,7 +158,7 @@
|
||||
By default this is set to the HockeyApp servers and there rarely should be a
|
||||
need to modify that.
|
||||
*/
|
||||
@property (nonatomic, retain) NSString *updateURL;
|
||||
@property (nonatomic, retain) NSString *serverURL;
|
||||
|
||||
|
||||
/**
|
||||
@ -197,7 +194,7 @@
|
||||
@see configureWithBetaIdentifier:liveIdentifier:delegate:
|
||||
@see startManager
|
||||
@see disableUpdateManager
|
||||
@return The BITCrashManager instance initialized by BITUpdateManager
|
||||
@return The BITUpdateManager instance initialized by BITHockeyManager
|
||||
*/
|
||||
@property (nonatomic, retain, readonly) BITUpdateManager *updateManager;
|
||||
|
||||
@ -216,6 +213,32 @@
|
||||
@property (nonatomic, getter = isUpdateManagerDisabled) BOOL disableUpdateManager;
|
||||
|
||||
|
||||
/**
|
||||
Reference to the initialized BITFeedbackManager module
|
||||
|
||||
@see configureWithIdentifier:delegate:
|
||||
@see configureWithBetaIdentifier:liveIdentifier:delegate:
|
||||
@see startManager
|
||||
@see disableFeedbackManager
|
||||
@return The BITFeedbackManager instance initialized by BITHockeyManager
|
||||
*/
|
||||
@property (nonatomic, retain, readonly) BITFeedbackManager *feedbackManager;
|
||||
|
||||
|
||||
/**
|
||||
Flag the determines wether the Feedback Manager should be disabled
|
||||
|
||||
If this flag is enabled, then letting the user give feedback and
|
||||
get responses will be turned off!
|
||||
|
||||
Please note that the Feedback Manager will be initialized anyway!
|
||||
|
||||
*Default*: _NO_
|
||||
@see feedbackManager
|
||||
*/
|
||||
@property (nonatomic, getter = isFeedbackManagerDisabled) BOOL disableFeedbackManager;
|
||||
|
||||
|
||||
///-----------------------------------------------------------------------------
|
||||
/// @name Environment
|
||||
///-----------------------------------------------------------------------------
|
||||
|
@ -30,9 +30,11 @@
|
||||
#import "HockeySDK.h"
|
||||
#import "HockeySDKPrivate.h"
|
||||
|
||||
#import "BITHockeyManagerPrivate.h"
|
||||
#import "BITHockeyBaseManagerPrivate.h"
|
||||
#import "BITCrashManagerPrivate.h"
|
||||
#import "BITUpdateManagerPrivate.h"
|
||||
|
||||
#import "BITFeedbackManagerPrivate.h"
|
||||
|
||||
@interface BITHockeyManager ()
|
||||
|
||||
@ -44,12 +46,14 @@
|
||||
|
||||
@end
|
||||
|
||||
@implementation BITHockeyManager
|
||||
|
||||
@synthesize crashManager = _crashManager;
|
||||
@synthesize updateManager = _updateManager;
|
||||
|
||||
@synthesize appStoreEnvironment = _appStoreEnvironment;
|
||||
@implementation BITHockeyManager {
|
||||
NSString *_appIdentifier;
|
||||
|
||||
BOOL _validAppIdentifier;
|
||||
|
||||
BOOL _startManagerIsInvoked;
|
||||
}
|
||||
|
||||
#pragma mark - Private Class Methods
|
||||
|
||||
@ -88,11 +92,12 @@
|
||||
|
||||
- (id) init {
|
||||
if ((self = [super init])) {
|
||||
_updateURL = nil;
|
||||
_serverURL = nil;
|
||||
_delegate = nil;
|
||||
|
||||
_disableCrashManager = NO;
|
||||
_disableUpdateManager = NO;
|
||||
_disableFeedbackManager = NO;
|
||||
|
||||
_appStoreEnvironment = NO;
|
||||
_startManagerIsInvoked = NO;
|
||||
@ -118,6 +123,7 @@
|
||||
|
||||
[_crashManager release], _crashManager = nil;
|
||||
[_updateManager release], _updateManager = nil;
|
||||
[_feedbackManager release], _feedbackManager = nil;
|
||||
|
||||
_delegate = nil;
|
||||
|
||||
@ -164,8 +170,8 @@
|
||||
// start CrashManager
|
||||
if (![self isCrashManagerDisabled]) {
|
||||
BITHockeyLog(@"INFO: Start CrashManager");
|
||||
if (_updateURL) {
|
||||
[_crashManager setUpdateURL:_updateURL];
|
||||
if (_serverURL) {
|
||||
[_crashManager setServerURL:_serverURL];
|
||||
}
|
||||
[_crashManager startManager];
|
||||
}
|
||||
@ -177,11 +183,20 @@
|
||||
#endif
|
||||
) {
|
||||
BITHockeyLog(@"INFO: Start UpdateManager with small delay");
|
||||
if (_updateURL) {
|
||||
[_updateManager setUpdateURL:_updateURL];
|
||||
if (_serverURL) {
|
||||
[_updateManager setServerURL:_serverURL];
|
||||
}
|
||||
[_updateManager performSelector:@selector(startManager) withObject:nil afterDelay:0.5f];
|
||||
}
|
||||
|
||||
// start FeedbackManager
|
||||
if (![self isFeedbackManagerDisabled]) {
|
||||
BITHockeyLog(@"INFO: Start FeedbackManager");
|
||||
if (_serverURL) {
|
||||
[_feedbackManager setServerURL:_serverURL];
|
||||
}
|
||||
[_feedbackManager performSelector:@selector(startManager) withObject:nil afterDelay:1.0f];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -202,15 +217,15 @@
|
||||
}
|
||||
|
||||
|
||||
- (void)setUpdateURL:(NSString *)anUpdateURL {
|
||||
- (void)setServerURL:(NSString *)aServerURL {
|
||||
// ensure url ends with a trailing slash
|
||||
if (![anUpdateURL hasSuffix:@"/"]) {
|
||||
anUpdateURL = [NSString stringWithFormat:@"%@/", anUpdateURL];
|
||||
if (![aServerURL hasSuffix:@"/"]) {
|
||||
aServerURL = [NSString stringWithFormat:@"%@/", aServerURL];
|
||||
}
|
||||
|
||||
if (_updateURL != anUpdateURL) {
|
||||
[_updateURL release];
|
||||
_updateURL = [anUpdateURL copy];
|
||||
if (_serverURL != aServerURL) {
|
||||
[_serverURL release];
|
||||
_serverURL = [aServerURL copy];
|
||||
}
|
||||
}
|
||||
|
||||
@ -219,8 +234,8 @@
|
||||
|
||||
- (BOOL)shouldUseLiveIdentifier {
|
||||
BOOL delegateResult = NO;
|
||||
if ([_delegate respondsToSelector:@selector(shouldUseLiveIdentifier)]) {
|
||||
delegateResult = [(NSObject <BITHockeyManagerDelegate>*)_delegate shouldUseLiveIdentifier];
|
||||
if ([_delegate respondsToSelector:@selector(shouldUseLiveIdentifierForHockeyManager:)]) {
|
||||
delegateResult = [(NSObject <BITHockeyManagerDelegate>*)_delegate shouldUseLiveIdentifierForHockeyManager:self];
|
||||
}
|
||||
|
||||
return (delegateResult) || (_appStoreEnvironment);
|
||||
@ -233,13 +248,16 @@
|
||||
|
||||
if (_validAppIdentifier) {
|
||||
BITHockeyLog(@"INFO: Setup CrashManager");
|
||||
_crashManager = [[BITCrashManager alloc] initWithAppIdentifier:_appIdentifier];
|
||||
_crashManager = [[BITCrashManager alloc] initWithAppIdentifier:_appIdentifier isAppStoreEnvironemt:_appStoreEnvironment];
|
||||
_crashManager.delegate = _delegate;
|
||||
|
||||
BITHockeyLog(@"INFO: Setup UpdateManager");
|
||||
_updateManager = [[BITUpdateManager alloc] initWithAppIdentifier:_appIdentifier isAppStoreEnvironemt:_appStoreEnvironment];
|
||||
_updateManager.delegate = _delegate;
|
||||
|
||||
BITHockeyLog(@"INFO: Setup FeedbackManager");
|
||||
_feedbackManager = [[BITFeedbackManager alloc] initWithAppIdentifier:_appIdentifier isAppStoreEnvironemt:_appStoreEnvironment];
|
||||
|
||||
#if JIRA_MOBILE_CONNECT_SUPPORT_ENABLED
|
||||
// Only if JMC is part of the project
|
||||
if ([[self class] isJMCPresent]) {
|
||||
|
@ -29,6 +29,9 @@
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
|
||||
@class BITHockeyManager;
|
||||
@class BITHockeyBaseManager;
|
||||
|
||||
/**
|
||||
The `BITHockeyManagerDelegate` formal protocol defines methods further configuring
|
||||
the behaviour of `BITHockeyManager`.
|
||||
@ -38,6 +41,11 @@
|
||||
|
||||
@optional
|
||||
|
||||
|
||||
///-----------------------------------------------------------------------------
|
||||
/// @name App Identifier usage
|
||||
///-----------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
Implement to force the usage of the live identifier
|
||||
|
||||
@ -46,13 +54,105 @@
|
||||
the App Store.
|
||||
|
||||
Example:
|
||||
- (BOOL)shouldUseLiveIdentifier {
|
||||
- (BOOL)shouldUseLiveIdentifierForHockeyManager:(BITHockeyManager *)hockeyManager {
|
||||
#ifdef (CONFIGURATION_Release)
|
||||
return YES;
|
||||
#endif
|
||||
return NO;
|
||||
}
|
||||
*/
|
||||
- (BOOL)shouldUseLiveIdentifier;
|
||||
- (BOOL)shouldUseLiveIdentifierForHockeyManager:(BITHockeyManager *)hockeyManager;
|
||||
|
||||
|
||||
///-----------------------------------------------------------------------------
|
||||
/// @name UI presentation
|
||||
///-----------------------------------------------------------------------------
|
||||
|
||||
|
||||
// optional parent view controller for the feedback screen when invoked via the alert view, default is the root UIWindow instance
|
||||
/**
|
||||
Return a custom parent view controller for presenting modal sheets
|
||||
|
||||
By default the SDK is using the root UIWindow instance to present any required
|
||||
view controllers. Overwrite this if this doesn't result in a satisfying
|
||||
behavior or if you want to define any other parent view controller.
|
||||
|
||||
@param hockeyManager The `BITHockeyManager` HockeyManager instance invoking this delegate
|
||||
@param componentManager The `BITHockeyBaseManager` component instance invoking this delegate
|
||||
*/
|
||||
- (UIViewController *)viewControllerForHockeyManager:(BITHockeyManager *)hockeyManager componentManager:(BITHockeyBaseManager *)componentManager;
|
||||
|
||||
|
||||
///-----------------------------------------------------------------------------
|
||||
/// @name Additional meta data
|
||||
///-----------------------------------------------------------------------------
|
||||
|
||||
|
||||
/** Return the userid that should used in the SDK components
|
||||
|
||||
Right now this is only used by the `BITCrashMananger` to attach to a crash report.
|
||||
|
||||
@param hockeyManager The `BITHockeyManager` HockeyManager instance invoking this delegate
|
||||
@param componentManager The `BITHockeyBaseManager` component instance invoking this delegate
|
||||
@see userNameForHockeyManager:
|
||||
@see userEmailForHockeyManager:
|
||||
@warning When returning a non nil value for the `BITCrashManager` component, crash reports
|
||||
are not anonymous any more and the crash alerts will not show the word "anonymous"!
|
||||
*/
|
||||
- (NSString *)userIDForHockeyManager:(BITHockeyManager *)hockeyManager componentManager:(BITHockeyBaseManager *)componentManager;
|
||||
|
||||
|
||||
/** Return the user name that should used in the SDK components
|
||||
|
||||
Right now this is used by the `BITCrashMananger` to attach to a crash report.
|
||||
`BITFeedbackManager` uses it too for assigning the user to a discussion thread.
|
||||
|
||||
You can find out the component requesting the user name like this:
|
||||
- (NSString *)userNameForHockeyManager:(BITHockeyManager *)hockeyManager componentManager:(BITHockeyBaseManager *)componentManager {
|
||||
if (componentManager == hockeyManager.feedbackManager) {
|
||||
return UserNameForFeedback;
|
||||
} else if (componentManager == hockeyManager.crashManager) {
|
||||
return UserNameForCrashReports;
|
||||
} else {
|
||||
return nil;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@param hockeyManager The `BITHockeyManager` HockeyManager instance invoking this delegate
|
||||
@param componentManager The `BITHockeyBaseManager` component instance invoking this delegate
|
||||
@see userIDForHockeyManager:
|
||||
@see userEmailForHockeyManager:
|
||||
@warning When returning a non nil value for the `BITCrashManager` component, crash reports
|
||||
are not anonymous any more and the crash alerts will not show the word "anonymous"!
|
||||
*/
|
||||
- (NSString *)userNameForHockeyManager:(BITHockeyManager *)hockeyManager componentManager:(BITHockeyBaseManager *)componentManager;
|
||||
|
||||
|
||||
/** Return the users email address that should used in the SDK components
|
||||
|
||||
Right now this is used by the `BITCrashMananger` to attach to a crash report.
|
||||
`BITFeedbackManager` uses it too for assigning the user to a discussion thread.
|
||||
|
||||
You can find out the component requesting the user name like this:
|
||||
- (NSString *)userNameForHockeyManager:(BITHockeyManager *)hockeyManager componentManager:(BITHockeyBaseManager *)componentManager {
|
||||
if (componentManager == hockeyManager.feedbackManager) {
|
||||
return UserNameForFeedback;
|
||||
} else if (componentManager == hockeyManager.crashManager) {
|
||||
return UserNameForCrashReports;
|
||||
} else {
|
||||
return nil;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@param hockeyManager The `BITHockeyManager` HockeyManager instance invoking this delegate
|
||||
@param componentManager The `BITHockeyBaseManager` component instance invoking this delegate
|
||||
@see userIDForHockeyManager:
|
||||
@see userNameForHockeyManager:
|
||||
@warning When returning a non nil value for the `BITCrashManager` component, crash reports
|
||||
are not anonymous any more and the crash alerts will not show the word "anonymous"!
|
||||
*/
|
||||
- (NSString *)userEmailForHockeyManager:(BITHockeyManager *)hockeyManager componentManager:(BITHockeyBaseManager *)componentManager;
|
||||
|
||||
@end
|
||||
|
37
Classes/BITHockeyManagerPrivate.h
Normal file
37
Classes/BITHockeyManagerPrivate.h
Normal file
@ -0,0 +1,37 @@
|
||||
/*
|
||||
* Author: Andreas Linde <mail@andreaslinde.de>
|
||||
*
|
||||
* Copyright (c) 2012 HockeyApp, Bit Stadium GmbH.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use,
|
||||
* copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following
|
||||
* conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||
* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
* OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
|
||||
@interface BITHockeyManager () {
|
||||
}
|
||||
|
||||
@property (nonatomic, assign) id delegate;
|
||||
|
||||
@end
|
@ -30,6 +30,9 @@
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
#import "BITHockeyBaseManager.h"
|
||||
|
||||
|
||||
// hockey crash manager status
|
||||
typedef enum {
|
||||
BITCrashManagerStatusDisabled = 0,
|
||||
@ -73,30 +76,7 @@ static NSString *kBITCrashManagerStatus = @"BITCrashManagerStatus";
|
||||
safe crash reporting: [Reliable Crash Reporting](http://goo.gl/WvTBR)
|
||||
*/
|
||||
|
||||
@interface BITCrashManager : NSObject {
|
||||
@private
|
||||
NSString *_appIdentifier;
|
||||
|
||||
NSMutableDictionary *_approvedCrashReports;
|
||||
|
||||
NSMutableArray *_crashFiles;
|
||||
NSString *_crashesDir;
|
||||
NSString *_settingsFile;
|
||||
NSString *_analyzerInProgressFile;
|
||||
NSFileManager *_fileManager;
|
||||
|
||||
BOOL _crashIdenticalCurrentVersion;
|
||||
|
||||
NSMutableData *_responseData;
|
||||
NSInteger _statusCode;
|
||||
|
||||
NSURLConnection *_urlConnection;
|
||||
|
||||
BOOL _sendingInProgress;
|
||||
BOOL _isSetup;
|
||||
|
||||
NSUncaughtExceptionHandler *_exceptionHandler;
|
||||
}
|
||||
@interface BITCrashManager : BITHockeyBaseManager
|
||||
|
||||
|
||||
///-----------------------------------------------------------------------------
|
@ -34,6 +34,8 @@
|
||||
#import "HockeySDK.h"
|
||||
#import "HockeySDKPrivate.h"
|
||||
|
||||
#import "BITHockeyManagerPrivate.h"
|
||||
#import "BITHockeyBaseManagerPrivate.h"
|
||||
#import "BITCrashManagerPrivate.h"
|
||||
#import "BITCrashReportTextFormatter.h"
|
||||
|
||||
@ -57,7 +59,27 @@
|
||||
|
||||
@end
|
||||
|
||||
@implementation BITCrashManager
|
||||
@implementation BITCrashManager {
|
||||
NSMutableDictionary *_approvedCrashReports;
|
||||
|
||||
NSMutableArray *_crashFiles;
|
||||
NSString *_crashesDir;
|
||||
NSString *_settingsFile;
|
||||
NSString *_analyzerInProgressFile;
|
||||
NSFileManager *_fileManager;
|
||||
|
||||
BOOL _crashIdenticalCurrentVersion;
|
||||
|
||||
NSMutableData *_responseData;
|
||||
NSInteger _statusCode;
|
||||
|
||||
NSURLConnection *_urlConnection;
|
||||
|
||||
BOOL _sendingInProgress;
|
||||
BOOL _isSetup;
|
||||
|
||||
NSUncaughtExceptionHandler *_exceptionHandler;
|
||||
}
|
||||
|
||||
@synthesize delegate = _delegate;
|
||||
@synthesize crashManagerStatus = _crashManagerStatus;
|
||||
@ -68,10 +90,9 @@
|
||||
@synthesize fileManager = _fileManager;
|
||||
|
||||
|
||||
- (id)initWithAppIdentifier:(NSString *)appIdentifier {
|
||||
- (id)init {
|
||||
if ((self = [super init])) {
|
||||
_updateURL = BITHOCKEYSDK_URL;
|
||||
_appIdentifier = appIdentifier;
|
||||
self.serverURL = BITHOCKEYSDK_URL;
|
||||
|
||||
_delegate = nil;
|
||||
_showAlwaysButton = NO;
|
||||
@ -134,12 +155,6 @@
|
||||
_delegate = nil;
|
||||
[[NSNotificationCenter defaultCenter] removeObserver:self name:BITHockeyNetworkDidBecomeReachableNotification object:nil];
|
||||
|
||||
[_updateURL release];
|
||||
_updateURL = nil;
|
||||
|
||||
[_appIdentifier release];
|
||||
_appIdentifier = nil;
|
||||
|
||||
[_urlConnection cancel];
|
||||
[_urlConnection release];
|
||||
_urlConnection = nil;
|
||||
@ -282,14 +297,26 @@
|
||||
NSString *applicationLog = @"";
|
||||
NSString *errorString = nil;
|
||||
|
||||
if (self.delegate != nil && [self.delegate respondsToSelector:@selector(userNameForCrashManager:)]) {
|
||||
username = [self.delegate userNameForCrashManager:self] ?: @"";
|
||||
if ([BITHockeyManager sharedHockeyManager].delegate &&
|
||||
[[BITHockeyManager sharedHockeyManager].delegate respondsToSelector:@selector(userNameForHockeyManager:componentManager:)]) {
|
||||
username = [[BITHockeyManager sharedHockeyManager].delegate
|
||||
userNameForHockeyManager:[BITHockeyManager sharedHockeyManager]
|
||||
componentManager:self];
|
||||
}
|
||||
if ([BITHockeyManager sharedHockeyManager].delegate &&
|
||||
[[BITHockeyManager sharedHockeyManager].delegate respondsToSelector:@selector(userIDForHockeyManager:componentManager:)]) {
|
||||
username = [[BITHockeyManager sharedHockeyManager].delegate
|
||||
userIDForHockeyManager:[BITHockeyManager sharedHockeyManager]
|
||||
componentManager:self];
|
||||
}
|
||||
[metaDict setObject:username forKey:kBITCrashMetaUserName];
|
||||
|
||||
if (self.delegate != nil && [self.delegate respondsToSelector:@selector(userEmailForCrashManager:)]) {
|
||||
useremail = [self.delegate userEmailForCrashManager:self] ?: @"";
|
||||
}
|
||||
if ([BITHockeyManager sharedHockeyManager].delegate &&
|
||||
[[BITHockeyManager sharedHockeyManager].delegate respondsToSelector:@selector(userEmailForHockeyManager:componentManager:)]) {
|
||||
useremail = [[BITHockeyManager sharedHockeyManager].delegate
|
||||
userEmailForHockeyManager:[BITHockeyManager sharedHockeyManager]
|
||||
componentManager:self];
|
||||
}
|
||||
[metaDict setObject:useremail forKey:kBITCrashMetaUserEmail];
|
||||
|
||||
if (self.delegate != nil && [self.delegate respondsToSelector:@selector(applicationLogForCrashManager:)]) {
|
||||
@ -405,12 +432,24 @@
|
||||
NSString *username = nil;
|
||||
NSString *useremail = nil;
|
||||
|
||||
if (self.delegate != nil && [self.delegate respondsToSelector:@selector(userNameForCrashManager:)]) {
|
||||
username = [self.delegate userNameForCrashManager:self];
|
||||
if ([BITHockeyManager sharedHockeyManager].delegate &&
|
||||
[[BITHockeyManager sharedHockeyManager].delegate respondsToSelector:@selector(userNameForHockeyManager:componentManager:)]) {
|
||||
username = [[BITHockeyManager sharedHockeyManager].delegate
|
||||
userNameForHockeyManager:[BITHockeyManager sharedHockeyManager]
|
||||
componentManager:self];
|
||||
}
|
||||
if ([BITHockeyManager sharedHockeyManager].delegate &&
|
||||
[[BITHockeyManager sharedHockeyManager].delegate respondsToSelector:@selector(userIDForHockeyManager:componentManager:)]) {
|
||||
username = [[BITHockeyManager sharedHockeyManager].delegate
|
||||
userIDForHockeyManager:[BITHockeyManager sharedHockeyManager]
|
||||
componentManager:self];
|
||||
}
|
||||
|
||||
if (self.delegate != nil && [self.delegate respondsToSelector:@selector(userEmailForCrashManager:)]) {
|
||||
useremail = [self.delegate userEmailForCrashManager:self];
|
||||
if ([BITHockeyManager sharedHockeyManager].delegate &&
|
||||
[[BITHockeyManager sharedHockeyManager].delegate respondsToSelector:@selector(userEmailForHockeyManager:componentManager:)]) {
|
||||
useremail = [[BITHockeyManager sharedHockeyManager].delegate
|
||||
userEmailForHockeyManager:[BITHockeyManager sharedHockeyManager]
|
||||
componentManager:self];
|
||||
}
|
||||
|
||||
if (username || useremail) {
|
||||
@ -641,8 +680,8 @@
|
||||
|
||||
request = [NSMutableURLRequest requestWithURL:
|
||||
[NSURL URLWithString:[NSString stringWithFormat:@"%@api/2/apps/%@/crashes?sdk=%@&sdk_version=%@&feedbackEnabled=no",
|
||||
_updateURL,
|
||||
[_appIdentifier stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding],
|
||||
self.serverURL,
|
||||
[self encodedAppIdentifier],
|
||||
BITHOCKEY_NAME,
|
||||
BITHOCKEY_VERSION
|
||||
]
|
@ -54,29 +54,6 @@
|
||||
|
||||
|
||||
|
||||
/** Return the user name or userid that should be send along each crash report
|
||||
|
||||
@param crashManager The `BITCrashManager` instance invoking this delegate
|
||||
@see applicationLogForCrashManager:
|
||||
@see userEmailForCrashManager:
|
||||
@warning When returning a non nil value, crash reports are not anonymous any
|
||||
more and the alerts will not show the "anonymous" word!
|
||||
*/
|
||||
-(NSString *)userNameForCrashManager:(BITCrashManager *)crashManager;
|
||||
|
||||
|
||||
|
||||
/** Return the users email address that should be send along each crash report
|
||||
|
||||
@param crashManager The `BITCrashManager` instance invoking this delegate
|
||||
@see applicationLogForCrashManager:
|
||||
@see userNameForCrashManager:
|
||||
@warning When returning a non nil value, crash reports are not anonymous any
|
||||
more and the alerts will not show the "anonymous" word!
|
||||
*/
|
||||
-(NSString *)userEmailForCrashManager:(BITCrashManager *)crashManager;
|
||||
|
||||
|
||||
///-----------------------------------------------------------------------------
|
||||
/// @name Alert
|
||||
///-----------------------------------------------------------------------------
|
@ -34,11 +34,11 @@
|
||||
@interface BITCrashManager () {
|
||||
}
|
||||
|
||||
// set the server URL
|
||||
@property (nonatomic, retain) NSString *updateURL;
|
||||
|
||||
- (id)initWithAppIdentifier:(NSString *)appIdentifier;
|
||||
|
||||
- (void)startManager;
|
||||
//// set the server URL
|
||||
//@property (nonatomic, retain) NSString *serverURL;
|
||||
//
|
||||
//- (id)initWithAppIdentifier:(NSString *)appIdentifier;
|
||||
//
|
||||
//- (void)startManager;
|
||||
|
||||
@end
|
37
Classes/Feedback/BITFeedbackComposeViewController.h
Normal file
37
Classes/Feedback/BITFeedbackComposeViewController.h
Normal file
@ -0,0 +1,37 @@
|
||||
/*
|
||||
* Author: Andreas Linde <mail@andreaslinde.de>
|
||||
*
|
||||
* Copyright (c) 2012 HockeyApp, Bit Stadium GmbH.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use,
|
||||
* copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following
|
||||
* conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||
* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
* OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
|
||||
#import <UIKit/UIKit.h>
|
||||
#import "BITHockeyBaseViewController.h"
|
||||
|
||||
@interface BITFeedbackComposeViewController : BITHockeyBaseViewController <UITextViewDelegate>
|
||||
|
||||
- (id)init;
|
||||
|
||||
@end
|
202
Classes/Feedback/BITFeedbackComposeViewController.m
Normal file
202
Classes/Feedback/BITFeedbackComposeViewController.m
Normal file
@ -0,0 +1,202 @@
|
||||
/*
|
||||
* Author: Andreas Linde <mail@andreaslinde.de>
|
||||
*
|
||||
* Copyright (c) 2012 HockeyApp, Bit Stadium GmbH.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use,
|
||||
* copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following
|
||||
* conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||
* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
* OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
|
||||
#import "HockeySDK.h"
|
||||
#import "HockeySDKPrivate.h"
|
||||
|
||||
#import "BITFeedbackManagerPrivate.h"
|
||||
#import "BITFeedbackComposeViewController.h"
|
||||
#import "BITFeedbackUserDataViewController.h"
|
||||
|
||||
#import "BITHockeyHelper.h"
|
||||
|
||||
|
||||
@interface BITFeedbackComposeViewController () <BITFeedbackUserDataDelegate> {
|
||||
BOOL blockUserDataScreen;
|
||||
}
|
||||
|
||||
@property (nonatomic, assign) BITFeedbackManager *manager;
|
||||
@property (nonatomic, retain) UITextView *textView;
|
||||
|
||||
- (void)setUserDataAction;
|
||||
|
||||
@end
|
||||
|
||||
|
||||
|
||||
@implementation BITFeedbackComposeViewController
|
||||
|
||||
- (id)init {
|
||||
self = [super init];
|
||||
if (self) {
|
||||
self.title = BITHockeyLocalizedString(@"HockeyFeedbackComposeTitle");
|
||||
blockUserDataScreen = NO;
|
||||
_manager = [BITHockeyManager sharedHockeyManager].feedbackManager;
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)viewDidLoad {
|
||||
[super viewDidLoad];
|
||||
|
||||
self.view.backgroundColor = [UIColor whiteColor];
|
||||
|
||||
// Do any additional setup after loading the view.
|
||||
self.navigationItem.leftBarButtonItem = [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel
|
||||
target:self
|
||||
action:@selector(dismissAction:)] autorelease];
|
||||
|
||||
self.navigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc] initWithTitle:BITHockeyLocalizedString(@"HockeyFeedbackComposeSend")
|
||||
style:UIBarButtonItemStyleDone
|
||||
target:self
|
||||
action:@selector(sendAction:)] autorelease];
|
||||
|
||||
// message input textfield
|
||||
CGRect frame = CGRectZero;
|
||||
|
||||
if (UI_USER_INTERFACE_IDIOM() != UIUserInterfaceIdiomPad) {
|
||||
frame = CGRectMake(0, 0, self.view.bounds.size.width, 200);
|
||||
} else {
|
||||
frame = CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height);
|
||||
}
|
||||
self.textView = [[[UITextView alloc] initWithFrame:frame] autorelease];
|
||||
self.textView.font = [UIFont systemFontOfSize:17];
|
||||
self.textView.delegate = self;
|
||||
self.textView.backgroundColor = [UIColor whiteColor];
|
||||
self.textView.returnKeyType = UIReturnKeyDefault;
|
||||
self.textView.autoresizingMask = UIViewAutoresizingFlexibleWidth;
|
||||
[self.view addSubview:self.textView];
|
||||
}
|
||||
|
||||
- (void)viewDidUnload {
|
||||
[super viewDidUnload];
|
||||
// Release any retained subviews of the main view.
|
||||
}
|
||||
|
||||
- (void)viewWillAppear:(BOOL)animated {
|
||||
self.manager.currentFeedbackComposeViewController = self;
|
||||
|
||||
[super viewWillAppear:animated];
|
||||
|
||||
self.navigationItem.rightBarButtonItem.enabled = NO;
|
||||
}
|
||||
|
||||
- (void)viewDidAppear:(BOOL)animated {
|
||||
[super viewDidAppear:animated];
|
||||
|
||||
if ([self.manager askManualUserDataAvailable] &&
|
||||
([self.manager requireManualUserDataMissing] ||
|
||||
![self.manager didAskUserData])
|
||||
) {
|
||||
if (!blockUserDataScreen)
|
||||
[self setUserDataAction];
|
||||
} else {
|
||||
[self.textView becomeFirstResponder];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)viewWillDisappear:(BOOL)animated {
|
||||
self.manager.currentFeedbackComposeViewController = nil;
|
||||
|
||||
[super viewWillDisappear:animated];
|
||||
}
|
||||
|
||||
- (void)viewDidDisappear:(BOOL)animated {
|
||||
[super viewDidDisappear:animated];
|
||||
}
|
||||
|
||||
|
||||
#pragma mark - Private methods
|
||||
|
||||
- (void)setUserDataAction {
|
||||
BITFeedbackUserDataViewController *userController = [[[BITFeedbackUserDataViewController alloc] initWithStyle:UITableViewStyleGrouped] autorelease];
|
||||
userController.delegate = self;
|
||||
|
||||
UINavigationController *navController = [[[UINavigationController alloc] initWithRootViewController:userController] autorelease];
|
||||
|
||||
[self.navigationController presentModalViewController:navController animated:YES];
|
||||
}
|
||||
|
||||
- (void)dismissAction:(id)sender {
|
||||
[self dismissModalViewControllerAnimated:YES];
|
||||
}
|
||||
|
||||
- (void)sendAction:(id)sender {
|
||||
if ([self.textView isFirstResponder])
|
||||
[self.textView resignFirstResponder];
|
||||
|
||||
NSString *text = self.textView.text;
|
||||
|
||||
[self.manager submitMessageWithText:text];
|
||||
|
||||
[self dismissModalViewControllerAnimated:YES];
|
||||
}
|
||||
|
||||
|
||||
#pragma mark - CNSFeedbackUserDataDelegate
|
||||
|
||||
- (void)userDataUpdateCancelled {
|
||||
blockUserDataScreen = YES;
|
||||
|
||||
if ([self.manager requireManualUserDataMissing]) {
|
||||
if ([self.navigationController respondsToSelector:@selector(dismissViewControllerAnimated:completion:)]) {
|
||||
[self.navigationController dismissViewControllerAnimated:YES
|
||||
completion:^(void) {
|
||||
[self dismissModalViewControllerAnimated:YES];
|
||||
}];
|
||||
} else {
|
||||
[self dismissModalViewControllerAnimated:YES];
|
||||
[self performSelector:@selector(dismissAction:) withObject:nil afterDelay:0.4];
|
||||
}
|
||||
} else {
|
||||
[self.navigationController dismissModalViewControllerAnimated:YES];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)userDataUpdateFinished {
|
||||
[self.manager saveMessages];
|
||||
|
||||
[self.navigationController dismissModalViewControllerAnimated:YES];
|
||||
}
|
||||
|
||||
|
||||
#pragma mark - UITextViewDelegate
|
||||
|
||||
- (void)textViewDidChange:(UITextView *)textView {
|
||||
NSUInteger newLength = [textView.text length];
|
||||
if (newLength == 0) {
|
||||
self.navigationItem.rightBarButtonItem.enabled = NO;
|
||||
} else {
|
||||
self.navigationItem.rightBarButtonItem.enabled = YES;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@end
|
||||
|
48
Classes/Feedback/BITFeedbackListViewCell.h
Normal file
48
Classes/Feedback/BITFeedbackListViewCell.h
Normal file
@ -0,0 +1,48 @@
|
||||
/*
|
||||
* Author: Andreas Linde <mail@andreaslinde.de>
|
||||
*
|
||||
* Copyright (c) 2012 HockeyApp, Bit Stadium GmbH.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use,
|
||||
* copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following
|
||||
* conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||
* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
* OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
|
||||
#import <UIKit/UIKit.h>
|
||||
|
||||
typedef enum {
|
||||
BITFeedbackListViewCellStyleNormal = 0, // left aligned header style
|
||||
BITFeedbackListViewCellStyleRepsonse = 1 // right aligned header style for dev responses
|
||||
} BITFeedbackListViewCellStyle;
|
||||
|
||||
@interface BITFeedbackListViewCell : UITableViewCell
|
||||
|
||||
@property (nonatomic) BITFeedbackListViewCellStyle style;
|
||||
@property (nonatomic) BOOL sent;
|
||||
|
||||
@property (nonatomic, copy) NSDate *date;
|
||||
@property (nonatomic, copy) NSString *name;
|
||||
@property (nonatomic, copy) NSString *text;
|
||||
|
||||
+ (CGFloat) heightForRowWithText:(NSString *)text tableViewWidth:(CGFloat)width;
|
||||
|
||||
@end
|
161
Classes/Feedback/BITFeedbackListViewCell.m
Normal file
161
Classes/Feedback/BITFeedbackListViewCell.m
Normal file
@ -0,0 +1,161 @@
|
||||
/*
|
||||
* Author: Andreas Linde <mail@andreaslinde.de>
|
||||
*
|
||||
* Copyright (c) 2012 HockeyApp, Bit Stadium GmbH.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use,
|
||||
* copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following
|
||||
* conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||
* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
* OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
|
||||
#import "BITFeedbackListViewCell.h"
|
||||
|
||||
#define FRAME_SIDE_BORDER 10
|
||||
#define FRAME_TOP_BORDER 5
|
||||
#define FRAME_BOTTOM_BORDER 5
|
||||
|
||||
#define LABEL_DATE_Y 0
|
||||
#define LABEL_DATE_HEIGHT 15
|
||||
|
||||
#define LABEL_NAME_Y 15
|
||||
#define LABEL_NAME_HEIGHT 15
|
||||
|
||||
#define LABEL_TEXT_Y 40
|
||||
|
||||
@interface BITFeedbackListViewCell ()
|
||||
|
||||
@property (nonatomic, retain) NSDateFormatter *dateFormatter;
|
||||
|
||||
@property (nonatomic, retain) UILabel *labelDate;
|
||||
@property (nonatomic, retain) UILabel *labelName;
|
||||
@property (nonatomic, retain) UILabel *labelText;
|
||||
|
||||
@end
|
||||
|
||||
|
||||
@implementation BITFeedbackListViewCell
|
||||
|
||||
|
||||
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
|
||||
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
|
||||
if (self) {
|
||||
// Initialization code
|
||||
self.contentView.backgroundColor = [UIColor whiteColor];
|
||||
|
||||
_style = BITFeedbackListViewCellStyleNormal;
|
||||
_sent = YES;
|
||||
|
||||
_date = nil;
|
||||
_name = nil;
|
||||
_text = nil;
|
||||
|
||||
self.dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
|
||||
[self.dateFormatter setTimeStyle:NSDateFormatterNoStyle];
|
||||
[self.dateFormatter setDateStyle:NSDateFormatterMediumStyle];
|
||||
[self.dateFormatter setLocale:[NSLocale currentLocale]];
|
||||
[self.dateFormatter setDoesRelativeDateFormatting:YES];
|
||||
|
||||
self.labelDate = [[[UILabel alloc] init] autorelease];
|
||||
self.labelDate.font = [UIFont systemFontOfSize:12];
|
||||
|
||||
self.labelName = [[[UILabel alloc] init] autorelease];
|
||||
self.labelName.font = [UIFont systemFontOfSize:12];
|
||||
|
||||
self.labelText = [[[UILabel alloc] init] autorelease];
|
||||
self.labelText.font = [UIFont systemFontOfSize:14];
|
||||
self.labelText.numberOfLines = 0;
|
||||
self.labelText.textAlignment = UITextAlignmentLeft;
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)dealloc {
|
||||
[_dateFormatter release], _dateFormatter = nil;
|
||||
|
||||
[_labelDate release], _labelDate = nil;
|
||||
[_labelName release], _labelName = nil;
|
||||
[_labelText release], _labelText = nil;
|
||||
|
||||
[_date release], _date = nil;
|
||||
[_name release], _name = nil;
|
||||
[_text release], _text = nil;
|
||||
|
||||
[super dealloc];
|
||||
}
|
||||
|
||||
|
||||
#pragma mark - Layout
|
||||
|
||||
+ (CGFloat) heightForRowWithText:(NSString *)text tableViewWidth:(CGFloat)width {
|
||||
CGFloat calculatedHeight = [text sizeWithFont:[UIFont systemFontOfSize:14]
|
||||
constrainedToSize:CGSizeMake(width - (2 * FRAME_SIDE_BORDER), CGFLOAT_MAX)].height + LABEL_TEXT_Y + FRAME_BOTTOM_BORDER;
|
||||
return calculatedHeight;
|
||||
}
|
||||
|
||||
- (void)layoutSubviews {
|
||||
[super layoutSubviews];
|
||||
|
||||
NSString *dateString = [self.dateFormatter stringFromDate:self.date];
|
||||
[self.labelDate setText:dateString];// [self.date description]];
|
||||
[self.labelDate setFrame:CGRectMake(FRAME_SIDE_BORDER, FRAME_TOP_BORDER + LABEL_DATE_Y, self.frame.size.width - (2 * FRAME_SIDE_BORDER), LABEL_DATE_HEIGHT)];
|
||||
|
||||
[self.labelName setText:self.name];
|
||||
[self.labelName setFrame:CGRectMake(FRAME_SIDE_BORDER, FRAME_TOP_BORDER + LABEL_NAME_Y, self.frame.size.width - (2 * FRAME_SIDE_BORDER), LABEL_NAME_HEIGHT)];
|
||||
// header
|
||||
if (_style == BITFeedbackListViewCellStyleNormal) {
|
||||
self.contentView.backgroundColor = [UIColor whiteColor];
|
||||
self.labelDate.backgroundColor = [UIColor whiteColor];
|
||||
self.labelName.backgroundColor = [UIColor whiteColor];
|
||||
self.labelText.backgroundColor = [UIColor whiteColor];
|
||||
|
||||
self.labelDate.textAlignment = UITextAlignmentLeft;
|
||||
self.labelName.textAlignment = UITextAlignmentLeft;
|
||||
} else {
|
||||
self.contentView.backgroundColor = [UIColor lightGrayColor];
|
||||
self.labelDate.backgroundColor = [UIColor lightGrayColor];
|
||||
self.labelName.backgroundColor = [UIColor lightGrayColor];
|
||||
self.labelText.backgroundColor = [UIColor lightGrayColor];
|
||||
|
||||
self.labelDate.textAlignment = UITextAlignmentRight;
|
||||
self.labelName.textAlignment = UITextAlignmentRight;
|
||||
}
|
||||
|
||||
[self addSubview:self.labelDate];
|
||||
[self addSubview:self.labelName];
|
||||
|
||||
// text
|
||||
[self.labelText setText:self.text];
|
||||
CGSize size = CGSizeMake(self.frame.size.width - (2 * FRAME_SIDE_BORDER),
|
||||
[[self class] heightForRowWithText:self.text tableViewWidth:self.frame.size.width] - LABEL_TEXT_Y - FRAME_BOTTOM_BORDER);
|
||||
|
||||
[self.labelText setFrame : CGRectMake(FRAME_SIDE_BORDER, LABEL_TEXT_Y, size.width, size.height)];
|
||||
if (self.sent) {
|
||||
[self.labelText setTextColor:[UIColor darkTextColor]];
|
||||
} else {
|
||||
[self.labelText setTextColor:[UIColor lightGrayColor]];
|
||||
}
|
||||
|
||||
[self addSubview:self.labelText];
|
||||
}
|
||||
|
||||
|
||||
@end
|
38
Classes/Feedback/BITFeedbackListViewController.h
Normal file
38
Classes/Feedback/BITFeedbackListViewController.h
Normal file
@ -0,0 +1,38 @@
|
||||
/*
|
||||
* Author: Andreas Linde <mail@andreaslinde.de>
|
||||
*
|
||||
* Copyright (c) 2012 HockeyApp, Bit Stadium GmbH.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use,
|
||||
* copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following
|
||||
* conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||
* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
* OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
|
||||
#import <UIKit/UIKit.h>
|
||||
|
||||
#import "BITHockeyBaseViewController.h"
|
||||
|
||||
|
||||
@interface BITFeedbackListViewController : BITHockeyBaseViewController <UITableViewDelegate, UITableViewDataSource> {
|
||||
}
|
||||
|
||||
@end
|
311
Classes/Feedback/BITFeedbackListViewController.m
Normal file
311
Classes/Feedback/BITFeedbackListViewController.m
Normal file
@ -0,0 +1,311 @@
|
||||
/*
|
||||
* Author: Andreas Linde <mail@andreaslinde.de>
|
||||
*
|
||||
* Copyright (c) 2012 HockeyApp, Bit Stadium GmbH.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use,
|
||||
* copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following
|
||||
* conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||
* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
* OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
|
||||
#import "HockeySDK.h"
|
||||
#import "HockeySDKPrivate.h"
|
||||
|
||||
#import "BITFeedbackManagerPrivate.h"
|
||||
#import "BITFeedbackListViewController.h"
|
||||
#import "BITFeedbackListViewCell.h"
|
||||
#import "BITFeedbackComposeViewController.h"
|
||||
#import "BITFeedbackUserDataViewController.h"
|
||||
#import "BITFeedbackMessage.h"
|
||||
|
||||
#import "BITHockeyHelper.h"
|
||||
|
||||
|
||||
@interface BITFeedbackListViewController () <BITFeedbackUserDataDelegate>
|
||||
@property (nonatomic, assign) BITFeedbackManager *manager;
|
||||
@property (nonatomic, retain) UITableView *tableView;
|
||||
|
||||
@property (nonatomic, retain) NSDateFormatter *lastUpdateDateFormatter;
|
||||
@end
|
||||
|
||||
@implementation BITFeedbackListViewController
|
||||
|
||||
- (id)init {
|
||||
if ((self = [super init])) {
|
||||
_manager = [BITHockeyManager sharedHockeyManager].feedbackManager;
|
||||
|
||||
self.lastUpdateDateFormatter = [[[NSDateFormatter alloc] init] autorelease];
|
||||
[self.lastUpdateDateFormatter setDateStyle:NSDateFormatterShortStyle];
|
||||
[self.lastUpdateDateFormatter setTimeStyle:NSDateFormatterShortStyle];
|
||||
self.lastUpdateDateFormatter.locale = [NSLocale currentLocale];
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
|
||||
- (void)dealloc {
|
||||
[_tableView release], _tableView = nil;
|
||||
[_lastUpdateDateFormatter release]; _lastUpdateDateFormatter = nil;
|
||||
|
||||
[super dealloc];
|
||||
}
|
||||
|
||||
|
||||
#pragma mark - View lifecycle
|
||||
|
||||
- (void)viewDidLoad {
|
||||
[super viewDidLoad];
|
||||
|
||||
[[NSNotificationCenter defaultCenter] addObserver:self
|
||||
selector:@selector(updateList)
|
||||
name:BITHockeyFeedbackMessagesUpdated
|
||||
object:nil];
|
||||
|
||||
self.title = BITHockeyLocalizedString(@"HockeyFeedbackListTitle");
|
||||
|
||||
self.tableView = [[[UITableView alloc] initWithFrame:self.view.bounds] autorelease];
|
||||
self.tableView.delegate = self;
|
||||
self.tableView.dataSource = self;
|
||||
self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
|
||||
[self.tableView setAutoresizingMask:UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth];
|
||||
[self.tableView setBackgroundColor:[UIColor colorWithRed:0.82 green:0.84 blue:0.84 alpha:1]];
|
||||
[self.tableView setSeparatorColor:[UIColor colorWithRed:0.79 green:0.79 blue:0.79 alpha:1]];
|
||||
[self.view addSubview:self.tableView];
|
||||
|
||||
self.navigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh
|
||||
target:self
|
||||
action:@selector(reloadList)] autorelease];
|
||||
|
||||
}
|
||||
|
||||
- (void)viewDidUnload {
|
||||
[[NSNotificationCenter defaultCenter] removeObserver:self name:BITHockeyFeedbackMessagesUpdated object:nil];
|
||||
|
||||
[super viewDidUnload];
|
||||
}
|
||||
|
||||
- (void)reloadList {
|
||||
[self.manager updateMessagesList];
|
||||
}
|
||||
|
||||
- (void)updateList {
|
||||
CGSize contentSize = self.tableView.contentSize;
|
||||
CGPoint contentOffset = self.tableView.contentOffset;
|
||||
|
||||
[self.tableView reloadData];
|
||||
if (self.tableView.contentSize.height > contentSize.height)
|
||||
[self.tableView setContentOffset:CGPointMake(contentOffset.x, self.tableView.contentSize.height - contentSize.height + contentOffset.y) animated:NO];
|
||||
|
||||
[self.tableView flashScrollIndicators];
|
||||
}
|
||||
|
||||
- (void)viewWillAppear:(BOOL)animated {
|
||||
self.manager.currentFeedbackListViewController = self;
|
||||
|
||||
[super viewWillAppear:animated];
|
||||
|
||||
[self.tableView reloadData];
|
||||
}
|
||||
|
||||
- (void)viewWillDisappear:(BOOL)animated {
|
||||
self.manager.currentFeedbackListViewController = nil;
|
||||
|
||||
[super viewWillDisappear:animated];
|
||||
}
|
||||
|
||||
|
||||
#pragma mark - Private methods
|
||||
|
||||
- (void)setUserDataAction:(id)sender {
|
||||
BITFeedbackUserDataViewController *userController = [[[BITFeedbackUserDataViewController alloc] initWithStyle:UITableViewStyleGrouped] autorelease];
|
||||
userController.delegate = self;
|
||||
|
||||
UINavigationController *navController = [[[UINavigationController alloc] initWithRootViewController:userController] autorelease];
|
||||
|
||||
[self.navigationController presentModalViewController:navController animated:YES];
|
||||
}
|
||||
|
||||
- (void)newFeedbackAction:(id)sender {
|
||||
BITFeedbackComposeViewController *composeController = [[[BITFeedbackComposeViewController alloc] init] autorelease];
|
||||
|
||||
UINavigationController *navController = [[[UINavigationController alloc] initWithRootViewController:composeController] autorelease];
|
||||
|
||||
[self.navigationController presentModalViewController:navController animated:YES];
|
||||
}
|
||||
|
||||
|
||||
#pragma mark - BITFeedbackUserDataDelegate
|
||||
|
||||
-(void)userDataUpdateCancelled {
|
||||
[self.navigationController dismissModalViewControllerAnimated:YES];
|
||||
}
|
||||
|
||||
-(void)userDataUpdateFinished {
|
||||
[self.manager saveMessages];
|
||||
|
||||
[self.navigationController dismissModalViewControllerAnimated:YES];
|
||||
}
|
||||
|
||||
|
||||
#pragma mark - Table view data source
|
||||
|
||||
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
|
||||
NSInteger rows = 2;
|
||||
if ([self.manager isManualUserDataAvailable] || [self.manager didAskUserData])
|
||||
rows++;
|
||||
|
||||
return rows;
|
||||
}
|
||||
|
||||
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
|
||||
if (section == 0) {
|
||||
return 2;
|
||||
} else if (section == 2) {
|
||||
return 1;
|
||||
} else {
|
||||
return [self.manager numberOfMessages];
|
||||
}
|
||||
}
|
||||
|
||||
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
|
||||
static NSString *CellIdentifier = @"MessageCell";
|
||||
static NSString *LastUpdateIdentifier = @"LastUpdateCell";
|
||||
static NSString *ButtonIdentifier = @"ButtonCell";
|
||||
|
||||
if (indexPath.section == 0 && indexPath.row == 1) {
|
||||
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:LastUpdateIdentifier];
|
||||
|
||||
if (!cell) {
|
||||
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:LastUpdateIdentifier] autorelease];
|
||||
cell.textLabel.font = [UIFont systemFontOfSize:10];
|
||||
cell.accessoryType = UITableViewCellAccessoryNone;
|
||||
cell.selectionStyle = UITableViewCellSelectionStyleNone;
|
||||
cell.textLabel.textAlignment = UITextAlignmentCenter;
|
||||
}
|
||||
|
||||
cell.textLabel.text = [NSString stringWithFormat:BITHockeyLocalizedString(@"HockeyFeedbackListLastUpdated"),
|
||||
[self.manager lastCheck] ? [self.lastUpdateDateFormatter stringFromDate:[self.manager lastCheck]] : BITHockeyLocalizedString(@"HockeyFeedbackListNeverUpdated")];
|
||||
|
||||
return cell;
|
||||
} else if (indexPath.section == 0 || indexPath.section == 2) {
|
||||
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ButtonIdentifier];
|
||||
|
||||
if (!cell) {
|
||||
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ButtonIdentifier] autorelease];
|
||||
cell.textLabel.font = [UIFont systemFontOfSize:14];
|
||||
cell.textLabel.numberOfLines = 0;
|
||||
cell.accessoryType = UITableViewCellAccessoryNone;
|
||||
cell.selectionStyle = UITableViewCellSelectionStyleNone;
|
||||
}
|
||||
|
||||
UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
|
||||
[button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
|
||||
[button setTitleShadowColor:[UIColor lightGrayColor] forState:UIControlStateNormal];
|
||||
if (indexPath.section == 0) {
|
||||
if ([self.manager numberOfMessages] == 0) {
|
||||
[button setTitle:BITHockeyLocalizedString(@"HockeyFeedbackListButonWriteFeedback") forState:UIControlStateNormal];
|
||||
} else {
|
||||
[button setTitle:BITHockeyLocalizedString(@"HockeyFeedbackListButonWriteResponse") forState:UIControlStateNormal];
|
||||
}
|
||||
[button addTarget:self action:@selector(newFeedbackAction:) forControlEvents:UIControlEventTouchUpInside];
|
||||
} else {
|
||||
NSString *title = @"";
|
||||
if ([self.manager requireUserName] == BITFeedbackUserDataElementRequired ||
|
||||
([self.manager requireUserName] == BITFeedbackUserDataElementOptional && [self.manager userName] != nil)
|
||||
) {
|
||||
title = [NSString stringWithFormat:BITHockeyLocalizedString(@"HockeyFeedbackListButonUserDataWithName"), [self.manager userName]];
|
||||
} else if ([self.manager requireUserEmail] == BITFeedbackUserDataElementRequired ||
|
||||
([self.manager requireUserEmail] == BITFeedbackUserDataElementOptional && [self.manager userEmail] != nil)
|
||||
) {
|
||||
title = [NSString stringWithFormat:BITHockeyLocalizedString(@"HockeyFeedbackListButonUserDataWithEmail"), [self.manager userEmail]];
|
||||
} else if ([self.manager requireUserName] == BITFeedbackUserDataElementOptional) {
|
||||
title = BITHockeyLocalizedString(@"HockeyFeedbackListButonUserDataSetName");
|
||||
} else {
|
||||
title = BITHockeyLocalizedString(@"HockeyFeedbackListButonUserDataSetEmail");
|
||||
}
|
||||
[button setTitle:title forState:UIControlStateNormal];
|
||||
[button addTarget:self action:@selector(setUserDataAction:) forControlEvents:UIControlEventTouchUpInside];
|
||||
}
|
||||
[button setFrame: CGRectMake( 10.0f, 12.0f, self.view.frame.size.width - 20.0f, 50.0f)];
|
||||
|
||||
[cell addSubview:button];
|
||||
|
||||
return cell;
|
||||
} else {
|
||||
BITFeedbackListViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
|
||||
|
||||
if (!cell) {
|
||||
cell = [[[BITFeedbackListViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
|
||||
cell.accessoryType = UITableViewCellAccessoryNone;
|
||||
cell.selectionStyle = UITableViewCellSelectionStyleNone;
|
||||
}
|
||||
|
||||
BITFeedbackMessage *message = [self.manager messageAtIndex:indexPath.row];
|
||||
cell.date = message.date;
|
||||
|
||||
if (message.userMessage) {
|
||||
cell.style = BITFeedbackListViewCellStyleNormal;
|
||||
if ([self.manager requireUserName] == BITFeedbackUserDataElementRequired ||
|
||||
([self.manager requireUserName] == BITFeedbackUserDataElementOptional && [self.manager userName] != nil)
|
||||
) {
|
||||
cell.name = [self.manager userName];
|
||||
} else {
|
||||
cell.name = BITHockeyLocalizedString(@"HockeyFeedbackListMessageUserNameNotSet");
|
||||
}
|
||||
} else {
|
||||
cell.style = BITFeedbackListViewCellStyleRepsonse;
|
||||
if (message.name && [message.name length] > 0) {
|
||||
cell.name = message.name;
|
||||
} else {
|
||||
cell.name = BITHockeyLocalizedString(@"HockeyFeedbackListmessageResponseNameNotSet");
|
||||
}
|
||||
}
|
||||
|
||||
if (message.text) {
|
||||
cell.text = message.text;
|
||||
} else {
|
||||
cell.text = @"";
|
||||
}
|
||||
|
||||
return cell;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#pragma mark - Table view delegate
|
||||
|
||||
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
|
||||
if (indexPath.section == 0 && indexPath.row == 1) {
|
||||
return 28;
|
||||
}
|
||||
if (indexPath.section == 0 || indexPath.section == 2) {
|
||||
return 74;
|
||||
}
|
||||
|
||||
BITFeedbackMessage *message = [self.manager messageAtIndex:indexPath.row];
|
||||
if (!message) return 44;
|
||||
|
||||
// BITFeedbackListViewCell *cell = (BITFeedbackListViewCell *)[tableView cellForRowAtIndexPath:indexPath];
|
||||
return [BITFeedbackListViewCell heightForRowWithText:message.text tableViewWidth:self.view.frame.size.width];
|
||||
}
|
||||
|
||||
@end
|
94
Classes/Feedback/BITFeedbackManager.h
Normal file
94
Classes/Feedback/BITFeedbackManager.h
Normal file
@ -0,0 +1,94 @@
|
||||
/*
|
||||
* Author: Andreas Linde <mail@andreaslinde.de>
|
||||
*
|
||||
* Copyright (c) 2012 HockeyApp, Bit Stadium GmbH.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use,
|
||||
* copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following
|
||||
* conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||
* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
* OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
#import "BITHockeyBaseManager.h"
|
||||
#import "BITFeedbackListViewController.h"
|
||||
#import "BITFeedbackComposeViewController.h"
|
||||
|
||||
|
||||
typedef enum {
|
||||
BITFeedbackUserDataElementDontShow = 0, // don't ask for this user data element at all
|
||||
BITFeedbackUserDataElementOptional = 1, // the user may provide it, but does not have to
|
||||
BITFeedbackUserDataElementRequired = 2 // the user has to provide this to continue
|
||||
} BITFeedbackUserDataElement;
|
||||
|
||||
|
||||
@class BITFeedbackMessage;
|
||||
@protocol BITFeedbackManagerDelegate;
|
||||
|
||||
|
||||
@interface BITFeedbackManager : BITHockeyBaseManager <UIAlertViewDelegate>
|
||||
|
||||
@property (nonatomic, retain) BITFeedbackListViewController *currentFeedbackListViewController;
|
||||
@property (nonatomic, retain) BITFeedbackComposeViewController *currentFeedbackComposeViewController;
|
||||
@property (nonatomic) BOOL didAskUserData;
|
||||
|
||||
@property (nonatomic, retain) NSDate *lastCheck;
|
||||
|
||||
@property (nonatomic, readwrite) BITFeedbackUserDataElement requireUserName; // default is BITFeedbackUserDataRequired
|
||||
@property (nonatomic, readwrite) BITFeedbackUserDataElement requireUserEmail; // default is BITFeedbackUserDataRequired
|
||||
@property (nonatomic, readwrite) BOOL showAlertOnIncomingMessages; // default is YES
|
||||
|
||||
@property (nonatomic, copy) NSString *userName;
|
||||
@property (nonatomic, copy) NSString *userEmail;
|
||||
|
||||
|
||||
// convenience methode to create feedback view controller
|
||||
- (BITFeedbackListViewController *)feedbackListViewController:(BOOL)modal;
|
||||
|
||||
// load new messages from the server
|
||||
- (void)updateMessagesList;
|
||||
|
||||
// open feedback list view
|
||||
- (void)showFeedbackListView;
|
||||
|
||||
// open feedback compose view
|
||||
- (void)showFeedbackComposeView;
|
||||
|
||||
- (NSUInteger)numberOfMessages;
|
||||
- (BITFeedbackMessage *)messageAtIndex:(NSUInteger)index;
|
||||
|
||||
- (void)submitMessageWithText:(NSString *)text;
|
||||
- (void)submitPendingMessages;
|
||||
|
||||
// Returns YES if manual user data can be entered, required or optional
|
||||
- (BOOL)askManualUserDataAvailable;
|
||||
|
||||
// Returns YES if required user data is missing?
|
||||
- (BOOL)requireManualUserDataMissing;
|
||||
|
||||
// Returns YES if user data is available and can be edited
|
||||
- (BOOL)isManualUserDataAvailable;
|
||||
|
||||
// used in the user data screen
|
||||
- (void)updateDidAskUserData;
|
||||
|
||||
@end
|
626
Classes/Feedback/BITFeedbackManager.m
Normal file
626
Classes/Feedback/BITFeedbackManager.m
Normal file
@ -0,0 +1,626 @@
|
||||
/*
|
||||
* Author: Andreas Linde <mail@andreaslinde.de>
|
||||
*
|
||||
* Copyright (c) 2012 HockeyApp, Bit Stadium GmbH.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use,
|
||||
* copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following
|
||||
* conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||
* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
* OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
|
||||
#import "HockeySDK.h"
|
||||
#import "HockeySDKPrivate.h"
|
||||
|
||||
#import "BITFeedbackManager.h"
|
||||
#import "BITFeedbackManagerPrivate.h"
|
||||
#import "BITHockeyBaseManagerPrivate.h"
|
||||
|
||||
#import "BITHockeyManagerPrivate.h"
|
||||
|
||||
#import "BITFeedbackMessage.h"
|
||||
#import "BITHockeyHelper.h"
|
||||
|
||||
|
||||
#define kBITFeedbackUserDataAsked @"HockeyFeedbackUserDataAsked"
|
||||
#define kBITFeedbackDateOfLastCheck @"HockeyFeedbackDateOfLastCheck"
|
||||
#define kBITFeedbackMessages @"HockeyFeedbackMessages"
|
||||
#define kBITFeedbackToken @"HockeyFeedbackToken"
|
||||
#define kBITFeedbackName @"HockeyFeedbackName"
|
||||
#define kBITFeedbackEmail @"HockeyFeedbackEmail"
|
||||
|
||||
|
||||
@implementation BITFeedbackManager {
|
||||
NSFileManager *_fileManager;
|
||||
NSString *_feedbackDir;
|
||||
NSString *_settingsFile;
|
||||
}
|
||||
|
||||
#pragma mark - Initialization
|
||||
|
||||
- (id)init {
|
||||
if ((self = [super init])) {
|
||||
_currentFeedbackListViewController = nil;
|
||||
_currentFeedbackComposeViewController = nil;
|
||||
_didAskUserData = NO;
|
||||
|
||||
_requireUserName = BITFeedbackUserDataElementRequired;
|
||||
_requireUserEmail = BITFeedbackUserDataElementRequired;
|
||||
_showAlertOnIncomingMessages = YES;
|
||||
|
||||
_networkRequestInProgress = NO;
|
||||
_incomingMessagesAlertShowing = NO;
|
||||
_lastCheck = nil;
|
||||
_token = nil;
|
||||
_feedbackList = nil;
|
||||
|
||||
_fileManager = [[NSFileManager alloc] init];
|
||||
|
||||
// temporary directory for crashes grabbed from PLCrashReporter
|
||||
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
|
||||
_feedbackDir = [[[paths objectAtIndex:0] stringByAppendingPathComponent:BITHOCKEY_IDENTIFIER] retain];
|
||||
|
||||
if (![_fileManager fileExistsAtPath:_feedbackDir]) {
|
||||
NSDictionary *attributes = [NSDictionary dictionaryWithObject: [NSNumber numberWithUnsignedLong: 0755] forKey: NSFilePosixPermissions];
|
||||
NSError *theError = NULL;
|
||||
|
||||
[_fileManager createDirectoryAtPath:_feedbackDir withIntermediateDirectories: YES attributes: attributes error: &theError];
|
||||
}
|
||||
|
||||
_settingsFile = [[_feedbackDir stringByAppendingPathComponent:BITHOCKEY_FEEDBACK_SETTINGS] retain];
|
||||
|
||||
|
||||
_userName = nil;
|
||||
_userEmail = nil;
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)dealloc {
|
||||
[_currentFeedbackListViewController release], _currentFeedbackListViewController = nil;
|
||||
[_currentFeedbackComposeViewController release], _currentFeedbackComposeViewController = nil;
|
||||
|
||||
[_lastCheck release], _lastCheck = nil;
|
||||
[_token release], _token = nil;
|
||||
[_feedbackList release], _feedbackList = nil;
|
||||
|
||||
[_userName release], _userName = nil;
|
||||
[_userEmail release], _userEmail = nil;
|
||||
|
||||
[_fileManager release], _fileManager = nil;
|
||||
[_feedbackDir release], _feedbackDir = nil;
|
||||
[_settingsFile release], _settingsFile = nil;
|
||||
|
||||
[super dealloc];
|
||||
}
|
||||
|
||||
|
||||
#pragma mark - Feedback Modal UI
|
||||
|
||||
- (BITFeedbackListViewController *)feedbackListViewController:(BOOL)modal {
|
||||
return [[[BITFeedbackListViewController alloc] initWithModalStyle:modal] autorelease];
|
||||
}
|
||||
|
||||
- (void)showFeedbackListView {
|
||||
if (_currentFeedbackListViewController) {
|
||||
BITHockeyLog(@"INFO: update view already visible, aborting");
|
||||
return;
|
||||
}
|
||||
|
||||
[self showView:[self feedbackListViewController:YES]];
|
||||
}
|
||||
|
||||
- (BITFeedbackComposeViewController *)feedbackComposeViewController:(BOOL)modal {
|
||||
return [[[BITFeedbackComposeViewController alloc] initWithModalStyle:modal] autorelease];
|
||||
}
|
||||
|
||||
- (void)showFeedbackComposeView {
|
||||
if (_currentFeedbackComposeViewController) {
|
||||
BITHockeyLog(@"INFO: update view already visible, aborting");
|
||||
return;
|
||||
}
|
||||
|
||||
[self showView:[self feedbackComposeViewController:YES]];
|
||||
}
|
||||
|
||||
|
||||
#pragma mark - Manager Control
|
||||
|
||||
- (void)startManager {
|
||||
if ([self.feedbackList count] == 0) {
|
||||
[self loadMessages];
|
||||
}
|
||||
[self updateMessagesList];
|
||||
}
|
||||
|
||||
- (void)updateMessagesList {
|
||||
if (_networkRequestInProgress) return;
|
||||
|
||||
if ([self nextPendingMessage]) {
|
||||
[self submitPendingMessages];
|
||||
} else {
|
||||
[self fetchMessageUpdates];
|
||||
}
|
||||
}
|
||||
|
||||
#pragma mark - Local Storage
|
||||
|
||||
- (void)loadMessages {
|
||||
NSString *errorString = nil;
|
||||
NSPropertyListFormat format;
|
||||
|
||||
BOOL userNameViaDelegate = NO;
|
||||
BOOL userEmailViaDelegate = NO;
|
||||
|
||||
if ([BITHockeyManager sharedHockeyManager].delegate &&
|
||||
[[BITHockeyManager sharedHockeyManager].delegate respondsToSelector:@selector(userNameForHockeyManager:componentManager:)]) {
|
||||
userNameViaDelegate = YES;
|
||||
self.userName = [[BITHockeyManager sharedHockeyManager].delegate
|
||||
userNameForHockeyManager:[BITHockeyManager sharedHockeyManager]
|
||||
componentManager:self];
|
||||
self.requireUserName = BITFeedbackUserDataElementDontShow;
|
||||
self.requireUserEmail = BITFeedbackUserDataElementDontShow;
|
||||
}
|
||||
if ([BITHockeyManager sharedHockeyManager].delegate &&
|
||||
[[BITHockeyManager sharedHockeyManager].delegate respondsToSelector:@selector(userEmailForHockeyManager:componentManager:)]) {
|
||||
userEmailViaDelegate = YES;
|
||||
self.userEmail = [[BITHockeyManager sharedHockeyManager].delegate
|
||||
userEmailForHockeyManager:[BITHockeyManager sharedHockeyManager]
|
||||
componentManager:self];
|
||||
self.requireUserName = BITFeedbackUserDataElementDontShow;
|
||||
self.requireUserEmail = BITFeedbackUserDataElementDontShow;
|
||||
}
|
||||
|
||||
if (![_fileManager fileExistsAtPath:_settingsFile])
|
||||
return;
|
||||
|
||||
NSData *plist = [NSData dataWithContentsOfFile:_settingsFile];
|
||||
if (plist) {
|
||||
NSDictionary *rootObj = (NSDictionary *)[NSPropertyListSerialization
|
||||
propertyListFromData:plist
|
||||
mutabilityOption:NSPropertyListMutableContainersAndLeaves
|
||||
format:&format
|
||||
errorDescription:&errorString];
|
||||
|
||||
if (!userNameViaDelegate) {
|
||||
if ([rootObj objectForKey:kBITFeedbackName])
|
||||
self.userName = [rootObj objectForKey:kBITFeedbackName];
|
||||
}
|
||||
|
||||
if (!userEmailViaDelegate) {
|
||||
if ([rootObj objectForKey:kBITFeedbackEmail])
|
||||
self.userEmail = [rootObj objectForKey:kBITFeedbackEmail];
|
||||
}
|
||||
|
||||
if ([rootObj objectForKey:kBITFeedbackUserDataAsked])
|
||||
self.didAskUserData = YES;
|
||||
|
||||
if ([rootObj objectForKey:kBITFeedbackToken])
|
||||
self.token = [rootObj objectForKey:kBITFeedbackToken];
|
||||
|
||||
if ([rootObj objectForKey:kBITFeedbackName])
|
||||
self.userName = [rootObj objectForKey:kBITFeedbackName];
|
||||
|
||||
if ([rootObj objectForKey:kBITFeedbackEmail])
|
||||
self.userEmail = [rootObj objectForKey:kBITFeedbackEmail];
|
||||
|
||||
if ([rootObj objectForKey:kBITFeedbackDateOfLastCheck])
|
||||
self.lastCheck = [rootObj objectForKey:kBITFeedbackDateOfLastCheck];
|
||||
|
||||
if ([rootObj objectForKey:kBITFeedbackMessages]) {
|
||||
self.feedbackList = [NSMutableArray arrayWithArray:[rootObj objectForKey:kBITFeedbackMessages]];
|
||||
|
||||
[self sortFeedbackList];
|
||||
|
||||
// inform the UI to update its data in case the list is already showing
|
||||
[[NSNotificationCenter defaultCenter] postNotificationName:BITHockeyFeedbackMessagesUpdated object:nil];
|
||||
} else {
|
||||
self.feedbackList = [NSMutableArray array];
|
||||
}
|
||||
} else {
|
||||
self.feedbackList = [NSMutableArray array];
|
||||
BITHockeyLog(@"ERROR: Reading settings. %@", errorString);
|
||||
}
|
||||
|
||||
if (!self.lastCheck) {
|
||||
self.lastCheck = [NSDate distantPast];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
- (void)saveMessages {
|
||||
[self sortFeedbackList];
|
||||
|
||||
NSString *errorString = nil;
|
||||
|
||||
NSMutableDictionary *rootObj = [NSMutableDictionary dictionaryWithCapacity:2];
|
||||
|
||||
if (self.didAskUserData)
|
||||
[rootObj setObject:[NSNumber numberWithBool:YES] forKey:kBITFeedbackUserDataAsked];
|
||||
|
||||
if (self.token)
|
||||
[rootObj setObject:self.token forKey:kBITFeedbackToken];
|
||||
|
||||
if (self.userName)
|
||||
[rootObj setObject:self.userName forKey:kBITFeedbackName];
|
||||
|
||||
if (self.userEmail)
|
||||
[rootObj setObject:self.userEmail forKey:kBITFeedbackEmail];
|
||||
|
||||
[rootObj setObject:self.lastCheck forKey:kBITFeedbackDateOfLastCheck];
|
||||
|
||||
[rootObj setObject:self.feedbackList forKey:kBITFeedbackMessages];
|
||||
|
||||
NSData *plist = [NSPropertyListSerialization dataFromPropertyList:(id)rootObj
|
||||
format:NSPropertyListBinaryFormat_v1_0
|
||||
errorDescription:&errorString];
|
||||
if (plist) {
|
||||
[plist writeToFile:_settingsFile atomically:YES];
|
||||
} else {
|
||||
BITHockeyLog(@"ERROR: Writing settings. %@", errorString);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
- (void)updateDidAskUserData {
|
||||
if (!self.didAskUserData) {
|
||||
self.didAskUserData = YES;
|
||||
|
||||
[self saveMessages];
|
||||
}
|
||||
}
|
||||
|
||||
#pragma mark - Messages
|
||||
|
||||
- (void)sortFeedbackList {
|
||||
[self.feedbackList sortUsingComparator:^(BITFeedbackMessage *obj1, BITFeedbackMessage *obj2) {
|
||||
NSDate *date1 = [obj1 date];
|
||||
NSDate *date2 = [obj2 date];
|
||||
|
||||
// not send and send in progress messages on top, sorted by date
|
||||
// read and unread on bottom, sorted by date
|
||||
|
||||
if ([obj1 status] >= BITFeedbackMessageStatusSendInProgress && [obj2 status] < BITFeedbackMessageStatusSendInProgress) {
|
||||
return NSOrderedAscending;
|
||||
} else if ([obj1 status] < BITFeedbackMessageStatusSendInProgress && [obj2 status] >= BITFeedbackMessageStatusSendInProgress) {
|
||||
return NSOrderedDescending;
|
||||
} else {
|
||||
return (NSInteger)[date2 compare:date1];
|
||||
}
|
||||
}];
|
||||
}
|
||||
|
||||
- (NSUInteger)numberOfMessages {
|
||||
return [self.feedbackList count];
|
||||
}
|
||||
|
||||
- (BITFeedbackMessage *)messageAtIndex:(NSUInteger)index {
|
||||
if ([self.feedbackList count] > index) {
|
||||
return [self.feedbackList objectAtIndex:index];
|
||||
}
|
||||
|
||||
return nil;
|
||||
}
|
||||
|
||||
- (BITFeedbackMessage *)messageWithID:(NSNumber *)messageID {
|
||||
__block BITFeedbackMessage *message = nil;
|
||||
|
||||
[self.feedbackList enumerateObjectsUsingBlock:^(BITFeedbackMessage *objMessage, NSUInteger messagesIdx, BOOL *stop) {
|
||||
if ([[objMessage id] isEqualToNumber:messageID]) {
|
||||
message = objMessage;
|
||||
*stop = YES;
|
||||
}
|
||||
}];
|
||||
|
||||
return message;
|
||||
}
|
||||
|
||||
- (BITFeedbackMessage *)sendInProgressMessage {
|
||||
__block BITFeedbackMessage *message = nil;
|
||||
|
||||
[self.feedbackList enumerateObjectsUsingBlock:^(BITFeedbackMessage *objMessage, NSUInteger messagesIdx, BOOL *stop) {
|
||||
if ([objMessage status] == BITFeedbackMessageStatusSendInProgress) {
|
||||
message = objMessage;
|
||||
*stop = YES;
|
||||
}
|
||||
}];
|
||||
|
||||
return message;
|
||||
}
|
||||
|
||||
- (BITFeedbackMessage *)nextPendingMessage {
|
||||
__block BITFeedbackMessage *message = nil;
|
||||
|
||||
[self.feedbackList enumerateObjectsUsingBlock:^(BITFeedbackMessage *objMessage, NSUInteger messagesIdx, BOOL *stop) {
|
||||
if ([objMessage status] == BITFeedbackMessageStatusSendPending) {
|
||||
message = objMessage;
|
||||
*stop = YES;
|
||||
}
|
||||
}];
|
||||
|
||||
return message;
|
||||
}
|
||||
|
||||
|
||||
#pragma mark - User
|
||||
|
||||
- (BOOL)askManualUserDataAvailable {
|
||||
if (self.requireUserName == BITFeedbackUserDataElementDontShow &&
|
||||
self.requireUserEmail == BITFeedbackUserDataElementDontShow)
|
||||
return NO;
|
||||
|
||||
return YES;
|
||||
}
|
||||
|
||||
- (BOOL)requireManualUserDataMissing {
|
||||
if (self.requireUserName == BITFeedbackUserDataElementRequired && !self.userName)
|
||||
return YES;
|
||||
|
||||
if (self.requireUserEmail == BITFeedbackUserDataElementRequired && !self.userEmail)
|
||||
return YES;
|
||||
|
||||
return NO;
|
||||
}
|
||||
|
||||
- (BOOL)isManualUserDataAvailable {
|
||||
if ((self.requireUserName != BITFeedbackUserDataElementDontShow && self.userName) ||
|
||||
(self.requireUserEmail != BITFeedbackUserDataElementDontShow && self.userEmail))
|
||||
return YES;
|
||||
|
||||
return NO;
|
||||
}
|
||||
|
||||
|
||||
#pragma mark - Networking
|
||||
|
||||
- (BOOL)updateMessageListFromResponse:(NSDictionary *)jsonDictionary {
|
||||
NSDictionary *feedback = [jsonDictionary objectForKey:@"feedback"];
|
||||
NSString *token = [jsonDictionary objectForKey:@"token"];
|
||||
NSDictionary *feedbackObject = [jsonDictionary objectForKey:@"feedback"];
|
||||
if (feedback && token && feedbackObject) {
|
||||
// update the thread token, which is not available until the 1st message was successfully sent
|
||||
self.token = token;
|
||||
|
||||
self.lastCheck = [NSDate date];
|
||||
|
||||
// add all new messages
|
||||
NSArray *feedMessages = [feedbackObject objectForKey:@"messages"];
|
||||
|
||||
// get the message that was currently sent if available
|
||||
__block BITFeedbackMessage *sendInProgressMessage = [self sendInProgressMessage];
|
||||
__block BOOL messagesUpdated = NO;
|
||||
__block BOOL newResponseMessage = NO;
|
||||
|
||||
[feedMessages enumerateObjectsUsingBlock:^(id objMessage, NSUInteger messagesIdx, BOOL *stop) {
|
||||
NSNumber *messageID = [(NSDictionary *)objMessage objectForKey:@"id"];
|
||||
if (![self messageWithID:messageID]) {
|
||||
// check if this is the message that was sent right now
|
||||
if (sendInProgressMessage && [[sendInProgressMessage text] isEqualToString:[(NSDictionary *)objMessage objectForKey:@"text"]]) {
|
||||
sendInProgressMessage.date = [self parseRFC3339Date:[(NSDictionary *)objMessage objectForKey:@"created_at"]];
|
||||
sendInProgressMessage.id = messageID;
|
||||
sendInProgressMessage.status = BITFeedbackMessageStatusRead;
|
||||
} else {
|
||||
BITFeedbackMessage *message = [[[BITFeedbackMessage alloc] init] autorelease];
|
||||
message.text = [(NSDictionary *)objMessage objectForKey:@"text"];
|
||||
message.name = [(NSDictionary *)objMessage objectForKey:@"name"];
|
||||
message.email = [(NSDictionary *)objMessage objectForKey:@"email"];
|
||||
|
||||
message.date = [self parseRFC3339Date:[(NSDictionary *)objMessage objectForKey:@"created_at"]];
|
||||
message.id = [(NSDictionary *)objMessage objectForKey:@"id"];
|
||||
message.status = BITFeedbackMessageStatusUnread;
|
||||
|
||||
[self.feedbackList addObject:message];
|
||||
|
||||
newResponseMessage = YES;
|
||||
}
|
||||
messagesUpdated = YES;
|
||||
}
|
||||
}];
|
||||
|
||||
// new data arrived, so save it
|
||||
if (messagesUpdated) {
|
||||
[self saveMessages];
|
||||
|
||||
// inform the UI to update its data in case the list is already showing
|
||||
[[NSNotificationCenter defaultCenter] postNotificationName:BITHockeyFeedbackMessagesUpdated object:nil];
|
||||
}
|
||||
|
||||
// we got a new incoming message, trigger user notification system
|
||||
if (newResponseMessage) {
|
||||
[[NSNotificationCenter defaultCenter] postNotificationName:BITHockeyFeedbackNewMessagesReceived object:nil];
|
||||
|
||||
if (self.showAlertOnIncomingMessages && !self.currentFeedbackListViewController && !self.currentFeedbackComposeViewController) {
|
||||
UIAlertView *alertView = [[[UIAlertView alloc] initWithTitle:BITHockeyLocalizedString(@"HockeyFeedbackNewMessageTitle")
|
||||
message:BITHockeyLocalizedString(@"HockeyFeedbackNewMessageText")
|
||||
delegate:self
|
||||
cancelButtonTitle:BITHockeyLocalizedString(@"HockeyFeedbackIgnore")
|
||||
otherButtonTitles:BITHockeyLocalizedString(@"HockeyFeedbackShow"), nil
|
||||
] autorelease];
|
||||
[alertView setTag:0];
|
||||
[alertView show];
|
||||
_incomingMessagesAlertShowing = YES;
|
||||
}
|
||||
}
|
||||
|
||||
return YES;
|
||||
}
|
||||
|
||||
// quit
|
||||
return NO;
|
||||
}
|
||||
|
||||
- (void)sendNetworkRequestWithHTTPMethod:(NSString *)httpMethod withText:(NSString *)text completionHandler:(void (^)(NSError *err))completionHandler {
|
||||
NSString *boundary = @"----FOO";
|
||||
|
||||
_networkRequestInProgress = YES;
|
||||
|
||||
NSString *tokenParameter = @"";
|
||||
if ([self token]) {
|
||||
tokenParameter = [NSString stringWithFormat:@"/%@", [self token]];
|
||||
}
|
||||
NSMutableString *parameter = [NSMutableString stringWithFormat:@"api/2/apps/%@/feedback%@", [self encodedAppIdentifier], tokenParameter];
|
||||
|
||||
[parameter appendFormat:@"?format=json&bundle_version=%@&sdk=%@&sdk_version=%@",
|
||||
bit_URLEncodedString([[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleVersion"]),
|
||||
BITHOCKEY_NAME,
|
||||
BITHOCKEY_VERSION
|
||||
];
|
||||
|
||||
// build request & send
|
||||
NSString *url = [NSString stringWithFormat:@"https://warmup.hockeyapp.net/%@", parameter];
|
||||
BITHockeyLog(@"INFO: sending api request to %@", url);
|
||||
|
||||
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url] cachePolicy:1 timeoutInterval:10.0];
|
||||
[request setHTTPMethod:httpMethod];
|
||||
[request setValue:@"Hockey/iOS" forHTTPHeaderField:@"User-Agent"];
|
||||
[request setValue:@"gzip" forHTTPHeaderField:@"Accept-Encoding"];
|
||||
|
||||
if (text) {
|
||||
NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundary];
|
||||
[request setValue:contentType forHTTPHeaderField:@"Content-type"];
|
||||
|
||||
NSMutableData *postBody = [NSMutableData data];
|
||||
|
||||
[postBody appendData:[self appendPostValue:@"Apple" forKey:@"oem"]];
|
||||
[postBody appendData:[self appendPostValue:[[UIDevice currentDevice] systemVersion] forKey:@"os_version"]];
|
||||
[postBody appendData:[self appendPostValue:[self getDevicePlatform] forKey:@"model"]];
|
||||
[postBody appendData:[self appendPostValue:[[[NSBundle mainBundle] preferredLocalizations] objectAtIndex:0] forKey:@"lang"]];
|
||||
[postBody appendData:[self appendPostValue:[[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleVersion"] forKey:@"bundle_version"]];
|
||||
[postBody appendData:[self appendPostValue:text forKey:@"text"]];
|
||||
|
||||
if (self.userName) {
|
||||
[postBody appendData:[self appendPostValue:self.userName forKey:@"name"]];
|
||||
}
|
||||
if (self.userEmail) {
|
||||
[postBody appendData:[self appendPostValue:self.userEmail forKey:@"email"]];
|
||||
}
|
||||
|
||||
[postBody appendData:[[NSString stringWithFormat:@"--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
|
||||
|
||||
[request setHTTPBody:postBody];
|
||||
}
|
||||
|
||||
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *responseData, NSError *err) {
|
||||
_networkRequestInProgress = NO;
|
||||
|
||||
if (err) {
|
||||
completionHandler(err);
|
||||
} else {
|
||||
if ([responseData length]) {
|
||||
NSString *responseString = [[[NSString alloc] initWithBytes:[responseData bytes] length:[responseData length] encoding: NSUTF8StringEncoding] autorelease];
|
||||
BITHockeyLog(@"INFO: Received API response: %@", responseString);
|
||||
|
||||
NSError *error = NULL;
|
||||
|
||||
NSDictionary *feedDict = (NSDictionary *)bit_parseJSON(responseString, &error);
|
||||
|
||||
// server returned empty response?
|
||||
if (error) {
|
||||
[self reportError:error];
|
||||
} else if (![feedDict count]) {
|
||||
[self reportError:[NSError errorWithDomain:kBITFeedbackErrorDomain
|
||||
code:BITFeedbackAPIServerReturnedEmptyResponse
|
||||
userInfo:[NSDictionary dictionaryWithObjectsAndKeys:@"Server returned empty response.", NSLocalizedDescriptionKey, nil]]];
|
||||
} else {
|
||||
BITHockeyLog(@"INFO: Received API response: %@", responseString);
|
||||
NSString *status = [feedDict objectForKey:@"status"];
|
||||
if ([status compare:@"success"] != NSOrderedSame) {
|
||||
[self reportError:[NSError errorWithDomain:kBITFeedbackErrorDomain
|
||||
code:BITFeedbackAPIServerReturnedInvalidStatus
|
||||
userInfo:[NSDictionary dictionaryWithObjectsAndKeys:@"Server returned invalid status.", NSLocalizedDescriptionKey, nil]]];
|
||||
} else {
|
||||
[self updateMessageListFromResponse:feedDict];
|
||||
}
|
||||
}
|
||||
|
||||
completionHandler(err);
|
||||
}
|
||||
}
|
||||
}];
|
||||
}
|
||||
|
||||
- (void)fetchMessageUpdates {
|
||||
if ([self.feedbackList count] == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
[self sendNetworkRequestWithHTTPMethod:@"GET"
|
||||
withText:nil
|
||||
completionHandler:^(NSError *err){
|
||||
}];
|
||||
}
|
||||
|
||||
- (void)submitPendingMessages {
|
||||
BITFeedbackMessage *message = [self nextPendingMessage];
|
||||
|
||||
if (message) {
|
||||
[message setStatus:BITFeedbackMessageStatusSendInProgress];
|
||||
if (self.userName)
|
||||
[message setName:self.userName];
|
||||
if (self.userEmail)
|
||||
[message setName:self.userEmail];
|
||||
|
||||
NSString *httpMethod = @"POST";
|
||||
if ([self token]) {
|
||||
httpMethod = @"PUT";
|
||||
}
|
||||
|
||||
[self sendNetworkRequestWithHTTPMethod:httpMethod
|
||||
withText:[message text]
|
||||
completionHandler:^(NSError *err){
|
||||
if (err) {
|
||||
[message setStatus:BITFeedbackMessageStatusSendPending];
|
||||
|
||||
[self saveMessages];
|
||||
|
||||
// inform the UI to update its data in case the list is already showing
|
||||
[[NSNotificationCenter defaultCenter] postNotificationName:BITHockeyFeedbackMessagesUpdated object:nil];
|
||||
|
||||
}
|
||||
}];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)submitMessageWithText:(NSString *)text {
|
||||
BITFeedbackMessage *message = [[[BITFeedbackMessage alloc] init] autorelease];
|
||||
message.text = text;
|
||||
[message setStatus:BITFeedbackMessageStatusSendPending];
|
||||
[message setUserMessage:YES];
|
||||
|
||||
[self.feedbackList addObject:message];
|
||||
|
||||
[self submitPendingMessages];
|
||||
}
|
||||
|
||||
|
||||
#pragma mark - UIAlertViewDelegate
|
||||
|
||||
// invoke the selected action from the actionsheet for a location element
|
||||
- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex {
|
||||
|
||||
_incomingMessagesAlertShowing = NO;
|
||||
if (buttonIndex == [alertView firstOtherButtonIndex]) {
|
||||
// Show button has been clicked
|
||||
[self showFeedbackListView];
|
||||
}
|
||||
}
|
||||
|
||||
@end
|
56
Classes/Feedback/BITFeedbackManagerPrivate.h
Normal file
56
Classes/Feedback/BITFeedbackManagerPrivate.h
Normal file
@ -0,0 +1,56 @@
|
||||
/*
|
||||
* Author: Andreas Linde <mail@andreaslinde.de>
|
||||
* Kent Sutherland
|
||||
*
|
||||
* Copyright (c) 2012 HockeyApp, Bit Stadium GmbH.
|
||||
* Copyright (c) 2011 Andreas Linde & Kent Sutherland.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use,
|
||||
* copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following
|
||||
* conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||
* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
* OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
|
||||
@interface BITFeedbackManager () {
|
||||
}
|
||||
|
||||
|
||||
@property (nonatomic, readwrite) BOOL incomingMessagesAlertShowing;
|
||||
@property (nonatomic) BOOL networkRequestInProgress;
|
||||
|
||||
@property (nonatomic, retain) NSString *token;
|
||||
@property (nonatomic, retain) NSMutableArray *feedbackList;
|
||||
|
||||
|
||||
|
||||
- (BITFeedbackMessage *)messageWithID:(NSNumber *)messageID;
|
||||
- (BITFeedbackMessage *)sendInProgressMessage;
|
||||
- (BITFeedbackMessage *)nextPendingMessage;
|
||||
|
||||
- (void)saveMessages;
|
||||
|
||||
- (void)fetchMessageUpdates;
|
||||
- (BOOL)updateMessageListFromResponse:(NSDictionary *)jsonDictionary;
|
||||
|
||||
|
||||
@end
|
54
Classes/Feedback/BITFeedbackMessage.h
Normal file
54
Classes/Feedback/BITFeedbackMessage.h
Normal file
@ -0,0 +1,54 @@
|
||||
/*
|
||||
* Author: Andreas Linde <mail@andreaslinde.de>
|
||||
*
|
||||
* Copyright (c) 2012 HockeyApp, Bit Stadium GmbH.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use,
|
||||
* copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following
|
||||
* conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||
* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
* OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
typedef enum {
|
||||
// default and new messages from SDK per default
|
||||
BITFeedbackMessageStatusSendPending = 0,
|
||||
// sending of message is in progress
|
||||
BITFeedbackMessageStatusSendInProgress = 1,
|
||||
// new messages from server
|
||||
BITFeedbackMessageStatusUnread = 2,
|
||||
// messages from server once read and new local messages once successful send from SDK
|
||||
BITFeedbackMessageStatusRead = 3
|
||||
} BITFeedbackMessageStatus;
|
||||
|
||||
@interface BITFeedbackMessage : NSObject {
|
||||
}
|
||||
|
||||
@property (nonatomic, copy) NSString *text;
|
||||
@property (nonatomic, copy) NSString *name;
|
||||
@property (nonatomic, copy) NSString *email;
|
||||
@property (nonatomic, copy) NSDate *date;
|
||||
@property (nonatomic, copy) NSNumber *id;
|
||||
@property (nonatomic) BITFeedbackMessageStatus status;
|
||||
@property (nonatomic) BOOL userMessage;
|
||||
|
||||
@end
|
86
Classes/Feedback/BITFeedbackMessage.m
Normal file
86
Classes/Feedback/BITFeedbackMessage.m
Normal file
@ -0,0 +1,86 @@
|
||||
/*
|
||||
* Author: Andreas Linde <mail@andreaslinde.de>
|
||||
*
|
||||
* Copyright (c) 2012 HockeyApp, Bit Stadium GmbH.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use,
|
||||
* copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following
|
||||
* conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||
* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
* OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
|
||||
#import "BITFeedbackMessage.h"
|
||||
|
||||
@implementation BITFeedbackMessage
|
||||
|
||||
|
||||
#pragma mark - NSObject
|
||||
|
||||
- (id) init {
|
||||
if ((self = [super init])) {
|
||||
_text = nil;
|
||||
_name = nil;
|
||||
_email = nil;
|
||||
_date = nil;
|
||||
_id = [[NSNumber alloc] initWithInteger:0];
|
||||
_status = BITFeedbackMessageStatusSendPending;
|
||||
_userMessage = NO;
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)dealloc {
|
||||
[_text release], _text = nil;
|
||||
[_name release], _name = nil;
|
||||
[_email release], _email = nil;
|
||||
[_date release], _date = nil;
|
||||
[_id release], _id = nil;
|
||||
|
||||
[super dealloc];
|
||||
}
|
||||
|
||||
|
||||
#pragma mark - NSCoder
|
||||
|
||||
- (void)encodeWithCoder:(NSCoder *)encoder {
|
||||
[encoder encodeObject:self.text forKey:@"text"];
|
||||
[encoder encodeObject:self.name forKey:@"name"];
|
||||
[encoder encodeObject:self.email forKey:@"email"];
|
||||
[encoder encodeObject:self.date forKey:@"date"];
|
||||
[encoder encodeObject:self.id forKey:@"id"];
|
||||
[encoder encodeInteger:self.status forKey:@"status"];
|
||||
[encoder encodeInteger:self.userMessage forKey:@"userMessage"];
|
||||
}
|
||||
|
||||
- (id)initWithCoder:(NSCoder *)decoder {
|
||||
if ((self = [super init])) {
|
||||
self.text = [decoder decodeObjectForKey:@"text"];
|
||||
self.name = [decoder decodeObjectForKey:@"name"];
|
||||
self.email = [decoder decodeObjectForKey:@"email"];
|
||||
self.date = [decoder decodeObjectForKey:@"date"];
|
||||
self.id = [decoder decodeObjectForKey:@"id"];
|
||||
self.status = [decoder decodeIntegerForKey:@"status"];
|
||||
self.userMessage = [decoder decodeIntegerForKey:@"userMessage"];
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
@end
|
51
Classes/Feedback/BITFeedbackUserDataViewController.h
Normal file
51
Classes/Feedback/BITFeedbackUserDataViewController.h
Normal file
@ -0,0 +1,51 @@
|
||||
/*
|
||||
* Author: Andreas Linde <mail@andreaslinde.de>
|
||||
*
|
||||
* Copyright (c) 2012 HockeyApp, Bit Stadium GmbH.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use,
|
||||
* copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following
|
||||
* conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||
* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
* OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
|
||||
#import <UIKit/UIKit.h>
|
||||
|
||||
@protocol BITFeedbackUserDataDelegate;
|
||||
|
||||
@interface BITFeedbackUserDataViewController : UITableViewController <UITextFieldDelegate>
|
||||
|
||||
@property (nonatomic, assign) id <BITFeedbackUserDataDelegate> delegate;
|
||||
|
||||
@end
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
@protocol BITFeedbackUserDataDelegate <NSObject>
|
||||
|
||||
@required
|
||||
|
||||
// cancel action is invoked
|
||||
- (void)userDataUpdateCancelled;
|
||||
|
||||
// save action is invoked and all required data available
|
||||
- (void)userDataUpdateFinished;
|
||||
|
||||
@end
|
255
Classes/Feedback/BITFeedbackUserDataViewController.m
Normal file
255
Classes/Feedback/BITFeedbackUserDataViewController.m
Normal file
@ -0,0 +1,255 @@
|
||||
/*
|
||||
* Author: Andreas Linde <mail@andreaslinde.de>
|
||||
*
|
||||
* Copyright (c) 2012 HockeyApp, Bit Stadium GmbH.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use,
|
||||
* copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following
|
||||
* conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||
* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
* OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
|
||||
#import "HockeySDK.h"
|
||||
#import "HockeySDKPrivate.h"
|
||||
|
||||
#import "BITFeedbackUserDataViewController.h"
|
||||
|
||||
|
||||
@interface BITFeedbackUserDataViewController ()
|
||||
@property (nonatomic, assign) BITFeedbackManager *manager;
|
||||
|
||||
@property (nonatomic, copy) NSString *name;
|
||||
@property (nonatomic, copy) NSString *email;
|
||||
@end
|
||||
|
||||
|
||||
@implementation BITFeedbackUserDataViewController
|
||||
|
||||
|
||||
- (id)initWithStyle:(UITableViewStyle)style {
|
||||
self = [super initWithStyle:style];
|
||||
if (self) {
|
||||
self.title = BITHockeyLocalizedString(@"HockeyFeedbackUserDataTitle");
|
||||
|
||||
_delegate = nil;
|
||||
|
||||
_manager = [BITHockeyManager sharedHockeyManager].feedbackManager;
|
||||
_name = @"";
|
||||
_email = @"";
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)dealloc {
|
||||
[_name release], _name = nil;
|
||||
[_email release], _email = nil;
|
||||
|
||||
[super dealloc];
|
||||
}
|
||||
|
||||
- (void)viewDidLoad {
|
||||
[super viewDidLoad];
|
||||
|
||||
[self.tableView setScrollEnabled:NO];
|
||||
|
||||
// Do any additional setup after loading the view.
|
||||
self.navigationItem.leftBarButtonItem = [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel
|
||||
target:self
|
||||
action:@selector(dismissAction:)] autorelease];
|
||||
|
||||
self.navigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemSave
|
||||
target:self
|
||||
action:@selector(saveAction:)] autorelease];
|
||||
}
|
||||
|
||||
- (void)viewDidUnload {
|
||||
[super viewDidUnload];
|
||||
// Release any retained subviews of the main view.
|
||||
// e.g. self.myOutlet = nil;
|
||||
}
|
||||
|
||||
- (void)viewWillAppear:(BOOL)animated {
|
||||
[super viewWillAppear:animated];
|
||||
|
||||
if ([self.manager userName])
|
||||
self.name = [self.manager userName];
|
||||
|
||||
if ([self.manager userEmail])
|
||||
self.email = [self.manager userEmail];
|
||||
|
||||
[self.manager updateDidAskUserData];
|
||||
|
||||
self.navigationItem.rightBarButtonItem.enabled = [self allRequiredFieldsEntered];
|
||||
}
|
||||
|
||||
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
|
||||
return (interfaceOrientation == UIInterfaceOrientationPortrait);
|
||||
}
|
||||
|
||||
#pragma mark - Private methods
|
||||
|
||||
- (BOOL)allRequiredFieldsEntered {
|
||||
if ([self.manager requireUserName] == BITFeedbackUserDataElementRequired && [self.name length] == 0)
|
||||
return NO;
|
||||
|
||||
if ([self.manager requireUserEmail] == BITFeedbackUserDataElementRequired && [self.email length] == 0)
|
||||
return NO;
|
||||
|
||||
return YES;
|
||||
}
|
||||
|
||||
- (void)userNameEntered:(id)sender {
|
||||
self.name = [(UITextField *)sender text];
|
||||
|
||||
self.navigationItem.rightBarButtonItem.enabled = [self allRequiredFieldsEntered];
|
||||
}
|
||||
|
||||
- (void)userEmailEntered:(id)sender {
|
||||
self.email = [(UITextField *)sender text];
|
||||
|
||||
self.navigationItem.rightBarButtonItem.enabled = [self allRequiredFieldsEntered];
|
||||
}
|
||||
|
||||
- (void)dismissAction:(id)sender {
|
||||
[self.delegate userDataUpdateCancelled];
|
||||
}
|
||||
|
||||
- (void)saveAction:(id)sender {
|
||||
|
||||
if ([self.manager requireUserName]) {
|
||||
[self.manager setUserName:self.name];
|
||||
}
|
||||
|
||||
if ([self.manager requireUserEmail]) {
|
||||
[self.manager setUserEmail:self.email];
|
||||
}
|
||||
|
||||
[self.delegate userDataUpdateFinished];
|
||||
}
|
||||
|
||||
#pragma mark - Table view data source
|
||||
|
||||
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
|
||||
return 1;
|
||||
}
|
||||
|
||||
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
|
||||
NSInteger rows = 0;
|
||||
|
||||
if ([self.manager requireUserName] != BITFeedbackUserDataElementDontShow)
|
||||
rows ++;
|
||||
|
||||
if ([self.manager requireUserEmail] != BITFeedbackUserDataElementDontShow)
|
||||
rows ++;
|
||||
|
||||
return rows;
|
||||
}
|
||||
|
||||
- (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section {
|
||||
if (section == 0) {
|
||||
return BITHockeyLocalizedString(@"HockeyFeedbackUserDataDescription");
|
||||
}
|
||||
|
||||
return nil;
|
||||
}
|
||||
|
||||
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
|
||||
static NSString *CellIdentifier = @"InputCell";
|
||||
|
||||
UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier];
|
||||
if (cell == nil) {
|
||||
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
|
||||
|
||||
cell.accessoryType = UITableViewCellAccessoryNone;
|
||||
cell.selectionStyle = UITableViewCellSelectionStyleNone;
|
||||
cell.backgroundColor = [UIColor whiteColor];
|
||||
|
||||
UITextField *textField = [[[UITextField alloc] initWithFrame:CGRectMake(110, 10, 185, 30)] autorelease];
|
||||
textField.adjustsFontSizeToFitWidth = YES;
|
||||
textField.textColor = [UIColor blackColor];
|
||||
textField.backgroundColor = [UIColor lightGrayColor];
|
||||
|
||||
if ([indexPath row] == 0 && [self.manager requireUserName] != BITFeedbackUserDataElementDontShow) {
|
||||
textField.placeholder = BITHockeyLocalizedString(@"HockeyFeedbackUserDataNamePlaceHolder");
|
||||
textField.text = self.name;
|
||||
|
||||
textField.keyboardType = UIKeyboardTypeDefault;
|
||||
if ([self.manager requireUserEmail])
|
||||
textField.returnKeyType = UIReturnKeyNext;
|
||||
else
|
||||
textField.returnKeyType = UIReturnKeyDone;
|
||||
[textField addTarget:self action:@selector(userNameEntered:) forControlEvents:UIControlEventEditingChanged];
|
||||
[textField becomeFirstResponder];
|
||||
} else {
|
||||
textField.placeholder = BITHockeyLocalizedString(@"HockeyFeedbackUserDataEmailPlaceholder");
|
||||
textField.text = self.email;
|
||||
|
||||
textField.keyboardType = UIKeyboardTypeEmailAddress;
|
||||
textField.returnKeyType = UIReturnKeyDone;
|
||||
[textField addTarget:self action:@selector(userEmailEntered:) forControlEvents:UIControlEventEditingChanged];
|
||||
if (![self.manager requireUserName])
|
||||
[textField becomeFirstResponder];
|
||||
}
|
||||
|
||||
textField.backgroundColor = [UIColor whiteColor];
|
||||
textField.autocorrectionType = UITextAutocorrectionTypeNo;
|
||||
textField.autocapitalizationType = UITextAutocapitalizationTypeNone;
|
||||
textField.textAlignment = UITextAlignmentLeft;
|
||||
textField.delegate = self;
|
||||
textField.tag = indexPath.row;
|
||||
|
||||
textField.clearButtonMode = UITextFieldViewModeWhileEditing;
|
||||
[textField setEnabled: YES];
|
||||
|
||||
[cell addSubview:textField];
|
||||
}
|
||||
|
||||
if ([indexPath row] == 0 && [self.manager requireUserName] != BITFeedbackUserDataElementDontShow) {
|
||||
cell.textLabel.text = BITHockeyLocalizedString(@"HockeyFeedbackUserDataName");
|
||||
} else {
|
||||
cell.textLabel.text = BITHockeyLocalizedString(@"HockeyFeedbackUserDataEmail");
|
||||
}
|
||||
|
||||
return cell;
|
||||
}
|
||||
|
||||
|
||||
#pragma mark - UITextFieldDelegate
|
||||
|
||||
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
|
||||
NSInteger nextTag = textField.tag + 1;
|
||||
|
||||
UIResponder* nextResponder = [self.view viewWithTag:nextTag];
|
||||
if (nextResponder) {
|
||||
[nextResponder becomeFirstResponder];
|
||||
} else {
|
||||
if ([self allRequiredFieldsEntered]) {
|
||||
if ([textField isFirstResponder])
|
||||
[textField resignFirstResponder];
|
||||
|
||||
[self saveAction:nil];
|
||||
}
|
||||
}
|
||||
return NO;
|
||||
}
|
||||
|
||||
|
||||
@end
|
29
Classes/Helper/BITHockeyBaseManager.h
Normal file
29
Classes/Helper/BITHockeyBaseManager.h
Normal file
@ -0,0 +1,29 @@
|
||||
//
|
||||
// CNSHockeyBaseManager.h
|
||||
// HockeySDK
|
||||
//
|
||||
// Created by Andreas Linde on 04.06.12.
|
||||
// Copyright (c) 2012 __MyCompanyName__. All rights reserved.
|
||||
//
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
#import <UIKit/UIKit.h>
|
||||
|
||||
|
||||
|
||||
@interface BITHockeyBaseManager : NSObject
|
||||
|
||||
///-----------------------------------------------------------------------------
|
||||
/// @name Delegate
|
||||
///-----------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
Sets the `BITUpdateManagerDelegate` delegate.
|
||||
|
||||
When using `BITUpdateManager` to distribute updates of your beta or enterprise
|
||||
application, it is _REQUIRED_ to set this delegate and implement
|
||||
`[BITUpdateManagerDelegate customDeviceIdentifierForUpdateManager:]`!
|
||||
*/
|
||||
@property (nonatomic, assign) id delegate;
|
||||
|
||||
@end
|
192
Classes/Helper/BITHockeyBaseManager.m
Normal file
192
Classes/Helper/BITHockeyBaseManager.m
Normal file
@ -0,0 +1,192 @@
|
||||
//
|
||||
// CNSHockeyBaseManager.m
|
||||
// HockeySDK
|
||||
//
|
||||
// Created by Andreas Linde on 04.06.12.
|
||||
// Copyright (c) 2012 __MyCompanyName__. All rights reserved.
|
||||
//
|
||||
|
||||
#import "HockeySDK.h"
|
||||
#import "HockeySDKPrivate.h"
|
||||
|
||||
#import "BITHockeyHelper.h"
|
||||
|
||||
#import "BITHockeyBaseManager.h"
|
||||
#import "BITHockeyBaseManagerPrivate.h"
|
||||
#import "BITHockeyBaseViewController.h"
|
||||
|
||||
#import "BITHockeyManagerPrivate.h"
|
||||
|
||||
#import <sys/sysctl.h>
|
||||
|
||||
|
||||
@implementation BITHockeyBaseManager
|
||||
|
||||
|
||||
- (id)init {
|
||||
if ((self = [super init])) {
|
||||
_isAppStoreEnvironment = NO;
|
||||
_appIdentifier = nil;
|
||||
|
||||
_navController = nil;
|
||||
_barStyle = UIBarStyleDefault;
|
||||
_modalPresentationStyle = UIModalPresentationFormSheet;
|
||||
|
||||
_rfc3339Formatter = [[NSDateFormatter alloc] init];
|
||||
[_rfc3339Formatter setLocale:[[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"] autorelease]];
|
||||
[_rfc3339Formatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss'Z'"];
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (id)initWithAppIdentifier:(NSString *)appIdentifier isAppStoreEnvironemt:(BOOL)isAppStoreEnvironment {
|
||||
if ((self = [self init])) {
|
||||
|
||||
self.appIdentifier = appIdentifier;
|
||||
_isAppStoreEnvironment = isAppStoreEnvironment;
|
||||
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
|
||||
- (void)dealloc {
|
||||
[_appIdentifier release];
|
||||
|
||||
[_navController release], _navController = nil;
|
||||
|
||||
[_rfc3339Formatter release], _rfc3339Formatter = nil;
|
||||
|
||||
[super dealloc];
|
||||
}
|
||||
|
||||
|
||||
#pragma mark - Private
|
||||
|
||||
- (void)reportError:(NSError *)error {
|
||||
BITHockeyLog(@"Error: %@", [error localizedDescription]);
|
||||
}
|
||||
|
||||
- (NSString *)encodedAppIdentifier {
|
||||
return (_appIdentifier ? bit_URLEncodedString(_appIdentifier) : bit_URLEncodedString([[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleIdentifier"]));
|
||||
}
|
||||
|
||||
- (NSString *)getDevicePlatform {
|
||||
size_t size;
|
||||
sysctlbyname("hw.machine", NULL, &size, NULL, 0);
|
||||
char *answer = (char*)malloc(size);
|
||||
sysctlbyname("hw.machine", answer, &size, NULL, 0);
|
||||
NSString *platform = [NSString stringWithCString:answer encoding: NSUTF8StringEncoding];
|
||||
free(answer);
|
||||
return platform;
|
||||
}
|
||||
|
||||
- (UIWindow *)findVisibleWindow {
|
||||
UIWindow *visibleWindow = nil;
|
||||
|
||||
// if the rootViewController property (available >= iOS 4.0) of the main window is set, we present the modal view controller on top of the rootViewController
|
||||
NSArray *windows = [[UIApplication sharedApplication] windows];
|
||||
for (UIWindow *window in windows) {
|
||||
if (!window.hidden && !visibleWindow) {
|
||||
visibleWindow = window;
|
||||
}
|
||||
if ([UIWindow instancesRespondToSelector:@selector(rootViewController)]) {
|
||||
if ([window rootViewController]) {
|
||||
visibleWindow = window;
|
||||
BITHockeyLog(@"INFO: UIWindow with rootViewController found: %@", visibleWindow);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return visibleWindow;
|
||||
}
|
||||
|
||||
- (void)showView:(BITHockeyBaseViewController *)viewController {
|
||||
UIViewController *parentViewController = nil;
|
||||
|
||||
if ([[BITHockeyManager sharedHockeyManager].delegate respondsToSelector:@selector(viewControllerForHockeyManager:componentManager:)]) {
|
||||
parentViewController = [[BITHockeyManager sharedHockeyManager].delegate viewControllerForHockeyManager:[BITHockeyManager sharedHockeyManager] componentManager:self];
|
||||
}
|
||||
|
||||
UIWindow *visibleWindow = [self findVisibleWindow];
|
||||
|
||||
if (parentViewController == nil && [UIWindow instancesRespondToSelector:@selector(rootViewController)]) {
|
||||
parentViewController = [visibleWindow rootViewController];
|
||||
}
|
||||
|
||||
// use topmost modal view
|
||||
while (parentViewController.modalViewController) {
|
||||
parentViewController = parentViewController.modalViewController;
|
||||
}
|
||||
|
||||
// special addition to get rootViewController from three20 which has it's own controller handling
|
||||
if (NSClassFromString(@"TTNavigator")) {
|
||||
parentViewController = [[NSClassFromString(@"TTNavigator") performSelector:(NSSelectorFromString(@"navigator"))] visibleViewController];
|
||||
}
|
||||
|
||||
if (_navController != nil) [_navController release], _navController = nil;
|
||||
|
||||
_navController = [[UINavigationController alloc] initWithRootViewController:viewController];
|
||||
_navController.navigationBar.barStyle = _barStyle;
|
||||
_navController.modalPresentationStyle = _modalPresentationStyle;
|
||||
|
||||
if (parentViewController) {
|
||||
if ([_navController respondsToSelector:@selector(setModalTransitionStyle:)]) {
|
||||
_navController.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
|
||||
}
|
||||
|
||||
// page sheet for the iPad
|
||||
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad && [_navController respondsToSelector:@selector(setModalPresentationStyle:)]) {
|
||||
_navController.modalPresentationStyle = UIModalPresentationFormSheet;
|
||||
}
|
||||
|
||||
viewController.modalAnimated = YES;
|
||||
|
||||
[parentViewController presentModalViewController:_navController animated:YES];
|
||||
} else {
|
||||
// if not, we add a subview to the window. A bit hacky but should work in most circumstances.
|
||||
// Also, we don't get a nice animation for free, but hey, this is for beta not production users ;)
|
||||
BITHockeyLog(@"INFO: No rootViewController found, using UIWindow-approach: %@", visibleWindow);
|
||||
viewController.modalAnimated = NO;
|
||||
[visibleWindow addSubview:_navController.view];
|
||||
}
|
||||
}
|
||||
|
||||
#pragma mark - Manager Control
|
||||
|
||||
- (void)startManager {
|
||||
}
|
||||
|
||||
|
||||
#pragma mark - Networking
|
||||
|
||||
- (NSData *)appendPostValue:(NSString *)value forKey:(NSString *)key {
|
||||
NSString *boundary = @"----FOO";
|
||||
|
||||
NSMutableData *postBody = [NSMutableData data];
|
||||
|
||||
[postBody appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
|
||||
[postBody appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\";\r\n", key] dataUsingEncoding:NSUTF8StringEncoding]];
|
||||
[postBody appendData:[[NSString stringWithFormat:@"Content-Type: text\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
|
||||
[postBody appendData:[value dataUsingEncoding:NSUTF8StringEncoding]];
|
||||
[postBody appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
|
||||
|
||||
return postBody;
|
||||
}
|
||||
|
||||
|
||||
#pragma mark - Helpers
|
||||
|
||||
- (NSDate *)parseRFC3339Date:(NSString *)dateString {
|
||||
NSDate *date = nil;
|
||||
NSError *error = nil;
|
||||
if (![_rfc3339Formatter getObjectValue:&date forString:dateString range:nil error:&error]) {
|
||||
BITHockeyLog(@"INFO: Invalid date '%@' string: %@", dateString, error);
|
||||
}
|
||||
|
||||
return date;
|
||||
}
|
||||
|
||||
|
||||
@end
|
46
Classes/Helper/BITHockeyBaseManagerPrivate.h
Normal file
46
Classes/Helper/BITHockeyBaseManagerPrivate.h
Normal file
@ -0,0 +1,46 @@
|
||||
//
|
||||
// CNSHockeyBaseManager+Private.h
|
||||
// HockeySDK
|
||||
//
|
||||
// Created by Andreas Linde on 04.06.12.
|
||||
// Copyright (c) 2012 __MyCompanyName__. All rights reserved.
|
||||
//
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
#import <UIKit/UIKit.h>
|
||||
|
||||
@class BITHockeyBaseManager;
|
||||
@class BITHockeyBaseViewController;
|
||||
|
||||
@interface BITHockeyBaseManager() {
|
||||
UINavigationController *_navController;
|
||||
UIBarStyle _barStyle;
|
||||
UIModalPresentationStyle _modalPresentationStyle;
|
||||
|
||||
NSDateFormatter *_rfc3339Formatter;
|
||||
|
||||
BOOL _isAppStoreEnvironment;
|
||||
}
|
||||
|
||||
// set the server URL
|
||||
@property (nonatomic, retain) NSString *serverURL;
|
||||
|
||||
@property (nonatomic, retain) NSString *appIdentifier;
|
||||
|
||||
- (id)initWithAppIdentifier:(NSString *)appIdentifier isAppStoreEnvironemt:(BOOL)isAppStoreEnvironment;
|
||||
|
||||
- (void)startManager;
|
||||
|
||||
- (void)reportError:(NSError *)error;
|
||||
- (NSString *)encodedAppIdentifier;
|
||||
|
||||
- (NSString *)getDevicePlatform;
|
||||
|
||||
- (UIWindow *)findVisibleWindow;
|
||||
- (void)showView:(BITHockeyBaseViewController *)viewController;
|
||||
|
||||
- (NSData *)appendPostValue:(NSString *)value forKey:(NSString *)key;
|
||||
|
||||
- (NSDate *)parseRFC3339Date:(NSString *)dateString;
|
||||
|
||||
@end
|
17
Classes/Helper/BITHockeyBaseViewController.h
Normal file
17
Classes/Helper/BITHockeyBaseViewController.h
Normal file
@ -0,0 +1,17 @@
|
||||
//
|
||||
// CNSHockeyBaseViewController.h
|
||||
// HockeySDK
|
||||
//
|
||||
// Created by Andreas Linde on 04.06.12.
|
||||
// Copyright (c) 2012 __MyCompanyName__. All rights reserved.
|
||||
//
|
||||
|
||||
#import <UIKit/UIKit.h>
|
||||
|
||||
@interface BITHockeyBaseViewController : UIViewController
|
||||
|
||||
@property (nonatomic, readwrite) BOOL modalAnimated;
|
||||
|
||||
- (id)initWithModalStyle:(BOOL)modal;
|
||||
|
||||
@end
|
118
Classes/Helper/BITHockeyBaseViewController.m
Normal file
118
Classes/Helper/BITHockeyBaseViewController.m
Normal file
@ -0,0 +1,118 @@
|
||||
//
|
||||
// CNSHockeyBaseViewController.m
|
||||
// HockeySDK
|
||||
//
|
||||
// Created by Andreas Linde on 04.06.12.
|
||||
// Copyright (c) 2012 __MyCompanyName__. All rights reserved.
|
||||
//
|
||||
|
||||
#import "BITHockeyBaseViewController.h"
|
||||
|
||||
@interface BITHockeyBaseViewController ()
|
||||
@property (nonatomic) BOOL modal;
|
||||
@property (nonatomic) UIStatusBarStyle statusBarStyle;
|
||||
@end
|
||||
|
||||
@implementation BITHockeyBaseViewController
|
||||
|
||||
@synthesize modalAnimated = _modalAnimated;
|
||||
@synthesize modal = _modal;
|
||||
@synthesize statusBarStyle = _statusBarStyle;
|
||||
|
||||
|
||||
- (id)init {
|
||||
self = [super init];
|
||||
if (self) {
|
||||
_modalAnimated = YES;
|
||||
_modal = NO;
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (id)initWithModalStyle:(BOOL)modal {
|
||||
self = [self init];
|
||||
if (self) {
|
||||
_modal = modal;
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
|
||||
#pragma mark - View lifecycle
|
||||
|
||||
- (void)onDismissModal:(id)sender {
|
||||
if (self.modal) {
|
||||
// Note that as of 5.0, parentViewController will no longer return the presenting view controller
|
||||
SEL presentingViewControllerSelector = NSSelectorFromString(@"presentingViewController");
|
||||
UIViewController *presentingViewController = nil;
|
||||
if ([self respondsToSelector:presentingViewControllerSelector]) {
|
||||
presentingViewController = [self performSelector:presentingViewControllerSelector];
|
||||
} else {
|
||||
presentingViewController = [self parentViewController];
|
||||
}
|
||||
|
||||
// If there is no presenting view controller just remove view
|
||||
if (presentingViewController && self.modalAnimated) {
|
||||
[presentingViewController dismissModalViewControllerAnimated:YES];
|
||||
} else {
|
||||
[self.navigationController.view removeFromSuperview];
|
||||
}
|
||||
} else {
|
||||
[self.navigationController popViewControllerAnimated:YES];
|
||||
}
|
||||
|
||||
[[UIApplication sharedApplication] setStatusBarStyle:_statusBarStyle];
|
||||
}
|
||||
|
||||
- (void)viewDidLoad {
|
||||
[super viewDidLoad];
|
||||
|
||||
if (self.modal) {
|
||||
self.navigationItem.leftBarButtonItem = [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone
|
||||
target:self
|
||||
action:@selector(onDismissModal:)] autorelease];
|
||||
}
|
||||
|
||||
// Do any additional setup after loading the view.
|
||||
}
|
||||
|
||||
- (void)viewDidUnload {
|
||||
[super viewDidUnload];
|
||||
// Release any retained subviews of the main view.
|
||||
}
|
||||
|
||||
- (void)viewWillAppear:(BOOL)animated {
|
||||
[super viewWillAppear:animated];
|
||||
|
||||
_statusBarStyle = [[UIApplication sharedApplication] statusBarStyle];
|
||||
[[UIApplication sharedApplication] setStatusBarStyle:(self.navigationController.navigationBar.barStyle == UIBarStyleDefault) ? UIStatusBarStyleDefault : UIStatusBarStyleBlackOpaque];
|
||||
}
|
||||
|
||||
- (void)viewWillDisappear:(BOOL)animated {
|
||||
[super viewWillDisappear:animated];
|
||||
|
||||
[[UIApplication sharedApplication] setStatusBarStyle:_statusBarStyle];
|
||||
}
|
||||
|
||||
|
||||
#pragma mark - Rotation
|
||||
|
||||
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
|
||||
BOOL shouldAutorotate;
|
||||
|
||||
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
|
||||
shouldAutorotate = (interfaceOrientation == UIInterfaceOrientationLandscapeLeft ||
|
||||
interfaceOrientation == UIInterfaceOrientationLandscapeRight ||
|
||||
interfaceOrientation == UIInterfaceOrientationPortrait);
|
||||
} else {
|
||||
shouldAutorotate = YES;
|
||||
}
|
||||
|
||||
return shouldAutorotate;
|
||||
}
|
||||
|
||||
|
||||
#pragma mark - Modal presentation
|
||||
|
||||
|
||||
@end
|
@ -33,6 +33,8 @@
|
||||
NSString *bit_URLEncodedString(NSString *inputString);
|
||||
NSString *bit_URLDecodedString(NSString *inputString);
|
||||
NSComparisonResult bit_versionCompare(NSString *stringA, NSString *stringB);
|
||||
id bit_parseJSON(NSString *inputString, NSError **error);
|
||||
NSString *bit_encodeAppIdentifier(NSString *inputString);
|
||||
|
||||
/* UIImage helpers */
|
||||
UIImage *bit_roundedCornerImage(UIImage *inputImage, NSInteger cornerSize, NSInteger borderSize);
|
@ -28,6 +28,8 @@
|
||||
|
||||
|
||||
#import "BITHockeyHelper.h"
|
||||
#import "HockeySDK.h"
|
||||
|
||||
|
||||
#pragma mark NSString helpers
|
||||
|
||||
@ -74,6 +76,88 @@ NSComparisonResult bit_versionCompare(NSString *stringA, NSString *stringB) {
|
||||
return result;
|
||||
}
|
||||
|
||||
// parse JSON depending on the available framework
|
||||
id bit_parseJSON(NSString *inputString, NSError **error) {
|
||||
error = nil;
|
||||
|
||||
if (!inputString)
|
||||
return nil;
|
||||
|
||||
id feedResult = nil;
|
||||
|
||||
#if BW_NATIVE_JSON_AVAILABLE
|
||||
feedResult = [NSJSONSerialization JSONObjectWithData:[jsonString dataUsingEncoding:NSUTF8StringEncoding] options:kNilOptions error:&error];
|
||||
#else
|
||||
id nsjsonClass = NSClassFromString(@"NSJSONSerialization");
|
||||
SEL nsjsonSelect = NSSelectorFromString(@"JSONObjectWithData:options:error:");
|
||||
SEL sbJSONSelector = NSSelectorFromString(@"JSONValue");
|
||||
SEL jsonKitSelector = NSSelectorFromString(@"objectFromJSONStringWithParseOptions:error:");
|
||||
SEL yajlSelector = NSSelectorFromString(@"yajl_JSONWithOptions:error:");
|
||||
|
||||
if (nsjsonClass && [nsjsonClass respondsToSelector:nsjsonSelect]) {
|
||||
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[nsjsonClass methodSignatureForSelector:nsjsonSelect]];
|
||||
invocation.target = nsjsonClass;
|
||||
invocation.selector = nsjsonSelect;
|
||||
NSData *jsonData = [inputString dataUsingEncoding:NSUTF8StringEncoding];
|
||||
|
||||
if (!jsonData)
|
||||
return nil;
|
||||
|
||||
[invocation setArgument:&jsonData atIndex:2]; // arguments 0 and 1 are self and _cmd respectively, automatically set by NSInvocation
|
||||
NSUInteger readOptions = kNilOptions;
|
||||
[invocation setArgument:&readOptions atIndex:3];
|
||||
[invocation setArgument:&error atIndex:4];
|
||||
[invocation invoke];
|
||||
[invocation getReturnValue:&feedResult];
|
||||
} else if (jsonKitSelector && [inputString respondsToSelector:jsonKitSelector]) {
|
||||
// first try JSONkit
|
||||
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[inputString methodSignatureForSelector:jsonKitSelector]];
|
||||
invocation.target = inputString;
|
||||
invocation.selector = jsonKitSelector;
|
||||
int parseOptions = 0;
|
||||
[invocation setArgument:&parseOptions atIndex:2]; // arguments 0 and 1 are self and _cmd respectively, automatically set by NSInvocation
|
||||
[invocation setArgument:&error atIndex:3];
|
||||
[invocation invoke];
|
||||
[invocation getReturnValue:&feedResult];
|
||||
} else if (sbJSONSelector && [inputString respondsToSelector:sbJSONSelector]) {
|
||||
// now try SBJson
|
||||
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[inputString methodSignatureForSelector:sbJSONSelector]];
|
||||
invocation.target = inputString;
|
||||
invocation.selector = sbJSONSelector;
|
||||
[invocation invoke];
|
||||
[invocation getReturnValue:&feedResult];
|
||||
} else if (yajlSelector && [inputString respondsToSelector:yajlSelector]) {
|
||||
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[inputString methodSignatureForSelector:yajlSelector]];
|
||||
invocation.target = inputString;
|
||||
invocation.selector = yajlSelector;
|
||||
|
||||
NSUInteger yajlParserOptions = 0;
|
||||
[invocation setArgument:&yajlParserOptions atIndex:2]; // arguments 0 and 1 are self and _cmd respectively, automatically set by NSInvocation
|
||||
[invocation setArgument:&error atIndex:3];
|
||||
|
||||
[invocation invoke];
|
||||
[invocation getReturnValue:&feedResult];
|
||||
} else {
|
||||
if (error != NULL)
|
||||
*error = [[NSError errorWithDomain:kBITHockeyErrorDomain
|
||||
code:HockeyAPIClientMissingJSONLibrary
|
||||
userInfo:[NSDictionary dictionaryWithObjectsAndKeys:@"You need a JSON Framework in your runtime for iOS4!", NSLocalizedDescriptionKey, nil]] retain];
|
||||
return nil;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (error != NULL) {
|
||||
return nil;
|
||||
}
|
||||
|
||||
return feedResult;
|
||||
}
|
||||
|
||||
NSString *bit_encodeAppIdentifier(NSString *inputString) {
|
||||
return (inputString ? bit_URLEncodedString(inputString) : bit_URLEncodedString([[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleIdentifier"]));
|
||||
}
|
||||
|
||||
|
||||
|
||||
#pragma mark UIImage private helpers
|
||||
|
@ -39,6 +39,8 @@
|
||||
#define BITHOCKEY_CRASH_SETTINGS @"BITCrashManager.plist"
|
||||
#define BITHOCKEY_CRASH_ANALYZER @"BITCrashManager.analyzer"
|
||||
|
||||
#define BITHOCKEY_FEEDBACK_SETTINGS @"BITFeedbackManager.plist"
|
||||
|
||||
#define kBITUpdateArrayOfLastCheck @"BITUpdateArrayOfLastCheck"
|
||||
#define kBITUpdateDateOfLastCheck @"BITUpdateDateOfLastCheck"
|
||||
#define kBITUpdateDateOfVersionInstallation @"BITUpdateDateOfVersionInstallation"
|
||||
@ -61,6 +63,7 @@
|
||||
NSBundle *BITHockeyBundle(void);
|
||||
NSString *BITHockeyLocalizedString(NSString *stringToken);
|
||||
NSString *BITHockeyMD5(NSString *str);
|
||||
id BITHockeyParseJSON(NSString *str, NSError **error);
|
||||
|
||||
|
||||
// compatibility helper
|
@ -27,6 +27,7 @@
|
||||
* OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#import "HockeySDK.h"
|
||||
#import "HockeySDKPrivate.h"
|
||||
#include <CommonCrypto/CommonDigest.h>
|
||||
|
||||
@ -66,4 +67,4 @@ NSString *BITHockeyMD5(NSString *str) {
|
||||
result[12], result[13],
|
||||
result[14], result[15]
|
||||
];
|
||||
}
|
||||
}
|
@ -33,6 +33,8 @@
|
||||
#import "BITHockeyManager.h"
|
||||
#import "BITHockeyManagerDelegate.h"
|
||||
|
||||
#import "BITHockeyBaseManager.h"
|
||||
|
||||
#import "BITCrashManager.h"
|
||||
#import "BITCrashManagerDelegate.h"
|
||||
|
||||
@ -40,10 +42,20 @@
|
||||
#import "BITUpdateManagerDelegate.h"
|
||||
#import "BITUpdateViewController.h"
|
||||
|
||||
#import "BITFeedbackManager.h"
|
||||
#import "BITFeedbackComposeViewController.h"
|
||||
#import "BITFeedbackListViewController.h"
|
||||
|
||||
|
||||
// Notification message which HockeyManager is listening to, to retry requesting updated from the server
|
||||
#define BITHockeyNetworkDidBecomeReachableNotification @"BITHockeyNetworkDidBecomeReachable"
|
||||
|
||||
// Notification message which tells that messages got updated or added
|
||||
#define BITHockeyFeedbackMessagesUpdated @"BITHockeyFeedbackMessagesUpdated"
|
||||
|
||||
// Notification message which tells that new messages arrived
|
||||
#define BITHockeyFeedbackNewMessagesReceived @"BITHockeyFeedbackNewMessagesReceived"
|
||||
|
||||
|
||||
// hockey api error domain
|
||||
typedef enum {
|
||||
@ -69,4 +81,28 @@ typedef enum {
|
||||
static NSString *kBITUpdateErrorDomain = @"BITUpdaterErrorDomain";
|
||||
|
||||
|
||||
// Update App Versions
|
||||
|
||||
// hockey api error domain
|
||||
typedef enum {
|
||||
BITFeedbackErrorUnknown,
|
||||
BITFeedbackAPIServerReturnedInvalidStatus,
|
||||
BITFeedbackAPIServerReturnedInvalidData,
|
||||
BITFeedbackAPIServerReturnedEmptyResponse,
|
||||
BITFeedbackAPIClientAuthorizationMissingSecret,
|
||||
BITFeedbackAPIClientCannotCreateConnection
|
||||
} BITFeedbackErrorReason;
|
||||
static NSString *kBITFeedbackErrorDomain = @"BITFeedbackErrorDomain";
|
||||
|
||||
|
||||
// HockeySDK
|
||||
|
||||
// hockey api error domain
|
||||
typedef enum {
|
||||
BITHockeyErrorUnknown,
|
||||
HockeyAPIClientMissingJSONLibrary
|
||||
} BITHockeyErrorReason;
|
||||
static NSString *kBITHockeyErrorDomain = @"BITHockeyErrorDomain";
|
||||
|
||||
|
||||
#endif
|
||||
|
@ -54,28 +54,6 @@
|
||||
|
||||
@implementation BITUpdateManager
|
||||
|
||||
@synthesize delegate = _delegate;
|
||||
|
||||
@synthesize urlConnection = _urlConnection;
|
||||
@synthesize checkInProgress = _checkInProgress;
|
||||
@synthesize receivedData = _receivedData;
|
||||
@synthesize alwaysShowUpdateReminder = _showUpdateReminder;
|
||||
@synthesize checkForUpdateOnLaunch = _checkForUpdateOnLaunch;
|
||||
@synthesize compareVersionType = _compareVersionType;
|
||||
@synthesize lastCheck = _lastCheck;
|
||||
@synthesize updateSetting = _updateSetting;
|
||||
@synthesize appVersions = _appVersions;
|
||||
@synthesize updateAvailable = _updateAvailable;
|
||||
@synthesize usageStartTimestamp = _usageStartTimestamp;
|
||||
@synthesize currentHockeyViewController = _currentHockeyViewController;
|
||||
@synthesize showDirectInstallOption = _showDirectInstallOption;
|
||||
@synthesize requireAuthorization = _requireAuthorization;
|
||||
@synthesize authenticationSecret = _authenticationSecret;
|
||||
@synthesize blockingView = _blockingView;
|
||||
@synthesize checkForTracker = _checkForTracker;
|
||||
@synthesize trackerConfig = _trackerConfig;
|
||||
@synthesize barStyle = _barStyle;
|
||||
@synthesize modalPresentationStyle = _modalPresentationStyle;
|
||||
|
||||
#pragma mark - private
|
||||
|
||||
@ -354,7 +332,7 @@
|
||||
_appIdentifier = appIdentifier;
|
||||
_isAppStoreEnvironment = isAppStoreEnvironment;
|
||||
|
||||
_updateURL = BITHOCKEYSDK_URL;
|
||||
_serverURL = BITHOCKEYSDK_URL;
|
||||
_delegate = nil;
|
||||
_expiryDate = nil;
|
||||
_checkInProgress = NO;
|
||||
@ -422,8 +400,7 @@
|
||||
|
||||
_delegate = nil;
|
||||
|
||||
[_updateURL release];
|
||||
_updateURL = nil;
|
||||
[_serverURL release];
|
||||
|
||||
[_urlConnection cancel];
|
||||
self.urlConnection = nil;
|
||||
@ -607,83 +584,6 @@
|
||||
}
|
||||
|
||||
|
||||
#pragma mark - JSONParsing
|
||||
|
||||
- (id)parseJSONResultString:(NSString *)jsonString {
|
||||
NSError *error = nil;
|
||||
id feedResult = nil;
|
||||
|
||||
if (!jsonString)
|
||||
return nil;
|
||||
|
||||
#if BITHOCKEYSDK_NATIVE_JSON_AVAILABLE
|
||||
feedResult = [NSJSONSerialization JSONObjectWithData:[jsonString dataUsingEncoding:NSUTF8StringEncoding] options:kNilOptions error:&error];
|
||||
#else
|
||||
id nsjsonClass = NSClassFromString(@"NSJSONSerialization");
|
||||
SEL nsjsonSelect = NSSelectorFromString(@"JSONObjectWithData:options:error:");
|
||||
SEL sbJSONSelector = NSSelectorFromString(@"JSONValue");
|
||||
SEL jsonKitSelector = NSSelectorFromString(@"objectFromJSONStringWithParseOptions:error:");
|
||||
SEL yajlSelector = NSSelectorFromString(@"yajl_JSONWithOptions:error:");
|
||||
|
||||
if (nsjsonClass && [nsjsonClass respondsToSelector:nsjsonSelect]) {
|
||||
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[nsjsonClass methodSignatureForSelector:nsjsonSelect]];
|
||||
invocation.target = nsjsonClass;
|
||||
invocation.selector = nsjsonSelect;
|
||||
NSData *jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
|
||||
|
||||
if (!jsonData)
|
||||
return nil;
|
||||
|
||||
[invocation setArgument:&jsonData atIndex:2]; // arguments 0 and 1 are self and _cmd respectively, automatically set by NSInvocation
|
||||
NSUInteger readOptions = kNilOptions;
|
||||
[invocation setArgument:&readOptions atIndex:3];
|
||||
[invocation setArgument:&error atIndex:4];
|
||||
[invocation invoke];
|
||||
[invocation getReturnValue:&feedResult];
|
||||
} else if (jsonKitSelector && [jsonString respondsToSelector:jsonKitSelector]) {
|
||||
// first try JSONkit
|
||||
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[jsonString methodSignatureForSelector:jsonKitSelector]];
|
||||
invocation.target = jsonString;
|
||||
invocation.selector = jsonKitSelector;
|
||||
int parseOptions = 0;
|
||||
[invocation setArgument:&parseOptions atIndex:2]; // arguments 0 and 1 are self and _cmd respectively, automatically set by NSInvocation
|
||||
[invocation setArgument:&error atIndex:3];
|
||||
[invocation invoke];
|
||||
[invocation getReturnValue:&feedResult];
|
||||
} else if (sbJSONSelector && [jsonString respondsToSelector:sbJSONSelector]) {
|
||||
// now try SBJson
|
||||
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[jsonString methodSignatureForSelector:sbJSONSelector]];
|
||||
invocation.target = jsonString;
|
||||
invocation.selector = sbJSONSelector;
|
||||
[invocation invoke];
|
||||
[invocation getReturnValue:&feedResult];
|
||||
} else if (yajlSelector && [jsonString respondsToSelector:yajlSelector]) {
|
||||
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[jsonString methodSignatureForSelector:yajlSelector]];
|
||||
invocation.target = jsonString;
|
||||
invocation.selector = yajlSelector;
|
||||
|
||||
NSUInteger yajlParserOptions = 0;
|
||||
[invocation setArgument:&yajlParserOptions atIndex:2]; // arguments 0 and 1 are self and _cmd respectively, automatically set by NSInvocation
|
||||
[invocation setArgument:&error atIndex:3];
|
||||
|
||||
[invocation invoke];
|
||||
[invocation getReturnValue:&feedResult];
|
||||
} else {
|
||||
error = [NSError errorWithDomain:kBITUpdateErrorDomain
|
||||
code:BITUpdateAPIServerReturnedEmptyResponse
|
||||
userInfo:[NSDictionary dictionaryWithObjectsAndKeys:@"You need a JSON Framework in your runtime for iOS4!", NSLocalizedDescriptionKey, nil]];
|
||||
}
|
||||
#endif
|
||||
|
||||
if (error) {
|
||||
[self reportError:error];
|
||||
return nil;
|
||||
}
|
||||
|
||||
return feedResult;
|
||||
}
|
||||
|
||||
|
||||
#pragma mark - RequestComments
|
||||
|
||||
- (BOOL)shouldCheckForUpdates {
|
||||
@ -723,7 +623,7 @@
|
||||
];
|
||||
|
||||
// build request & send
|
||||
NSString *url = [NSString stringWithFormat:@"%@%@", _updateURL, parameter];
|
||||
NSString *url = [NSString stringWithFormat:@"%@%@", _serverURL, parameter];
|
||||
BITHockeyLog(@"INFO: Sending api request to %@", url);
|
||||
|
||||
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url] cachePolicy:1 timeoutInterval:10.0];
|
||||
@ -739,7 +639,7 @@
|
||||
if ([responseData length]) {
|
||||
NSString *responseString = [[[NSString alloc] initWithBytes:[responseData bytes] length:[responseData length] encoding: NSUTF8StringEncoding] autorelease];
|
||||
|
||||
NSDictionary *feedDict = (NSDictionary *)[self parseJSONResultString:responseString];
|
||||
NSDictionary *feedDict = (NSDictionary *)bit_parseJSON(responseString, &error);
|
||||
|
||||
// server returned empty response?
|
||||
if (![feedDict count]) {
|
||||
@ -838,7 +738,7 @@
|
||||
}
|
||||
|
||||
// build request & send
|
||||
NSString *url = [NSString stringWithFormat:@"%@%@", _updateURL, parameter];
|
||||
NSString *url = [NSString stringWithFormat:@"%@%@", _serverURL, parameter];
|
||||
BITHockeyLog(@"INFO: Sending api request to %@", url);
|
||||
|
||||
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url] cachePolicy:1 timeoutInterval:10.0];
|
||||
@ -874,7 +774,7 @@
|
||||
extraParameter = [NSString stringWithFormat:@"&udid=%@", [self deviceIdentifier]];
|
||||
}
|
||||
|
||||
NSString *hockeyAPIURL = [NSString stringWithFormat:@"%@api/2/apps/%@?format=plist%@", _updateURL, [self encodedAppIdentifier], extraParameter];
|
||||
NSString *hockeyAPIURL = [NSString stringWithFormat:@"%@api/2/apps/%@?format=plist%@", _serverURL, [self encodedAppIdentifier], extraParameter];
|
||||
NSString *iOSUpdateURL = [NSString stringWithFormat:@"itms-services://?action=download-manifest&url=%@", bit_URLEncodedString(hockeyAPIURL)];
|
||||
|
||||
BITHockeyLog(@"INFO: API Server Call: %@, calling iOS with %@", hockeyAPIURL, iOSUpdateURL);
|
||||
@ -995,7 +895,8 @@
|
||||
NSString *responseString = [[[NSString alloc] initWithBytes:[_receivedData bytes] length:[_receivedData length] encoding: NSUTF8StringEncoding] autorelease];
|
||||
BITHockeyLog(@"INFO: Received API response: %@", responseString);
|
||||
|
||||
id json = [self parseJSONResultString:responseString];
|
||||
NSError *error = nil;
|
||||
id json = bit_parseJSON(responseString, &error);
|
||||
self.trackerConfig = (([self checkForTracker] && [[json valueForKey:@"tracker"] isKindOfClass:[NSDictionary class]]) ? [json valueForKey:@"tracker"] : nil);
|
||||
|
||||
if (!_isAppStoreEnvironment) {
|
@ -36,7 +36,7 @@
|
||||
}
|
||||
|
||||
// set the server URL
|
||||
@property (nonatomic, retain) NSString *updateURL;
|
||||
@property (nonatomic, retain) NSString *serverURL;
|
||||
|
||||
// is an update available?
|
||||
@property (nonatomic, assign, getter=isUpdateAvailable) BOOL updateAvailable;
|
@ -107,3 +107,89 @@
|
||||
/* Update Simulator Warning */
|
||||
|
||||
"UpdateSimulatorMessage" = "Hockey funktioniert nicht im Simulator.";
|
||||
|
||||
|
||||
|
||||
|
||||
/* Feedback */
|
||||
|
||||
|
||||
/* New Message Alert */
|
||||
|
||||
/* Alert Title */
|
||||
"HockeyFeedbackNewMessageTitle" = "New Feedback Response";
|
||||
|
||||
/* Alert Text */
|
||||
"HockeyFeedbackNewMessageText" = "A new response to your feedback is available. Would you like to view it?";
|
||||
|
||||
/* Alert Ignore Button */
|
||||
"HockeyFeedbackIgnore" = "Ignore";
|
||||
|
||||
/* Alert Show Button */
|
||||
"HockeyFeedbackShow" = "Show";
|
||||
|
||||
|
||||
/* List View */
|
||||
|
||||
/* Title */
|
||||
"HockeyFeedbackListTitle" = "Feedback";
|
||||
|
||||
/* Last Updated */
|
||||
"HockeyFeedbackListLastUpdated" = "Last Updated: %@";
|
||||
|
||||
/* Never Updated */
|
||||
"HockeyFeedbackListNeverUpdated" = "Never";
|
||||
|
||||
/* Write Feedback Button Title */
|
||||
"HockeyFeedbackListButonWriteFeedback" = "Write Feedback";
|
||||
|
||||
/* Write Response Button Title */
|
||||
"HockeyFeedbackListButonWriteResponse" = "Write Response";
|
||||
|
||||
/* User Data Set Name Button Title */
|
||||
"HockeyFeedbackListButonUserDataSetName" = "Set Your Name";
|
||||
|
||||
/* User Data Set Email Button Title */
|
||||
"HockeyFeedbackListButonUserDataSetEmail" = "Set Your Email";
|
||||
|
||||
/* User Data With Name Button Title */
|
||||
"HockeyFeedbackListButonUserDataWithName" = "Name: %@";
|
||||
|
||||
/* User Data With Email Button Title */
|
||||
"HockeyFeedbackListButonUserDataWithEmail" = "Email: %@";
|
||||
|
||||
/* User Name In Message If Name Not Set */
|
||||
"HockeyFeedbackListMessageUserNameNotSet" = "You";
|
||||
|
||||
/* Name In Message From Server If Name Not Set */
|
||||
"HockeyFeedbackListmessageResponseNameNotSet" = "Response";
|
||||
|
||||
|
||||
/* Compose Message */
|
||||
|
||||
/* Title */
|
||||
"HockeyFeedbackComposeTitle" = "New Feedback";
|
||||
|
||||
/* Send button */
|
||||
"HockeyFeedbackComposeSend" = "Send";
|
||||
|
||||
|
||||
/* Set User Data */
|
||||
|
||||
/* Title */
|
||||
"HockeyFeedbackUserDataTitle" = "Who Are You";
|
||||
|
||||
/* Description On What Should Be Entered */
|
||||
"HockeyFeedbackUserDataDescription" = "Please let us know who you are before writing us your feedback.";
|
||||
|
||||
/* Name Field */
|
||||
"HockeyFeedbackUserDataName" = "Name";
|
||||
|
||||
/* Name Placeholder */
|
||||
"HockeyFeedbackUserDataNamePlaceHolder" = "John Doe";
|
||||
|
||||
/* Email Field */
|
||||
"HockeyFeedbackUserDataEmail" = "Email";
|
||||
|
||||
/* Email Placeholder */
|
||||
"HockeyFeedbackUserDataEmailPlaceholder" = "example@email.com";
|
||||
|
@ -106,3 +106,87 @@
|
||||
/* Update Simulator Warning */
|
||||
|
||||
"UpdateSimulatorMessage" = "Hockey Update does not work in the Simulator.\nThe itms-services:// url scheme is implemented but nonfunctional.";
|
||||
|
||||
|
||||
/* Feedback */
|
||||
|
||||
|
||||
/* New Message Alert */
|
||||
|
||||
/* Alert Title */
|
||||
"HockeyFeedbackNewMessageTitle" = "New Feedback Response";
|
||||
|
||||
/* Alert Text */
|
||||
"HockeyFeedbackNewMessageText" = "A new response to your feedback is available. Would you like to view it?";
|
||||
|
||||
/* Alert Ignore Button */
|
||||
"HockeyFeedbackIgnore" = "Ignore";
|
||||
|
||||
/* Alert Show Button */
|
||||
"HockeyFeedbackShow" = "Show";
|
||||
|
||||
|
||||
/* List View */
|
||||
|
||||
/* Title */
|
||||
"HockeyFeedbackListTitle" = "Feedback";
|
||||
|
||||
/* Last Updated */
|
||||
"HockeyFeedbackListLastUpdated" = "Last Updated: %@";
|
||||
|
||||
/* Never Updated */
|
||||
"HockeyFeedbackListNeverUpdated" = "Never";
|
||||
|
||||
/* Write Feedback Button Title */
|
||||
"HockeyFeedbackListButonWriteFeedback" = "Write Feedback";
|
||||
|
||||
/* Write Response Button Title */
|
||||
"HockeyFeedbackListButonWriteResponse" = "Write Response";
|
||||
|
||||
/* User Data Set Name Button Title */
|
||||
"HockeyFeedbackListButonUserDataSetName" = "Set Your Name";
|
||||
|
||||
/* User Data Set Email Button Title */
|
||||
"HockeyFeedbackListButonUserDataSetEmail" = "Set Your Email";
|
||||
|
||||
/* User Data With Name Button Title */
|
||||
"HockeyFeedbackListButonUserDataWithName" = "Name: %@";
|
||||
|
||||
/* User Data With Email Button Title */
|
||||
"HockeyFeedbackListButonUserDataWithEmail" = "Email: %@";
|
||||
|
||||
/* User Name In Message If Name Not Set */
|
||||
"HockeyFeedbackListMessageUserNameNotSet" = "You";
|
||||
|
||||
/* Name In Message From Server If Name Not Set */
|
||||
"HockeyFeedbackListmessageResponseNameNotSet" = "Response";
|
||||
|
||||
|
||||
/* Compose Message */
|
||||
|
||||
/* Title */
|
||||
"HockeyFeedbackComposeTitle" = "New Feedback";
|
||||
|
||||
/* Send button */
|
||||
"HockeyFeedbackComposeSend" = "Send";
|
||||
|
||||
|
||||
/* Set User Data */
|
||||
|
||||
/* Title */
|
||||
"HockeyFeedbackUserDataTitle" = "Who Are You";
|
||||
|
||||
/* Description On What Should Be Entered */
|
||||
"HockeyFeedbackUserDataDescription" = "Please let us know who you are before writing us your feedback.";
|
||||
|
||||
/* Name Field */
|
||||
"HockeyFeedbackUserDataName" = "Name";
|
||||
|
||||
/* Name Placeholder */
|
||||
"HockeyFeedbackUserDataNamePlaceHolder" = "John Doe";
|
||||
|
||||
/* Email Field */
|
||||
"HockeyFeedbackUserDataEmail" = "Email";
|
||||
|
||||
/* Email Placeholder */
|
||||
"HockeyFeedbackUserDataEmailPlaceholder" = "example@email.com";
|
||||
|
@ -107,3 +107,87 @@
|
||||
/* Update Simulator Warning */
|
||||
|
||||
"UpdateSimulatorMessage" = "Hockey Update does not work in the Simulator.\nThe itms-services:// url scheme is implemented but nonfunctional.";
|
||||
|
||||
|
||||
/* Feedback */
|
||||
|
||||
|
||||
/* New Message Alert */
|
||||
|
||||
/* Alert Title */
|
||||
"HockeyFeedbackNewMessageTitle" = "New Feedback Response";
|
||||
|
||||
/* Alert Text */
|
||||
"HockeyFeedbackNewMessageText" = "A new response to your feedback is available. Would you like to view it?";
|
||||
|
||||
/* Alert Ignore Button */
|
||||
"HockeyFeedbackIgnore" = "Ignore";
|
||||
|
||||
/* Alert Show Button */
|
||||
"HockeyFeedbackShow" = "Show";
|
||||
|
||||
|
||||
/* List View */
|
||||
|
||||
/* Title */
|
||||
"HockeyFeedbackListTitle" = "Feedback";
|
||||
|
||||
/* Last Updated */
|
||||
"HockeyFeedbackListLastUpdated" = "Last Updated: %@";
|
||||
|
||||
/* Never Updated */
|
||||
"HockeyFeedbackListNeverUpdated" = "Never";
|
||||
|
||||
/* Write Feedback Button Title */
|
||||
"HockeyFeedbackListButonWriteFeedback" = "Write Feedback";
|
||||
|
||||
/* Write Response Button Title */
|
||||
"HockeyFeedbackListButonWriteResponse" = "Write Response";
|
||||
|
||||
/* User Data Set Name Button Title */
|
||||
"HockeyFeedbackListButonUserDataSetName" = "Set Your Name";
|
||||
|
||||
/* User Data Set Email Button Title */
|
||||
"HockeyFeedbackListButonUserDataSetEmail" = "Set Your Email";
|
||||
|
||||
/* User Data With Name Button Title */
|
||||
"HockeyFeedbackListButonUserDataWithName" = "Name: %@";
|
||||
|
||||
/* User Data With Email Button Title */
|
||||
"HockeyFeedbackListButonUserDataWithEmail" = "Email: %@";
|
||||
|
||||
/* User Name In Message If Name Not Set */
|
||||
"HockeyFeedbackListMessageUserNameNotSet" = "You";
|
||||
|
||||
/* Name In Message From Server If Name Not Set */
|
||||
"HockeyFeedbackListmessageResponseNameNotSet" = "Response";
|
||||
|
||||
|
||||
/* Compose Message */
|
||||
|
||||
/* Title */
|
||||
"HockeyFeedbackComposeTitle" = "New Feedback";
|
||||
|
||||
/* Send button */
|
||||
"HockeyFeedbackComposeSend" = "Send";
|
||||
|
||||
|
||||
/* Set User Data */
|
||||
|
||||
/* Title */
|
||||
"HockeyFeedbackUserDataTitle" = "Who Are You";
|
||||
|
||||
/* Description On What Should Be Entered */
|
||||
"HockeyFeedbackUserDataDescription" = "Please let us know who you are before writing us your feedback.";
|
||||
|
||||
/* Name Field */
|
||||
"HockeyFeedbackUserDataName" = "Name";
|
||||
|
||||
/* Name Placeholder */
|
||||
"HockeyFeedbackUserDataNamePlaceHolder" = "John Doe";
|
||||
|
||||
/* Email Field */
|
||||
"HockeyFeedbackUserDataEmail" = "Email";
|
||||
|
||||
/* Email Placeholder */
|
||||
"HockeyFeedbackUserDataEmailPlaceholder" = "example@email.com";
|
||||
|
@ -107,3 +107,87 @@
|
||||
/* Update Simulator Warning */
|
||||
|
||||
"UpdateSimulatorMessage" = "Hockey Update does not work in the Simulator.\nThe itms-services:// url scheme is implemented but nonfunctional.";
|
||||
|
||||
|
||||
/* Feedback */
|
||||
|
||||
|
||||
/* New Message Alert */
|
||||
|
||||
/* Alert Title */
|
||||
"HockeyFeedbackNewMessageTitle" = "New Feedback Response";
|
||||
|
||||
/* Alert Text */
|
||||
"HockeyFeedbackNewMessageText" = "A new response to your feedback is available. Would you like to view it?";
|
||||
|
||||
/* Alert Ignore Button */
|
||||
"HockeyFeedbackIgnore" = "Ignore";
|
||||
|
||||
/* Alert Show Button */
|
||||
"HockeyFeedbackShow" = "Show";
|
||||
|
||||
|
||||
/* List View */
|
||||
|
||||
/* Title */
|
||||
"HockeyFeedbackListTitle" = "Feedback";
|
||||
|
||||
/* Last Updated */
|
||||
"HockeyFeedbackListLastUpdated" = "Last Updated: %@";
|
||||
|
||||
/* Never Updated */
|
||||
"HockeyFeedbackListNeverUpdated" = "Never";
|
||||
|
||||
/* Write Feedback Button Title */
|
||||
"HockeyFeedbackListButonWriteFeedback" = "Write Feedback";
|
||||
|
||||
/* Write Response Button Title */
|
||||
"HockeyFeedbackListButonWriteResponse" = "Write Response";
|
||||
|
||||
/* User Data Set Name Button Title */
|
||||
"HockeyFeedbackListButonUserDataSetName" = "Set Your Name";
|
||||
|
||||
/* User Data Set Email Button Title */
|
||||
"HockeyFeedbackListButonUserDataSetEmail" = "Set Your Email";
|
||||
|
||||
/* User Data With Name Button Title */
|
||||
"HockeyFeedbackListButonUserDataWithName" = "Name: %@";
|
||||
|
||||
/* User Data With Email Button Title */
|
||||
"HockeyFeedbackListButonUserDataWithEmail" = "Email: %@";
|
||||
|
||||
/* User Name In Message If Name Not Set */
|
||||
"HockeyFeedbackListMessageUserNameNotSet" = "You";
|
||||
|
||||
/* Name In Message From Server If Name Not Set */
|
||||
"HockeyFeedbackListmessageResponseNameNotSet" = "Response";
|
||||
|
||||
|
||||
/* Compose Message */
|
||||
|
||||
/* Title */
|
||||
"HockeyFeedbackComposeTitle" = "New Feedback";
|
||||
|
||||
/* Send button */
|
||||
"HockeyFeedbackComposeSend" = "Send";
|
||||
|
||||
|
||||
/* Set User Data */
|
||||
|
||||
/* Title */
|
||||
"HockeyFeedbackUserDataTitle" = "Who Are You";
|
||||
|
||||
/* Description On What Should Be Entered */
|
||||
"HockeyFeedbackUserDataDescription" = "Please let us know who you are before writing us your feedback.";
|
||||
|
||||
/* Name Field */
|
||||
"HockeyFeedbackUserDataName" = "Name";
|
||||
|
||||
/* Name Placeholder */
|
||||
"HockeyFeedbackUserDataNamePlaceHolder" = "John Doe";
|
||||
|
||||
/* Email Field */
|
||||
"HockeyFeedbackUserDataEmail" = "Email";
|
||||
|
||||
/* Email Placeholder */
|
||||
"HockeyFeedbackUserDataEmailPlaceholder" = "example@email.com";
|
||||
|
@ -107,3 +107,87 @@
|
||||
/* Update Simulator Warning */
|
||||
|
||||
"UpdateSimulatorMessage" = "Hockey Update does not work in the Simulator.\nThe itms-services:// url scheme is implemented but nonfunctional.";
|
||||
|
||||
|
||||
/* Feedback */
|
||||
|
||||
|
||||
/* New Message Alert */
|
||||
|
||||
/* Alert Title */
|
||||
"HockeyFeedbackNewMessageTitle" = "New Feedback Response";
|
||||
|
||||
/* Alert Text */
|
||||
"HockeyFeedbackNewMessageText" = "A new response to your feedback is available. Would you like to view it?";
|
||||
|
||||
/* Alert Ignore Button */
|
||||
"HockeyFeedbackIgnore" = "Ignore";
|
||||
|
||||
/* Alert Show Button */
|
||||
"HockeyFeedbackShow" = "Show";
|
||||
|
||||
|
||||
/* List View */
|
||||
|
||||
/* Title */
|
||||
"HockeyFeedbackListTitle" = "Feedback";
|
||||
|
||||
/* Last Updated */
|
||||
"HockeyFeedbackListLastUpdated" = "Last Updated: %@";
|
||||
|
||||
/* Never Updated */
|
||||
"HockeyFeedbackListNeverUpdated" = "Never";
|
||||
|
||||
/* Write Feedback Button Title */
|
||||
"HockeyFeedbackListButonWriteFeedback" = "Write Feedback";
|
||||
|
||||
/* Write Response Button Title */
|
||||
"HockeyFeedbackListButonWriteResponse" = "Write Response";
|
||||
|
||||
/* User Data Set Name Button Title */
|
||||
"HockeyFeedbackListButonUserDataSetName" = "Set Your Name";
|
||||
|
||||
/* User Data Set Email Button Title */
|
||||
"HockeyFeedbackListButonUserDataSetEmail" = "Set Your Email";
|
||||
|
||||
/* User Data With Name Button Title */
|
||||
"HockeyFeedbackListButonUserDataWithName" = "Name: %@";
|
||||
|
||||
/* User Data With Email Button Title */
|
||||
"HockeyFeedbackListButonUserDataWithEmail" = "Email: %@";
|
||||
|
||||
/* User Name In Message If Name Not Set */
|
||||
"HockeyFeedbackListMessageUserNameNotSet" = "You";
|
||||
|
||||
/* Name In Message From Server If Name Not Set */
|
||||
"HockeyFeedbackListmessageResponseNameNotSet" = "Response";
|
||||
|
||||
|
||||
/* Compose Message */
|
||||
|
||||
/* Title */
|
||||
"HockeyFeedbackComposeTitle" = "New Feedback";
|
||||
|
||||
/* Send button */
|
||||
"HockeyFeedbackComposeSend" = "Send";
|
||||
|
||||
|
||||
/* Set User Data */
|
||||
|
||||
/* Title */
|
||||
"HockeyFeedbackUserDataTitle" = "Who Are You";
|
||||
|
||||
/* Description On What Should Be Entered */
|
||||
"HockeyFeedbackUserDataDescription" = "Please let us know who you are before writing us your feedback.";
|
||||
|
||||
/* Name Field */
|
||||
"HockeyFeedbackUserDataName" = "Name";
|
||||
|
||||
/* Name Placeholder */
|
||||
"HockeyFeedbackUserDataNamePlaceHolder" = "John Doe";
|
||||
|
||||
/* Email Field */
|
||||
"HockeyFeedbackUserDataEmail" = "Email";
|
||||
|
||||
/* Email Placeholder */
|
||||
"HockeyFeedbackUserDataEmailPlaceholder" = "example@email.com";
|
||||
|
@ -107,3 +107,87 @@
|
||||
/* Update Simulator Warning */
|
||||
|
||||
"UpdateSimulatorMessage" = "Hockey Update does not work in the Simulator.\nThe itms-services:// url scheme is implemented but nonfunctional.";
|
||||
|
||||
|
||||
/* Feedback */
|
||||
|
||||
|
||||
/* New Message Alert */
|
||||
|
||||
/* Alert Title */
|
||||
"HockeyFeedbackNewMessageTitle" = "New Feedback Response";
|
||||
|
||||
/* Alert Text */
|
||||
"HockeyFeedbackNewMessageText" = "A new response to your feedback is available. Would you like to view it?";
|
||||
|
||||
/* Alert Ignore Button */
|
||||
"HockeyFeedbackIgnore" = "Ignore";
|
||||
|
||||
/* Alert Show Button */
|
||||
"HockeyFeedbackShow" = "Show";
|
||||
|
||||
|
||||
/* List View */
|
||||
|
||||
/* Title */
|
||||
"HockeyFeedbackListTitle" = "Feedback";
|
||||
|
||||
/* Last Updated */
|
||||
"HockeyFeedbackListLastUpdated" = "Last Updated: %@";
|
||||
|
||||
/* Never Updated */
|
||||
"HockeyFeedbackListNeverUpdated" = "Never";
|
||||
|
||||
/* Write Feedback Button Title */
|
||||
"HockeyFeedbackListButonWriteFeedback" = "Write Feedback";
|
||||
|
||||
/* Write Response Button Title */
|
||||
"HockeyFeedbackListButonWriteResponse" = "Write Response";
|
||||
|
||||
/* User Data Set Name Button Title */
|
||||
"HockeyFeedbackListButonUserDataSetName" = "Set Your Name";
|
||||
|
||||
/* User Data Set Email Button Title */
|
||||
"HockeyFeedbackListButonUserDataSetEmail" = "Set Your Email";
|
||||
|
||||
/* User Data With Name Button Title */
|
||||
"HockeyFeedbackListButonUserDataWithName" = "Name: %@";
|
||||
|
||||
/* User Data With Email Button Title */
|
||||
"HockeyFeedbackListButonUserDataWithEmail" = "Email: %@";
|
||||
|
||||
/* User Name In Message If Name Not Set */
|
||||
"HockeyFeedbackListMessageUserNameNotSet" = "You";
|
||||
|
||||
/* Name In Message From Server If Name Not Set */
|
||||
"HockeyFeedbackListmessageResponseNameNotSet" = "Response";
|
||||
|
||||
|
||||
/* Compose Message */
|
||||
|
||||
/* Title */
|
||||
"HockeyFeedbackComposeTitle" = "New Feedback";
|
||||
|
||||
/* Send button */
|
||||
"HockeyFeedbackComposeSend" = "Send";
|
||||
|
||||
|
||||
/* Set User Data */
|
||||
|
||||
/* Title */
|
||||
"HockeyFeedbackUserDataTitle" = "Who Are You";
|
||||
|
||||
/* Description On What Should Be Entered */
|
||||
"HockeyFeedbackUserDataDescription" = "Please let us know who you are before writing us your feedback.";
|
||||
|
||||
/* Name Field */
|
||||
"HockeyFeedbackUserDataName" = "Name";
|
||||
|
||||
/* Name Placeholder */
|
||||
"HockeyFeedbackUserDataNamePlaceHolder" = "John Doe";
|
||||
|
||||
/* Email Field */
|
||||
"HockeyFeedbackUserDataEmail" = "Email";
|
||||
|
||||
/* Email Placeholder */
|
||||
"HockeyFeedbackUserDataEmailPlaceholder" = "example@email.com";
|
||||
|
@ -107,3 +107,87 @@
|
||||
/* Update Simulator Warning */
|
||||
|
||||
"UpdateSimulatorMessage" = "Hockey Update does not work in the Simulator.\nThe itms-services:// url scheme is implemented but nonfunctional.";
|
||||
|
||||
|
||||
/* Feedback */
|
||||
|
||||
|
||||
/* New Message Alert */
|
||||
|
||||
/* Alert Title */
|
||||
"HockeyFeedbackNewMessageTitle" = "New Feedback Response";
|
||||
|
||||
/* Alert Text */
|
||||
"HockeyFeedbackNewMessageText" = "A new response to your feedback is available. Would you like to view it?";
|
||||
|
||||
/* Alert Ignore Button */
|
||||
"HockeyFeedbackIgnore" = "Ignore";
|
||||
|
||||
/* Alert Show Button */
|
||||
"HockeyFeedbackShow" = "Show";
|
||||
|
||||
|
||||
/* List View */
|
||||
|
||||
/* Title */
|
||||
"HockeyFeedbackListTitle" = "Feedback";
|
||||
|
||||
/* Last Updated */
|
||||
"HockeyFeedbackListLastUpdated" = "Last Updated: %@";
|
||||
|
||||
/* Never Updated */
|
||||
"HockeyFeedbackListNeverUpdated" = "Never";
|
||||
|
||||
/* Write Feedback Button Title */
|
||||
"HockeyFeedbackListButonWriteFeedback" = "Write Feedback";
|
||||
|
||||
/* Write Response Button Title */
|
||||
"HockeyFeedbackListButonWriteResponse" = "Write Response";
|
||||
|
||||
/* User Data Set Name Button Title */
|
||||
"HockeyFeedbackListButonUserDataSetName" = "Set Your Name";
|
||||
|
||||
/* User Data Set Email Button Title */
|
||||
"HockeyFeedbackListButonUserDataSetEmail" = "Set Your Email";
|
||||
|
||||
/* User Data With Name Button Title */
|
||||
"HockeyFeedbackListButonUserDataWithName" = "Name: %@";
|
||||
|
||||
/* User Data With Email Button Title */
|
||||
"HockeyFeedbackListButonUserDataWithEmail" = "Email: %@";
|
||||
|
||||
/* User Name In Message If Name Not Set */
|
||||
"HockeyFeedbackListMessageUserNameNotSet" = "You";
|
||||
|
||||
/* Name In Message From Server If Name Not Set */
|
||||
"HockeyFeedbackListmessageResponseNameNotSet" = "Response";
|
||||
|
||||
|
||||
/* Compose Message */
|
||||
|
||||
/* Title */
|
||||
"HockeyFeedbackComposeTitle" = "New Feedback";
|
||||
|
||||
/* Send button */
|
||||
"HockeyFeedbackComposeSend" = "Send";
|
||||
|
||||
|
||||
/* Set User Data */
|
||||
|
||||
/* Title */
|
||||
"HockeyFeedbackUserDataTitle" = "Who Are You";
|
||||
|
||||
/* Description On What Should Be Entered */
|
||||
"HockeyFeedbackUserDataDescription" = "Please let us know who you are before writing us your feedback.";
|
||||
|
||||
/* Name Field */
|
||||
"HockeyFeedbackUserDataName" = "Name";
|
||||
|
||||
/* Name Placeholder */
|
||||
"HockeyFeedbackUserDataNamePlaceHolder" = "John Doe";
|
||||
|
||||
/* Email Field */
|
||||
"HockeyFeedbackUserDataEmail" = "Email";
|
||||
|
||||
/* Email Placeholder */
|
||||
"HockeyFeedbackUserDataEmailPlaceholder" = "example@email.com";
|
||||
|
@ -107,3 +107,87 @@
|
||||
/* Update Simulator Warning */
|
||||
|
||||
"UpdateSimulatorMessage" = "Hockey Update does not work in the Simulator.\nThe itms-services:// url scheme is implemented but nonfunctional.";
|
||||
|
||||
|
||||
/* Feedback */
|
||||
|
||||
|
||||
/* New Message Alert */
|
||||
|
||||
/* Alert Title */
|
||||
"HockeyFeedbackNewMessageTitle" = "New Feedback Response";
|
||||
|
||||
/* Alert Text */
|
||||
"HockeyFeedbackNewMessageText" = "A new response to your feedback is available. Would you like to view it?";
|
||||
|
||||
/* Alert Ignore Button */
|
||||
"HockeyFeedbackIgnore" = "Ignore";
|
||||
|
||||
/* Alert Show Button */
|
||||
"HockeyFeedbackShow" = "Show";
|
||||
|
||||
|
||||
/* List View */
|
||||
|
||||
/* Title */
|
||||
"HockeyFeedbackListTitle" = "Feedback";
|
||||
|
||||
/* Last Updated */
|
||||
"HockeyFeedbackListLastUpdated" = "Last Updated: %@";
|
||||
|
||||
/* Never Updated */
|
||||
"HockeyFeedbackListNeverUpdated" = "Never";
|
||||
|
||||
/* Write Feedback Button Title */
|
||||
"HockeyFeedbackListButonWriteFeedback" = "Write Feedback";
|
||||
|
||||
/* Write Response Button Title */
|
||||
"HockeyFeedbackListButonWriteResponse" = "Write Response";
|
||||
|
||||
/* User Data Set Name Button Title */
|
||||
"HockeyFeedbackListButonUserDataSetName" = "Set Your Name";
|
||||
|
||||
/* User Data Set Email Button Title */
|
||||
"HockeyFeedbackListButonUserDataSetEmail" = "Set Your Email";
|
||||
|
||||
/* User Data With Name Button Title */
|
||||
"HockeyFeedbackListButonUserDataWithName" = "Name: %@";
|
||||
|
||||
/* User Data With Email Button Title */
|
||||
"HockeyFeedbackListButonUserDataWithEmail" = "Email: %@";
|
||||
|
||||
/* User Name In Message If Name Not Set */
|
||||
"HockeyFeedbackListMessageUserNameNotSet" = "You";
|
||||
|
||||
/* Name In Message From Server If Name Not Set */
|
||||
"HockeyFeedbackListmessageResponseNameNotSet" = "Response";
|
||||
|
||||
|
||||
/* Compose Message */
|
||||
|
||||
/* Title */
|
||||
"HockeyFeedbackComposeTitle" = "New Feedback";
|
||||
|
||||
/* Send button */
|
||||
"HockeyFeedbackComposeSend" = "Send";
|
||||
|
||||
|
||||
/* Set User Data */
|
||||
|
||||
/* Title */
|
||||
"HockeyFeedbackUserDataTitle" = "Who Are You";
|
||||
|
||||
/* Description On What Should Be Entered */
|
||||
"HockeyFeedbackUserDataDescription" = "Please let us know who you are before writing us your feedback.";
|
||||
|
||||
/* Name Field */
|
||||
"HockeyFeedbackUserDataName" = "Name";
|
||||
|
||||
/* Name Placeholder */
|
||||
"HockeyFeedbackUserDataNamePlaceHolder" = "John Doe";
|
||||
|
||||
/* Email Field */
|
||||
"HockeyFeedbackUserDataEmail" = "Email";
|
||||
|
||||
/* Email Placeholder */
|
||||
"HockeyFeedbackUserDataEmailPlaceholder" = "example@email.com";
|
||||
|
@ -107,3 +107,87 @@
|
||||
/* Update Simulator Warning */
|
||||
|
||||
"UpdateSimulatorMessage" = "Hockey Update não funciona no Simulador.\nA url itms-services:// é implementada mas não é funcional.";
|
||||
|
||||
|
||||
/* Feedback */
|
||||
|
||||
|
||||
/* New Message Alert */
|
||||
|
||||
/* Alert Title */
|
||||
"HockeyFeedbackNewMessageTitle" = "New Feedback Response";
|
||||
|
||||
/* Alert Text */
|
||||
"HockeyFeedbackNewMessageText" = "A new response to your feedback is available. Would you like to view it?";
|
||||
|
||||
/* Alert Ignore Button */
|
||||
"HockeyFeedbackIgnore" = "Ignore";
|
||||
|
||||
/* Alert Show Button */
|
||||
"HockeyFeedbackShow" = "Show";
|
||||
|
||||
|
||||
/* List View */
|
||||
|
||||
/* Title */
|
||||
"HockeyFeedbackListTitle" = "Feedback";
|
||||
|
||||
/* Last Updated */
|
||||
"HockeyFeedbackListLastUpdated" = "Last Updated: %@";
|
||||
|
||||
/* Never Updated */
|
||||
"HockeyFeedbackListNeverUpdated" = "Never";
|
||||
|
||||
/* Write Feedback Button Title */
|
||||
"HockeyFeedbackListButonWriteFeedback" = "Write Feedback";
|
||||
|
||||
/* Write Response Button Title */
|
||||
"HockeyFeedbackListButonWriteResponse" = "Write Response";
|
||||
|
||||
/* User Data Set Name Button Title */
|
||||
"HockeyFeedbackListButonUserDataSetName" = "Set Your Name";
|
||||
|
||||
/* User Data Set Email Button Title */
|
||||
"HockeyFeedbackListButonUserDataSetEmail" = "Set Your Email";
|
||||
|
||||
/* User Data With Name Button Title */
|
||||
"HockeyFeedbackListButonUserDataWithName" = "Name: %@";
|
||||
|
||||
/* User Data With Email Button Title */
|
||||
"HockeyFeedbackListButonUserDataWithEmail" = "Email: %@";
|
||||
|
||||
/* User Name In Message If Name Not Set */
|
||||
"HockeyFeedbackListMessageUserNameNotSet" = "You";
|
||||
|
||||
/* Name In Message From Server If Name Not Set */
|
||||
"HockeyFeedbackListmessageResponseNameNotSet" = "Response";
|
||||
|
||||
|
||||
/* Compose Message */
|
||||
|
||||
/* Title */
|
||||
"HockeyFeedbackComposeTitle" = "New Feedback";
|
||||
|
||||
/* Send button */
|
||||
"HockeyFeedbackComposeSend" = "Send";
|
||||
|
||||
|
||||
/* Set User Data */
|
||||
|
||||
/* Title */
|
||||
"HockeyFeedbackUserDataTitle" = "Who Are You";
|
||||
|
||||
/* Description On What Should Be Entered */
|
||||
"HockeyFeedbackUserDataDescription" = "Please let us know who you are before writing us your feedback.";
|
||||
|
||||
/* Name Field */
|
||||
"HockeyFeedbackUserDataName" = "Name";
|
||||
|
||||
/* Name Placeholder */
|
||||
"HockeyFeedbackUserDataNamePlaceHolder" = "John Doe";
|
||||
|
||||
/* Email Field */
|
||||
"HockeyFeedbackUserDataEmail" = "Email";
|
||||
|
||||
/* Email Placeholder */
|
||||
"HockeyFeedbackUserDataEmailPlaceholder" = "example@email.com";
|
||||
|
@ -107,3 +107,87 @@
|
||||
/* Update Simulator Warning */
|
||||
|
||||
"UpdateSimulatorMessage" = "Hockey Update does not work in the Simulator.\nThe itms-services:// url scheme is implemented but nonfunctional.";
|
||||
|
||||
|
||||
/* Feedback */
|
||||
|
||||
|
||||
/* New Message Alert */
|
||||
|
||||
/* Alert Title */
|
||||
"HockeyFeedbackNewMessageTitle" = "New Feedback Response";
|
||||
|
||||
/* Alert Text */
|
||||
"HockeyFeedbackNewMessageText" = "A new response to your feedback is available. Would you like to view it?";
|
||||
|
||||
/* Alert Ignore Button */
|
||||
"HockeyFeedbackIgnore" = "Ignore";
|
||||
|
||||
/* Alert Show Button */
|
||||
"HockeyFeedbackShow" = "Show";
|
||||
|
||||
|
||||
/* List View */
|
||||
|
||||
/* Title */
|
||||
"HockeyFeedbackListTitle" = "Feedback";
|
||||
|
||||
/* Last Updated */
|
||||
"HockeyFeedbackListLastUpdated" = "Last Updated: %@";
|
||||
|
||||
/* Never Updated */
|
||||
"HockeyFeedbackListNeverUpdated" = "Never";
|
||||
|
||||
/* Write Feedback Button Title */
|
||||
"HockeyFeedbackListButonWriteFeedback" = "Write Feedback";
|
||||
|
||||
/* Write Response Button Title */
|
||||
"HockeyFeedbackListButonWriteResponse" = "Write Response";
|
||||
|
||||
/* User Data Set Name Button Title */
|
||||
"HockeyFeedbackListButonUserDataSetName" = "Set Your Name";
|
||||
|
||||
/* User Data Set Email Button Title */
|
||||
"HockeyFeedbackListButonUserDataSetEmail" = "Set Your Email";
|
||||
|
||||
/* User Data With Name Button Title */
|
||||
"HockeyFeedbackListButonUserDataWithName" = "Name: %@";
|
||||
|
||||
/* User Data With Email Button Title */
|
||||
"HockeyFeedbackListButonUserDataWithEmail" = "Email: %@";
|
||||
|
||||
/* User Name In Message If Name Not Set */
|
||||
"HockeyFeedbackListMessageUserNameNotSet" = "You";
|
||||
|
||||
/* Name In Message From Server If Name Not Set */
|
||||
"HockeyFeedbackListmessageResponseNameNotSet" = "Response";
|
||||
|
||||
|
||||
/* Compose Message */
|
||||
|
||||
/* Title */
|
||||
"HockeyFeedbackComposeTitle" = "New Feedback";
|
||||
|
||||
/* Send button */
|
||||
"HockeyFeedbackComposeSend" = "Send";
|
||||
|
||||
|
||||
/* Set User Data */
|
||||
|
||||
/* Title */
|
||||
"HockeyFeedbackUserDataTitle" = "Who Are You";
|
||||
|
||||
/* Description On What Should Be Entered */
|
||||
"HockeyFeedbackUserDataDescription" = "Please let us know who you are before writing us your feedback.";
|
||||
|
||||
/* Name Field */
|
||||
"HockeyFeedbackUserDataName" = "Name";
|
||||
|
||||
/* Name Placeholder */
|
||||
"HockeyFeedbackUserDataNamePlaceHolder" = "John Doe";
|
||||
|
||||
/* Email Field */
|
||||
"HockeyFeedbackUserDataEmail" = "Email";
|
||||
|
||||
/* Email Placeholder */
|
||||
"HockeyFeedbackUserDataEmailPlaceholder" = "example@email.com";
|
||||
|
@ -107,3 +107,87 @@
|
||||
/* Update Simulator Warning */
|
||||
|
||||
"UpdateSimulatorMessage" = "Hockey Update fungerar inte i Simulatorn.\nitms-services:// url schemat är implementerat men fungerar ej.";
|
||||
|
||||
|
||||
/* Feedback */
|
||||
|
||||
|
||||
/* New Message Alert */
|
||||
|
||||
/* Alert Title */
|
||||
"HockeyFeedbackNewMessageTitle" = "New Feedback Response";
|
||||
|
||||
/* Alert Text */
|
||||
"HockeyFeedbackNewMessageText" = "A new response to your feedback is available. Would you like to view it?";
|
||||
|
||||
/* Alert Ignore Button */
|
||||
"HockeyFeedbackIgnore" = "Ignore";
|
||||
|
||||
/* Alert Show Button */
|
||||
"HockeyFeedbackShow" = "Show";
|
||||
|
||||
|
||||
/* List View */
|
||||
|
||||
/* Title */
|
||||
"HockeyFeedbackListTitle" = "Feedback";
|
||||
|
||||
/* Last Updated */
|
||||
"HockeyFeedbackListLastUpdated" = "Last Updated: %@";
|
||||
|
||||
/* Never Updated */
|
||||
"HockeyFeedbackListNeverUpdated" = "Never";
|
||||
|
||||
/* Write Feedback Button Title */
|
||||
"HockeyFeedbackListButonWriteFeedback" = "Write Feedback";
|
||||
|
||||
/* Write Response Button Title */
|
||||
"HockeyFeedbackListButonWriteResponse" = "Write Response";
|
||||
|
||||
/* User Data Set Name Button Title */
|
||||
"HockeyFeedbackListButonUserDataSetName" = "Set Your Name";
|
||||
|
||||
/* User Data Set Email Button Title */
|
||||
"HockeyFeedbackListButonUserDataSetEmail" = "Set Your Email";
|
||||
|
||||
/* User Data With Name Button Title */
|
||||
"HockeyFeedbackListButonUserDataWithName" = "Name: %@";
|
||||
|
||||
/* User Data With Email Button Title */
|
||||
"HockeyFeedbackListButonUserDataWithEmail" = "Email: %@";
|
||||
|
||||
/* User Name In Message If Name Not Set */
|
||||
"HockeyFeedbackListMessageUserNameNotSet" = "You";
|
||||
|
||||
/* Name In Message From Server If Name Not Set */
|
||||
"HockeyFeedbackListmessageResponseNameNotSet" = "Response";
|
||||
|
||||
|
||||
/* Compose Message */
|
||||
|
||||
/* Title */
|
||||
"HockeyFeedbackComposeTitle" = "New Feedback";
|
||||
|
||||
/* Send button */
|
||||
"HockeyFeedbackComposeSend" = "Send";
|
||||
|
||||
|
||||
/* Set User Data */
|
||||
|
||||
/* Title */
|
||||
"HockeyFeedbackUserDataTitle" = "Who Are You";
|
||||
|
||||
/* Description On What Should Be Entered */
|
||||
"HockeyFeedbackUserDataDescription" = "Please let us know who you are before writing us your feedback.";
|
||||
|
||||
/* Name Field */
|
||||
"HockeyFeedbackUserDataName" = "Name";
|
||||
|
||||
/* Name Placeholder */
|
||||
"HockeyFeedbackUserDataNamePlaceHolder" = "John Doe";
|
||||
|
||||
/* Email Field */
|
||||
"HockeyFeedbackUserDataEmail" = "Email";
|
||||
|
||||
/* Email Placeholder */
|
||||
"HockeyFeedbackUserDataEmailPlaceholder" = "example@email.com";
|
||||
|
@ -107,3 +107,87 @@
|
||||
/* Update Simulator Warning */
|
||||
|
||||
"UpdateSimulatorMessage" = "Hockey Update does not work in the Simulator.\nThe itms-services:// url scheme is implemented but nonfunctional.";
|
||||
|
||||
|
||||
/* Feedback */
|
||||
|
||||
|
||||
/* New Message Alert */
|
||||
|
||||
/* Alert Title */
|
||||
"HockeyFeedbackNewMessageTitle" = "New Feedback Response";
|
||||
|
||||
/* Alert Text */
|
||||
"HockeyFeedbackNewMessageText" = "A new response to your feedback is available. Would you like to view it?";
|
||||
|
||||
/* Alert Ignore Button */
|
||||
"HockeyFeedbackIgnore" = "Ignore";
|
||||
|
||||
/* Alert Show Button */
|
||||
"HockeyFeedbackShow" = "Show";
|
||||
|
||||
|
||||
/* List View */
|
||||
|
||||
/* Title */
|
||||
"HockeyFeedbackListTitle" = "Feedback";
|
||||
|
||||
/* Last Updated */
|
||||
"HockeyFeedbackListLastUpdated" = "Last Updated: %@";
|
||||
|
||||
/* Never Updated */
|
||||
"HockeyFeedbackListNeverUpdated" = "Never";
|
||||
|
||||
/* Write Feedback Button Title */
|
||||
"HockeyFeedbackListButonWriteFeedback" = "Write Feedback";
|
||||
|
||||
/* Write Response Button Title */
|
||||
"HockeyFeedbackListButonWriteResponse" = "Write Response";
|
||||
|
||||
/* User Data Set Name Button Title */
|
||||
"HockeyFeedbackListButonUserDataSetName" = "Set Your Name";
|
||||
|
||||
/* User Data Set Email Button Title */
|
||||
"HockeyFeedbackListButonUserDataSetEmail" = "Set Your Email";
|
||||
|
||||
/* User Data With Name Button Title */
|
||||
"HockeyFeedbackListButonUserDataWithName" = "Name: %@";
|
||||
|
||||
/* User Data With Email Button Title */
|
||||
"HockeyFeedbackListButonUserDataWithEmail" = "Email: %@";
|
||||
|
||||
/* User Name In Message If Name Not Set */
|
||||
"HockeyFeedbackListMessageUserNameNotSet" = "You";
|
||||
|
||||
/* Name In Message From Server If Name Not Set */
|
||||
"HockeyFeedbackListmessageResponseNameNotSet" = "Response";
|
||||
|
||||
|
||||
/* Compose Message */
|
||||
|
||||
/* Title */
|
||||
"HockeyFeedbackComposeTitle" = "New Feedback";
|
||||
|
||||
/* Send button */
|
||||
"HockeyFeedbackComposeSend" = "Send";
|
||||
|
||||
|
||||
/* Set User Data */
|
||||
|
||||
/* Title */
|
||||
"HockeyFeedbackUserDataTitle" = "Who Are You";
|
||||
|
||||
/* Description On What Should Be Entered */
|
||||
"HockeyFeedbackUserDataDescription" = "Please let us know who you are before writing us your feedback.";
|
||||
|
||||
/* Name Field */
|
||||
"HockeyFeedbackUserDataName" = "Name";
|
||||
|
||||
/* Name Placeholder */
|
||||
"HockeyFeedbackUserDataNamePlaceHolder" = "John Doe";
|
||||
|
||||
/* Email Field */
|
||||
"HockeyFeedbackUserDataEmail" = "Email";
|
||||
|
||||
/* Email Placeholder */
|
||||
"HockeyFeedbackUserDataEmailPlaceholder" = "example@email.com";
|
||||
|
@ -107,3 +107,87 @@
|
||||
/* Update Simulator Warning */
|
||||
|
||||
"UpdateSimulatorMessage" = "Hockey Update does not work in the Simulator.\nThe itms-services:// url scheme is implemented but nonfunctional.";
|
||||
|
||||
|
||||
/* Feedback */
|
||||
|
||||
|
||||
/* New Message Alert */
|
||||
|
||||
/* Alert Title */
|
||||
"HockeyFeedbackNewMessageTitle" = "New Feedback Response";
|
||||
|
||||
/* Alert Text */
|
||||
"HockeyFeedbackNewMessageText" = "A new response to your feedback is available. Would you like to view it?";
|
||||
|
||||
/* Alert Ignore Button */
|
||||
"HockeyFeedbackIgnore" = "Ignore";
|
||||
|
||||
/* Alert Show Button */
|
||||
"HockeyFeedbackShow" = "Show";
|
||||
|
||||
|
||||
/* List View */
|
||||
|
||||
/* Title */
|
||||
"HockeyFeedbackListTitle" = "Feedback";
|
||||
|
||||
/* Last Updated */
|
||||
"HockeyFeedbackListLastUpdated" = "Last Updated: %@";
|
||||
|
||||
/* Never Updated */
|
||||
"HockeyFeedbackListNeverUpdated" = "Never";
|
||||
|
||||
/* Write Feedback Button Title */
|
||||
"HockeyFeedbackListButonWriteFeedback" = "Write Feedback";
|
||||
|
||||
/* Write Response Button Title */
|
||||
"HockeyFeedbackListButonWriteResponse" = "Write Response";
|
||||
|
||||
/* User Data Set Name Button Title */
|
||||
"HockeyFeedbackListButonUserDataSetName" = "Set Your Name";
|
||||
|
||||
/* User Data Set Email Button Title */
|
||||
"HockeyFeedbackListButonUserDataSetEmail" = "Set Your Email";
|
||||
|
||||
/* User Data With Name Button Title */
|
||||
"HockeyFeedbackListButonUserDataWithName" = "Name: %@";
|
||||
|
||||
/* User Data With Email Button Title */
|
||||
"HockeyFeedbackListButonUserDataWithEmail" = "Email: %@";
|
||||
|
||||
/* User Name In Message If Name Not Set */
|
||||
"HockeyFeedbackListMessageUserNameNotSet" = "You";
|
||||
|
||||
/* Name In Message From Server If Name Not Set */
|
||||
"HockeyFeedbackListmessageResponseNameNotSet" = "Response";
|
||||
|
||||
|
||||
/* Compose Message */
|
||||
|
||||
/* Title */
|
||||
"HockeyFeedbackComposeTitle" = "New Feedback";
|
||||
|
||||
/* Send button */
|
||||
"HockeyFeedbackComposeSend" = "Send";
|
||||
|
||||
|
||||
/* Set User Data */
|
||||
|
||||
/* Title */
|
||||
"HockeyFeedbackUserDataTitle" = "Who Are You";
|
||||
|
||||
/* Description On What Should Be Entered */
|
||||
"HockeyFeedbackUserDataDescription" = "Please let us know who you are before writing us your feedback.";
|
||||
|
||||
/* Name Field */
|
||||
"HockeyFeedbackUserDataName" = "Name";
|
||||
|
||||
/* Name Placeholder */
|
||||
"HockeyFeedbackUserDataNamePlaceHolder" = "John Doe";
|
||||
|
||||
/* Email Field */
|
||||
"HockeyFeedbackUserDataEmail" = "Email";
|
||||
|
||||
/* Email Placeholder */
|
||||
"HockeyFeedbackUserDataEmailPlaceholder" = "example@email.com";
|
||||
|
@ -107,3 +107,87 @@
|
||||
/* Update Simulator Warning */
|
||||
|
||||
"UpdateSimulatorMessage" = "Hockey Update does not work in the Simulator.\nThe itms-services:// url scheme is implemented but nonfunctional.";
|
||||
|
||||
|
||||
/* Feedback */
|
||||
|
||||
|
||||
/* New Message Alert */
|
||||
|
||||
/* Alert Title */
|
||||
"HockeyFeedbackNewMessageTitle" = "New Feedback Response";
|
||||
|
||||
/* Alert Text */
|
||||
"HockeyFeedbackNewMessageText" = "A new response to your feedback is available. Would you like to view it?";
|
||||
|
||||
/* Alert Ignore Button */
|
||||
"HockeyFeedbackIgnore" = "Ignore";
|
||||
|
||||
/* Alert Show Button */
|
||||
"HockeyFeedbackShow" = "Show";
|
||||
|
||||
|
||||
/* List View */
|
||||
|
||||
/* Title */
|
||||
"HockeyFeedbackListTitle" = "Feedback";
|
||||
|
||||
/* Last Updated */
|
||||
"HockeyFeedbackListLastUpdated" = "Last Updated: %@";
|
||||
|
||||
/* Never Updated */
|
||||
"HockeyFeedbackListNeverUpdated" = "Never";
|
||||
|
||||
/* Write Feedback Button Title */
|
||||
"HockeyFeedbackListButonWriteFeedback" = "Write Feedback";
|
||||
|
||||
/* Write Response Button Title */
|
||||
"HockeyFeedbackListButonWriteResponse" = "Write Response";
|
||||
|
||||
/* User Data Set Name Button Title */
|
||||
"HockeyFeedbackListButonUserDataSetName" = "Set Your Name";
|
||||
|
||||
/* User Data Set Email Button Title */
|
||||
"HockeyFeedbackListButonUserDataSetEmail" = "Set Your Email";
|
||||
|
||||
/* User Data With Name Button Title */
|
||||
"HockeyFeedbackListButonUserDataWithName" = "Name: %@";
|
||||
|
||||
/* User Data With Email Button Title */
|
||||
"HockeyFeedbackListButonUserDataWithEmail" = "Email: %@";
|
||||
|
||||
/* User Name In Message If Name Not Set */
|
||||
"HockeyFeedbackListMessageUserNameNotSet" = "You";
|
||||
|
||||
/* Name In Message From Server If Name Not Set */
|
||||
"HockeyFeedbackListmessageResponseNameNotSet" = "Response";
|
||||
|
||||
|
||||
/* Compose Message */
|
||||
|
||||
/* Title */
|
||||
"HockeyFeedbackComposeTitle" = "New Feedback";
|
||||
|
||||
/* Send button */
|
||||
"HockeyFeedbackComposeSend" = "Send";
|
||||
|
||||
|
||||
/* Set User Data */
|
||||
|
||||
/* Title */
|
||||
"HockeyFeedbackUserDataTitle" = "Who Are You";
|
||||
|
||||
/* Description On What Should Be Entered */
|
||||
"HockeyFeedbackUserDataDescription" = "Please let us know who you are before writing us your feedback.";
|
||||
|
||||
/* Name Field */
|
||||
"HockeyFeedbackUserDataName" = "Name";
|
||||
|
||||
/* Name Placeholder */
|
||||
"HockeyFeedbackUserDataNamePlaceHolder" = "John Doe";
|
||||
|
||||
/* Email Field */
|
||||
"HockeyFeedbackUserDataEmail" = "Email";
|
||||
|
||||
/* Email Placeholder */
|
||||
"HockeyFeedbackUserDataEmailPlaceholder" = "example@email.com";
|
||||
|
@ -21,62 +21,148 @@
|
||||
/* End PBXAggregateTarget section */
|
||||
|
||||
/* Begin PBXBuildFile section */
|
||||
1E01118115BB6311007002AC /* BITUpdateManagerPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E01118015BB62FE007002AC /* BITUpdateManagerPrivate.h */; };
|
||||
1E01118215BB6314007002AC /* BITCrashManagerPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E01117E15BB6228007002AC /* BITCrashManagerPrivate.h */; };
|
||||
1E01118D15BB83FB007002AC /* BITUpdateViewControllerPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E01118C15BB83F6007002AC /* BITUpdateViewControllerPrivate.h */; };
|
||||
1E27EF2515BB5033000AE995 /* HockeySDK.strings in Resources */ = {isa = PBXBuildFile; fileRef = 1E59555F15B6F80E00A03429 /* HockeySDK.strings */; };
|
||||
1E40BCB515A3487500BD64D9 /* BITCrashManagerDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E40BCB415A3487500BD64D9 /* BITCrashManagerDelegate.h */; settings = {ATTRIBUTES = (); }; };
|
||||
1E40BCB915A3494400BD64D9 /* BITCrashReportTextFormatter.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E40BCB715A3494400BD64D9 /* BITCrashReportTextFormatter.h */; };
|
||||
1E40BCBA15A3494400BD64D9 /* BITCrashReportTextFormatter.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E40BCB815A3494400BD64D9 /* BITCrashReportTextFormatter.m */; };
|
||||
1E59545715B6C41300A03429 /* BITAppVersionMetaInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = E41EB45A148D7BF50015DEDC /* BITAppVersionMetaInfo.m */; };
|
||||
1E59545C15B6C41300A03429 /* BITCrashManager.m in Sources */ = {isa = PBXBuildFile; fileRef = E41EB464148D7BF50015DEDC /* BITCrashManager.m */; };
|
||||
1E49A43A1612223B00463151 /* BITFeedbackComposeViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A42D1612223B00463151 /* BITFeedbackComposeViewController.h */; };
|
||||
1E49A43B1612223B00463151 /* BITFeedbackComposeViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A42D1612223B00463151 /* BITFeedbackComposeViewController.h */; };
|
||||
1E49A43C1612223B00463151 /* BITFeedbackComposeViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A42D1612223B00463151 /* BITFeedbackComposeViewController.h */; };
|
||||
1E49A43D1612223B00463151 /* BITFeedbackComposeViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E49A42E1612223B00463151 /* BITFeedbackComposeViewController.m */; };
|
||||
1E49A43E1612223B00463151 /* BITFeedbackComposeViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E49A42E1612223B00463151 /* BITFeedbackComposeViewController.m */; };
|
||||
1E49A43F1612223B00463151 /* BITFeedbackComposeViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E49A42E1612223B00463151 /* BITFeedbackComposeViewController.m */; };
|
||||
1E49A4401612223B00463151 /* BITFeedbackListViewCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A42F1612223B00463151 /* BITFeedbackListViewCell.h */; };
|
||||
1E49A4411612223B00463151 /* BITFeedbackListViewCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A42F1612223B00463151 /* BITFeedbackListViewCell.h */; };
|
||||
1E49A4421612223B00463151 /* BITFeedbackListViewCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A42F1612223B00463151 /* BITFeedbackListViewCell.h */; };
|
||||
1E49A4431612223B00463151 /* BITFeedbackListViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E49A4301612223B00463151 /* BITFeedbackListViewCell.m */; };
|
||||
1E49A4441612223B00463151 /* BITFeedbackListViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E49A4301612223B00463151 /* BITFeedbackListViewCell.m */; };
|
||||
1E49A4451612223B00463151 /* BITFeedbackListViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E49A4301612223B00463151 /* BITFeedbackListViewCell.m */; };
|
||||
1E49A4461612223B00463151 /* BITFeedbackListViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A4311612223B00463151 /* BITFeedbackListViewController.h */; };
|
||||
1E49A4471612223B00463151 /* BITFeedbackListViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A4311612223B00463151 /* BITFeedbackListViewController.h */; };
|
||||
1E49A4481612223B00463151 /* BITFeedbackListViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A4311612223B00463151 /* BITFeedbackListViewController.h */; };
|
||||
1E49A4491612223B00463151 /* BITFeedbackListViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E49A4321612223B00463151 /* BITFeedbackListViewController.m */; };
|
||||
1E49A44A1612223B00463151 /* BITFeedbackListViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E49A4321612223B00463151 /* BITFeedbackListViewController.m */; };
|
||||
1E49A44B1612223B00463151 /* BITFeedbackListViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E49A4321612223B00463151 /* BITFeedbackListViewController.m */; };
|
||||
1E49A44C1612223B00463151 /* BITFeedbackManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A4331612223B00463151 /* BITFeedbackManager.h */; };
|
||||
1E49A44D1612223B00463151 /* BITFeedbackManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A4331612223B00463151 /* BITFeedbackManager.h */; };
|
||||
1E49A44E1612223B00463151 /* BITFeedbackManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A4331612223B00463151 /* BITFeedbackManager.h */; };
|
||||
1E49A44F1612223B00463151 /* BITFeedbackManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E49A4341612223B00463151 /* BITFeedbackManager.m */; };
|
||||
1E49A4501612223B00463151 /* BITFeedbackManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E49A4341612223B00463151 /* BITFeedbackManager.m */; };
|
||||
1E49A4511612223B00463151 /* BITFeedbackManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E49A4341612223B00463151 /* BITFeedbackManager.m */; };
|
||||
1E49A4521612223B00463151 /* BITFeedbackManagerPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A4351612223B00463151 /* BITFeedbackManagerPrivate.h */; };
|
||||
1E49A4531612223B00463151 /* BITFeedbackManagerPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A4351612223B00463151 /* BITFeedbackManagerPrivate.h */; };
|
||||
1E49A4541612223B00463151 /* BITFeedbackManagerPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A4351612223B00463151 /* BITFeedbackManagerPrivate.h */; };
|
||||
1E49A4551612223B00463151 /* BITFeedbackMessage.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A4361612223B00463151 /* BITFeedbackMessage.h */; };
|
||||
1E49A4561612223B00463151 /* BITFeedbackMessage.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A4361612223B00463151 /* BITFeedbackMessage.h */; };
|
||||
1E49A4571612223B00463151 /* BITFeedbackMessage.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A4361612223B00463151 /* BITFeedbackMessage.h */; };
|
||||
1E49A4581612223B00463151 /* BITFeedbackMessage.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E49A4371612223B00463151 /* BITFeedbackMessage.m */; };
|
||||
1E49A4591612223B00463151 /* BITFeedbackMessage.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E49A4371612223B00463151 /* BITFeedbackMessage.m */; };
|
||||
1E49A45A1612223B00463151 /* BITFeedbackMessage.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E49A4371612223B00463151 /* BITFeedbackMessage.m */; };
|
||||
1E49A45B1612223B00463151 /* BITFeedbackUserDataViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A4381612223B00463151 /* BITFeedbackUserDataViewController.h */; };
|
||||
1E49A45C1612223B00463151 /* BITFeedbackUserDataViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A4381612223B00463151 /* BITFeedbackUserDataViewController.h */; };
|
||||
1E49A45D1612223B00463151 /* BITFeedbackUserDataViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A4381612223B00463151 /* BITFeedbackUserDataViewController.h */; };
|
||||
1E49A45E1612223B00463151 /* BITFeedbackUserDataViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E49A4391612223B00463151 /* BITFeedbackUserDataViewController.m */; };
|
||||
1E49A45F1612223B00463151 /* BITFeedbackUserDataViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E49A4391612223B00463151 /* BITFeedbackUserDataViewController.m */; };
|
||||
1E49A4601612223B00463151 /* BITFeedbackUserDataViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E49A4391612223B00463151 /* BITFeedbackUserDataViewController.m */; };
|
||||
1E49A46B1612226D00463151 /* BITAppVersionMetaInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A4621612226D00463151 /* BITAppVersionMetaInfo.h */; };
|
||||
1E49A46C1612226D00463151 /* BITAppVersionMetaInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A4621612226D00463151 /* BITAppVersionMetaInfo.h */; };
|
||||
1E49A46D1612226D00463151 /* BITAppVersionMetaInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A4621612226D00463151 /* BITAppVersionMetaInfo.h */; };
|
||||
1E49A46E1612226D00463151 /* BITAppVersionMetaInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E49A4631612226D00463151 /* BITAppVersionMetaInfo.m */; };
|
||||
1E49A46F1612226D00463151 /* BITAppVersionMetaInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E49A4631612226D00463151 /* BITAppVersionMetaInfo.m */; };
|
||||
1E49A4701612226D00463151 /* BITAppVersionMetaInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E49A4631612226D00463151 /* BITAppVersionMetaInfo.m */; };
|
||||
1E49A4711612226D00463151 /* BITUpdateManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A4641612226D00463151 /* BITUpdateManager.h */; };
|
||||
1E49A4721612226D00463151 /* BITUpdateManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A4641612226D00463151 /* BITUpdateManager.h */; };
|
||||
1E49A4731612226D00463151 /* BITUpdateManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A4641612226D00463151 /* BITUpdateManager.h */; };
|
||||
1E49A4741612226D00463151 /* BITUpdateManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E49A4651612226D00463151 /* BITUpdateManager.m */; };
|
||||
1E49A4751612226D00463151 /* BITUpdateManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E49A4651612226D00463151 /* BITUpdateManager.m */; };
|
||||
1E49A4761612226D00463151 /* BITUpdateManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E49A4651612226D00463151 /* BITUpdateManager.m */; };
|
||||
1E49A4771612226D00463151 /* BITUpdateManagerDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A4661612226D00463151 /* BITUpdateManagerDelegate.h */; };
|
||||
1E49A4781612226D00463151 /* BITUpdateManagerDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A4661612226D00463151 /* BITUpdateManagerDelegate.h */; };
|
||||
1E49A4791612226D00463151 /* BITUpdateManagerDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A4661612226D00463151 /* BITUpdateManagerDelegate.h */; };
|
||||
1E49A47A1612226D00463151 /* BITUpdateManagerPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A4671612226D00463151 /* BITUpdateManagerPrivate.h */; };
|
||||
1E49A47B1612226D00463151 /* BITUpdateManagerPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A4671612226D00463151 /* BITUpdateManagerPrivate.h */; };
|
||||
1E49A47C1612226D00463151 /* BITUpdateManagerPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A4671612226D00463151 /* BITUpdateManagerPrivate.h */; };
|
||||
1E49A47D1612226D00463151 /* BITUpdateViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A4681612226D00463151 /* BITUpdateViewController.h */; };
|
||||
1E49A47E1612226D00463151 /* BITUpdateViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A4681612226D00463151 /* BITUpdateViewController.h */; };
|
||||
1E49A47F1612226D00463151 /* BITUpdateViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A4681612226D00463151 /* BITUpdateViewController.h */; };
|
||||
1E49A4801612226D00463151 /* BITUpdateViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E49A4691612226D00463151 /* BITUpdateViewController.m */; };
|
||||
1E49A4811612226D00463151 /* BITUpdateViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E49A4691612226D00463151 /* BITUpdateViewController.m */; };
|
||||
1E49A4821612226D00463151 /* BITUpdateViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E49A4691612226D00463151 /* BITUpdateViewController.m */; };
|
||||
1E49A4831612226D00463151 /* BITUpdateViewControllerPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A46A1612226D00463151 /* BITUpdateViewControllerPrivate.h */; };
|
||||
1E49A4841612226D00463151 /* BITUpdateViewControllerPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A46A1612226D00463151 /* BITUpdateViewControllerPrivate.h */; };
|
||||
1E49A4851612226D00463151 /* BITUpdateViewControllerPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A46A1612226D00463151 /* BITUpdateViewControllerPrivate.h */; };
|
||||
1E49A48D1612228800463151 /* BITCrashManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A4871612228800463151 /* BITCrashManager.h */; };
|
||||
1E49A48E1612228800463151 /* BITCrashManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A4871612228800463151 /* BITCrashManager.h */; };
|
||||
1E49A48F1612228800463151 /* BITCrashManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A4871612228800463151 /* BITCrashManager.h */; };
|
||||
1E49A4901612228800463151 /* BITCrashManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E49A4881612228800463151 /* BITCrashManager.m */; };
|
||||
1E49A4911612228800463151 /* BITCrashManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E49A4881612228800463151 /* BITCrashManager.m */; };
|
||||
1E49A4921612228800463151 /* BITCrashManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E49A4881612228800463151 /* BITCrashManager.m */; };
|
||||
1E49A4931612228800463151 /* BITCrashManagerDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A4891612228800463151 /* BITCrashManagerDelegate.h */; };
|
||||
1E49A4941612228800463151 /* BITCrashManagerDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A4891612228800463151 /* BITCrashManagerDelegate.h */; };
|
||||
1E49A4951612228800463151 /* BITCrashManagerDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A4891612228800463151 /* BITCrashManagerDelegate.h */; };
|
||||
1E49A4961612228800463151 /* BITCrashManagerPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A48A1612228800463151 /* BITCrashManagerPrivate.h */; };
|
||||
1E49A4971612228800463151 /* BITCrashManagerPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A48A1612228800463151 /* BITCrashManagerPrivate.h */; };
|
||||
1E49A4981612228800463151 /* BITCrashManagerPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A48A1612228800463151 /* BITCrashManagerPrivate.h */; };
|
||||
1E49A4991612228800463151 /* BITCrashReportTextFormatter.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A48B1612228800463151 /* BITCrashReportTextFormatter.h */; };
|
||||
1E49A49A1612228800463151 /* BITCrashReportTextFormatter.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A48B1612228800463151 /* BITCrashReportTextFormatter.h */; };
|
||||
1E49A49B1612228800463151 /* BITCrashReportTextFormatter.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A48B1612228800463151 /* BITCrashReportTextFormatter.h */; };
|
||||
1E49A49C1612228800463151 /* BITCrashReportTextFormatter.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E49A48C1612228800463151 /* BITCrashReportTextFormatter.m */; };
|
||||
1E49A49D1612228800463151 /* BITCrashReportTextFormatter.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E49A48C1612228800463151 /* BITCrashReportTextFormatter.m */; };
|
||||
1E49A49E1612228800463151 /* BITCrashReportTextFormatter.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E49A48C1612228800463151 /* BITCrashReportTextFormatter.m */; };
|
||||
1E49A4AD161222B900463151 /* BITHockeyBaseManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A4A0161222B900463151 /* BITHockeyBaseManager.h */; };
|
||||
1E49A4AE161222B900463151 /* BITHockeyBaseManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A4A0161222B900463151 /* BITHockeyBaseManager.h */; };
|
||||
1E49A4AF161222B900463151 /* BITHockeyBaseManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A4A0161222B900463151 /* BITHockeyBaseManager.h */; };
|
||||
1E49A4B0161222B900463151 /* BITHockeyBaseManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E49A4A1161222B900463151 /* BITHockeyBaseManager.m */; };
|
||||
1E49A4B1161222B900463151 /* BITHockeyBaseManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E49A4A1161222B900463151 /* BITHockeyBaseManager.m */; };
|
||||
1E49A4B2161222B900463151 /* BITHockeyBaseManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E49A4A1161222B900463151 /* BITHockeyBaseManager.m */; };
|
||||
1E49A4B3161222B900463151 /* BITHockeyBaseManagerPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A4A2161222B900463151 /* BITHockeyBaseManagerPrivate.h */; };
|
||||
1E49A4B4161222B900463151 /* BITHockeyBaseManagerPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A4A2161222B900463151 /* BITHockeyBaseManagerPrivate.h */; };
|
||||
1E49A4B5161222B900463151 /* BITHockeyBaseManagerPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A4A2161222B900463151 /* BITHockeyBaseManagerPrivate.h */; };
|
||||
1E49A4B6161222B900463151 /* BITHockeyBaseViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A4A3161222B900463151 /* BITHockeyBaseViewController.h */; };
|
||||
1E49A4B7161222B900463151 /* BITHockeyBaseViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A4A3161222B900463151 /* BITHockeyBaseViewController.h */; };
|
||||
1E49A4B8161222B900463151 /* BITHockeyBaseViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A4A3161222B900463151 /* BITHockeyBaseViewController.h */; };
|
||||
1E49A4B9161222B900463151 /* BITHockeyBaseViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E49A4A4161222B900463151 /* BITHockeyBaseViewController.m */; };
|
||||
1E49A4BA161222B900463151 /* BITHockeyBaseViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E49A4A4161222B900463151 /* BITHockeyBaseViewController.m */; };
|
||||
1E49A4BB161222B900463151 /* BITHockeyBaseViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E49A4A4161222B900463151 /* BITHockeyBaseViewController.m */; };
|
||||
1E49A4BC161222B900463151 /* BITHockeyHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A4A5161222B900463151 /* BITHockeyHelper.h */; };
|
||||
1E49A4BD161222B900463151 /* BITHockeyHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A4A5161222B900463151 /* BITHockeyHelper.h */; };
|
||||
1E49A4BE161222B900463151 /* BITHockeyHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A4A5161222B900463151 /* BITHockeyHelper.h */; };
|
||||
1E49A4BF161222B900463151 /* BITHockeyHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E49A4A6161222B900463151 /* BITHockeyHelper.m */; };
|
||||
1E49A4C0161222B900463151 /* BITHockeyHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E49A4A6161222B900463151 /* BITHockeyHelper.m */; };
|
||||
1E49A4C1161222B900463151 /* BITHockeyHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E49A4A6161222B900463151 /* BITHockeyHelper.m */; };
|
||||
1E49A4C2161222B900463151 /* PSAppStoreHeader.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A4A7161222B900463151 /* PSAppStoreHeader.h */; };
|
||||
1E49A4C3161222B900463151 /* PSAppStoreHeader.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A4A7161222B900463151 /* PSAppStoreHeader.h */; };
|
||||
1E49A4C4161222B900463151 /* PSAppStoreHeader.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A4A7161222B900463151 /* PSAppStoreHeader.h */; };
|
||||
1E49A4C5161222B900463151 /* PSAppStoreHeader.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E49A4A8161222B900463151 /* PSAppStoreHeader.m */; };
|
||||
1E49A4C6161222B900463151 /* PSAppStoreHeader.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E49A4A8161222B900463151 /* PSAppStoreHeader.m */; };
|
||||
1E49A4C7161222B900463151 /* PSAppStoreHeader.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E49A4A8161222B900463151 /* PSAppStoreHeader.m */; };
|
||||
1E49A4C8161222B900463151 /* PSStoreButton.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A4A9161222B900463151 /* PSStoreButton.h */; };
|
||||
1E49A4C9161222B900463151 /* PSStoreButton.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A4A9161222B900463151 /* PSStoreButton.h */; };
|
||||
1E49A4CA161222B900463151 /* PSStoreButton.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A4A9161222B900463151 /* PSStoreButton.h */; };
|
||||
1E49A4CB161222B900463151 /* PSStoreButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E49A4AA161222B900463151 /* PSStoreButton.m */; };
|
||||
1E49A4CC161222B900463151 /* PSStoreButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E49A4AA161222B900463151 /* PSStoreButton.m */; };
|
||||
1E49A4CD161222B900463151 /* PSStoreButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E49A4AA161222B900463151 /* PSStoreButton.m */; };
|
||||
1E49A4CE161222B900463151 /* PSWebTableViewCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A4AB161222B900463151 /* PSWebTableViewCell.h */; };
|
||||
1E49A4CF161222B900463151 /* PSWebTableViewCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A4AB161222B900463151 /* PSWebTableViewCell.h */; };
|
||||
1E49A4D0161222B900463151 /* PSWebTableViewCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A4AB161222B900463151 /* PSWebTableViewCell.h */; };
|
||||
1E49A4D1161222B900463151 /* PSWebTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E49A4AC161222B900463151 /* PSWebTableViewCell.m */; };
|
||||
1E49A4D2161222B900463151 /* PSWebTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E49A4AC161222B900463151 /* PSWebTableViewCell.m */; };
|
||||
1E49A4D3161222B900463151 /* PSWebTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E49A4AC161222B900463151 /* PSWebTableViewCell.m */; };
|
||||
1E49A4D6161222D400463151 /* HockeySDKPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A4D4161222D400463151 /* HockeySDKPrivate.h */; };
|
||||
1E49A4D7161222D400463151 /* HockeySDKPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A4D4161222D400463151 /* HockeySDKPrivate.h */; };
|
||||
1E49A4D8161222D400463151 /* HockeySDKPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E49A4D4161222D400463151 /* HockeySDKPrivate.h */; };
|
||||
1E49A4D9161222D400463151 /* HockeySDKPrivate.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E49A4D5161222D400463151 /* HockeySDKPrivate.m */; };
|
||||
1E49A4DA161222D400463151 /* HockeySDKPrivate.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E49A4D5161222D400463151 /* HockeySDKPrivate.m */; };
|
||||
1E49A4DB161222D400463151 /* HockeySDKPrivate.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E49A4D5161222D400463151 /* HockeySDKPrivate.m */; };
|
||||
1E59545D15B6C41300A03429 /* BITHockeyManager.m in Sources */ = {isa = PBXBuildFile; fileRef = E41EB466148D7BF50015DEDC /* BITHockeyManager.m */; };
|
||||
1E59545F15B6C41300A03429 /* PSAppStoreHeader.m in Sources */ = {isa = PBXBuildFile; fileRef = E41EB46A148D7BF50015DEDC /* PSAppStoreHeader.m */; };
|
||||
1E59546015B6C41300A03429 /* PSStoreButton.m in Sources */ = {isa = PBXBuildFile; fileRef = E41EB46C148D7BF50015DEDC /* PSStoreButton.m */; };
|
||||
1E59546115B6C41300A03429 /* PSWebTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = E41EB46E148D7BF50015DEDC /* PSWebTableViewCell.m */; };
|
||||
1E59546315B6C41300A03429 /* BITCrashReportTextFormatter.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E40BCB815A3494400BD64D9 /* BITCrashReportTextFormatter.m */; };
|
||||
1E59546615B6C41300A03429 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E400561D148D79B500EB22B9 /* Foundation.framework */; };
|
||||
1E59546715B6C41300A03429 /* CrashReporter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E41EB48B148D7C4E0015DEDC /* CrashReporter.framework */; };
|
||||
1E59546915B6C41300A03429 /* BITAppVersionMetaInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = E41EB459148D7BF50015DEDC /* BITAppVersionMetaInfo.h */; };
|
||||
1E59546B15B6C41300A03429 /* BITUpdateManager.h in Headers */ = {isa = PBXBuildFile; fileRef = E41EB45D148D7BF50015DEDC /* BITUpdateManager.h */; };
|
||||
1E59546E15B6C41300A03429 /* BITHockeyManager.h in Headers */ = {isa = PBXBuildFile; fileRef = E41EB465148D7BF50015DEDC /* BITHockeyManager.h */; };
|
||||
1E59547015B6C41300A03429 /* PSAppStoreHeader.h in Headers */ = {isa = PBXBuildFile; fileRef = E41EB469148D7BF50015DEDC /* PSAppStoreHeader.h */; };
|
||||
1E59547115B6C41300A03429 /* PSStoreButton.h in Headers */ = {isa = PBXBuildFile; fileRef = E41EB46B148D7BF50015DEDC /* PSStoreButton.h */; };
|
||||
1E59547215B6C41300A03429 /* PSWebTableViewCell.h in Headers */ = {isa = PBXBuildFile; fileRef = E41EB46D148D7BF50015DEDC /* PSWebTableViewCell.h */; };
|
||||
1E59547515B6C41300A03429 /* BITCrashManagerDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E40BCB415A3487500BD64D9 /* BITCrashManagerDelegate.h */; settings = {ATTRIBUTES = (); }; };
|
||||
1E59547615B6C41300A03429 /* BITCrashReportTextFormatter.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E40BCB715A3494400BD64D9 /* BITCrashReportTextFormatter.h */; };
|
||||
1E59547815B6C41300A03429 /* HockeySDK.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E71509A15B5C76F004E88FF /* HockeySDK.h */; settings = {ATTRIBUTES = (); }; };
|
||||
1E59548315B6C4EF00A03429 /* HockeySDK.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E71509A15B5C76F004E88FF /* HockeySDK.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
1E59548415B6C4F300A03429 /* BITCrashManagerDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E40BCB415A3487500BD64D9 /* BITCrashManagerDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
1E59548515B6C4FB00A03429 /* BITHockeyManager.h in Headers */ = {isa = PBXBuildFile; fileRef = E41EB465148D7BF50015DEDC /* BITHockeyManager.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
1E59548715B6C51100A03429 /* BITCrashReportTextFormatter.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E40BCB715A3494400BD64D9 /* BITCrashReportTextFormatter.h */; };
|
||||
1E5954B315B6E15300A03429 /* BITUpdateManager.h in Headers */ = {isa = PBXBuildFile; fileRef = E41EB45D148D7BF50015DEDC /* BITUpdateManager.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
1E5954B615B6E17700A03429 /* PSStoreButton.h in Headers */ = {isa = PBXBuildFile; fileRef = E41EB46B148D7BF50015DEDC /* PSStoreButton.h */; settings = {ATTRIBUTES = (); }; };
|
||||
1E5954B815B6E19C00A03429 /* BITAppVersionMetaInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = E41EB459148D7BF50015DEDC /* BITAppVersionMetaInfo.h */; settings = {ATTRIBUTES = (); }; };
|
||||
1E5954CD15B6F24A00A03429 /* BITAppVersionMetaInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = E41EB45A148D7BF50015DEDC /* BITAppVersionMetaInfo.m */; };
|
||||
1E5954D215B6F24A00A03429 /* BITCrashManager.m in Sources */ = {isa = PBXBuildFile; fileRef = E41EB464148D7BF50015DEDC /* BITCrashManager.m */; };
|
||||
1E5954D315B6F24A00A03429 /* BITHockeyManager.m in Sources */ = {isa = PBXBuildFile; fileRef = E41EB466148D7BF50015DEDC /* BITHockeyManager.m */; };
|
||||
1E5954D515B6F24A00A03429 /* PSAppStoreHeader.m in Sources */ = {isa = PBXBuildFile; fileRef = E41EB46A148D7BF50015DEDC /* PSAppStoreHeader.m */; };
|
||||
1E5954D615B6F24A00A03429 /* PSStoreButton.m in Sources */ = {isa = PBXBuildFile; fileRef = E41EB46C148D7BF50015DEDC /* PSStoreButton.m */; };
|
||||
1E5954D715B6F24A00A03429 /* PSWebTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = E41EB46E148D7BF50015DEDC /* PSWebTableViewCell.m */; };
|
||||
1E5954D915B6F24A00A03429 /* BITCrashReportTextFormatter.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E40BCB815A3494400BD64D9 /* BITCrashReportTextFormatter.m */; };
|
||||
1E5954DC15B6F24A00A03429 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E400561D148D79B500EB22B9 /* Foundation.framework */; };
|
||||
1E5954DD15B6F24A00A03429 /* CrashReporter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E41EB48B148D7C4E0015DEDC /* CrashReporter.framework */; };
|
||||
1E59558D15B6FDA500A03429 /* PSAppStoreHeader.h in Headers */ = {isa = PBXBuildFile; fileRef = E41EB469148D7BF50015DEDC /* PSAppStoreHeader.h */; };
|
||||
1E59558E15B6FDA500A03429 /* PSStoreButton.h in Headers */ = {isa = PBXBuildFile; fileRef = E41EB46B148D7BF50015DEDC /* PSStoreButton.h */; };
|
||||
1E59558F15B6FDA500A03429 /* PSWebTableViewCell.h in Headers */ = {isa = PBXBuildFile; fileRef = E41EB46D148D7BF50015DEDC /* PSWebTableViewCell.h */; };
|
||||
1E59559215B6FDA500A03429 /* BITAppVersionMetaInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = E41EB459148D7BF50015DEDC /* BITAppVersionMetaInfo.h */; };
|
||||
1E59559415B6FDA500A03429 /* BITUpdateManager.h in Headers */ = {isa = PBXBuildFile; fileRef = E41EB45D148D7BF50015DEDC /* BITUpdateManager.h */; settings = {ATTRIBUTES = (); }; };
|
||||
1E59559815B6FDA500A03429 /* BITCrashManagerDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E40BCB415A3487500BD64D9 /* BITCrashManagerDelegate.h */; settings = {ATTRIBUTES = (); }; };
|
||||
1E59559915B6FDA500A03429 /* BITCrashReportTextFormatter.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E40BCB715A3494400BD64D9 /* BITCrashReportTextFormatter.h */; };
|
||||
1E59559A15B6FDA500A03429 /* BITHockeyManager.h in Headers */ = {isa = PBXBuildFile; fileRef = E41EB465148D7BF50015DEDC /* BITHockeyManager.h */; settings = {ATTRIBUTES = (); }; };
|
||||
1E59559B15B6FDA500A03429 /* HockeySDK.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E71509A15B5C76F004E88FF /* HockeySDK.h */; settings = {ATTRIBUTES = (); }; };
|
||||
1E59559D15B70F4D00A03429 /* HockeySDKPrivate.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E59559C15B70F4D00A03429 /* HockeySDKPrivate.m */; };
|
||||
1E59559E15B70F4D00A03429 /* HockeySDKPrivate.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E59559C15B70F4D00A03429 /* HockeySDKPrivate.m */; };
|
||||
1E59559F15B70F4D00A03429 /* HockeySDKPrivate.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E59559C15B70F4D00A03429 /* HockeySDKPrivate.m */; };
|
||||
1E5955A115B70F6900A03429 /* HockeySDKPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E5955A015B70F6900A03429 /* HockeySDKPrivate.h */; };
|
||||
1E5955A215B70F6900A03429 /* HockeySDKPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E5955A015B70F6900A03429 /* HockeySDKPrivate.h */; };
|
||||
1E5955A315B70F6900A03429 /* HockeySDKPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E5955A015B70F6900A03429 /* HockeySDKPrivate.h */; };
|
||||
1E5955C615B71C8600A03429 /* authorize_denied.png in Resources */ = {isa = PBXBuildFile; fileRef = 1E5955BB15B71C8600A03429 /* authorize_denied.png */; };
|
||||
1E5955C715B71C8600A03429 /* authorize_denied@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 1E5955BC15B71C8600A03429 /* authorize_denied@2x.png */; };
|
||||
1E5955C815B71C8600A03429 /* authorize_request.png in Resources */ = {isa = PBXBuildFile; fileRef = 1E5955BD15B71C8600A03429 /* authorize_request.png */; };
|
||||
@ -86,51 +172,17 @@
|
||||
1E5955CC15B71C8600A03429 /* buttonHighlight@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 1E5955C115B71C8600A03429 /* buttonHighlight@2x.png */; };
|
||||
1E5955CF15B71C8600A03429 /* IconGradient.png in Resources */ = {isa = PBXBuildFile; fileRef = 1E5955C415B71C8600A03429 /* IconGradient.png */; };
|
||||
1E5955D015B71C8600A03429 /* IconGradient@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 1E5955C515B71C8600A03429 /* IconGradient@2x.png */; };
|
||||
1E5955D215B72E5400A03429 /* BITCrashManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E5955D115B72E5300A03429 /* BITCrashManager.h */; };
|
||||
1E5955D315B72E5400A03429 /* BITCrashManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E5955D115B72E5300A03429 /* BITCrashManager.h */; };
|
||||
1E5955D415B72E5400A03429 /* BITCrashManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E5955D115B72E5300A03429 /* BITCrashManager.h */; };
|
||||
1E5955D615B72ED500A03429 /* BITUpdateManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E5955D515B72ED500A03429 /* BITUpdateManager.m */; };
|
||||
1E5955D715B72ED500A03429 /* BITUpdateManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E5955D515B72ED500A03429 /* BITUpdateManager.m */; };
|
||||
1E5955D815B72ED500A03429 /* BITUpdateManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E5955D515B72ED500A03429 /* BITUpdateManager.m */; };
|
||||
1E5955E315B751EE00A03429 /* BITUpdateViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E5955E215B751ED00A03429 /* BITUpdateViewController.h */; };
|
||||
1E5955E415B751EE00A03429 /* BITUpdateViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E5955E215B751ED00A03429 /* BITUpdateViewController.h */; };
|
||||
1E5955E515B751EE00A03429 /* BITUpdateViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E5955E215B751ED00A03429 /* BITUpdateViewController.h */; };
|
||||
1E5955E715B751FB00A03429 /* BITUpdateViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E5955E615B751FB00A03429 /* BITUpdateViewController.m */; };
|
||||
1E5955E815B751FB00A03429 /* BITUpdateViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E5955E615B751FB00A03429 /* BITUpdateViewController.m */; };
|
||||
1E5955E915B751FB00A03429 /* BITUpdateViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E5955E615B751FB00A03429 /* BITUpdateViewController.m */; };
|
||||
1E5955EF15B7752300A03429 /* BITUpdateManagerDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E5955EE15B7752200A03429 /* BITUpdateManagerDelegate.h */; };
|
||||
1E5955F015B7752300A03429 /* BITUpdateManagerDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E5955EE15B7752200A03429 /* BITUpdateManagerDelegate.h */; };
|
||||
1E5955F115B7752300A03429 /* BITUpdateManagerDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E5955EE15B7752200A03429 /* BITUpdateManagerDelegate.h */; };
|
||||
1E5955F315B77F5600A03429 /* PSAppStoreHeader.h in Headers */ = {isa = PBXBuildFile; fileRef = E41EB469148D7BF50015DEDC /* PSAppStoreHeader.h */; };
|
||||
1E5955F415B77F5E00A03429 /* PSWebTableViewCell.h in Headers */ = {isa = PBXBuildFile; fileRef = E41EB46D148D7BF50015DEDC /* PSWebTableViewCell.h */; };
|
||||
1E5955F615B77F6500A03429 /* HockeySDKPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E5955A015B70F6900A03429 /* HockeySDKPrivate.h */; };
|
||||
1E5955F715B77F7600A03429 /* BITUpdateManagerDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E5955EE15B7752200A03429 /* BITUpdateManagerDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
1E5955F815B77F7C00A03429 /* BITUpdateViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E5955E215B751ED00A03429 /* BITUpdateViewController.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
1E5955F915B77F8200A03429 /* BITCrashManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E5955D115B72E5300A03429 /* BITCrashManager.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
1E5955FB15B7877B00A03429 /* BITHockeyManagerDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E5955FA15B7877A00A03429 /* BITHockeyManagerDelegate.h */; };
|
||||
1E5955FC15B7877B00A03429 /* BITHockeyManagerDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E5955FA15B7877A00A03429 /* BITHockeyManagerDelegate.h */; };
|
||||
1E5955FD15B7877B00A03429 /* BITHockeyManagerDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E5955FA15B7877A00A03429 /* BITHockeyManagerDelegate.h */; };
|
||||
1E5955FE15B787D600A03429 /* BITHockeyManagerDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E5955FA15B7877A00A03429 /* BITHockeyManagerDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
1E71509B15B5C76F004E88FF /* HockeySDK.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E71509A15B5C76F004E88FF /* HockeySDK.h */; settings = {ATTRIBUTES = (); }; };
|
||||
1EB6046D15EF6B3200F69880 /* BITHockeyHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = 1EB6046B15EF6B3200F69880 /* BITHockeyHelper.h */; };
|
||||
1EB6046E15EF6B3200F69880 /* BITHockeyHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = 1EB6046B15EF6B3200F69880 /* BITHockeyHelper.h */; };
|
||||
1EB6046F15EF6B3200F69880 /* BITHockeyHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = 1EB6046B15EF6B3200F69880 /* BITHockeyHelper.h */; };
|
||||
1EB6047015EF6B3200F69880 /* BITHockeyHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 1EB6046C15EF6B3200F69880 /* BITHockeyHelper.m */; };
|
||||
1EB6047115EF6B3200F69880 /* BITHockeyHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 1EB6046C15EF6B3200F69880 /* BITHockeyHelper.m */; };
|
||||
1EB6047215EF6B3200F69880 /* BITHockeyHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 1EB6046C15EF6B3200F69880 /* BITHockeyHelper.m */; };
|
||||
1EC69F5E1615001500808FD9 /* BITHockeyManagerPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 1EC69F5D1615001500808FD9 /* BITHockeyManagerPrivate.h */; };
|
||||
1EC69F5F1615001500808FD9 /* BITHockeyManagerPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 1EC69F5D1615001500808FD9 /* BITHockeyManagerPrivate.h */; };
|
||||
1EC69F601615001500808FD9 /* BITHockeyManagerPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 1EC69F5D1615001500808FD9 /* BITHockeyManagerPrivate.h */; };
|
||||
E400561E148D79B500EB22B9 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E400561D148D79B500EB22B9 /* Foundation.framework */; };
|
||||
E41EB471148D7BF50015DEDC /* BITAppVersionMetaInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = E41EB459148D7BF50015DEDC /* BITAppVersionMetaInfo.h */; };
|
||||
E41EB472148D7BF50015DEDC /* BITAppVersionMetaInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = E41EB45A148D7BF50015DEDC /* BITAppVersionMetaInfo.m */; };
|
||||
E41EB475148D7BF50015DEDC /* BITUpdateManager.h in Headers */ = {isa = PBXBuildFile; fileRef = E41EB45D148D7BF50015DEDC /* BITUpdateManager.h */; };
|
||||
E41EB47C148D7BF50015DEDC /* BITCrashManager.m in Sources */ = {isa = PBXBuildFile; fileRef = E41EB464148D7BF50015DEDC /* BITCrashManager.m */; };
|
||||
E41EB47D148D7BF50015DEDC /* BITHockeyManager.h in Headers */ = {isa = PBXBuildFile; fileRef = E41EB465148D7BF50015DEDC /* BITHockeyManager.h */; };
|
||||
E41EB47E148D7BF50015DEDC /* BITHockeyManager.m in Sources */ = {isa = PBXBuildFile; fileRef = E41EB466148D7BF50015DEDC /* BITHockeyManager.m */; };
|
||||
E41EB481148D7BF50015DEDC /* PSAppStoreHeader.h in Headers */ = {isa = PBXBuildFile; fileRef = E41EB469148D7BF50015DEDC /* PSAppStoreHeader.h */; };
|
||||
E41EB482148D7BF50015DEDC /* PSAppStoreHeader.m in Sources */ = {isa = PBXBuildFile; fileRef = E41EB46A148D7BF50015DEDC /* PSAppStoreHeader.m */; };
|
||||
E41EB483148D7BF50015DEDC /* PSStoreButton.h in Headers */ = {isa = PBXBuildFile; fileRef = E41EB46B148D7BF50015DEDC /* PSStoreButton.h */; };
|
||||
E41EB484148D7BF50015DEDC /* PSStoreButton.m in Sources */ = {isa = PBXBuildFile; fileRef = E41EB46C148D7BF50015DEDC /* PSStoreButton.m */; };
|
||||
E41EB485148D7BF50015DEDC /* PSWebTableViewCell.h in Headers */ = {isa = PBXBuildFile; fileRef = E41EB46D148D7BF50015DEDC /* PSWebTableViewCell.h */; };
|
||||
E41EB486148D7BF50015DEDC /* PSWebTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = E41EB46E148D7BF50015DEDC /* PSWebTableViewCell.m */; };
|
||||
E41EB48C148D7C4E0015DEDC /* CrashReporter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E41EB48B148D7C4E0015DEDC /* CrashReporter.framework */; };
|
||||
/* End PBXBuildFile section */
|
||||
|
||||
@ -166,12 +218,49 @@
|
||||
/* End PBXContainerItemProxy section */
|
||||
|
||||
/* Begin PBXFileReference section */
|
||||
1E01117E15BB6228007002AC /* BITCrashManagerPrivate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = BITCrashManagerPrivate.h; sourceTree = "<group>"; };
|
||||
1E01118015BB62FE007002AC /* BITUpdateManagerPrivate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = BITUpdateManagerPrivate.h; sourceTree = "<group>"; };
|
||||
1E01118C15BB83F6007002AC /* BITUpdateViewControllerPrivate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = BITUpdateViewControllerPrivate.h; sourceTree = "<group>"; };
|
||||
1E40BCB415A3487500BD64D9 /* BITCrashManagerDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITCrashManagerDelegate.h; sourceTree = "<group>"; };
|
||||
1E40BCB715A3494400BD64D9 /* BITCrashReportTextFormatter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITCrashReportTextFormatter.h; sourceTree = "<group>"; };
|
||||
1E40BCB815A3494400BD64D9 /* BITCrashReportTextFormatter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BITCrashReportTextFormatter.m; sourceTree = "<group>"; };
|
||||
1E49A42D1612223B00463151 /* BITFeedbackComposeViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITFeedbackComposeViewController.h; sourceTree = "<group>"; };
|
||||
1E49A42E1612223B00463151 /* BITFeedbackComposeViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BITFeedbackComposeViewController.m; sourceTree = "<group>"; };
|
||||
1E49A42F1612223B00463151 /* BITFeedbackListViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITFeedbackListViewCell.h; sourceTree = "<group>"; };
|
||||
1E49A4301612223B00463151 /* BITFeedbackListViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BITFeedbackListViewCell.m; sourceTree = "<group>"; };
|
||||
1E49A4311612223B00463151 /* BITFeedbackListViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITFeedbackListViewController.h; sourceTree = "<group>"; };
|
||||
1E49A4321612223B00463151 /* BITFeedbackListViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BITFeedbackListViewController.m; sourceTree = "<group>"; };
|
||||
1E49A4331612223B00463151 /* BITFeedbackManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITFeedbackManager.h; sourceTree = "<group>"; };
|
||||
1E49A4341612223B00463151 /* BITFeedbackManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BITFeedbackManager.m; sourceTree = "<group>"; };
|
||||
1E49A4351612223B00463151 /* BITFeedbackManagerPrivate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITFeedbackManagerPrivate.h; sourceTree = "<group>"; };
|
||||
1E49A4361612223B00463151 /* BITFeedbackMessage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITFeedbackMessage.h; sourceTree = "<group>"; };
|
||||
1E49A4371612223B00463151 /* BITFeedbackMessage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BITFeedbackMessage.m; sourceTree = "<group>"; };
|
||||
1E49A4381612223B00463151 /* BITFeedbackUserDataViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITFeedbackUserDataViewController.h; sourceTree = "<group>"; };
|
||||
1E49A4391612223B00463151 /* BITFeedbackUserDataViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BITFeedbackUserDataViewController.m; sourceTree = "<group>"; };
|
||||
1E49A4621612226D00463151 /* BITAppVersionMetaInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITAppVersionMetaInfo.h; sourceTree = "<group>"; };
|
||||
1E49A4631612226D00463151 /* BITAppVersionMetaInfo.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BITAppVersionMetaInfo.m; sourceTree = "<group>"; };
|
||||
1E49A4641612226D00463151 /* BITUpdateManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITUpdateManager.h; sourceTree = "<group>"; };
|
||||
1E49A4651612226D00463151 /* BITUpdateManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BITUpdateManager.m; sourceTree = "<group>"; };
|
||||
1E49A4661612226D00463151 /* BITUpdateManagerDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITUpdateManagerDelegate.h; sourceTree = "<group>"; };
|
||||
1E49A4671612226D00463151 /* BITUpdateManagerPrivate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITUpdateManagerPrivate.h; sourceTree = "<group>"; };
|
||||
1E49A4681612226D00463151 /* BITUpdateViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITUpdateViewController.h; sourceTree = "<group>"; };
|
||||
1E49A4691612226D00463151 /* BITUpdateViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BITUpdateViewController.m; sourceTree = "<group>"; };
|
||||
1E49A46A1612226D00463151 /* BITUpdateViewControllerPrivate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITUpdateViewControllerPrivate.h; sourceTree = "<group>"; };
|
||||
1E49A4871612228800463151 /* BITCrashManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITCrashManager.h; sourceTree = "<group>"; };
|
||||
1E49A4881612228800463151 /* BITCrashManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BITCrashManager.m; sourceTree = "<group>"; };
|
||||
1E49A4891612228800463151 /* BITCrashManagerDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITCrashManagerDelegate.h; sourceTree = "<group>"; };
|
||||
1E49A48A1612228800463151 /* BITCrashManagerPrivate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITCrashManagerPrivate.h; sourceTree = "<group>"; };
|
||||
1E49A48B1612228800463151 /* BITCrashReportTextFormatter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITCrashReportTextFormatter.h; sourceTree = "<group>"; };
|
||||
1E49A48C1612228800463151 /* BITCrashReportTextFormatter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BITCrashReportTextFormatter.m; sourceTree = "<group>"; };
|
||||
1E49A4A0161222B900463151 /* BITHockeyBaseManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITHockeyBaseManager.h; sourceTree = "<group>"; };
|
||||
1E49A4A1161222B900463151 /* BITHockeyBaseManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BITHockeyBaseManager.m; sourceTree = "<group>"; };
|
||||
1E49A4A2161222B900463151 /* BITHockeyBaseManagerPrivate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITHockeyBaseManagerPrivate.h; sourceTree = "<group>"; };
|
||||
1E49A4A3161222B900463151 /* BITHockeyBaseViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITHockeyBaseViewController.h; sourceTree = "<group>"; };
|
||||
1E49A4A4161222B900463151 /* BITHockeyBaseViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BITHockeyBaseViewController.m; sourceTree = "<group>"; };
|
||||
1E49A4A5161222B900463151 /* BITHockeyHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITHockeyHelper.h; sourceTree = "<group>"; };
|
||||
1E49A4A6161222B900463151 /* BITHockeyHelper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BITHockeyHelper.m; sourceTree = "<group>"; };
|
||||
1E49A4A7161222B900463151 /* PSAppStoreHeader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PSAppStoreHeader.h; sourceTree = "<group>"; };
|
||||
1E49A4A8161222B900463151 /* PSAppStoreHeader.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PSAppStoreHeader.m; sourceTree = "<group>"; };
|
||||
1E49A4A9161222B900463151 /* PSStoreButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PSStoreButton.h; sourceTree = "<group>"; };
|
||||
1E49A4AA161222B900463151 /* PSStoreButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PSStoreButton.m; sourceTree = "<group>"; };
|
||||
1E49A4AB161222B900463151 /* PSWebTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PSWebTableViewCell.h; sourceTree = "<group>"; };
|
||||
1E49A4AC161222B900463151 /* PSWebTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PSWebTableViewCell.m; sourceTree = "<group>"; };
|
||||
1E49A4D4161222D400463151 /* HockeySDKPrivate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HockeySDKPrivate.h; sourceTree = "<group>"; };
|
||||
1E49A4D5161222D400463151 /* HockeySDKPrivate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HockeySDKPrivate.m; sourceTree = "<group>"; };
|
||||
1E59544115B6C3DC00A03429 /* HockeySDK.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = HockeySDK.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
1E59547C15B6C41300A03429 /* libHockeySDK-iphonesimulator.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libHockeySDK-iphonesimulator.a"; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
1E5954F215B6F24A00A03429 /* libHockeySDK.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libHockeySDK.a; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
@ -190,8 +279,6 @@
|
||||
1E59557615B6F85E00A03429 /* tr */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = tr; path = tr.lproj/HockeySDK.strings; sourceTree = "<group>"; };
|
||||
1E59557815B6F86600A03429 /* zh_CN */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = zh_CN; path = zh_CN.lproj/HockeySDK.strings; sourceTree = "<group>"; };
|
||||
1E59557A15B6F86E00A03429 /* zh_TW */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = zh_TW; path = zh_TW.lproj/HockeySDK.strings; sourceTree = "<group>"; };
|
||||
1E59559C15B70F4D00A03429 /* HockeySDKPrivate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HockeySDKPrivate.m; sourceTree = "<group>"; };
|
||||
1E5955A015B70F6900A03429 /* HockeySDKPrivate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HockeySDKPrivate.h; sourceTree = "<group>"; };
|
||||
1E5955BB15B71C8600A03429 /* authorize_denied.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = authorize_denied.png; sourceTree = "<group>"; };
|
||||
1E5955BC15B71C8600A03429 /* authorize_denied@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "authorize_denied@2x.png"; sourceTree = "<group>"; };
|
||||
1E5955BD15B71C8600A03429 /* authorize_request.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = authorize_request.png; sourceTree = "<group>"; };
|
||||
@ -201,31 +288,15 @@
|
||||
1E5955C115B71C8600A03429 /* buttonHighlight@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "buttonHighlight@2x.png"; sourceTree = "<group>"; };
|
||||
1E5955C415B71C8600A03429 /* IconGradient.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = IconGradient.png; sourceTree = "<group>"; };
|
||||
1E5955C515B71C8600A03429 /* IconGradient@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "IconGradient@2x.png"; sourceTree = "<group>"; };
|
||||
1E5955D115B72E5300A03429 /* BITCrashManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITCrashManager.h; sourceTree = "<group>"; };
|
||||
1E5955D515B72ED500A03429 /* BITUpdateManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = BITUpdateManager.m; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.objc; };
|
||||
1E5955E215B751ED00A03429 /* BITUpdateViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITUpdateViewController.h; sourceTree = "<group>"; };
|
||||
1E5955E615B751FB00A03429 /* BITUpdateViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BITUpdateViewController.m; sourceTree = "<group>"; };
|
||||
1E5955EE15B7752200A03429 /* BITUpdateManagerDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITUpdateManagerDelegate.h; sourceTree = "<group>"; };
|
||||
1E5955FA15B7877A00A03429 /* BITHockeyManagerDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITHockeyManagerDelegate.h; sourceTree = "<group>"; };
|
||||
1E66CA9115D4100500F35BED /* buildnumber.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = buildnumber.xcconfig; sourceTree = "<group>"; };
|
||||
1E71509A15B5C76F004E88FF /* HockeySDK.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HockeySDK.h; sourceTree = "<group>"; };
|
||||
1EB6046B15EF6B3200F69880 /* BITHockeyHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITHockeyHelper.h; sourceTree = "<group>"; };
|
||||
1EB6046C15EF6B3200F69880 /* BITHockeyHelper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BITHockeyHelper.m; sourceTree = "<group>"; };
|
||||
1EC69F5D1615001500808FD9 /* BITHockeyManagerPrivate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITHockeyManagerPrivate.h; sourceTree = "<group>"; };
|
||||
1EDA60CF15C2C1450032D10B /* HockeySDK-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "HockeySDK-Info.plist"; sourceTree = "<group>"; };
|
||||
E400561A148D79B500EB22B9 /* libHockeySDK-iphoneos.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libHockeySDK-iphoneos.a"; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
E400561D148D79B500EB22B9 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
|
||||
E41EB459148D7BF50015DEDC /* BITAppVersionMetaInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITAppVersionMetaInfo.h; sourceTree = "<group>"; };
|
||||
E41EB45A148D7BF50015DEDC /* BITAppVersionMetaInfo.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BITAppVersionMetaInfo.m; sourceTree = "<group>"; };
|
||||
E41EB45D148D7BF50015DEDC /* BITUpdateManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = BITUpdateManager.h; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; };
|
||||
E41EB464148D7BF50015DEDC /* BITCrashManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = BITCrashManager.m; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.objc; };
|
||||
E41EB465148D7BF50015DEDC /* BITHockeyManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITHockeyManager.h; sourceTree = "<group>"; };
|
||||
E41EB466148D7BF50015DEDC /* BITHockeyManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BITHockeyManager.m; sourceTree = "<group>"; };
|
||||
E41EB469148D7BF50015DEDC /* PSAppStoreHeader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PSAppStoreHeader.h; sourceTree = "<group>"; };
|
||||
E41EB46A148D7BF50015DEDC /* PSAppStoreHeader.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PSAppStoreHeader.m; sourceTree = "<group>"; };
|
||||
E41EB46B148D7BF50015DEDC /* PSStoreButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PSStoreButton.h; sourceTree = "<group>"; };
|
||||
E41EB46C148D7BF50015DEDC /* PSStoreButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PSStoreButton.m; sourceTree = "<group>"; };
|
||||
E41EB46D148D7BF50015DEDC /* PSWebTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PSWebTableViewCell.h; sourceTree = "<group>"; };
|
||||
E41EB46E148D7BF50015DEDC /* PSWebTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PSWebTableViewCell.m; sourceTree = "<group>"; };
|
||||
E41EB48B148D7C4E0015DEDC /* CrashReporter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CrashReporter.framework; path = ../Vendor/CrashReporter.framework; sourceTree = "<group>"; };
|
||||
E4E7335A148D7A5A00763A39 /* LICENSE.txt */ = {isa = PBXFileReference; lastKnownFileType = text; name = LICENSE.txt; path = ../LICENSE.txt; sourceTree = "<group>"; };
|
||||
E4E7335B148D7A5A00763A39 /* README.md */ = {isa = PBXFileReference; lastKnownFileType = text; name = README.md; path = ../README.md; sourceTree = "<group>"; };
|
||||
@ -276,6 +347,77 @@
|
||||
/* End PBXFrameworksBuildPhase section */
|
||||
|
||||
/* Begin PBXGroup section */
|
||||
1E49A42C1612223B00463151 /* Feedback */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
1E49A4361612223B00463151 /* BITFeedbackMessage.h */,
|
||||
1E49A4371612223B00463151 /* BITFeedbackMessage.m */,
|
||||
1E49A42D1612223B00463151 /* BITFeedbackComposeViewController.h */,
|
||||
1E49A42E1612223B00463151 /* BITFeedbackComposeViewController.m */,
|
||||
1E49A4381612223B00463151 /* BITFeedbackUserDataViewController.h */,
|
||||
1E49A4391612223B00463151 /* BITFeedbackUserDataViewController.m */,
|
||||
1E49A42F1612223B00463151 /* BITFeedbackListViewCell.h */,
|
||||
1E49A4301612223B00463151 /* BITFeedbackListViewCell.m */,
|
||||
1E49A4311612223B00463151 /* BITFeedbackListViewController.h */,
|
||||
1E49A4321612223B00463151 /* BITFeedbackListViewController.m */,
|
||||
1E49A4331612223B00463151 /* BITFeedbackManager.h */,
|
||||
1E49A4341612223B00463151 /* BITFeedbackManager.m */,
|
||||
1E49A4351612223B00463151 /* BITFeedbackManagerPrivate.h */,
|
||||
);
|
||||
path = Feedback;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
1E49A4611612226D00463151 /* Update */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
1E49A4621612226D00463151 /* BITAppVersionMetaInfo.h */,
|
||||
1E49A4631612226D00463151 /* BITAppVersionMetaInfo.m */,
|
||||
1E49A4641612226D00463151 /* BITUpdateManager.h */,
|
||||
1E49A4651612226D00463151 /* BITUpdateManager.m */,
|
||||
1E49A4661612226D00463151 /* BITUpdateManagerDelegate.h */,
|
||||
1E49A4671612226D00463151 /* BITUpdateManagerPrivate.h */,
|
||||
1E49A4681612226D00463151 /* BITUpdateViewController.h */,
|
||||
1E49A4691612226D00463151 /* BITUpdateViewController.m */,
|
||||
1E49A46A1612226D00463151 /* BITUpdateViewControllerPrivate.h */,
|
||||
);
|
||||
path = Update;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
1E49A4861612228800463151 /* CrashReports */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
1E49A4871612228800463151 /* BITCrashManager.h */,
|
||||
1E49A4881612228800463151 /* BITCrashManager.m */,
|
||||
1E49A4891612228800463151 /* BITCrashManagerDelegate.h */,
|
||||
1E49A48A1612228800463151 /* BITCrashManagerPrivate.h */,
|
||||
1E49A48B1612228800463151 /* BITCrashReportTextFormatter.h */,
|
||||
1E49A48C1612228800463151 /* BITCrashReportTextFormatter.m */,
|
||||
);
|
||||
path = CrashReports;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
1E49A49F161222B900463151 /* Helper */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
1E49A4D4161222D400463151 /* HockeySDKPrivate.h */,
|
||||
1E49A4D5161222D400463151 /* HockeySDKPrivate.m */,
|
||||
1E49A4A0161222B900463151 /* BITHockeyBaseManager.h */,
|
||||
1E49A4A1161222B900463151 /* BITHockeyBaseManager.m */,
|
||||
1E49A4A2161222B900463151 /* BITHockeyBaseManagerPrivate.h */,
|
||||
1E49A4A3161222B900463151 /* BITHockeyBaseViewController.h */,
|
||||
1E49A4A4161222B900463151 /* BITHockeyBaseViewController.m */,
|
||||
1E49A4A5161222B900463151 /* BITHockeyHelper.h */,
|
||||
1E49A4A6161222B900463151 /* BITHockeyHelper.m */,
|
||||
1E49A4A7161222B900463151 /* PSAppStoreHeader.h */,
|
||||
1E49A4A8161222B900463151 /* PSAppStoreHeader.m */,
|
||||
1E49A4A9161222B900463151 /* PSStoreButton.h */,
|
||||
1E49A4AA161222B900463151 /* PSStoreButton.m */,
|
||||
1E49A4AB161222B900463151 /* PSWebTableViewCell.h */,
|
||||
1E49A4AC161222B900463151 /* PSWebTableViewCell.m */,
|
||||
);
|
||||
path = Helper;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
1E5955A415B71BDC00A03429 /* Images */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
@ -348,26 +490,13 @@
|
||||
E41EB458148D7BF50015DEDC /* Classes */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
E41EB48A148D7C150015DEDC /* Helper */,
|
||||
1E5955A015B70F6900A03429 /* HockeySDKPrivate.h */,
|
||||
1E59559C15B70F4D00A03429 /* HockeySDKPrivate.m */,
|
||||
E41EB459148D7BF50015DEDC /* BITAppVersionMetaInfo.h */,
|
||||
E41EB45A148D7BF50015DEDC /* BITAppVersionMetaInfo.m */,
|
||||
E41EB45D148D7BF50015DEDC /* BITUpdateManager.h */,
|
||||
1E01118015BB62FE007002AC /* BITUpdateManagerPrivate.h */,
|
||||
1E5955D515B72ED500A03429 /* BITUpdateManager.m */,
|
||||
1E5955EE15B7752200A03429 /* BITUpdateManagerDelegate.h */,
|
||||
1E5955E215B751ED00A03429 /* BITUpdateViewController.h */,
|
||||
1E01118C15BB83F6007002AC /* BITUpdateViewControllerPrivate.h */,
|
||||
1E5955E615B751FB00A03429 /* BITUpdateViewController.m */,
|
||||
1E5955D115B72E5300A03429 /* BITCrashManager.h */,
|
||||
1E01117E15BB6228007002AC /* BITCrashManagerPrivate.h */,
|
||||
E41EB464148D7BF50015DEDC /* BITCrashManager.m */,
|
||||
1E40BCB415A3487500BD64D9 /* BITCrashManagerDelegate.h */,
|
||||
1E40BCB715A3494400BD64D9 /* BITCrashReportTextFormatter.h */,
|
||||
1E40BCB815A3494400BD64D9 /* BITCrashReportTextFormatter.m */,
|
||||
1E49A49F161222B900463151 /* Helper */,
|
||||
1E49A4861612228800463151 /* CrashReports */,
|
||||
1E49A42C1612223B00463151 /* Feedback */,
|
||||
1E49A4611612226D00463151 /* Update */,
|
||||
E41EB465148D7BF50015DEDC /* BITHockeyManager.h */,
|
||||
E41EB466148D7BF50015DEDC /* BITHockeyManager.m */,
|
||||
1EC69F5D1615001500808FD9 /* BITHockeyManagerPrivate.h */,
|
||||
1E5955FA15B7877A00A03429 /* BITHockeyManagerDelegate.h */,
|
||||
1E71509A15B5C76F004E88FF /* HockeySDK.h */,
|
||||
);
|
||||
@ -383,21 +512,6 @@
|
||||
name = HockeySDK;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
E41EB48A148D7C150015DEDC /* Helper */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
E41EB469148D7BF50015DEDC /* PSAppStoreHeader.h */,
|
||||
E41EB46A148D7BF50015DEDC /* PSAppStoreHeader.m */,
|
||||
E41EB46B148D7BF50015DEDC /* PSStoreButton.h */,
|
||||
E41EB46C148D7BF50015DEDC /* PSStoreButton.m */,
|
||||
E41EB46D148D7BF50015DEDC /* PSWebTableViewCell.h */,
|
||||
E41EB46E148D7BF50015DEDC /* PSWebTableViewCell.m */,
|
||||
1EB6046B15EF6B3200F69880 /* BITHockeyHelper.h */,
|
||||
1EB6046C15EF6B3200F69880 /* BITHockeyHelper.m */,
|
||||
);
|
||||
name = Helper;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
/* End PBXGroup section */
|
||||
|
||||
/* Begin PBXHeadersBuildPhase section */
|
||||
@ -408,20 +522,6 @@
|
||||
1E59548315B6C4EF00A03429 /* HockeySDK.h in Headers */,
|
||||
1E59548515B6C4FB00A03429 /* BITHockeyManager.h in Headers */,
|
||||
1E5955FE15B787D600A03429 /* BITHockeyManagerDelegate.h in Headers */,
|
||||
1E5955F915B77F8200A03429 /* BITCrashManager.h in Headers */,
|
||||
1E59548415B6C4F300A03429 /* BITCrashManagerDelegate.h in Headers */,
|
||||
1E5954B315B6E15300A03429 /* BITUpdateManager.h in Headers */,
|
||||
1E5955F715B77F7600A03429 /* BITUpdateManagerDelegate.h in Headers */,
|
||||
1E5955F815B77F7C00A03429 /* BITUpdateViewController.h in Headers */,
|
||||
1E5955F615B77F6500A03429 /* HockeySDKPrivate.h in Headers */,
|
||||
1E01118115BB6311007002AC /* BITUpdateManagerPrivate.h in Headers */,
|
||||
1E01118215BB6314007002AC /* BITCrashManagerPrivate.h in Headers */,
|
||||
1E01118D15BB83FB007002AC /* BITUpdateViewControllerPrivate.h in Headers */,
|
||||
1E5955F315B77F5600A03429 /* PSAppStoreHeader.h in Headers */,
|
||||
1E5954B615B6E17700A03429 /* PSStoreButton.h in Headers */,
|
||||
1E5955F415B77F5E00A03429 /* PSWebTableViewCell.h in Headers */,
|
||||
1E5954B815B6E19C00A03429 /* BITAppVersionMetaInfo.h in Headers */,
|
||||
1E59548715B6C51100A03429 /* BITCrashReportTextFormatter.h in Headers */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
@ -430,20 +530,34 @@
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
1E59547815B6C41300A03429 /* HockeySDK.h in Headers */,
|
||||
1E59547515B6C41300A03429 /* BITCrashManagerDelegate.h in Headers */,
|
||||
1E59546915B6C41300A03429 /* BITAppVersionMetaInfo.h in Headers */,
|
||||
1E59546B15B6C41300A03429 /* BITUpdateManager.h in Headers */,
|
||||
1E59546E15B6C41300A03429 /* BITHockeyManager.h in Headers */,
|
||||
1E59547015B6C41300A03429 /* PSAppStoreHeader.h in Headers */,
|
||||
1E59547115B6C41300A03429 /* PSStoreButton.h in Headers */,
|
||||
1E59547215B6C41300A03429 /* PSWebTableViewCell.h in Headers */,
|
||||
1E59547615B6C41300A03429 /* BITCrashReportTextFormatter.h in Headers */,
|
||||
1E5955A215B70F6900A03429 /* HockeySDKPrivate.h in Headers */,
|
||||
1E5955D315B72E5400A03429 /* BITCrashManager.h in Headers */,
|
||||
1E5955E415B751EE00A03429 /* BITUpdateViewController.h in Headers */,
|
||||
1E5955F015B7752300A03429 /* BITUpdateManagerDelegate.h in Headers */,
|
||||
1E5955FC15B7877B00A03429 /* BITHockeyManagerDelegate.h in Headers */,
|
||||
1EB6046E15EF6B3200F69880 /* BITHockeyHelper.h in Headers */,
|
||||
1E49A43B1612223B00463151 /* BITFeedbackComposeViewController.h in Headers */,
|
||||
1E49A4411612223B00463151 /* BITFeedbackListViewCell.h in Headers */,
|
||||
1E49A4471612223B00463151 /* BITFeedbackListViewController.h in Headers */,
|
||||
1E49A44D1612223B00463151 /* BITFeedbackManager.h in Headers */,
|
||||
1E49A4531612223B00463151 /* BITFeedbackManagerPrivate.h in Headers */,
|
||||
1E49A4561612223B00463151 /* BITFeedbackMessage.h in Headers */,
|
||||
1E49A45C1612223B00463151 /* BITFeedbackUserDataViewController.h in Headers */,
|
||||
1E49A46C1612226D00463151 /* BITAppVersionMetaInfo.h in Headers */,
|
||||
1E49A4721612226D00463151 /* BITUpdateManager.h in Headers */,
|
||||
1E49A4781612226D00463151 /* BITUpdateManagerDelegate.h in Headers */,
|
||||
1E49A47B1612226D00463151 /* BITUpdateManagerPrivate.h in Headers */,
|
||||
1E49A47E1612226D00463151 /* BITUpdateViewController.h in Headers */,
|
||||
1E49A4841612226D00463151 /* BITUpdateViewControllerPrivate.h in Headers */,
|
||||
1E49A48E1612228800463151 /* BITCrashManager.h in Headers */,
|
||||
1E49A4941612228800463151 /* BITCrashManagerDelegate.h in Headers */,
|
||||
1E49A4971612228800463151 /* BITCrashManagerPrivate.h in Headers */,
|
||||
1E49A49A1612228800463151 /* BITCrashReportTextFormatter.h in Headers */,
|
||||
1E49A4AE161222B900463151 /* BITHockeyBaseManager.h in Headers */,
|
||||
1E49A4B4161222B900463151 /* BITHockeyBaseManagerPrivate.h in Headers */,
|
||||
1E49A4B7161222B900463151 /* BITHockeyBaseViewController.h in Headers */,
|
||||
1E49A4BD161222B900463151 /* BITHockeyHelper.h in Headers */,
|
||||
1E49A4C3161222B900463151 /* PSAppStoreHeader.h in Headers */,
|
||||
1E49A4C9161222B900463151 /* PSStoreButton.h in Headers */,
|
||||
1E49A4CF161222B900463151 /* PSWebTableViewCell.h in Headers */,
|
||||
1E49A4D7161222D400463151 /* HockeySDKPrivate.h in Headers */,
|
||||
1EC69F5F1615001500808FD9 /* BITHockeyManagerPrivate.h in Headers */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
@ -452,20 +566,34 @@
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
1E59559A15B6FDA500A03429 /* BITHockeyManager.h in Headers */,
|
||||
1E59559815B6FDA500A03429 /* BITCrashManagerDelegate.h in Headers */,
|
||||
1E59559415B6FDA500A03429 /* BITUpdateManager.h in Headers */,
|
||||
1E59558D15B6FDA500A03429 /* PSAppStoreHeader.h in Headers */,
|
||||
1E59558E15B6FDA500A03429 /* PSStoreButton.h in Headers */,
|
||||
1E59558F15B6FDA500A03429 /* PSWebTableViewCell.h in Headers */,
|
||||
1E59559B15B6FDA500A03429 /* HockeySDK.h in Headers */,
|
||||
1E59559215B6FDA500A03429 /* BITAppVersionMetaInfo.h in Headers */,
|
||||
1E59559915B6FDA500A03429 /* BITCrashReportTextFormatter.h in Headers */,
|
||||
1E5955A315B70F6900A03429 /* HockeySDKPrivate.h in Headers */,
|
||||
1E5955D415B72E5400A03429 /* BITCrashManager.h in Headers */,
|
||||
1E5955E515B751EE00A03429 /* BITUpdateViewController.h in Headers */,
|
||||
1E5955F115B7752300A03429 /* BITUpdateManagerDelegate.h in Headers */,
|
||||
1E5955FD15B7877B00A03429 /* BITHockeyManagerDelegate.h in Headers */,
|
||||
1EB6046F15EF6B3200F69880 /* BITHockeyHelper.h in Headers */,
|
||||
1E49A43C1612223B00463151 /* BITFeedbackComposeViewController.h in Headers */,
|
||||
1E49A4421612223B00463151 /* BITFeedbackListViewCell.h in Headers */,
|
||||
1E49A4481612223B00463151 /* BITFeedbackListViewController.h in Headers */,
|
||||
1E49A44E1612223B00463151 /* BITFeedbackManager.h in Headers */,
|
||||
1E49A4541612223B00463151 /* BITFeedbackManagerPrivate.h in Headers */,
|
||||
1E49A4571612223B00463151 /* BITFeedbackMessage.h in Headers */,
|
||||
1E49A45D1612223B00463151 /* BITFeedbackUserDataViewController.h in Headers */,
|
||||
1E49A46D1612226D00463151 /* BITAppVersionMetaInfo.h in Headers */,
|
||||
1E49A4731612226D00463151 /* BITUpdateManager.h in Headers */,
|
||||
1E49A4791612226D00463151 /* BITUpdateManagerDelegate.h in Headers */,
|
||||
1E49A47C1612226D00463151 /* BITUpdateManagerPrivate.h in Headers */,
|
||||
1E49A47F1612226D00463151 /* BITUpdateViewController.h in Headers */,
|
||||
1E49A4851612226D00463151 /* BITUpdateViewControllerPrivate.h in Headers */,
|
||||
1E49A48F1612228800463151 /* BITCrashManager.h in Headers */,
|
||||
1E49A4951612228800463151 /* BITCrashManagerDelegate.h in Headers */,
|
||||
1E49A4981612228800463151 /* BITCrashManagerPrivate.h in Headers */,
|
||||
1E49A49B1612228800463151 /* BITCrashReportTextFormatter.h in Headers */,
|
||||
1E49A4AF161222B900463151 /* BITHockeyBaseManager.h in Headers */,
|
||||
1E49A4B5161222B900463151 /* BITHockeyBaseManagerPrivate.h in Headers */,
|
||||
1E49A4B8161222B900463151 /* BITHockeyBaseViewController.h in Headers */,
|
||||
1E49A4BE161222B900463151 /* BITHockeyHelper.h in Headers */,
|
||||
1E49A4C4161222B900463151 /* PSAppStoreHeader.h in Headers */,
|
||||
1E49A4CA161222B900463151 /* PSStoreButton.h in Headers */,
|
||||
1E49A4D0161222B900463151 /* PSWebTableViewCell.h in Headers */,
|
||||
1E49A4D8161222D400463151 /* HockeySDKPrivate.h in Headers */,
|
||||
1EC69F601615001500808FD9 /* BITHockeyManagerPrivate.h in Headers */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
@ -474,20 +602,34 @@
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
1E71509B15B5C76F004E88FF /* HockeySDK.h in Headers */,
|
||||
1E40BCB515A3487500BD64D9 /* BITCrashManagerDelegate.h in Headers */,
|
||||
E41EB471148D7BF50015DEDC /* BITAppVersionMetaInfo.h in Headers */,
|
||||
E41EB475148D7BF50015DEDC /* BITUpdateManager.h in Headers */,
|
||||
E41EB47D148D7BF50015DEDC /* BITHockeyManager.h in Headers */,
|
||||
E41EB481148D7BF50015DEDC /* PSAppStoreHeader.h in Headers */,
|
||||
E41EB483148D7BF50015DEDC /* PSStoreButton.h in Headers */,
|
||||
E41EB485148D7BF50015DEDC /* PSWebTableViewCell.h in Headers */,
|
||||
1E40BCB915A3494400BD64D9 /* BITCrashReportTextFormatter.h in Headers */,
|
||||
1E5955A115B70F6900A03429 /* HockeySDKPrivate.h in Headers */,
|
||||
1E5955D215B72E5400A03429 /* BITCrashManager.h in Headers */,
|
||||
1E5955E315B751EE00A03429 /* BITUpdateViewController.h in Headers */,
|
||||
1E5955EF15B7752300A03429 /* BITUpdateManagerDelegate.h in Headers */,
|
||||
1E5955FB15B7877B00A03429 /* BITHockeyManagerDelegate.h in Headers */,
|
||||
1EB6046D15EF6B3200F69880 /* BITHockeyHelper.h in Headers */,
|
||||
1E49A43A1612223B00463151 /* BITFeedbackComposeViewController.h in Headers */,
|
||||
1E49A4401612223B00463151 /* BITFeedbackListViewCell.h in Headers */,
|
||||
1E49A4461612223B00463151 /* BITFeedbackListViewController.h in Headers */,
|
||||
1E49A44C1612223B00463151 /* BITFeedbackManager.h in Headers */,
|
||||
1E49A4521612223B00463151 /* BITFeedbackManagerPrivate.h in Headers */,
|
||||
1E49A4551612223B00463151 /* BITFeedbackMessage.h in Headers */,
|
||||
1E49A45B1612223B00463151 /* BITFeedbackUserDataViewController.h in Headers */,
|
||||
1E49A46B1612226D00463151 /* BITAppVersionMetaInfo.h in Headers */,
|
||||
1E49A4711612226D00463151 /* BITUpdateManager.h in Headers */,
|
||||
1E49A4771612226D00463151 /* BITUpdateManagerDelegate.h in Headers */,
|
||||
1E49A47A1612226D00463151 /* BITUpdateManagerPrivate.h in Headers */,
|
||||
1E49A47D1612226D00463151 /* BITUpdateViewController.h in Headers */,
|
||||
1E49A4831612226D00463151 /* BITUpdateViewControllerPrivate.h in Headers */,
|
||||
1E49A48D1612228800463151 /* BITCrashManager.h in Headers */,
|
||||
1E49A4931612228800463151 /* BITCrashManagerDelegate.h in Headers */,
|
||||
1E49A4961612228800463151 /* BITCrashManagerPrivate.h in Headers */,
|
||||
1E49A4991612228800463151 /* BITCrashReportTextFormatter.h in Headers */,
|
||||
1E49A4AD161222B900463151 /* BITHockeyBaseManager.h in Headers */,
|
||||
1E49A4B3161222B900463151 /* BITHockeyBaseManagerPrivate.h in Headers */,
|
||||
1E49A4B6161222B900463151 /* BITHockeyBaseViewController.h in Headers */,
|
||||
1E49A4BC161222B900463151 /* BITHockeyHelper.h in Headers */,
|
||||
1E49A4C2161222B900463151 /* PSAppStoreHeader.h in Headers */,
|
||||
1E49A4C8161222B900463151 /* PSStoreButton.h in Headers */,
|
||||
1E49A4CE161222B900463151 /* PSWebTableViewCell.h in Headers */,
|
||||
1E49A4D6161222D400463151 /* HockeySDKPrivate.h in Headers */,
|
||||
1EC69F5E1615001500808FD9 /* BITHockeyManagerPrivate.h in Headers */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
@ -699,17 +841,25 @@
|
||||
isa = PBXSourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
1E59545715B6C41300A03429 /* BITAppVersionMetaInfo.m in Sources */,
|
||||
1E59545C15B6C41300A03429 /* BITCrashManager.m in Sources */,
|
||||
1E59545D15B6C41300A03429 /* BITHockeyManager.m in Sources */,
|
||||
1E59545F15B6C41300A03429 /* PSAppStoreHeader.m in Sources */,
|
||||
1E59546015B6C41300A03429 /* PSStoreButton.m in Sources */,
|
||||
1E59546115B6C41300A03429 /* PSWebTableViewCell.m in Sources */,
|
||||
1E59546315B6C41300A03429 /* BITCrashReportTextFormatter.m in Sources */,
|
||||
1E59559E15B70F4D00A03429 /* HockeySDKPrivate.m in Sources */,
|
||||
1E5955D715B72ED500A03429 /* BITUpdateManager.m in Sources */,
|
||||
1E5955E815B751FB00A03429 /* BITUpdateViewController.m in Sources */,
|
||||
1EB6047115EF6B3200F69880 /* BITHockeyHelper.m in Sources */,
|
||||
1E49A43E1612223B00463151 /* BITFeedbackComposeViewController.m in Sources */,
|
||||
1E49A4441612223B00463151 /* BITFeedbackListViewCell.m in Sources */,
|
||||
1E49A44A1612223B00463151 /* BITFeedbackListViewController.m in Sources */,
|
||||
1E49A4501612223B00463151 /* BITFeedbackManager.m in Sources */,
|
||||
1E49A4591612223B00463151 /* BITFeedbackMessage.m in Sources */,
|
||||
1E49A45F1612223B00463151 /* BITFeedbackUserDataViewController.m in Sources */,
|
||||
1E49A46F1612226D00463151 /* BITAppVersionMetaInfo.m in Sources */,
|
||||
1E49A4751612226D00463151 /* BITUpdateManager.m in Sources */,
|
||||
1E49A4811612226D00463151 /* BITUpdateViewController.m in Sources */,
|
||||
1E49A4911612228800463151 /* BITCrashManager.m in Sources */,
|
||||
1E49A49D1612228800463151 /* BITCrashReportTextFormatter.m in Sources */,
|
||||
1E49A4B1161222B900463151 /* BITHockeyBaseManager.m in Sources */,
|
||||
1E49A4BA161222B900463151 /* BITHockeyBaseViewController.m in Sources */,
|
||||
1E49A4C0161222B900463151 /* BITHockeyHelper.m in Sources */,
|
||||
1E49A4C6161222B900463151 /* PSAppStoreHeader.m in Sources */,
|
||||
1E49A4CC161222B900463151 /* PSStoreButton.m in Sources */,
|
||||
1E49A4D2161222B900463151 /* PSWebTableViewCell.m in Sources */,
|
||||
1E49A4DA161222D400463151 /* HockeySDKPrivate.m in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
@ -717,17 +867,25 @@
|
||||
isa = PBXSourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
1E5954CD15B6F24A00A03429 /* BITAppVersionMetaInfo.m in Sources */,
|
||||
1E5954D215B6F24A00A03429 /* BITCrashManager.m in Sources */,
|
||||
1E5954D315B6F24A00A03429 /* BITHockeyManager.m in Sources */,
|
||||
1E5954D515B6F24A00A03429 /* PSAppStoreHeader.m in Sources */,
|
||||
1E5954D615B6F24A00A03429 /* PSStoreButton.m in Sources */,
|
||||
1E5954D715B6F24A00A03429 /* PSWebTableViewCell.m in Sources */,
|
||||
1E5954D915B6F24A00A03429 /* BITCrashReportTextFormatter.m in Sources */,
|
||||
1E59559F15B70F4D00A03429 /* HockeySDKPrivate.m in Sources */,
|
||||
1E5955D815B72ED500A03429 /* BITUpdateManager.m in Sources */,
|
||||
1E5955E915B751FB00A03429 /* BITUpdateViewController.m in Sources */,
|
||||
1EB6047215EF6B3200F69880 /* BITHockeyHelper.m in Sources */,
|
||||
1E49A43F1612223B00463151 /* BITFeedbackComposeViewController.m in Sources */,
|
||||
1E49A4451612223B00463151 /* BITFeedbackListViewCell.m in Sources */,
|
||||
1E49A44B1612223B00463151 /* BITFeedbackListViewController.m in Sources */,
|
||||
1E49A4511612223B00463151 /* BITFeedbackManager.m in Sources */,
|
||||
1E49A45A1612223B00463151 /* BITFeedbackMessage.m in Sources */,
|
||||
1E49A4601612223B00463151 /* BITFeedbackUserDataViewController.m in Sources */,
|
||||
1E49A4701612226D00463151 /* BITAppVersionMetaInfo.m in Sources */,
|
||||
1E49A4761612226D00463151 /* BITUpdateManager.m in Sources */,
|
||||
1E49A4821612226D00463151 /* BITUpdateViewController.m in Sources */,
|
||||
1E49A4921612228800463151 /* BITCrashManager.m in Sources */,
|
||||
1E49A49E1612228800463151 /* BITCrashReportTextFormatter.m in Sources */,
|
||||
1E49A4B2161222B900463151 /* BITHockeyBaseManager.m in Sources */,
|
||||
1E49A4BB161222B900463151 /* BITHockeyBaseViewController.m in Sources */,
|
||||
1E49A4C1161222B900463151 /* BITHockeyHelper.m in Sources */,
|
||||
1E49A4C7161222B900463151 /* PSAppStoreHeader.m in Sources */,
|
||||
1E49A4CD161222B900463151 /* PSStoreButton.m in Sources */,
|
||||
1E49A4D3161222B900463151 /* PSWebTableViewCell.m in Sources */,
|
||||
1E49A4DB161222D400463151 /* HockeySDKPrivate.m in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
@ -742,17 +900,25 @@
|
||||
isa = PBXSourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
E41EB472148D7BF50015DEDC /* BITAppVersionMetaInfo.m in Sources */,
|
||||
E41EB47C148D7BF50015DEDC /* BITCrashManager.m in Sources */,
|
||||
E41EB47E148D7BF50015DEDC /* BITHockeyManager.m in Sources */,
|
||||
E41EB482148D7BF50015DEDC /* PSAppStoreHeader.m in Sources */,
|
||||
E41EB484148D7BF50015DEDC /* PSStoreButton.m in Sources */,
|
||||
E41EB486148D7BF50015DEDC /* PSWebTableViewCell.m in Sources */,
|
||||
1E40BCBA15A3494400BD64D9 /* BITCrashReportTextFormatter.m in Sources */,
|
||||
1E59559D15B70F4D00A03429 /* HockeySDKPrivate.m in Sources */,
|
||||
1E5955D615B72ED500A03429 /* BITUpdateManager.m in Sources */,
|
||||
1E5955E715B751FB00A03429 /* BITUpdateViewController.m in Sources */,
|
||||
1EB6047015EF6B3200F69880 /* BITHockeyHelper.m in Sources */,
|
||||
1E49A43D1612223B00463151 /* BITFeedbackComposeViewController.m in Sources */,
|
||||
1E49A4431612223B00463151 /* BITFeedbackListViewCell.m in Sources */,
|
||||
1E49A4491612223B00463151 /* BITFeedbackListViewController.m in Sources */,
|
||||
1E49A44F1612223B00463151 /* BITFeedbackManager.m in Sources */,
|
||||
1E49A4581612223B00463151 /* BITFeedbackMessage.m in Sources */,
|
||||
1E49A45E1612223B00463151 /* BITFeedbackUserDataViewController.m in Sources */,
|
||||
1E49A46E1612226D00463151 /* BITAppVersionMetaInfo.m in Sources */,
|
||||
1E49A4741612226D00463151 /* BITUpdateManager.m in Sources */,
|
||||
1E49A4801612226D00463151 /* BITUpdateViewController.m in Sources */,
|
||||
1E49A4901612228800463151 /* BITCrashManager.m in Sources */,
|
||||
1E49A49C1612228800463151 /* BITCrashReportTextFormatter.m in Sources */,
|
||||
1E49A4B0161222B900463151 /* BITHockeyBaseManager.m in Sources */,
|
||||
1E49A4B9161222B900463151 /* BITHockeyBaseViewController.m in Sources */,
|
||||
1E49A4BF161222B900463151 /* BITHockeyHelper.m in Sources */,
|
||||
1E49A4C5161222B900463151 /* PSAppStoreHeader.m in Sources */,
|
||||
1E49A4CB161222B900463151 /* PSStoreButton.m in Sources */,
|
||||
1E49A4D1161222B900463151 /* PSWebTableViewCell.m in Sources */,
|
||||
1E49A4D9161222D400463151 /* HockeySDKPrivate.m in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
|
Loading…
x
Reference in New Issue
Block a user