私は自分のアプリでプッシュ通知サービスを使用しています。アプリがバックグラウンドにあるときは通知画面(iOSデバイスの上から下にスワイプすると表示される画面)で通知を見ることができます。しかし、アプリケーションがフォアグラウンドにある場合、デリゲートメソッド
- (void)application:(UIApplication*)application didReceiveRemoteNotification:(NSDictionary*)userInfo
が呼び出されていますが、通知画面に通知が表示されません。
アプリがバックグラウンドにあるかフォアグラウンドにあるかに関係なく、通知画面に通知を表示します。私は解決策を探すことにうんざりしています。任意の助けは大歓迎です。
アプリケーションがフォアグラウンドで実行されている場合、iOSは通知バナー/警告を表示しません。それは仕様によるものです。しかし、次のようにUILocalNotification
を使うことでそれを達成できます。
リモート受信時にアプリケーションがアクティブ状態かどうかを確認
お知らせ。アクティブ状態の場合はUILocalNotificationを発行します。
if (application.applicationState == UIApplicationStateActive ) {
UILocalNotification *localNotification = [[UILocalNotification alloc] init];
localNotification.userInfo = userInfo;
localNotification.soundName = UILocalNotificationDefaultSoundName;
localNotification.alertBody = message;
localNotification.fireDate = [NSDate date];
[[UIApplication sharedApplication] scheduleLocalNotification:localNotification];
}
迅速:
if application.applicationState == .active {
var localNotification = UILocalNotification()
localNotification.userInfo = userInfo
localNotification.soundName = UILocalNotificationDefaultSoundName
localNotification.alertBody = message
localNotification.fireDate = Date()
UIApplication.shared.scheduleLocalNotification(localNotification)
}
アプリがフォアグラウンドのときにバナーメッセージを表示するには、次の方法を使用します。
iOS 10、Swift 3/4:
// This method will be called when app received Push notifications in foreground
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void)
{
completionHandler([.alert, .badge, .sound])
}
iOS 10、Swift 2.:
@available(iOS 10.0, *)
func userNotificationCenter(center: UNUserNotificationCenter, willPresentNotification notification: UNNotification, withCompletionHandler completionHandler: (UNNotificationPresentationOptions) -> Void)
{
//Handle the notification
completionHandler(
[UNNotificationPresentationOptions.Alert,
UNNotificationPresentationOptions.Sound,
UNNotificationPresentationOptions.Badge])
}
アプリデリゲートを通知センターのデリゲートとして登録する必要もあります。
import UserNotifications
// snip!
class AppDelegate : UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate
// snip!
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// set the delegate in didFinishLaunchingWithOptions
UNUserNotificationCenter.current().delegate = self
...
}
以下のコードはあなたのために働くでしょう:
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
application.applicationIconBadgeNumber = 0;
//self.textView.text = [userInfo description];
// We can determine whether an application is launched as a result of the user tapping the action
// button or whether the notification was delivered to the already-running application by examining
// the application state.
if (application.applicationState == UIApplicationStateActive) {
// Nothing to do if applicationState is Inactive, the iOS already displayed an alert view.
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Did receive a Remote Notification" message:[NSString stringWithFormat:@"Your App name received this notification while it was running:\n%@",[[userInfo objectForKey:@"aps"] objectForKey:@"alert"]]delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alertView show];
}
}
興味のある方は、システムプッシュバナーのように見えるカスタムビューを作成しましたが、閉じるボタン(小さな青いX)とカスタムアクションのメッセージをタップするオプションを追加しました。また、ユーザーが古い通知を読んだり却下したりする時間がある前に、複数の通知が到着した場合もサポートされます(何個まで積み上げることができるかに制限はありません...)
使い方は基本的には裏書です:
[AGPushNoteView showWithNotificationMessage:@"John Doe sent you a message!"];
そして、それはiOS 7ではこんな感じです(iOS 6はiOS 6のルックアンドフィールを持っています...)
目標C
iOS 10
では、show notification bannerのwillPresentNotification
メソッドをforeground
に統合する必要があります。
アプリがフォアグラウンドモードの場合(アクティブ)
- (void)userNotificationCenter:(UNUserNotificationCenter* )center willPresentNotification:(UNNotification* )notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler {
NSLog( @“Here handle Push notification in foreground" );
//For notification Banner - when app in foreground
completionHandler(UNNotificationPresentationOptionAlert);
// Print Notification info
NSLog(@"Userinfo %@",notification.request.content.userInfo);
}
アプリケーションがフォアグラウンドで実行されている場合、iOSは通知バナー/警告を表示しません。それは仕様によるものです。アプリケーションがフォアグラウンドにある間に通知を受け取る状況に対処するには、コードをいくつか書く必要があります。通知は最も適切な方法で表示する必要があります(たとえば、UITabBar
アイコンにバッジ番号を追加する、Notification Centerバナーをシミュレートするなど)。
バナーアラートを模した独自の通知を作成できます。
1つの方法は、バナーのように見え、アニメーション化してタッチに応答できるカスタムのuiviewを作成することです。これを念頭に置いて、さらに多くの機能を備えたさらに優れたバナーを作成できます。
それともあなたのためにそれを行うAPIを探して、あなたのプロジェクトにポッドファイルとしてそれらを追加することができます。
これが私が使ったカップルです。
これは、アプリがアクティブ状態(フォアグラウンドまたはオープン)のときにプッシュ通知を受け取るためのコードです。 NUserNotificationCenterのドキュメント
@available(iOS 10.0, *)
func userNotificationCenter(center: UNUserNotificationCenter, willPresentNotification notification: UNNotification, withCompletionHandler completionHandler: (UNNotificationPresentationOptions) -> Void)
{
completionHandler([UNNotificationPresentationOptions.Alert,UNNotificationPresentationOptions.Sound,UNNotificationPresentationOptions.Badge])
}
通知のuserInfoにアクセスする必要がある場合は、コードを使用します:notification.request.content.userInfo
アップルによれば ドキュメント 、はい、アプリの実行中に通知を表示できます
Xcode 10 Swift 4.2
アプリがフォアグラウンドにあるときにプッシュ通知を表示するには-
ステップ1: AppDelegateクラスにデリゲートUNUserNotificationCenterDelegateを追加します。
class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate {
ステップ2: UNUserNotificationCenterデリゲートを設定します
let notificationCenter = UNUserNotificationCenter.current()
notificationCenter.delegate = self
ステップ3:このステップにより、アプリがフォアグラウンドにある場合でもプッシュ通知を表示できます
func userNotificationCenter(_ center: UNUserNotificationCenter,
willPresent notification: UNNotification,
withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
completionHandler([.alert, .sound])
}
ステップ4:このステップはオプションです。アプリがフォアグラウンドにあるかどうかを確認し、フォアグラウンドにある場合は、ローカルPushNotificationを表示します。
func application(_ application: UIApplication,didReceiveRemoteNotification userInfo: [AnyHashable: Any],fetchCompletionHandler completionHandler:@escaping (UIBackgroundFetchResult) -> Void) {
let state : UIApplicationState = application.applicationState
if (state == .inactive || state == .background) {
// go to screen relevant to Notification content
print("background")
} else {
// App is in UIApplicationStateActive (running in foreground)
print("foreground")
showLocalNotification()
}
}
ローカル通知機能-
fileprivate func showLocalNotification() {
//creating the notification content
let content = UNMutableNotificationContent()
//adding title, subtitle, body and badge
content.title = "App Update"
//content.subtitle = "local notification"
content.body = "New version of app update is available."
//content.badge = 1
content.sound = UNNotificationSound.default()
//getting the notification trigger
//it will be called after 5 seconds
let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 1, repeats: false)
//getting the notification request
let request = UNNotificationRequest(identifier: "SimplifiedIOSNotification", content: content, trigger: trigger)
//adding the notification to notification center
notificationCenter.add(request, withCompletionHandler: nil)
}
あなたのアプリデリゲートで以下のコードを使用してください
import UIKit
import UserNotifications
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate {
var currentToken: String?
var window: UIWindow?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
application.registerForRemoteNotifications()
let center = UNUserNotificationCenter.current()
center.requestAuthorization(options: [.alert, .sound, .badge]) { (granted, error) in
// Enable or disable features based on authorization.
if granted == true
{
print("Allow")
UIApplication.shared.registerForRemoteNotifications()
}
else
{
print("Don't Allow")
}
}
UNUserNotificationCenter.current().delegate = self
return true
}
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data){
let tokenParts = deviceToken.map { data -> String in
return String(format: "%02.2hhx", data)
}
let token = tokenParts.joined()
currentToken = token //get device token to delegate variable
}
public class var shared: AppDelegate {
return UIApplication.shared.delegate as! AppDelegate
}
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
completionHandler([.alert, .badge, .sound])
}
}
そのcompletionHandler行をデリゲートメソッドに追加しても同じ問題が解決しました。
//Called when a notification is delivered to a foreground app.
@available(iOS 10.0, *)
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
completionHandler([.alert, .badge, .sound])
}
前述のように、これを実現するにはUserNotification.framework
を使用する必要があります。しかし、私の目的のために私はとにかくアプリでそれを見せなければならなくて、そしてiOS 11
スタイルを持ちたかったので、私は小さい補助ビューを作成しました、多分誰かにとって役に立つでしょう。