0

私はPhonegapアプリケーションに取り組んでいます。プッシュ通知を実装するために、iOS 用のプラグイン (github の AppDelegate+Notification および PushNotification ファイル) を使用し、APN にデバイスを登録することに成功し、MAC マシンのターミナルを使用して (.php ファイルを使用して) プッシュ通知を送信することができました。

アプリケーションがアクティブ モードの場合、「didReceiveRemoteNotification」ブロック内で通知を受け取ることができます。また、通知センターからの通知をタップすると、このメソッドが実行されます。

私が直面している問題は次のとおりです。

  1. アプリが通知クリックからアクティブ化されている間 (バックグラウンド状態)、「didReceiveRemoteNotification」から Notification.js 関数呼び出しを取得するにはどうすればよいですか?

アプリは関数を呼び出すことができるため:

1. AppDelegate+Notification.m

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
      NSLog(@"didReceiveRemoteNotification AppDelegate+Notification.h :%@", userInfo);

      PushNotification* pushHandler = [self.viewController getCommandInstance:@"PushNotification"];
      NSMutableDictionary* mutableUserInfo = [userInfo mutableCopy];

      // Get application state for iOS4.x+ devices, otherwise assume active
      UIApplicationState appState = UIApplicationStateActive;
     if([application respondsToSelector:@selector(applicationState)]) {
       appState = application.applicationState;
     }

     if(appState == UIApplicationStateActive) //Active state
     {
       NSLog(@"UIApplicationStateActive");
       [mutableUserInfo setValue:@"1" forKey:@"applicationStateActive"];
       [pushHandler didReceiveRemoteNotification:mutableUserInfo];
     }
    else // BG state
    {
       NSLog(@"UIApplicationStateBackground");
       [mutableUserInfo setValue:@"0" forKey:@"applicationStateActive"];
       [mutableUserInfo setValue:[NSNumber numberWithDouble: [[NSDate date] timeIntervalSince1970]] forKey:@"timestamp"];
      [pushHandler.pendingNotifications addObject:mutableUserInfo];
  }
[[UIApplication sharedApplication] cancelAllLocalNotifications];
[UIApplication sharedApplication].applicationIconBadgeNumber = 0;
}

2. PushNotification.m

- (void)didReceiveRemoteNotification:(NSDictionary*)userInfo {
      NSLog(@"didReceiveRemoteNotification : %@", userInfo);

     // Converting Dict to NSString in JSON format using NSJSONSerialization as per Cordova 2.4.0
    NSError* error = nil;
    NSString *jsStatement = nil;
   NSData* jsonData = [NSJSONSerialization dataWithJSONObject:userInfo options:0 error: &error];
   if (error != nil)
   {
       jsStatement = [NSString stringWithFormat:@"window.plugins.pushNotification.notificationCallback({error: %@});",[error localizedDescription]];
  }
  else
  {
       jsStatement = [NSString stringWithFormat:@"window.plugins.pushNotification.notificationCallback(%@);", [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]];

  }

  [self writeJavascript:jsStatement];
}

3. PushNotification.js

PushNotification.prototype.notificationCallback = function(notification) {
     alert ('JS notificationCallback');
}

すでにアクティブな状態で通知が来た場合。最後のステップのアラートが発生する (JS notificationCallback)

または簡単な方法で、ios プラグインから Java スクリプト関数を呼び出すにはどうすればよいですか?

4

2 に答える 2

0

このプラグインを使用しているようです: https://github.com/mgcrea/cordova-push-notification (これが正しくない場合は、正しいプラグインへのリンクを提供してください)

上記で参照したプラグインが正しい場合は、AppDelegate.m を更新する手順を見逃していると思います。

起動通知 (リモート通知から開始するアプリ) をサポートするには、次のブロックを内部に追加する必要があります - (BOOL) application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions, return YES; の直前。

[self.window addSubview:self.viewController.view];
[self.window makeKeyAndVisible];

/* START BLOCK */

// PushNotification - Handle launch from a push notification
NSDictionary* userInfo = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
if(userInfo) {
    PushNotification *pushHandler = [self.viewController getCommandInstance:@"PushNotification"];
    NSMutableDictionary* mutableUserInfo = [userInfo mutableCopy];
    [mutableUserInfo setValue:@"1" forKey:@"applicationLaunchNotification"];
    [mutableUserInfo setValue:@"0" forKey:@"applicationStateActive"];
    [pushHandler.pendingNotifications addObject:mutableUserInfo];
}

/* STOP BLOCK */

return YES;

昨年、Urban Airship バージョンのプラグインのドキュメントに問題があったことを思い出したようです...最初の 2 行だけを追加する必要があるのか​​、それともブロック全体を追加する必要があるのか​​ 覚えていません追加した。

いずれにせよ、問題は AppDelegate.m 内の didFinishLaunchingWithOptions メソッドにあると思います。

于 2013-09-10T22:41:40.730 に答える