app-starlock/ios/Runner/AppDelegate.m

297 lines
12 KiB
Mathematica
Raw Permalink Normal View History

2023-07-10 17:50:31 +08:00
#import "AppDelegate.h"
2023-07-10 17:50:31 +08:00
#import "GeneratedPluginRegistrant.h"
2023-10-14 17:08:25 +08:00
#import "CommonDefine.h"
#import "XSFlutterManager.h"
#import "Runner-Swift.h"
#import <UserNotifications/UserNotifications.h>
#import <PushKit/PushKit.h>
2025-07-02 17:11:39 +08:00
#import <CallKit/CallKit.h>
2025-01-09 19:35:02 +08:00
// #import <UMCommon/UMCommon.h>
2025-07-02 17:11:39 +08:00
@interface AppDelegate()<PKPushRegistryDelegate, CXProviderDelegate>
2025-02-13 10:56:24 +08:00
@property (nonatomic, strong) FlutterMethodChannel *methodChannel;
2025-07-02 17:11:39 +08:00
@property (nonatomic, strong) CXProvider *callKitProvider;
@property (nonatomic, copy) NSString *pendingCallKitEvent; // CallKit
@property (nonatomic, strong) NSUUID *lastCallUUID;
@property (nonatomic, copy) NSString *voipTokenString; // + VoIP Token
@end
@implementation AppDelegate {
}
2023-07-10 17:50:31 +08:00
- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
2025-01-09 19:35:02 +08:00
// [UMConfigure initWithAppkey:@"671244ae80464b33f6df9646" channel:@"Product"];
2025-02-13 10:56:24 +08:00
//Required
//notice: 3.0.0
JPUSHRegisterEntity * entity = [[JPUSHRegisterEntity alloc] init];
entity.types = JPAuthorizationOptionAlert|JPAuthorizationOptionBadge|JPAuthorizationOptionSound|JPAuthorizationOptionProvidesAppNotificationSettings;
if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) {
// categories
// NSSet<UNNotificationCategory *> *categories for iOS10 or later
// NSSet<UIUserNotificationCategory *> *categories for iOS8 and iOS9
}
[JPUSHService registerForRemoteNotificationConfig:entity delegate:self];
// VoIP
PKPushRegistry *voipRegistry = [[PKPushRegistry alloc] initWithQueue:dispatch_get_main_queue()];
voipRegistry.delegate = self;
voipRegistry.desiredPushTypes = [NSSet setWithObject:PKPushTypeVoIP];
XSFlutterManager *VC = [[XSFlutterManager alloc] init];
self.window.rootViewController = VC;
[self.window makeKeyAndVisible];
2025-02-13 10:56:24 +08:00
2025-07-02 17:11:39 +08:00
// FlutterMethodChannel
FlutterViewController *controller = (FlutterViewController *)self.window.rootViewController;
self.methodChannel = [FlutterMethodChannel methodChannelWithName:@"com.starlock/callkit" binaryMessenger:controller.binaryMessenger];
// pending
__weak typeof(self) weakSelf = self;
[self.methodChannel setMethodCallHandler:^(FlutterMethodCall *call, FlutterResult result) {
if ([call.method isEqualToString:@"get_pending_event"]) {
if (weakSelf.pendingCallKitEvent) {
result(weakSelf.pendingCallKitEvent);
weakSelf.pendingCallKitEvent = nil;
} else {
result(nil);
}
} else if ([call.method isEqualToString:@"end_call"]) {
NSLog(@"[CallKit] 收到Flutter端结束通话请求");
// CallKit
// UUID
if (weakSelf.lastCallUUID) {
CXCallEndedReason reason = CXCallEndedReasonRemoteEnded;
[weakSelf.callKitProvider reportCallWithUUID:weakSelf.lastCallUUID endedAtDate:[NSDate date] reason:reason];
weakSelf.lastCallUUID = nil;
result(@"ok");
} else {
NSLog(@"[CallKit] 无有效UUID无法结束通话");
result(@"no_call");
}
} else if ([call.method isEqualToString:@"get_voip_token"]) { // +
if (weakSelf.voipTokenString) {
result(weakSelf.voipTokenString);
} else {
result(nil);
}
2025-07-02 17:11:39 +08:00
} else {
result(FlutterMethodNotImplemented);
}
}];
// CallKit Provider
#if USE_CALLKIT
CXProviderConfiguration *providerConfiguration = [[CXProviderConfiguration alloc] initWithLocalizedName:@"来电"];
providerConfiguration.supportsVideo = NO;
providerConfiguration.maximumCallsPerCallGroup = 1;
self.callKitProvider = [[CXProvider alloc] initWithConfiguration:providerConfiguration];
[self.callKitProvider setDelegate:self queue:nil];
#endif
return YES;
2023-07-10 17:50:31 +08:00
}
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options {
// URL Scheme
if ([url.scheme isEqualToString:@"skysmartlock"]) {
// URL
return YES;
}
return NO;
}
/**
* deviceToken
*
* @param application
*/
- (void)registerAPNS:(UIApplication *)application {
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0) {
// iOS 8 Notifications
[application registerUserNotificationSettings:
[UIUserNotificationSettings settingsForTypes:
(UIUserNotificationTypeSound | UIUserNotificationTypeAlert)
categories:nil]];
[application registerForRemoteNotifications];
}
else {
// iOS < 8 Notifications
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:
(UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound)];
}
}
/*
* deviceTokenCloudPush
*/
//- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
// NSString *tokenString = [self hexStringFromData:deviceToken];
// NSLog(@"starlock didRegisterForRemoteNotificationsWithDeviceToken token: %@", tokenString);
// /// Required - DeviceToken
// [JPUSHService registerDeviceToken:deviceToken];
//
//}
- (NSString *)hexStringFromData:(NSData *)data {
const unsigned char *dataBuffer = (const unsigned char *)[data bytes];
NSMutableString *hexString = [NSMutableString stringWithCapacity:data.length * 2];
for (NSInteger i = 0; i < data.length; i++) {
[hexString appendFormat:@"%02x", dataBuffer[i]];
}
return [hexString copy];
}
/*
*
*/
- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {
2025-02-13 10:56:24 +08:00
//Optional
NSLog(@"did Fail To Register For Remote Notifications With Error: %@", error);
}
/**
*
*/
- (void)registerMessageReceive {
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(onMessageReceived:)
name:@"CCPDidReceiveMessageNotification"
object:nil];
}
/**
*
*
* @param notification
*/
- (void)onMessageReceived:(NSNotification *)notification {
CCPSysMessage *message = [notification object];
NSString *title = [[NSString alloc] initWithData:message.title encoding:NSUTF8StringEncoding];
NSString *body = [[NSString alloc] initWithData:message.body encoding:NSUTF8StringEncoding];
NSLog(@"Receive message title: %@, content: %@.", title, body);
}
2025-02-13 10:56:24 +08:00
# pragma mark- JPUSHRegisterDelegate
// iOS 12 Support
- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center openSettingsForNotification:(UNNotification *)notification{
if (notification && [notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
//
}else{
//
}
}
// iOS 10 Support
- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(NSInteger))completionHandler {
// Required
NSDictionary * userInfo = notification.request.content.userInfo;
if([notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
[JPUSHService handleRemoteNotification:userInfo];
}
completionHandler(UNNotificationPresentationOptionAlert); // BadgeSoundAlert
}
// iOS 10 Support
- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler {
// Required
NSDictionary * userInfo = response.notification.request.content.userInfo;
if([response.notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
[JPUSHService handleRemoteNotification:userInfo];
}
completionHandler(); //
}
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
// Required, iOS 7 Support
[JPUSHService handleRemoteNotification:userInfo];
completionHandler(UIBackgroundFetchResultNewData);
}
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
// Required, For systems with less than or equal to iOS 6
[JPUSHService handleRemoteNotification:userInfo];
}
#pragma mark - PKPushRegistryDelegate
// VoIP Token
- (void)pushRegistry:(PKPushRegistry *)registry didUpdatePushCredentials:(PKPushCredentials *)credentials forType:(PKPushType)type {
if ([type isEqualToString:PKPushTypeVoIP]) {
const unsigned char *tokenBytes = credentials.token.bytes;
NSMutableString *tokenString = [NSMutableString string];
for (NSInteger i = 0; i < credentials.token.length; i++) {
[tokenString appendFormat:@"%02x", tokenBytes[i]];
}
NSLog(@"[VoIP] didUpdatePushCredentials, token: %@", tokenString);
self.voipTokenString = tokenString; // + token
if (self.methodChannel) {
[self.methodChannel invokeMethod:@"voip_token" arguments:tokenString];
}
// FlutterreadyFlutterget_voip_token
}
}
// VoIP
- (void)pushRegistry:(PKPushRegistry *)registry didReceiveIncomingPushWithPayload:(PKPushPayload *)payload forType:(PKPushType)type withCompletionHandler:(void (^)(void))completion {
if ([type isEqualToString:PKPushTypeVoIP]) {
NSLog(@"[VoIP] didReceiveIncomingPushWithPayload: %@", payload.dictionaryPayload);
2025-07-02 17:11:39 +08:00
#if USE_CALLKIT
// CallKit
NSString *callerName = @"来电"; // payload
// provider
CXCallUpdate *update = [[CXCallUpdate alloc] init];
update.remoteHandle = [[CXHandle alloc] initWithType:CXHandleTypeGeneric value:callerName];
update.hasVideo = NO;
NSUUID *callUUID = [NSUUID UUID];
self.lastCallUUID = callUUID;
[self.callKitProvider reportNewIncomingCallWithUUID:callUUID update:update completion:^(NSError * _Nullable error) {
if (error) {
NSLog(@"CallKit error: %@", error);
}
}];
#else
// 使LiveCommunicationKit
UIViewController *rootVC = [UIApplication sharedApplication].delegate.window.rootViewController;
NSString *callerName = @"来电"; // payload
[LCKBridge presentCallInterfaceFromRootVC:rootVC callerName:callerName];
2025-07-02 17:11:39 +08:00
#endif
}
if (completion) {
completion();
}
}
2025-07-02 17:11:39 +08:00
#pragma mark - CXProviderDelegate
// "接听"
- (void)provider:(CXProvider *)provider performAnswerCallAction:(CXAnswerCallAction *)action {
NSLog(@"[CallKit] 用户接听来电");
if (self.methodChannel) {
[self.methodChannel invokeMethod:@"callkit_answered" arguments:nil];
} else {
self.pendingCallKitEvent = @"callkit_answered";
}
[action fulfill];
}
// "拒绝"
- (void)provider:(CXProvider *)provider performEndCallAction:(CXEndCallAction *)action {
NSLog(@"[CallKit] 用户拒绝/挂断来电");
if (self.methodChannel) {
[self.methodChannel invokeMethod:@"callkit_declined" arguments:nil];
} else {
self.pendingCallKitEvent = @"callkit_declined";
}
[action fulfill];
}
2023-07-10 17:50:31 +08:00
@end