Search code examples
javascriptiospush-notificationquickblox

Unable to send Push Notifications from Web(JavaScript) QuickBlox


I am trying to send push notification from web backend (JavaScript) using QuickBlox Push Notification API to iOS devices. I have created subscription on iOS app and trying to send push notification from JavaScript to subscribed users.

The iOS App code to subscribe is as follows:

- (void)loginAndConnectToChatQBUserWithLoginName:(NSString *)loginName password:(NSString *)password{
    isConnecting = YES;

    QBUUser *user = [[QBUUser alloc] init];
    user.login = loginName;
    user.password = password;

    __weak typeof(self) weakSelf = self;

    //Authenticate user

    [QBRequest logInWithUserLogin:user.login password:user.password successBlock:^(QBResponse * _Nonnull response, QBUUser * _Nullable user) {
        NSLog(@"Logged in");
        [weakSelf registerForRemoteNotifications];

        [AppDelegate appDelegate].currentUser = user;

        user.password = password;

        [QBChat.instance connectWithUser:user completion:^(NSError * _Nullable error) {
            if (QBChat.instance.isConnected) {
                NSLog(@"chat is connected");
            }
            else{
                NSLog(@"chat not connected");
            }

            isConnecting = NO;
        }];
    } errorBlock:^(QBResponse * _Nonnull response) {
        // Handle error here
        NSLog(@"Unable to connect");
        isConnecting = NO;
    }];
}

- (void)registerForRemoteNotifications{

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000
    if ([[UIApplication sharedApplication] respondsToSelector:@selector(registerUserNotificationSettings:)]) {

        [[UIApplication sharedApplication] registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge) categories:nil]];
        [[UIApplication sharedApplication] registerForRemoteNotifications];
    }
    else{
        [[UIApplication sharedApplication] registerForRemoteNotificationTypes:UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound];
    }
#else
    [[UIApplication sharedApplication] registerForRemoteNotificationTypes:UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound];
#endif
}

-(void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken{
    NSString *deviceIdentifier = [[[UIDevice currentDevice] identifierForVendor] UUIDString];

    QBMSubscription *subscription = [QBMSubscription subscription];
    subscription.notificationChannel = QBMNotificationChannelAPNS;
    subscription.deviceUDID = deviceIdentifier;
    subscription.deviceToken = deviceToken;

    [QBRequest createSubscription:subscription successBlock:^(QBResponse *response, NSArray *objects) {
        //Subscription Successfull
        NSLog(@"Subscription Successfull.");

    } errorBlock:^(QBResponse *response) {
        //Subscription Failure
    }];
}

Create Subscription success response is as follow:

[QBResponse], status: 201

Code to send push notification from JavaScript is as follows:

var pushCustomParams = {
  message: 'Message received from Bob',
  ios_badge: 1,
  ios_sound: 'mysound.wav', //Sound File name
  user_id: '234', //Caller User ID
}

var params = {
  notification_type: 'push',
  user: {ids: [110678]}, // recipients.
  environment: 'development', // environment, can be 'production' as well.
  message: QB.pushnotifications.base64Encode(JSON.stringify(pushCustomParams))
};

QB.pushnotifications.events.create(params, function(err, response) {
  if (err) {
    console.log(err);
  } else {
    // success
  }
});

On creation on event I get an error all the time:

[EventsProxy] create Object { notification_type:"push", user:Object,environment:"development",message:"ey....."}

[ServiceProxy] Request: POST Object {data:"{"url":"https://api.quickblox.com/e.."}

[ServiceProxy] ajax error 401 Unauthorized {"errors" : ["Token is required"]}

Object {code:401, status:"error", message:"Unauthorized", detail:"{errors"["Token is required"]}"}

Please suggest me what I am doing wrong in the code.


Solution

  • In order to send a push you have to act as a user

    To do this you have to create a session with user

    so your code should be like that:

    var params = {login: 'garry', password: 'garry5santos'};
    
    QB.createSession(params, function(err, result) {
      if(!err){
        // send a push code
      }
    });