一.儲(chǔ)存崩潰日志
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
NSSetUncaughtExceptionHandler (&UncaughtExceptionHandler);
}
#pragma mark - 儲(chǔ)存崩潰日志
void UncaughtExceptionHandler(NSException *exception) {
NSArray *arr = [exception callStackSymbols];//得到當(dāng)前調(diào)用棧信息
NSString *reason = [exception reason];//非常重要璧瞬,就是崩潰的原因
NSString *name = [exception name];//異常類型
NSString *content = [NSString stringWithFormat:@"exception type : %@ n crash reason : %@ n call stack info : %@", name, reason, arr];
NSLog(@"exception type : %@ n crash reason : %@ n call stack info : %@", name, reason, arr);
// NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
// [userDefaults setObject:content forKey:@"content"];
// [userDefaults synchronize];
// 可以在上傳時(shí)使用當(dāng)前的系統(tǒng)事件作為文件名
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
// 設(shè)置時(shí)間格式
formatter.dateFormat = @"yyyyMMddHHmmss";
NSString *timeStr = [formatter stringFromDate:[NSDate date]];
NSString *nameStr = [NSString stringWithFormat:@"%@iOSException.txt", timeStr];
// NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
// NSString *str = [userDefaults objectForKey:@"content"];
//NSString *eStr = [str stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
//
// NSLog(@"%@",str);
NSArray *paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
NSString *path=[paths objectAtIndex:0];
NSLog(@"path = %@",path);
//NSString *filename=[path stringByAppendingPathComponent:@"exception.plist"];
NSString *filename=[path stringByAppendingPathComponent:nameStr];
NSFileManager* fm = [NSFileManager defaultManager];
[fm createFileAtPath:filename contents:nil attributes:nil];
//NSDictionary* dic = [NSDictionary dictionaryWithContentsOfFile:plistPath];
//創(chuàng)建一個(gè)dic蜡镶,寫(xiě)到plist文件里
//NSDictionary* dic = [NSDictionary dictionaryWithObjectsAndKeys:str,@"exception",nil];
//[dic writeToFile:filename atomically:YES];
[content writeToFile:filename atomically:YES encoding:NSUTF8StringEncoding error:nil] ;
/**
* 把異常崩潰信息發(fā)送至開(kāi)發(fā)者郵件
*/
NSMutableString *mailUrl = [NSMutableString string];
[mailUrl appendString:@"mailto:1178638897@qq.com"];
[mailUrl appendString:@"?subject=程序異常崩潰畜普,請(qǐng)配合發(fā)送異常報(bào)告堪夭,謝謝合作瞻惋!"];
[mailUrl appendFormat:@"&body=%@", content];
// 打開(kāi)地址
NSString *mailPath = [mailUrl stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:mailPath]];
}
二.獲取devicetoken方法
#warning 將得到的deviceToken傳給SDK
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
方法1:
NSString *token =
[[[[deviceToken description] stringByReplacingOccurrencesOfString:@"<"
withString:@""]
stringByReplacingOccurrencesOfString:@">"
withString:@""]
stringByReplacingOccurrencesOfString:@" "
withString:@""];
方法1獲取不到時(shí)可以用方法2
方法2:
NSMutableString *deviceTokenString1 = [NSMutableString string];
const char *bytes = (char*)[deviceToken bytes];
int iCount = deviceToken.length;
for (int i = 0; i < iCount; i++) {
[deviceTokenString1 appendFormat:@"%02x", bytes[i]&0x000000FF];
}
NSLog(@"My dvsToken is %@",deviceTokenString1);
}
三.NSUserDefaults儲(chǔ)存數(shù)據(jù)
NSUserDefaults *userde = [NSUserDefaults standardUserDefaults];
NSDictionary *userDic = [userde objectForKey:@"UserInfoDic"];
NSString *selfStr = [userDic objectForKey:@"user_id"];
NSString *APNSStr = [NSString stringWithFormat:@"APNSArr%@",selfStr];
id notificationarr = [userde objectForKey:APNSStr];
NSMutableArray *APNSArr = [[NSMutableArray alloc]init];
if ([notificationarr isKindOfClass:[NSArray class]])
{
APNSArr = [NSMutableArray arrayWithArray:notificationarr];
} else {
}
NSDate *date = [NSDate date];
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateStyle:NSDateFormatterMediumStyle];
[formatter setTimeStyle:NSDateFormatterShortStyle];
[formatter setDateFormat:@"YYYY-MM-dd hh:mm:ss"];
NSString *DateTime = [formatter stringFromDate:date];
NSData *modelData = [NSKeyedArchiver archivedDataWithRootObject:[GPLModel baseModelWithText:text.content orderId:gplorderidStr nickname:gplnameStr userid:gpluseridStr time:DateTime]];
[APNSArr addObject:modelData];
**NSUserDefaults不能儲(chǔ)存可變數(shù)組,需要先轉(zhuǎn)成NSArray**
NSArray *arrAY = [NSArray arrayWithArray:APNSArr];
[userde setObject:arrAY forKey:APNSStr];
[userde synchronize];
**model需要進(jìn)行編碼和解碼**
#import "GPLModel.h"
@implementation GPLModel
- (instancetype)initWithText:(NSString *)text orderId:(NSString *)orderIdStr nickname:(NSString*)nicknameStr userid:(NSString*)useridStr time:(NSString*)timeStr
{
if (self==[super init]) {
_textStr = [text copy];
_orderId = [orderIdStr copy];
_nickname = [nicknameStr copy];
_userid = [useridStr copy];
_time = [timeStr copy];
}
return self;
}
+ (instancetype)baseModelWithText:(NSString *)text orderId:(NSString *)orderIdStr nickname:(NSString*)nicknameStr userid:(NSString*)useridStr time:(NSString*)timeStr
{
return [[self alloc] initWithText:text orderId:orderIdStr nickname:nicknameStr userid:useridStr time:timeStr];
}
-(void)encodeWithCoder:(NSCoder *)aCoder
{
[aCoder encodeObject:_textStr forKey:@"textStr"];
[aCoder encodeObject:_orderId forKey:@"orderId"];
[aCoder encodeObject:_nickname forKey:@"nickname"];
[aCoder encodeObject:_userid forKey:@"userid"];
[aCoder encodeObject:_time forKey:@"time"];
}
-(id)initWithCoder:(NSCoder *)aDecoder
{
if (self=[super init]) {
_textStr= [aDecoder decodeObjectForKey:@"textStr"];
_orderId= [aDecoder decodeObjectForKey:@"orderId"];
_nickname= [aDecoder decodeObjectForKey:@"nickname"];
_userid= [aDecoder decodeObjectForKey:@"userid"];
_time= [aDecoder decodeObjectForKey:@"time"];
}
return self;
}
@end
四.獲取當(dāng)前最頂層的ViewController
#pragma mark 獲取當(dāng)前最頂層的ViewController
- (UIViewController *)topViewController {
UIViewController *resultVC;
resultVC = [self _topViewController:[[UIApplication sharedApplication].keyWindow rootViewController]];
while (resultVC.presentedViewController) {
resultVC = [self _topViewController:resultVC.presentedViewController];
}
return resultVC;
}
- (UIViewController *)_topViewController:(UIViewController *)vc {
if ([vc isKindOfClass:[UINavigationController class]]) {
return [self _topViewController:[(UINavigationController *)vc topViewController]];
} else if ([vc isKindOfClass:[UITabBarController class]]) {
return [self _topViewController:[(UITabBarController *)vc selectedViewController]];
} else {
return vc;
}
return nil;
}