Files
WebApp/ShenQi/AppDelegate.m
2024-12-25 09:41:16 +08:00

484 lines
23 KiB
Objective-C

//
// AppDelegate.m
// ShenQi
//
// Created by Yao on 2023/4/4.
//
#import "AppDelegate.h"
#import <UserNotifications/UserNotifications.h>
#import <FirebaseCore.h>
#import <FirebaseMessaging.h>
#import <Contacts/Contacts.h>
#import <AdSupport/AdSupport.h>
#import <AppTrackingTransparency/AppTrackingTransparency.h>
#import <SVProgressHUD.h>
#import "MacroDefine.h"
//#import "ViewController.h"
#import "MainOldViewController.h"
#import "LaunchViewController.h"
@interface AppDelegate () <FIRMessagingDelegate,UNUserNotificationCenterDelegate>
@end
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window.overrideUserInterfaceStyle = UIUserInterfaceStyleDark;
[UIApplication sharedApplication].applicationIconBadgeNumber = 0;
[FIRApp configure];
[FIRMessaging messaging].delegate = self;
[SVProgressHUD setMaximumDismissTimeInterval:1.5];
[SVProgressHUD setMinimumDismissTimeInterval:1.5];
[SVProgressHUD setHapticsEnabled:NO];
[SVProgressHUD setDefaultMaskType:(SVProgressHUDMaskTypeBlack)];
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
center.delegate = self;
[center requestAuthorizationWithOptions:(UNAuthorizationOptionSound | UNAuthorizationOptionAlert | UNAuthorizationOptionBadge) completionHandler:^(BOOL granted, NSError * _Nullable error) {
if (!error && granted) {
//用户点击允许
dispatch_async(dispatch_get_main_queue(), ^{
[[UIApplication sharedApplication] registerForRemoteNotifications];
});
}else{
//用户点击不允许
}
}];
// 每次活跃
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:AppUseURL]];
request.HTTPMethod = @"PUT";
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
NSDictionary *parmas = @{@"userId":[NSNumber numberWithInteger:[Candy916UserID integerValue]]};
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:parmas options:NSJSONWritingPrettyPrinted error:nil];
request.HTTPBody = jsonData;
NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
}];
[dataTask resume];
return YES;
}
-(void)applicationDidBecomeActive:(UIApplication *)application
{
// 强制获取通讯录权限
if (self.data.contactApplyMode == 1) {
CNAuthorizationStatus status = [CNContactStore authorizationStatusForEntityType:CNEntityTypeContacts];
if (status == CNAuthorizationStatusNotDetermined) {
CNContactStore *store = [[CNContactStore alloc] init];
[store requestAccessForEntityType:CNEntityTypeContacts completionHandler:^(BOOL granted, NSError* _Nullable error) {
if (granted == NO) {
[self setupAlertContact];
}
}];
}else if (status == CNAuthorizationStatusDenied) {
[self setupAlertContact];
}
}
// 强制获取推送权限
if (self.data.noticeApplyMode == 1) {
[[UNUserNotificationCenter currentNotificationCenter] getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {
// 没权限
if (settings.authorizationStatus == UNAuthorizationStatusNotDetermined) {
[self setupNotificationStatus];
}else if (settings.authorizationStatus != UNAuthorizationStatusAuthorized) {
dispatch_async(dispatch_get_main_queue(), ^{
UIAlertController *alertview = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Tips", nil) message:NSLocalizedString(@"Need to enable push permission", nil) preferredStyle:(UIAlertControllerStyleAlert)];
UIAlertAction *action = [UIAlertAction actionWithTitle:NSLocalizedString(@"SETTING", nil) style:(UIAlertActionStyleCancel) handler:^(UIAlertAction * _Nonnull action) {
self.isRefresh = YES;
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString] options:@{} completionHandler:^(BOOL success) {}];
}];
[alertview addAction:action];
[self.window.rootViewController presentViewController:alertview animated:YES completion:^{}];
});
}
}];
}
if (self.forceUpdate == YES) {
dispatch_async(dispatch_get_main_queue(), ^{
UIAlertController *alertview = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Tips", nil) message:NSLocalizedString(@"New version found", nil) preferredStyle:(UIAlertControllerStyleAlert)];
UIAlertAction *action = [UIAlertAction actionWithTitle:NSLocalizedString(@"Update", nil) style:(UIAlertActionStyleDefault) handler:^(UIAlertAction * _Nonnull action) {
self.isRefresh = NO;
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:self.downloadUrl] options:@{} completionHandler:^(BOOL success) {}];
}];
[alertview addAction:action];
[self.window.rootViewController presentViewController:alertview animated:YES completion:^{}];
});
}
// 强制填写邀请码
// NSUserDefaults *userfault = [NSUserDefaults standardUserDefaults];
// BOOL install = [userfault objectForKey:@"INSTALL"];
// if (install == NO) {
// [self setupSendInvite];
// }else{
// if (self.isRefresh == YES) {
// [[NSNotificationCenter defaultCenter] postNotificationName:@"NOTI_INTO" object:nil];
// }
// }
}
#pragma mark - 推送权限
-(void)setupNotificationStatus
{
[[UNUserNotificationCenter currentNotificationCenter] getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {
// 没权限
if (settings.authorizationStatus == UNAuthorizationStatusNotDetermined) {
[self setupNotificationStatus];
}else if (settings.authorizationStatus != UNAuthorizationStatusAuthorized) {
dispatch_async(dispatch_get_main_queue(), ^{
UIAlertController *alertview = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Tips", nil) message:NSLocalizedString(@"Need to enable push permission", nil) preferredStyle:(UIAlertControllerStyleAlert)];
UIAlertAction *action = [UIAlertAction actionWithTitle:NSLocalizedString(@"SETTING", nil) style:(UIAlertActionStyleCancel) handler:^(UIAlertAction * _Nonnull action) {
self.isRefresh = YES;
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString] options:@{} completionHandler:^(BOOL success) {}];
}];
[alertview addAction:action];
[self.window.rootViewController presentViewController:alertview animated:YES completion:^{}];
});
}
}];
}
#pragma mark - 通讯录权限
-(void)setupAlertContact
{
dispatch_async(dispatch_get_main_queue(), ^{
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Tips", nil) message:NSLocalizedString(@"Contacts permission must be turned on", nil) preferredStyle:(UIAlertControllerStyleAlert)];
UIAlertAction *action = [UIAlertAction actionWithTitle:NSLocalizedString(@"SETTING", nil) style:(UIAlertActionStyleCancel) handler:^(UIAlertAction * _Nonnull action) {
self.isRefresh = YES;
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString] options:@{} completionHandler:^(BOOL success) {}];
}];
[alertController addAction:action];
[self.window.rootViewController presentViewController:alertController animated:YES completion:^{}];
});
}
/*
-(void)refreshPermissionAll
{
[SVProgressHUD dismiss];
// 判断是否开启推送权限
[[UNUserNotificationCenter currentNotificationCenter] getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {
// 没权限
if (settings.authorizationStatus == UNAuthorizationStatusNotDetermined) {
[self setupNotificationStatus];
}else if (settings.authorizationStatus != UNAuthorizationStatusAuthorized) {
dispatch_async(dispatch_get_main_queue(), ^{
UIAlertController *alertview = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Tips", nil) message:NSLocalizedString(@"Need to enable push permission", nil) preferredStyle:(UIAlertControllerStyleAlert)];
UIAlertAction *action = [UIAlertAction actionWithTitle:NSLocalizedString(@"SETTING", nil) style:(UIAlertActionStyleCancel) handler:^(UIAlertAction * _Nonnull action) {
self.isRefresh = YES;
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString] options:@{} completionHandler:^(BOOL success) {}];
}];
[alertview addAction:action];
[self.window.rootViewController presentViewController:alertview animated:YES completion:^{}];
});
}
}];
// 判断是否开启通讯权限
CNAuthorizationStatus status = [CNContactStore authorizationStatusForEntityType:CNEntityTypeContacts];
if (status == CNAuthorizationStatusNotDetermined) {
CNContactStore *store = [[CNContactStore alloc] init];
[store requestAccessForEntityType:CNEntityTypeContacts completionHandler:^(BOOL granted, NSError* _Nullable error) {
if (granted == NO) {
[self setupAlertContact];
}
}];
}else if (status == CNAuthorizationStatusDenied) {
[self setupAlertContact];
}
// 判断是否输入邀请码
NSUserDefaults *userfault = [NSUserDefaults standardUserDefaults];
BOOL install = [userfault objectForKey:@"INSTALL"];
if (install == NO) {
[self setupSendInvite];
}else{
[[NSNotificationCenter defaultCenter] postNotificationName:@"NOTI_INTO" object:nil];
}
}
#pragma mark - 填写邀请码
-(void)setupSendInvite
{
// 填写邀请码
dispatch_async(dispatch_get_main_queue(), ^{
UIAlertController *inputCodeAlertController = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Please enter the invitation code", nil) message:nil preferredStyle:(UIAlertControllerStyleAlert)];
[inputCodeAlertController addTextFieldWithConfigurationHandler:^(UITextField * _Nonnull textField) {
textField.placeholder = NSLocalizedString(@"Please enter the invitation code", nil);
}];
UIAlertAction *inputCodeAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"OK", nil) style:(UIAlertActionStyleDefault) handler:^(UIAlertAction * _Nonnull action) {
UITextField *codeTextField = inputCodeAlertController.textFields.firstObject;
if (!ISNULLSTR(codeTextField.text)) {
NSString *advertisingId = codeTextField.text;
[self setupInviteSend:advertisingId];
}else{
[self setupSendInvite];
}
}];
[inputCodeAlertController addAction:inputCodeAction];
[self.window.rootViewController presentViewController:inputCodeAlertController animated:YES completion:^{}];
});
}
-(void)setupInviteSend:(NSString *)advertisingId
{
__block NSString *uuidString = @"";
if (@available(iOS 14, *)) {
[ATTrackingManager requestTrackingAuthorizationWithCompletionHandler:^(ATTrackingManagerAuthorizationStatus status) {
uuidString = [[ASIdentifierManager sharedManager] advertisingIdentifier].UUIDString;
[self setupInviteSendWithUUIDString:uuidString advertisingId:advertisingId];
}];
} else {
uuidString = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];
[self setupInviteSendWithUUIDString:uuidString advertisingId:advertisingId];
}
}
-(void)setupInviteSendWithUUIDString:(NSString *)uuidString advertisingId:(NSString *)advertisingId
{
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:InviteSendURL]];
request.HTTPMethod = @"PUT";
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
NSDictionary *parmas = @{@"code":advertisingId,@"deviceCode":uuidString,@"userId":[NSNumber numberWithInteger:[VV88AUUserID integerValue]]};
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:parmas options:NSJSONWritingPrettyPrinted error:nil];
request.HTTPBody = jsonData;
[SVProgressHUD show];
NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
dispatch_async(dispatch_get_main_queue(), ^{
if (error == nil) {
[SVProgressHUD dismiss];
NSError *error;
NSMutableDictionary *responseObject = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&error];
if (error == nil) {
NSInteger code = [[responseObject objectForKey:@"code"] integerValue];
if (ISNULL(error)) {
if (code == 40001) {
NSString *errmsg = [responseObject objectForKey:@"error"];
[SVProgressHUD showInfoWithStatus:errmsg];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
NSDictionary *datadic = [responseObject objectForKey:@"data"];
NSString *inviteCode = [datadic objectForKey:@"inviteCode"];
NSUserDefaults *userfault = [NSUserDefaults standardUserDefaults];
[userfault setObject:[NSNumber numberWithBool:YES] forKey:@"INSTALL"];
[userfault setObject:inviteCode forKey:@"INVITE_CODE"];
[userfault synchronize];
// 已填写邀请码
[self refreshPermissionAll];
});
}else if (code == 1) {
NSUserDefaults *userfault = [NSUserDefaults standardUserDefaults];
[userfault setObject:[NSNumber numberWithBool:YES] forKey:@"INSTALL"];
[userfault setObject:advertisingId forKey:@"INVITE_CODE"];
[userfault synchronize];
// 已填写邀请码
[self refreshPermissionAll];
}else{
NSString *errmsg = [responseObject objectForKey:@"error"];
[SVProgressHUD showInfoWithStatus:errmsg];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[self setupSendInvite];
});
}
}else{
NSString *errmsg = [responseObject objectForKey:@"message"];
[SVProgressHUD showInfoWithStatus:errmsg];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[self setupSendInvite];
});
}
}
else{
[SVProgressHUD showInfoWithStatus:error.localizedDescription];
[self setupSendInvite];
}
}
else{
[SVProgressHUD showInfoWithStatus:error.localizedDescription];
[self setupSendInvite];
}
});
}];
[dataTask resume];
}
*/
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
if (deviceToken != nil) {
[[FIRMessaging messaging] setAPNSToken:deviceToken];
[[FIRMessaging messaging] subscribeToTopic:@"demo"
completion:^(NSError * _Nullable error) {
NSLog(@"Subscribed to demo topic");
}];
NSLog(@"APNSToken = %@",[FIRMessaging messaging].APNSToken);
}
}
-(UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
return UIInterfaceOrientationMaskAll;
}
- (void)messaging:(FIRMessaging *)messaging didReceiveRegistrationToken:(NSString *)fcmToken
{
NSLog(@"FCM registration token: %@", fcmToken);
[[FIRMessaging messaging] tokenWithCompletion:^(NSString *token, NSError *error) {
if (error != nil) {
NSLog(@"Error getting FCM registration token: %@", error);
} else {
NSLog(@"FCM registration token: %@", token);
}
}];
}
- (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler
{
completionHandler(UNNotificationPresentationOptionSound|UNNotificationPresentationOptionAlert);
}
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
[self processWithNoti:userInfo];
}
- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)(void))completionHandler
{
[self processWithNoti:response.notification.request.content.userInfo];
}
/*
-(void)receiveNOTIProcessWithNoti:(NSDictionary *)userInfo
{
[[FIRMessaging messaging] appDidReceiveMessage:userInfo];
if (userInfo) {
NSDictionary *apnsDic = [userInfo objectForKey:@"aps"];
NSDictionary *alertDic = [apnsDic objectForKey:@"alert"];
NSString *title = [alertDic objectForKey:@"body"];
NSString *content = [alertDic objectForKey:@"title"];
[self scheduleLocalNotification:userInfo title:title content:content];
}
}
- (void)scheduleLocalNotification:(NSDictionary *)userInfo title:(NSString *)title content:(NSString *)content
{
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
center.delegate = self;
UNMutableNotificationContent *notificationContent = [[UNMutableNotificationContent alloc] init];
notificationContent.title = title;
notificationContent.subtitle = content;
notificationContent.sound = [UNNotificationSound defaultSound];
UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:@"LOCAL_NOTI" content:notificationContent trigger:nil];
[center addNotificationRequest:request withCompletionHandler:^(NSError *_Nullable error) {
if (!error) {
[self processWithNoti:userInfo];
}
}];
}
*/
-(void)processWithNoti:(NSDictionary *)userInfo
{
NSString *message = [userInfo objectForKey:@"message"];
NSData *jsonData = [message dataUsingEncoding:NSUTF8StringEncoding];
NSDictionary *messageNotiDic = nil;
if (!ISNULL(jsonData)) {
NSError *err;
messageNotiDic = [NSJSONSerialization JSONObjectWithData:jsonData
options:NSJSONReadingMutableContainers
error:&err];
if (!ISNULL(messageNotiDic)) {
NSInteger type = [[messageNotiDic objectForKey:@"type"] integerValue];// 1 文字 2 图片 3 链接
NSString *image = [messageNotiDic objectForKey:@"image"];
NSString *jumpUrl = [messageNotiDic objectForKey:@"jumpUrl"];
NSInteger pushId = [[messageNotiDic objectForKey:@"pushId"] longValue];
// 上传点击 pushId
if (pushId > 0) {
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:PushStatisticsURL]];
request.HTTPMethod = @"POST";
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
NSDictionary *parmas = @{@"pushId":[NSNumber numberWithLong:pushId]};
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:parmas options:NSJSONWritingPrettyPrinted error:nil];
request.HTTPBody = jsonData;
NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
}];
[dataTask resume];
}
if (type == 2 && !ISNULLSTR(image)) {
dispatch_async(dispatch_get_main_queue(), ^{
NSURL *url = [NSURL URLWithString:image];
NSData *data = [NSData dataWithContentsOfURL:url];
UIView *bgView = [[UIView alloc] initWithFrame:self.window.bounds];
bgView.backgroundColor = [UIColor colorWithWhite:0 alpha:0.5];
UIImageView *imageview = [[UIImageView alloc] initWithFrame:CGRectMake(20, 80, bgView.frame.size.width-40, bgView.frame.size.height-160)];
imageview.image = [UIImage imageWithData:data];
imageview.contentMode = UIViewContentModeScaleAspectFill;
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapImageView:)];
[imageview addGestureRecognizer:tap];
[self.window addSubview:bgView];
[bgView addSubview:imageview];
});
}else if (type == 3 && !ISNULLSTR(jumpUrl)) {
dispatch_async(dispatch_get_main_queue(), ^{
MainOldViewController *view = [[MainOldViewController alloc] init];
view.gameURLString = jumpUrl;
view.isPresent = YES;
view.modalPresentationStyle = UIModalPresentationFullScreen;
[self.window.rootViewController presentViewController:view animated:YES completion:^{}];
});
}
}
}
}
-(void)tapImageView:(UITapGestureRecognizer *)tap
{
[tap.view removeFromSuperview];
}
+ (BOOL)allowsAnyHTTPSCertificateForHost:(NSString *)host
{
return YES;
}
@end