mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-12-23 22:55:00 +00:00
Allow customizable attachments to feedback
- New `BITHockeyAttachment` class, which `BITCrashAttachment` is now a subclass of - Can also be used in `prepareWithItems:` for BITFeedbackComposeViewController - Allows to set a custom filename and content-type for attachments that can be used with crash reports and with feedback
This commit is contained in:
@@ -26,38 +26,31 @@
|
|||||||
* OTHER DEALINGS IN THE SOFTWARE.
|
* OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#import <Foundation/Foundation.h>
|
#import "BITHockeyAttachment.h"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Provides support to add binary attachments to crash reports
|
Deprecated: Provides support to add binary attachments to crash reports
|
||||||
*
|
|
||||||
* This is used by `[BITCrashManagerDelegate attachmentForCrashManager:]`
|
This class is not needed any longer and exists for compatiblity purposes with
|
||||||
|
HockeySDK-iOS 3.5.5.
|
||||||
|
|
||||||
|
It is a subclass of `BITHockeyAttachment` which only provides an initializer
|
||||||
|
that is compatible with the one of HockeySDK-iOS 3.5.5.
|
||||||
|
|
||||||
|
This is used by `[BITCrashManagerDelegate attachmentForCrashManager:]`
|
||||||
|
|
||||||
|
@see BITHockeyAttachment
|
||||||
*/
|
*/
|
||||||
@interface BITCrashAttachment : NSObject<NSCoding>
|
@interface BITCrashAttachment : BITHockeyAttachment
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The filename the attachment should get
|
Create an BITCrashAttachment instance with a given filename and NSData object
|
||||||
*/
|
|
||||||
@property (nonatomic, readonly, strong) NSString *filename;
|
@param filename The filename the attachment should get
|
||||||
|
@param crashAttachmentData The attachment data as NSData
|
||||||
/**
|
@param contentType The content type of your data as MIME type
|
||||||
* The attachment data as NSData object
|
|
||||||
*/
|
@return An instsance of BITCrashAttachment
|
||||||
@property (nonatomic, readonly, strong) NSData *crashAttachmentData;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The content type of your data as MIME type
|
|
||||||
*/
|
|
||||||
@property (nonatomic, readonly, strong) NSString *contentType;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create an BITCrashAttachment instance with a given filename and NSData object
|
|
||||||
*
|
|
||||||
* @param filename The filename the attachment should get
|
|
||||||
* @param crashAttachmentData The attachment data as NSData
|
|
||||||
* @param contentType The content type of your data as MIME type
|
|
||||||
*
|
|
||||||
* @return An instsance of BITCrashAttachment
|
|
||||||
*/
|
*/
|
||||||
- (instancetype)initWithFilename:(NSString *)filename
|
- (instancetype)initWithFilename:(NSString *)filename
|
||||||
crashAttachmentData:(NSData *)crashAttachmentData
|
crashAttachmentData:(NSData *)crashAttachmentData
|
||||||
|
|||||||
@@ -34,31 +34,9 @@
|
|||||||
crashAttachmentData:(NSData *)crashAttachmentData
|
crashAttachmentData:(NSData *)crashAttachmentData
|
||||||
contentType:(NSString *)contentType
|
contentType:(NSString *)contentType
|
||||||
{
|
{
|
||||||
if (self = [super init]) {
|
self = [super initWithFilename:filename hockeyAttachmentData:crashAttachmentData contentType:contentType];
|
||||||
_filename = filename;
|
|
||||||
_crashAttachmentData = crashAttachmentData;
|
|
||||||
_contentType = contentType;
|
|
||||||
}
|
|
||||||
|
|
||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#pragma mark - NSCoder
|
|
||||||
|
|
||||||
- (void)encodeWithCoder:(NSCoder *)encoder {
|
|
||||||
[encoder encodeObject:self.filename forKey:@"filename"];
|
|
||||||
[encoder encodeObject:self.crashAttachmentData forKey:@"data"];
|
|
||||||
[encoder encodeObject:self.contentType forKey:@"contentType"];
|
|
||||||
}
|
|
||||||
|
|
||||||
- (instancetype)initWithCoder:(NSCoder *)decoder {
|
|
||||||
if ((self = [super init])) {
|
|
||||||
_filename = [decoder decodeObjectForKey:@"filename"];
|
|
||||||
_crashAttachmentData = [decoder decodeObjectForKey:@"data"];
|
|
||||||
_contentType = [decoder decodeObjectForKey:@"contentType"];
|
|
||||||
}
|
|
||||||
return self;
|
|
||||||
}
|
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|||||||
@@ -278,7 +278,7 @@ static PLCrashReporterCallbacks plCrashCallbacks = {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)persistAttachment:(BITCrashAttachment *)attachment withFilename:(NSString *)filename {
|
- (void)persistAttachment:(BITHockeyAttachment *)attachment withFilename:(NSString *)filename {
|
||||||
NSString *attachmentFilename = [filename stringByAppendingString:@".data"];
|
NSString *attachmentFilename = [filename stringByAppendingString:@".data"];
|
||||||
NSMutableData *data = [[NSMutableData alloc] init];
|
NSMutableData *data = [[NSMutableData alloc] init];
|
||||||
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
|
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
|
||||||
@@ -318,9 +318,9 @@ static PLCrashReporterCallbacks plCrashCallbacks = {
|
|||||||
*
|
*
|
||||||
* @param filename The crash report file path
|
* @param filename The crash report file path
|
||||||
*
|
*
|
||||||
* @return an BITCrashAttachment instance or nil
|
* @return an BITHockeyAttachment instance or nil
|
||||||
*/
|
*/
|
||||||
- (BITCrashAttachment *)attachmentForCrashReport:(NSString *)filename {
|
- (BITHockeyAttachment *)attachmentForCrashReport:(NSString *)filename {
|
||||||
NSString *attachmentFilename = [filename stringByAppendingString:@".data"];
|
NSString *attachmentFilename = [filename stringByAppendingString:@".data"];
|
||||||
|
|
||||||
if (![_fileManager fileExistsAtPath:attachmentFilename])
|
if (![_fileManager fileExistsAtPath:attachmentFilename])
|
||||||
@@ -341,7 +341,7 @@ static PLCrashReporterCallbacks plCrashCallbacks = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if ([unarchiver containsValueForKey:kBITCrashMetaAttachment]) {
|
if ([unarchiver containsValueForKey:kBITCrashMetaAttachment]) {
|
||||||
BITCrashAttachment *attachment = [unarchiver decodeObjectForKey:kBITCrashMetaAttachment];
|
BITHockeyAttachment *attachment = [unarchiver decodeObjectForKey:kBITCrashMetaAttachment];
|
||||||
return attachment;
|
return attachment;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -701,9 +701,9 @@ static PLCrashReporterCallbacks plCrashCallbacks = {
|
|||||||
[metaDict setObject:applicationLog forKey:kBITCrashMetaApplicationLog];
|
[metaDict setObject:applicationLog forKey:kBITCrashMetaApplicationLog];
|
||||||
|
|
||||||
if (self.delegate != nil && [self.delegate respondsToSelector:@selector(attachmentForCrashManager:)]) {
|
if (self.delegate != nil && [self.delegate respondsToSelector:@selector(attachmentForCrashManager:)]) {
|
||||||
BITCrashAttachment *attachment = [self.delegate attachmentForCrashManager:self];
|
BITHockeyAttachment *attachment = [self.delegate attachmentForCrashManager:self];
|
||||||
|
|
||||||
if (attachment) {
|
if (attachment && attachment.hockeyAttachmentData) {
|
||||||
[self persistAttachment:attachment withFilename:[_crashesDir stringByAppendingPathComponent: filename]];
|
[self persistAttachment:attachment withFilename:[_crashesDir stringByAppendingPathComponent: filename]];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1219,7 +1219,7 @@ static PLCrashReporterCallbacks plCrashCallbacks = {
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
NSString *crashXML = nil;
|
NSString *crashXML = nil;
|
||||||
BITCrashAttachment *attachment = nil;
|
BITHockeyAttachment *attachment = nil;
|
||||||
|
|
||||||
NSString *filename = [_crashFiles objectAtIndex:0];
|
NSString *filename = [_crashFiles objectAtIndex:0];
|
||||||
NSString *cacheFilename = [filename lastPathComponent];
|
NSString *cacheFilename = [filename lastPathComponent];
|
||||||
@@ -1378,7 +1378,7 @@ static PLCrashReporterCallbacks plCrashCallbacks = {
|
|||||||
|
|
||||||
#pragma mark - Networking
|
#pragma mark - Networking
|
||||||
|
|
||||||
- (NSURLRequest *)requestWithXML:(NSString*)xml attachment:(BITCrashAttachment *)attachment {
|
- (NSURLRequest *)requestWithXML:(NSString*)xml attachment:(BITHockeyAttachment *)attachment {
|
||||||
NSString *postCrashPath = [NSString stringWithFormat:@"api/2/apps/%@/crashes", self.encodedAppIdentifier];
|
NSString *postCrashPath = [NSString stringWithFormat:@"api/2/apps/%@/crashes", self.encodedAppIdentifier];
|
||||||
|
|
||||||
NSMutableURLRequest *request = [self.hockeyAppClient requestWithMethod:@"POST"
|
NSMutableURLRequest *request = [self.hockeyAppClient requestWithMethod:@"POST"
|
||||||
@@ -1413,12 +1413,16 @@ static PLCrashReporterCallbacks plCrashCallbacks = {
|
|||||||
boundary:boundary
|
boundary:boundary
|
||||||
filename:@"crash.xml"]];
|
filename:@"crash.xml"]];
|
||||||
|
|
||||||
if (attachment) {
|
if (attachment && attachment.hockeyAttachmentData) {
|
||||||
[postBody appendData:[BITHockeyAppClient dataWithPostValue:attachment.crashAttachmentData
|
NSString *attachmentFilename = attachment.filename;
|
||||||
|
if (!attachmentFilename) {
|
||||||
|
attachmentFilename = @"Attachment_0";
|
||||||
|
}
|
||||||
|
[postBody appendData:[BITHockeyAppClient dataWithPostValue:attachment.hockeyAttachmentData
|
||||||
forKey:@"attachment0"
|
forKey:@"attachment0"
|
||||||
contentType:attachment.contentType
|
contentType:attachment.contentType
|
||||||
boundary:boundary
|
boundary:boundary
|
||||||
filename:attachment.filename]];
|
filename:attachmentFilename]];
|
||||||
}
|
}
|
||||||
|
|
||||||
[postBody appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
|
[postBody appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
|
||||||
@@ -1435,7 +1439,7 @@ static PLCrashReporterCallbacks plCrashCallbacks = {
|
|||||||
*
|
*
|
||||||
* @param xml The XML data that needs to be send to the server
|
* @param xml The XML data that needs to be send to the server
|
||||||
*/
|
*/
|
||||||
- (void)sendCrashReportWithFilename:(NSString *)filename xml:(NSString*)xml attachment:(BITCrashAttachment *)attachment {
|
- (void)sendCrashReportWithFilename:(NSString *)filename xml:(NSString*)xml attachment:(BITHockeyAttachment *)attachment {
|
||||||
|
|
||||||
NSURLRequest* request = [self requestWithXML:xml attachment:attachment];
|
NSURLRequest* request = [self requestWithXML:xml attachment:attachment];
|
||||||
|
|
||||||
|
|||||||
@@ -29,7 +29,7 @@
|
|||||||
#import <Foundation/Foundation.h>
|
#import <Foundation/Foundation.h>
|
||||||
|
|
||||||
@class BITCrashManager;
|
@class BITCrashManager;
|
||||||
@class BITCrashAttachment;
|
@class BITHockeyAttachment;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
The `BITCrashManagerDelegate` formal protocol defines methods further configuring
|
The `BITCrashManagerDelegate` formal protocol defines methods further configuring
|
||||||
@@ -55,28 +55,29 @@
|
|||||||
-(NSString *)applicationLogForCrashManager:(BITCrashManager *)crashManager;
|
-(NSString *)applicationLogForCrashManager:(BITCrashManager *)crashManager;
|
||||||
|
|
||||||
|
|
||||||
/** Return a BITCrashAttachment object providing an NSData object the crash report
|
/** Return a BITHockeyAttachment object providing an NSData object the crash report
|
||||||
being processed should contain
|
being processed should contain
|
||||||
|
|
||||||
Please limit your attachments to reasonable files to avoid high traffic costs for your users.
|
Please limit your attachments to reasonable files to avoid high traffic costs for your users.
|
||||||
|
|
||||||
Example implementation:
|
Example implementation:
|
||||||
|
|
||||||
- (BITCrashAttachment *)attachmentForCrashManager:(BITCrashManager *)crashManager {
|
- (BITHockeyAttachment *)attachmentForCrashManager:(BITCrashManager *)crashManager {
|
||||||
NSData *data = [NSData dataWithContentsOfURL:@"mydatafile"];
|
NSData *data = [NSData dataWithContentsOfURL:@"mydatafile"];
|
||||||
|
|
||||||
BITCrashAttachment *attachment = [[BITCrashAttachment alloc] initWithFilename:@"myfile.data"
|
BITHockeyAttachment *attachment = [[BITHockeyAttachment alloc] initWithFilename:@"myfile.data"
|
||||||
crashAttachmentData:data
|
hockeyAttachmentData:data
|
||||||
contentType:@"'application/octet-stream"];
|
contentType:@"'application/octet-stream"];
|
||||||
return attachment;
|
return attachment;
|
||||||
}
|
}
|
||||||
|
|
||||||
@param crashManager The `BITCrashManager` instance invoking this delegate
|
@param crashManager The `BITCrashManager` instance invoking this delegate
|
||||||
|
@see BITHockeyAttachment
|
||||||
@see applicationLogForCrashManager:
|
@see applicationLogForCrashManager:
|
||||||
@see userNameForCrashManager:
|
@see userNameForCrashManager:
|
||||||
@see userEmailForCrashManager:
|
@see userEmailForCrashManager:
|
||||||
*/
|
*/
|
||||||
-(BITCrashAttachment *)attachmentForCrashManager:(BITCrashManager *)crashManager;
|
-(BITHockeyAttachment *)attachmentForCrashManager:(BITCrashManager *)crashManager;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -94,9 +94,9 @@
|
|||||||
- (NSString *)firstNotApprovedCrashReport;
|
- (NSString *)firstNotApprovedCrashReport;
|
||||||
|
|
||||||
- (void)persistUserProvidedMetaData:(BITCrashMetaData *)userProvidedMetaData;
|
- (void)persistUserProvidedMetaData:(BITCrashMetaData *)userProvidedMetaData;
|
||||||
- (void)persistAttachment:(BITCrashAttachment *)attachment withFilename:(NSString *)filename;
|
- (void)persistAttachment:(BITHockeyAttachment *)attachment withFilename:(NSString *)filename;
|
||||||
|
|
||||||
- (BITCrashAttachment *)attachmentForCrashReport:(NSString *)filename;
|
- (BITHockeyAttachment *)attachmentForCrashReport:(NSString *)filename;
|
||||||
|
|
||||||
- (void)invokeDelayedProcessing;
|
- (void)invokeDelayedProcessing;
|
||||||
- (void)sendNextCrashReport;
|
- (void)sendNextCrashReport;
|
||||||
|
|||||||
@@ -38,6 +38,7 @@
|
|||||||
#import "BITFeedbackManagerPrivate.h"
|
#import "BITFeedbackManagerPrivate.h"
|
||||||
|
|
||||||
#import "BITHockeyBaseManagerPrivate.h"
|
#import "BITHockeyBaseManagerPrivate.h"
|
||||||
|
#import "BITHockeyAttachment.h"
|
||||||
|
|
||||||
|
|
||||||
@interface BITFeedbackActivity()
|
@interface BITFeedbackActivity()
|
||||||
@@ -100,6 +101,8 @@
|
|||||||
return YES;
|
return YES;
|
||||||
} else if ([item isKindOfClass:[NSData class]]) {
|
} else if ([item isKindOfClass:[NSData class]]) {
|
||||||
return YES;
|
return YES;
|
||||||
|
} else if ([item isKindOfClass:[BITHockeyAttachment class]]) {
|
||||||
|
return YES;
|
||||||
} else if ([item isKindOfClass:[NSURL class]]) {
|
} else if ([item isKindOfClass:[NSURL class]]) {
|
||||||
return YES;
|
return YES;
|
||||||
}
|
}
|
||||||
@@ -112,6 +115,7 @@
|
|||||||
if ([item isKindOfClass:[NSString class]] ||
|
if ([item isKindOfClass:[NSString class]] ||
|
||||||
[item isKindOfClass:[UIImage class]] ||
|
[item isKindOfClass:[UIImage class]] ||
|
||||||
[item isKindOfClass:[NSData class]] ||
|
[item isKindOfClass:[NSData class]] ||
|
||||||
|
[item isKindOfClass:[BITHockeyAttachment class]] ||
|
||||||
[item isKindOfClass:[NSURL class]]) {
|
[item isKindOfClass:[NSURL class]]) {
|
||||||
[_items addObject:item];
|
[_items addObject:item];
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -77,6 +77,7 @@
|
|||||||
- NSURL
|
- NSURL
|
||||||
- UIImage
|
- UIImage
|
||||||
- NSData
|
- NSData
|
||||||
|
- `BITHockeyAttachment`
|
||||||
|
|
||||||
These are automatically concatenated to one text string, while any images and NSData
|
These are automatically concatenated to one text string, while any images and NSData
|
||||||
objects are added as attachments to the feedback.
|
objects are added as attachments to the feedback.
|
||||||
|
|||||||
@@ -43,6 +43,7 @@
|
|||||||
#import "BITHockeyHelper.h"
|
#import "BITHockeyHelper.h"
|
||||||
|
|
||||||
#import "BITImageAnnotationViewController.h"
|
#import "BITImageAnnotationViewController.h"
|
||||||
|
#import "BITHockeyAttachment.h"
|
||||||
|
|
||||||
|
|
||||||
@interface BITFeedbackComposeViewController () <BITFeedbackUserDataDelegate, UIImagePickerControllerDelegate, UINavigationControllerDelegate, UIActionSheetDelegate, BITImageAnnotationDelegate> {
|
@interface BITFeedbackComposeViewController () <BITFeedbackUserDataDelegate, UIImagePickerControllerDelegate, UINavigationControllerDelegate, UIActionSheetDelegate, BITImageAnnotationDelegate> {
|
||||||
@@ -114,6 +115,22 @@
|
|||||||
BITFeedbackMessageAttachment *attachment = [BITFeedbackMessageAttachment attachmentWithData:item contentType:@"application/octet-stream"];
|
BITFeedbackMessageAttachment *attachment = [BITFeedbackMessageAttachment attachmentWithData:item contentType:@"application/octet-stream"];
|
||||||
attachment.originalFilename = [NSString stringWithFormat:@"Attachment_%li.data", (unsigned long)[self.attachments count]];
|
attachment.originalFilename = [NSString stringWithFormat:@"Attachment_%li.data", (unsigned long)[self.attachments count]];
|
||||||
[self.attachments addObject:attachment];
|
[self.attachments addObject:attachment];
|
||||||
|
} else if ([item isKindOfClass:[BITHockeyAttachment class]]) {
|
||||||
|
BITHockeyAttachment *sourceAttachment = (BITHockeyAttachment *)item;
|
||||||
|
|
||||||
|
if (!sourceAttachment.hockeyAttachmentData) {
|
||||||
|
BITHockeyLog(@"BITHockeyAttachment instance doesn't contain any data.");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
NSString *filename = [NSString stringWithFormat:@"Attachment_%li.data", (unsigned long)[self.attachments count]];
|
||||||
|
if (sourceAttachment.filename) {
|
||||||
|
filename = sourceAttachment.filename;
|
||||||
|
}
|
||||||
|
|
||||||
|
BITFeedbackMessageAttachment *attachment = [BITFeedbackMessageAttachment attachmentWithData:sourceAttachment.hockeyAttachmentData contentType:sourceAttachment.contentType];
|
||||||
|
attachment.originalFilename = filename;
|
||||||
|
[self.attachments addObject:attachment];
|
||||||
} else {
|
} else {
|
||||||
BITHockeyLog(@"Unknown item type %@", item);
|
BITHockeyLog(@"Unknown item type %@", item);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -289,6 +289,7 @@ typedef NS_ENUM(NSInteger, BITFeedbackObservationMode) {
|
|||||||
while all UIImage and NSData-instances will be turned into attachments.
|
while all UIImage and NSData-instances will be turned into attachments.
|
||||||
|
|
||||||
@param items an NSArray with objects that should be attached
|
@param items an NSArray with objects that should be attached
|
||||||
|
@see `[BITFeedbackComposeViewController prepareWithItems:]`
|
||||||
*/
|
*/
|
||||||
- (void)showFeedbackComposeViewWithPreparedItems:(NSArray *)items;
|
- (void)showFeedbackComposeViewWithPreparedItems:(NSArray *)items;
|
||||||
|
|
||||||
|
|||||||
68
Classes/BITHockeyAttachment.h
Normal file
68
Classes/BITHockeyAttachment.h
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
/*
|
||||||
|
* Author: Andreas Linde <mail@andreaslinde.de>
|
||||||
|
*
|
||||||
|
* Copyright (c) 2014 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>
|
||||||
|
|
||||||
|
/**
|
||||||
|
Provides support to add binary attachments to crash reports and feedback messages
|
||||||
|
|
||||||
|
This is used by `[BITCrashManagerDelegate attachmentForCrashManager:]`,
|
||||||
|
`[BITFeedbackComposeViewController prepareWithItems:]` and
|
||||||
|
`[BITFeedbackManager showFeedbackComposeViewWithPreparedItems:]`
|
||||||
|
*/
|
||||||
|
@interface BITHockeyAttachment : NSObject<NSCoding>
|
||||||
|
|
||||||
|
/**
|
||||||
|
The filename the attachment should get
|
||||||
|
*/
|
||||||
|
@property (nonatomic, readonly, strong) NSString *filename;
|
||||||
|
|
||||||
|
/**
|
||||||
|
The attachment data as NSData object
|
||||||
|
*/
|
||||||
|
@property (nonatomic, readonly, strong) NSData *hockeyAttachmentData;
|
||||||
|
|
||||||
|
/**
|
||||||
|
The content type of your data as MIME type
|
||||||
|
*/
|
||||||
|
@property (nonatomic, readonly, strong) NSString *contentType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
Create an BITHockeyAttachment instance with a given filename and NSData object
|
||||||
|
|
||||||
|
@param filename The filename the attachment should get. If nil will get a automatically generated filename
|
||||||
|
@param hockeyAttachmentData The attachment data as NSData. The instance will be ignore if this is set to nil!
|
||||||
|
@param contentType The content type of your data as MIME type. If nil will be set to "application/octet-stream"
|
||||||
|
|
||||||
|
@return An instsance of BITHockeyAttachment.
|
||||||
|
*/
|
||||||
|
- (instancetype)initWithFilename:(NSString *)filename
|
||||||
|
hockeyAttachmentData:(NSData *)hockeyAttachmentData
|
||||||
|
contentType:(NSString *)contentType;
|
||||||
|
|
||||||
|
@end
|
||||||
75
Classes/BITHockeyAttachment.m
Normal file
75
Classes/BITHockeyAttachment.m
Normal file
@@ -0,0 +1,75 @@
|
|||||||
|
/*
|
||||||
|
* Author: Andreas Linde <mail@andreaslinde.de>
|
||||||
|
*
|
||||||
|
* Copyright (c) 2014 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 "BITHockeyAttachment.h"
|
||||||
|
|
||||||
|
@implementation BITHockeyAttachment
|
||||||
|
|
||||||
|
- (instancetype)initWithFilename:(NSString *)filename
|
||||||
|
hockeyAttachmentData:(NSData *)hockeyAttachmentData
|
||||||
|
contentType:(NSString *)contentType
|
||||||
|
{
|
||||||
|
if (self = [super init]) {
|
||||||
|
_filename = filename;
|
||||||
|
|
||||||
|
_hockeyAttachmentData = hockeyAttachmentData;
|
||||||
|
|
||||||
|
if (contentType) {
|
||||||
|
_contentType = contentType;
|
||||||
|
} else {
|
||||||
|
_contentType = @"application/octet-stream";
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return self;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#pragma mark - NSCoder
|
||||||
|
|
||||||
|
- (void)encodeWithCoder:(NSCoder *)encoder {
|
||||||
|
if (self.filename) {
|
||||||
|
[encoder encodeObject:self.filename forKey:@"filename"];
|
||||||
|
}
|
||||||
|
if (self.hockeyAttachmentData) {
|
||||||
|
[encoder encodeObject:self.hockeyAttachmentData forKey:@"data"];
|
||||||
|
}
|
||||||
|
[encoder encodeObject:self.contentType forKey:@"contentType"];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (instancetype)initWithCoder:(NSCoder *)decoder {
|
||||||
|
if ((self = [super init])) {
|
||||||
|
_filename = [decoder decodeObjectForKey:@"filename"];
|
||||||
|
_hockeyAttachmentData = [decoder decodeObjectForKey:@"data"];
|
||||||
|
_contentType = [decoder decodeObjectForKey:@"contentType"];
|
||||||
|
}
|
||||||
|
return self;
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
||||||
@@ -35,6 +35,10 @@
|
|||||||
#import "BITHockeyManager.h"
|
#import "BITHockeyManager.h"
|
||||||
#import "BITHockeyManagerDelegate.h"
|
#import "BITHockeyManagerDelegate.h"
|
||||||
|
|
||||||
|
#if HOCKEYSDK_FEATURE_CRASH_REPORTER || HOCKEYSDK_FEATURE_FEEDBACK
|
||||||
|
#import "BITHockeyAttachment.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
#if HOCKEYSDK_FEATURE_CRASH_REPORTER
|
#if HOCKEYSDK_FEATURE_CRASH_REPORTER
|
||||||
#import "BITCrashManager.h"
|
#import "BITCrashManager.h"
|
||||||
#import "BITCrashAttachment.h"
|
#import "BITCrashAttachment.h"
|
||||||
|
|||||||
@@ -131,6 +131,8 @@
|
|||||||
1EAF20AA162DC0F600957B1D /* feedbackActiviy.png in Resources */ = {isa = PBXBuildFile; fileRef = 1EAF20A6162DC0F600957B1D /* feedbackActiviy.png */; };
|
1EAF20AA162DC0F600957B1D /* feedbackActiviy.png in Resources */ = {isa = PBXBuildFile; fileRef = 1EAF20A6162DC0F600957B1D /* feedbackActiviy.png */; };
|
||||||
1EAF20AB162DC0F600957B1D /* feedbackActiviy@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 1EAF20A7162DC0F600957B1D /* feedbackActiviy@2x.png */; };
|
1EAF20AB162DC0F600957B1D /* feedbackActiviy@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 1EAF20A7162DC0F600957B1D /* feedbackActiviy@2x.png */; };
|
||||||
1EB52FD5167B766100C801D5 /* HockeySDK.strings in Resources */ = {isa = PBXBuildFile; fileRef = 1E59555F15B6F80E00A03429 /* HockeySDK.strings */; };
|
1EB52FD5167B766100C801D5 /* HockeySDK.strings in Resources */ = {isa = PBXBuildFile; fileRef = 1E59555F15B6F80E00A03429 /* HockeySDK.strings */; };
|
||||||
|
1EB92E731955C38C0093C8B6 /* BITHockeyAttachment.h in Headers */ = {isa = PBXBuildFile; fileRef = 1EB92E711955C38C0093C8B6 /* BITHockeyAttachment.h */; };
|
||||||
|
1EB92E741955C38C0093C8B6 /* BITHockeyAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = 1EB92E721955C38C0093C8B6 /* BITHockeyAttachment.m */; };
|
||||||
1ECA8F4D192B5BD8006B9416 /* BITCrashDetailsPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 1ECA8F4B192B5BD8006B9416 /* BITCrashDetailsPrivate.h */; };
|
1ECA8F4D192B5BD8006B9416 /* BITCrashDetailsPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 1ECA8F4B192B5BD8006B9416 /* BITCrashDetailsPrivate.h */; };
|
||||||
1ECA8F51192B6954006B9416 /* BITCrashMetaData.h in Headers */ = {isa = PBXBuildFile; fileRef = 1ECA8F4F192B6954006B9416 /* BITCrashMetaData.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
1ECA8F51192B6954006B9416 /* BITCrashMetaData.h in Headers */ = {isa = PBXBuildFile; fileRef = 1ECA8F4F192B6954006B9416 /* BITCrashMetaData.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||||
1ECA8F52192B6954006B9416 /* BITCrashMetaData.m in Sources */ = {isa = PBXBuildFile; fileRef = 1ECA8F50192B6954006B9416 /* BITCrashMetaData.m */; };
|
1ECA8F52192B6954006B9416 /* BITCrashMetaData.m in Sources */ = {isa = PBXBuildFile; fileRef = 1ECA8F50192B6954006B9416 /* BITCrashMetaData.m */; };
|
||||||
@@ -325,6 +327,8 @@
|
|||||||
1EAF20A6162DC0F600957B1D /* feedbackActiviy.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = feedbackActiviy.png; sourceTree = "<group>"; };
|
1EAF20A6162DC0F600957B1D /* feedbackActiviy.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = feedbackActiviy.png; sourceTree = "<group>"; };
|
||||||
1EAF20A7162DC0F600957B1D /* feedbackActiviy@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "feedbackActiviy@2x.png"; sourceTree = "<group>"; };
|
1EAF20A7162DC0F600957B1D /* feedbackActiviy@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "feedbackActiviy@2x.png"; sourceTree = "<group>"; };
|
||||||
1EB52FC3167B73D400C801D5 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/HockeySDK.strings; sourceTree = "<group>"; };
|
1EB52FC3167B73D400C801D5 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/HockeySDK.strings; sourceTree = "<group>"; };
|
||||||
|
1EB92E711955C38C0093C8B6 /* BITHockeyAttachment.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITHockeyAttachment.h; sourceTree = "<group>"; };
|
||||||
|
1EB92E721955C38C0093C8B6 /* BITHockeyAttachment.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BITHockeyAttachment.m; sourceTree = "<group>"; };
|
||||||
1ECA8F4B192B5BD8006B9416 /* BITCrashDetailsPrivate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITCrashDetailsPrivate.h; sourceTree = "<group>"; };
|
1ECA8F4B192B5BD8006B9416 /* BITCrashDetailsPrivate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITCrashDetailsPrivate.h; sourceTree = "<group>"; };
|
||||||
1ECA8F4F192B6954006B9416 /* BITCrashMetaData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITCrashMetaData.h; sourceTree = "<group>"; };
|
1ECA8F4F192B6954006B9416 /* BITCrashMetaData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BITCrashMetaData.h; sourceTree = "<group>"; };
|
||||||
1ECA8F50192B6954006B9416 /* BITCrashMetaData.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BITCrashMetaData.m; sourceTree = "<group>"; };
|
1ECA8F50192B6954006B9416 /* BITCrashMetaData.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BITCrashMetaData.m; sourceTree = "<group>"; };
|
||||||
@@ -522,6 +526,8 @@
|
|||||||
1E49A4AA161222B900463151 /* BITStoreButton.m */,
|
1E49A4AA161222B900463151 /* BITStoreButton.m */,
|
||||||
1E49A4AB161222B900463151 /* BITWebTableViewCell.h */,
|
1E49A4AB161222B900463151 /* BITWebTableViewCell.h */,
|
||||||
1E49A4AC161222B900463151 /* BITWebTableViewCell.m */,
|
1E49A4AC161222B900463151 /* BITWebTableViewCell.m */,
|
||||||
|
1EB92E711955C38C0093C8B6 /* BITHockeyAttachment.h */,
|
||||||
|
1EB92E721955C38C0093C8B6 /* BITHockeyAttachment.m */,
|
||||||
);
|
);
|
||||||
name = Helper;
|
name = Helper;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
@@ -780,6 +786,7 @@
|
|||||||
1EF95CAA162CB314000AE3AD /* BITFeedbackComposeViewControllerDelegate.h in Headers */,
|
1EF95CAA162CB314000AE3AD /* BITFeedbackComposeViewControllerDelegate.h in Headers */,
|
||||||
1EF95CA6162CB037000AE3AD /* BITFeedbackActivity.h in Headers */,
|
1EF95CA6162CB037000AE3AD /* BITFeedbackActivity.h in Headers */,
|
||||||
1E49A4B8161222B900463151 /* BITHockeyBaseViewController.h in Headers */,
|
1E49A4B8161222B900463151 /* BITHockeyBaseViewController.h in Headers */,
|
||||||
|
1EB92E731955C38C0093C8B6 /* BITHockeyAttachment.h in Headers */,
|
||||||
1E49A4AF161222B900463151 /* BITHockeyBaseManager.h in Headers */,
|
1E49A4AF161222B900463151 /* BITHockeyBaseManager.h in Headers */,
|
||||||
1E0829001708F69A0073050E /* BITStoreUpdateManagerDelegate.h in Headers */,
|
1E0829001708F69A0073050E /* BITStoreUpdateManagerDelegate.h in Headers */,
|
||||||
1E49A4421612223B00463151 /* BITFeedbackListViewCell.h in Headers */,
|
1E49A4421612223B00463151 /* BITFeedbackListViewCell.h in Headers */,
|
||||||
@@ -1044,6 +1051,7 @@
|
|||||||
1E49A4CD161222B900463151 /* BITStoreButton.m in Sources */,
|
1E49A4CD161222B900463151 /* BITStoreButton.m in Sources */,
|
||||||
1E90FD7418EDB86400CF0417 /* BITCrashDetails.m in Sources */,
|
1E90FD7418EDB86400CF0417 /* BITCrashDetails.m in Sources */,
|
||||||
1E49A4D3161222B900463151 /* BITWebTableViewCell.m in Sources */,
|
1E49A4D3161222B900463151 /* BITWebTableViewCell.m in Sources */,
|
||||||
|
1EB92E741955C38C0093C8B6 /* BITHockeyAttachment.m in Sources */,
|
||||||
E48A3DED17B3ED1C00924C3D /* BITAuthenticator.m in Sources */,
|
E48A3DED17B3ED1C00924C3D /* BITAuthenticator.m in Sources */,
|
||||||
1E49A4DB161222D400463151 /* HockeySDKPrivate.m in Sources */,
|
1E49A4DB161222D400463151 /* HockeySDKPrivate.m in Sources */,
|
||||||
1E754E5D1621FBB70070AB92 /* BITCrashManager.m in Sources */,
|
1E754E5D1621FBB70070AB92 /* BITCrashManager.m in Sources */,
|
||||||
|
|||||||
@@ -99,15 +99,15 @@
|
|||||||
NSData *data = [[NSData alloc] initWithBase64Encoding:@"TestData"];
|
NSData *data = [[NSData alloc] initWithBase64Encoding:@"TestData"];
|
||||||
NSString* type = @"text/plain";
|
NSString* type = @"text/plain";
|
||||||
|
|
||||||
BITCrashAttachment *originalAttachment = [[BITCrashAttachment alloc] initWithFilename:filename crashAttachmentData:data contentType:type];
|
BITHockeyAttachment *originalAttachment = [[BITHockeyAttachment alloc] initWithFilename:filename hockeyAttachmentData:data contentType:type];
|
||||||
NSString *attachmentFilename = [[_sut crashesDir] stringByAppendingPathComponent:@"testAttachment"];
|
NSString *attachmentFilename = [[_sut crashesDir] stringByAppendingPathComponent:@"testAttachment"];
|
||||||
|
|
||||||
[_sut persistAttachment:originalAttachment withFilename:attachmentFilename];
|
[_sut persistAttachment:originalAttachment withFilename:attachmentFilename];
|
||||||
|
|
||||||
BITCrashAttachment *decodedAttachment = [_sut attachmentForCrashReport:attachmentFilename];
|
BITHockeyAttachment *decodedAttachment = [_sut attachmentForCrashReport:attachmentFilename];
|
||||||
|
|
||||||
assertThat(decodedAttachment.filename, equalTo(filename));
|
assertThat(decodedAttachment.filename, equalTo(filename));
|
||||||
assertThat(decodedAttachment.crashAttachmentData, equalTo(data));
|
assertThat(decodedAttachment.hockeyAttachmentData, equalTo(data));
|
||||||
assertThat(decodedAttachment.contentType, equalTo(type));
|
assertThat(decodedAttachment.contentType, equalTo(type));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user