123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365 |
- //
- // PushTalkPlugin.m
- // PushTalk
- //
- // Created by zhangqinghe on 13-12-13.
- //
- //
- #import "JPushPlugin.h"
- #import "JPUSHService.h"
- #import <UIKit/UIKit.h>
- #import <AdSupport/AdSupport.h>
- #import <UserNotifications/UserNotifications.h>
- #import "AppDelegate+JPush.h"
- #import "JPushDefine.h"
- @implementation NSDictionary (JPush)
- -(NSString*)toJsonString{
- NSError *error;
- NSData *data = [NSJSONSerialization dataWithJSONObject:self options:0 error:&error];
- NSString *jsonString = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
- return jsonString;
- }
- @end
- @implementation NSString (JPush)
- -(NSDictionary*)toDictionary{
- NSError *error;
- NSData *jsonData = [self dataUsingEncoding:NSUTF8StringEncoding];
- NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:&error];
- return dict;
- }
- @end
- @interface JPushPlugin()
- @end
- @implementation JPushPlugin
- -(void)startJPushSDK:(CDVInvokedUrlCommand*)command{
- [(AppDelegate*)[UIApplication sharedApplication].delegate startJPushSDK];
- }
- #pragma mark- 外部接口
- -(void)stopPush:(CDVInvokedUrlCommand*)command{
- [[UIApplication sharedApplication]unregisterForRemoteNotifications];
- }
- -(void)resumePush:(CDVInvokedUrlCommand*)command{
- [(AppDelegate*)[UIApplication sharedApplication].delegate registerForRemoteNotification];
- }
- -(void)isPushStopped:(CDVInvokedUrlCommand*)command{
- NSNumber *result = [[UIApplication sharedApplication] isRegisteredForRemoteNotifications] ? @(0) : @(1);
- [self handleResultWithValue:result command:command];
- }
- -(void)initial:(CDVInvokedUrlCommand*)command{
- //do nithng,because Cordova plugin use lazy load mode.
- }
- #ifdef __CORDOVA_4_0_0
- - (void)pluginInitialize {
- NSLog(@"### pluginInitialize ");
- [self initPlugin];
- }
- #else
- - (CDVPlugin*)initWithWebView:(UIWebView*)theWebView{
- NSLog(@"### initWithWebView ");
- if (self=[super initWithWebView:theWebView]) {
- }
- [self initPlugin];
- return self;
- }
- #endif
- -(void)initPlugin{
- if (!SharedJPushPlugin) {
- SharedJPushPlugin = self;
- }
- [[NSNotificationCenter defaultCenter] addObserver:self
- selector:@selector(networkDidReceiveMessage:)
- name:kJPFNetworkDidReceiveMessageNotification
- object:nil];
- }
- +(void)fireDocumentEvent:(NSString*)eventName jsString:(NSString*)jsString{
- dispatch_async(dispatch_get_main_queue(), ^{
- [SharedJPushPlugin.commandDelegate evalJs:[NSString stringWithFormat:@"cordova.fireDocumentEvent('jpush.%@',%@)", eventName, jsString]];
- });
- }
- -(void)setTagsWithAlias:(CDVInvokedUrlCommand*)command{
- NSString *alias = [command argumentAtIndex:0];
- NSArray *tags = [command argumentAtIndex:1];
- [JPUSHService setTags:[NSSet setWithArray:tags]
- alias:alias
- fetchCompletionHandle:^(int iResCode, NSSet *iTags, NSString *iAlias) {
- CDVPluginResult *result;
- if (iResCode == 0) {
- result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:nil];
- } else {
- result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:nil];
- }
- [self.commandDelegate sendPluginResult:result callbackId:command.callbackId];
- }];
- }
- -(void)setTags:(CDVInvokedUrlCommand*)command{
- NSArray *tags = command.arguments;
- [JPUSHService setTags:[NSSet setWithArray:tags]
- alias:nil
- fetchCompletionHandle:^(int iResCode, NSSet *iTags, NSString *iAlias) {
- CDVPluginResult *result;
- if (iResCode == 0) {
- result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:nil];
- } else {
- result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:nil];
- }
- [self.commandDelegate sendPluginResult:result callbackId:command.callbackId];
- }];
- }
- -(void)setAlias:(CDVInvokedUrlCommand*)command{
- NSString *alias = [command argumentAtIndex:0];
- [JPUSHService setTags:nil
- alias:alias
- fetchCompletionHandle:^(int iResCode, NSSet *iTags, NSString *iAlias) {
- CDVPluginResult *result;
- if (iResCode == 0) {
- result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:nil];
- } else {
- result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:nil];
- }
- [self.commandDelegate sendPluginResult:result callbackId:command.callbackId];
- }];
- }
- -(void)getRegistrationID:(CDVInvokedUrlCommand*)command{
- NSString* registrationID = [JPUSHService registrationID];
- [self handleResultWithValue:registrationID command:command];
- }
- -(void)startLogPageView:(CDVInvokedUrlCommand*)command{
- NSString * pageName = [command argumentAtIndex:0];
- [JPUSHService startLogPageView:pageName];
- }
- -(void)stopLogPageView:(CDVInvokedUrlCommand*)command{
- NSString * pageName = [command argumentAtIndex:0];
- [JPUSHService stopLogPageView:pageName];
- }
- -(void)beginLogPageView:(CDVInvokedUrlCommand*)command{
- NSString *pageName = [command argumentAtIndex:0];
- NSNumber *duration = [command argumentAtIndex:1];
- [JPUSHService beginLogPageView:pageName duration:duration.intValue];
- }
- -(void)setBadge:(CDVInvokedUrlCommand*)command{
- NSNumber *badge = [command argumentAtIndex:0];
- [JPUSHService setBadge:badge.intValue];
- }
- -(void)resetBadge:(CDVInvokedUrlCommand*)command{
- [JPUSHService resetBadge];
- }
- -(void)setApplicationIconBadgeNumber:(CDVInvokedUrlCommand*)command{
- NSNumber *badge = [command argumentAtIndex:0];
- [UIApplication sharedApplication].applicationIconBadgeNumber = badge.intValue;
- }
- -(void)getApplicationIconBadgeNumber:(CDVInvokedUrlCommand*)command {
- NSInteger num = [UIApplication sharedApplication].applicationIconBadgeNumber;
- NSNumber *number = [NSNumber numberWithInteger:num];
- [self handleResultWithValue:number command:command];
- }
- -(void)setDebugModeFromIos:(CDVInvokedUrlCommand*)command{
- [JPUSHService setDebugMode];
- }
- -(void)setLogOFF:(CDVInvokedUrlCommand*)command{
- [JPUSHService setLogOFF];
- }
- -(void)crashLogON:(CDVInvokedUrlCommand*)command{
- [JPUSHService crashLogON];
- }
- -(void)setLocalNotification:(CDVInvokedUrlCommand*)command{
- NSLog(@"ios 10 after please use UNNotificationRequest to set local notification, see apple doc to learn more");
- NSDate *date = [NSDate dateWithTimeIntervalSinceNow:[[command argumentAtIndex:0] intValue]];
- NSString *alert = [command argumentAtIndex:1];
- NSNumber *badge = [command argumentAtIndex:2];
- NSString *idKey = [command argumentAtIndex:3];
- NSDictionary *dict = [command argumentAtIndex:4];
- [JPUSHService setLocalNotification:date alertBody:alert badge:badge.intValue alertAction:nil identifierKey:idKey userInfo:dict soundName:nil];
- }
- -(void)deleteLocalNotificationWithIdentifierKey:(CDVInvokedUrlCommand*)command{
- NSString *identifier = [command argumentAtIndex:0];
- JPushNotificationIdentifier *jpid = [JPushNotificationIdentifier new];
- jpid.identifiers = @[identifier];
- [JPUSHService removeNotification:jpid];
- }
- -(void)clearAllLocalNotifications:(CDVInvokedUrlCommand*)command{
- [JPUSHService removeNotification:nil];
- }
- -(void)setLocation:(CDVInvokedUrlCommand*)command{
- NSNumber *latitude = [command argumentAtIndex:0];
- NSNumber *longitude = [command argumentAtIndex:1];
- [JPUSHService setLatitude:latitude.doubleValue longitude:longitude.doubleValue];
- }
- -(void)getUserNotificationSettings:(CDVInvokedUrlCommand*)command{
- if ([[UIDevice currentDevice].systemVersion floatValue] >= 10.0) {
- UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
- WEAK_SELF(weakSelf);
- [center getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {
- NSMutableDictionary *dict = [NSMutableDictionary dictionary];
- dict[@"authorizationStatus"] = @(settings.authorizationStatus);
- dict[@"soundSetting"] = @(settings.soundSetting);
- dict[@"badgeSetting"] = @(settings.badgeSetting);
- dict[@"alertSetting"] = @(settings.alertSetting);
- dict[@"notificationCenterSetting"] = @(settings.notificationCenterSetting);
- dict[@"lockScreenSetting"] = @(settings.lockScreenSetting);
- dict[@"carPlaySetting"] = @(settings.carPlaySetting);
- dict[@"alertStyle"] = @(settings.alertStyle);
- [weakSelf handleResultWithValue:dict command:command];
- }];
- }else if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) {
- UIUserNotificationSettings *settings = [[UIApplication sharedApplication] currentUserNotificationSettings];
- UIUserNotificationType type = settings.types;
- NSNumber *number = [NSNumber numberWithInteger:type];
- [self handleResultWithValue:number command:command];
- }else{
- UIRemoteNotificationType type = [[UIApplication sharedApplication] enabledRemoteNotificationTypes];
- NSNumber *number = [NSNumber numberWithInteger:type];
- [self handleResultWithValue:number command:command];
- }
- }
- #pragma mark - ios 10 APIs
- -(void)addDismissActions:(CDVInvokedUrlCommand*)command{
- [self addActions:command dismiss:YES];
- }
- -(void)addNotificationActions:(CDVInvokedUrlCommand*)command{
- [self addActions:command dismiss:NO];
- }
- -(void)addActions:(CDVInvokedUrlCommand*)command dismiss:(BOOL)dimiss{
- NSArray *actionsData = [command argumentAtIndex:0];
- NSString *categoryId = [command argumentAtIndex:1];
- NSMutableArray *actions = [NSMutableArray array];
- for (NSDictionary *dict in actionsData) {
- NSString *title = dict[@"title"];
- NSString *identifier = dict[@"identifier"];
- NSString *option = dict[@"option"];
- NSString *type = dict[@"type"];
- if ([type isEqualToString:@"textInput"]) {
- NSString *textInputButtonTitle = dict[@"textInputButtonTitle"];
- NSString *textInputPlaceholder = dict[@"textInputPlaceholder"];
- UNTextInputNotificationAction *inputAction = [UNTextInputNotificationAction actionWithIdentifier:identifier title:title options:option.integerValue textInputButtonTitle:textInputButtonTitle textInputPlaceholder:textInputPlaceholder];
- [actions addObject:inputAction];
- } else {
- UNNotificationAction *action = [UNNotificationAction actionWithIdentifier:title title:title options:option.integerValue];
- [actions addObject:action];
- }
- }
- UNNotificationCategory *category;
- if (dimiss) {
- category = [UNNotificationCategory categoryWithIdentifier:categoryId
- actions:actions
- intentIdentifiers:@[]
- options:UNNotificationCategoryOptionCustomDismissAction];
- } else {
- category = [UNNotificationCategory categoryWithIdentifier:categoryId
- actions:actions
- intentIdentifiers:@[]
- options:UNNotificationCategoryOptionNone];
- }
- [[UNUserNotificationCenter currentNotificationCenter] setNotificationCategories:[NSSet setWithObject:category]];
- }
- #pragma mark - 内部方法
- +(void)setupJPushSDK:(NSDictionary*)userInfo{
- NSString *plistPath = [[NSBundle mainBundle] pathForResource:JPushConfig_FileName ofType:@"plist"];
- if (plistPath == nil) {
- NSLog(@"error: PushConfig.plist not found");
- assert(0);
- }
- NSMutableDictionary *plistData = [[NSMutableDictionary alloc] initWithContentsOfFile:plistPath];
- NSString *appkey = [plistData valueForKey:JPushConfig_Appkey];
- NSString *channel = [plistData valueForKey:JPushConfig_Channel];
- NSNumber *isProduction = [plistData valueForKey:JPushConfig_IsProduction];
- NSNumber *isIDFA = [plistData valueForKey:JPushConfig_IsIDFA];
- NSString *advertisingId = nil;
- if(isIDFA.boolValue) {
- advertisingId = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];
- }
- [JPUSHService setupWithOption:userInfo
- appKey:appkey
- channel:channel
- apsForProduction:[isProduction boolValue]
- advertisingIdentifier:advertisingId];
- }
- #pragma mark 将参数返回给js
- -(void)handleResultWithValue:(id)value command:(CDVInvokedUrlCommand*)command {
- CDVPluginResult *result = nil;
- CDVCommandStatus status = CDVCommandStatus_OK;
- if ([value isKindOfClass:[NSString class]]) {
- value = [value stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
- } else if ([value isKindOfClass:[NSNull class]]) {
- value = nil;
- }
- if ([value isKindOfClass:[NSObject class]]) {
- result = [CDVPluginResult resultWithStatus:status messageAsString:value];//NSObject 类型都可以
- } else {
- NSLog(@"Cordova callback block returned unrecognized type: %@", NSStringFromClass([value class]));
- result = nil;
- }
- if (!result) {
- result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR];
- }
- [self.commandDelegate sendPluginResult:result callbackId:command.callbackId];
- }
- #pragma mark 设置标签及别名回调
- -(void)tagsWithAliasCallback:(int)resultCode tags:(NSSet *)tags alias:(NSString *)alias {
- if (resultCode == 0) { // Success
- } else {
- }
- }
- - (void)networkDidReceiveMessage:(NSNotification *)notification {
- if (notification && notification.userInfo) {
- [JPushPlugin fireDocumentEvent:JPushDocumentEvent_ReceiveMessage
- jsString:[notification.userInfo toJsonString]];
- }
- }
- @end
|