web-dev-qa-db-ja.com

iOS 10でローカル通知を追加-Swift 3

そのため、新しいUNUserNotificationCenterに通知を追加しようとしましたが、取得できないようです。

私のView Controllerにはアクションがあります:

@IBAction func sendPressed(_ sender: AnyObject) {
    let content = UNMutableNotificationContent()

    content.title = "Hello"
    content.body = "What up?"
    content.sound = UNNotificationSound.default()

    // Deliver the notification in five seconds.
    let trigger = UNTimeIntervalNotificationTrigger.init(timeInterval: 5, repeats: false)
    let request = UNNotificationRequest.init(identifier: "FiveSecond", content: content, trigger: trigger)

    // Schedule the notification.
    let center = UNUserNotificationCenter.current()
    center.add(request) { (error) in
        print(error)
    }
    print("should have been added")
}

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    let center = UNUserNotificationCenter.current()
    center.requestAuthorization([.alert, .sound]) { (granted, error) in
    }
}

そして、プロジェクトにもNotification Content Extensionがありますが、まったくトリガーされていないようです。何か不足しているアイデアはありますか?ユーザードキュメントの例を試していますが、それ以上のことを言っていないか、見逃しています。

ここ: https://developer.Apple.com/reference/usernotifications/unmutablenotificationcontent

また: https://developer.Apple.com/reference/usernotificationsuihttps://developer.Apple.com/reference/usernotifications

編集:

そのため、アプリをバックグラウンドに配置することでうまくいきました。

26
Bjarte

あなたは通知に登録する必要があります...私は試しましたが、これは動作します。

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        // Override point for customization after application launch.
        let center = UNUserNotificationCenter.current()
        center.requestAuthorization([.alert, .sound]) { (granted, error) in
            // Enable or disable features based on authorization.
        }
        return true
    }

編集:iOS 10以降の通知を表示するために、アプリをバックグラウンドに配置する必要はありません。

フォアグラウンドで表示する通知を構成するには、以下のコールバックを使用します。

func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void)

ここ はサンプルプロジェクトです。

29
LC 웃

Objective-C実装の場合:

ここにデモプロジェクトを作成しました: iOS10AdaptationTips .

  1. userNotificationsのインポート

    ///Notification become independent from Foundation
    @import UserNotifications;
    
  2. localNotificationの承認をリクエストする

    UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
    [center requestAuthorizationWithOptions:(UNAuthorizationOptionBadge | UNAuthorizationOptionSound | UNAuthorizationOptionAlert)
                          completionHandler:^(BOOL granted, NSError * _Nullable error) {
                              if (!error) {
                                  NSLog(@"request authorization succeeded!");
                                  [self showAlert];
                              }
                          }];
    

    承認リクエスト: enter image description here

  3. スケジュールlocalNotification

  4. アプリケーションアイコンのバッジ番号を更新する

        //        //Deliver the notification at 08:30 everyday
        //        NSDateComponents *dateComponents = [[NSDateComponents alloc] init];
        //        dateComponents.hour = 8;
        //        dateComponents.minute = 30;
        //        UNCalendarNotificationTrigger *trigger = [UNCalendarNotificationTrigger triggerWithDateMatchingComponents:dateComponents repeats:YES];
    
        UNMutableNotificationContent *content = [[UNMutableNotificationContent alloc] init];
        content.title = [NSString localizedUserNotificationStringForKey:@"Elon said:" arguments:nil];
        content.body = [NSString localizedUserNotificationStringForKey:@"Hello Tom!Get up, let's play with Jerry!"
                                                             arguments:nil];
        content.sound = [UNNotificationSound defaultSound];
    
        /// 4. update application icon badge number
        content.badge = @([[UIApplication sharedApplication] applicationIconBadgeNumber] + 1);
        // Deliver the notification in five seconds.
        UNTimeIntervalNotificationTrigger *trigger = [UNTimeIntervalNotificationTrigger
                                                      triggerWithTimeInterval:5.f repeats:NO];
        UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:@"FiveSecond"
                                                                              content:content trigger:trigger];
        /// 3. schedule localNotification
        UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
        [center addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) {
            if (!error) {
                NSLog(@"add NotificationRequest succeeded!");
            }
        }];
    

次のように表示されます。

バックグラウンドで: enter image description here ロック画面:
enter image description here

デフォルトでRepeatが1つだけ表示される場合 enter image description here iOS9のロック画面に多くを表示する代わりに: http://i67.tinypic.com/98t75s.jpg また、3Dタッチを自動的にサポートします http:// a67。 tinypic.com/dorw3b.jpg

ここにデモを書きます: iOS10AdaptationTips .

17
ElonChan

以下にいくつかの手順を示します。

  1. 許可があることを確認してください。そうでない場合は、UNUserNotificationCenter.current()。requestAuthorizationを使用して取得します。または、リクエストポップアップを複数回表示する場合は、 answer に従います。

  2. 通知foregroundを表示する場合は、UNUserNotificationCenterDelegateをどこかに割り当てる必要があります。

  3. コードを見せて

    @IBAction func sendPressed(_ sender: AnyObject) {
        let content = UNMutableNotificationContent()
        content.title = "Hello"
        content.body = "What up?"
        content.sound = UNNotificationSound.default()
    
        let trigger = UNTimeIntervalNotificationTrigger.init(timeInterval: 5, repeats: false)
        let request = UNNotificationRequest.init(identifier: "FiveSecond", content: content, trigger: trigger)
    
        let center = UNUserNotificationCenter.current()
        center.add(request) { (error) in
            print(error)
        }
    }
    
    override func viewDidLoad(_ animated: Bool) {
        super.viewDidLoad(animated)
    
        // Assign the delegate
        UNUserNotificationCenter.current().delegate = self
    
        // Ask the permission
        let center = UNUserNotificationCenter.current()
        center.requestAuthorization([.alert, .sound]) { (granted, error) in
            if granted {
                // do something
            }
        }
    }
    // Remember to add UNUserNotificationCenterDelegate to your view controller
    func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
        print("Got the msg...")
        completionHandler([.badge, .sound, .alert])
    }
    
1
Allen

次のように問題を解決しました(Firebase、Swift 3):

AppDelegateでこのメソッドを見つける:

func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {

この行を見つける:

completionHandler()

セットの終了:

completionHandler([.alert,.sound,.badge])

プレゼンテーションオプションをcompletionHandlerメソッドに渡さないと、通知は発生しません。

0
ibrahimyilmaz

私はSwift 3の実装を作成しましたが、ここで確認できます。 https://stackoverflow.com/a/45381380/22966

0
mourodrigo