28064


Swift2.3で記述したUserNotificationコード(下記)でuserNotificationCenterが呼ばれません。  
基本的に同等(と思われる)Swift3では動作します。基本的というのは、Swift2.3 と Swift3
でシンタックスが異なり、Xcodeの補完に従って変更しています。ここで誤っているのかもしれませんが、、、

[code]

    import UIKit
    import UserNotifications
    
    @UIApplicationMain
    class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate {
    
        var window: UIWindow?
    
        func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
            // Override point for customization after application launch.
    
            if #available(iOS 10.0, *) {
                // iOS 10
                let center = UNUserNotificationCenter.currentNotificationCenter()
    
                center.requestAuthorizationWithOptions([.Badge, .Sound, .Alert], completionHandler: { (granted, error) in
                    if error != nil {
                        return
                    }
    
                    if granted {
                        debugPrint("通知許可")
    
                        center.delegate = self
    
                        let content = UNMutableNotificationContent()
                        content.title = "Title"
                        content.subtitle = "Subtitle" // 新登場！
                        content.body = "Body"
                        content.sound = UNNotificationSound.defaultSound()
    
                        // 5秒後に発火
                        let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 5, repeats: false)
                        let request = UNNotificationRequest(identifier: "FiveSecond",
                                                            content: content,
                                                            trigger: trigger)
    
                        // ローカル通知予約
                        center.addNotificationRequest(request, withCompletionHandler: nil)
    
                        center.getPendingNotificationRequestsWithCompletionHandler { (requests: [UNNotificationRequest]) in
                            print(">>>>> \(requests)")
                        }
    
                    } else {
                        debugPrint("通知拒否")
                    }
                })
    
            } else {
                // <= iOS 9
    //            let settings = UIUserNotificationSettings(forTypes: [.Badge, .Sound, .Alert], categories: nil)
    //            UIApplication.shared.registerUserNotificationSettings(settings)
            }
    
            return true
        }
    
        @available(iOS 10.0, *)
        func userNotificationCenter(center: UNUserNotificationCenter,
                                    willPresent notification: UNNotification,
                                    withCompletionHandler completionHandler: (UNNotificationPresentationOptions) -> Void) {
    
            // ...
            let identifier = notification.request.identifier
            debugPrint("userNotificationCenter \(identifier)")
       }
    }
    
[/code]


CC BY-SA 3.0
2016-08-04T11:48:08.770
28063
2016-08-04T12:45:33.350
2016-08-04T12:45:33.350
5519
13605
question
notification swift3
Swift2.3 で UNUserNotification (iOS10) のdelegateメソッドが呼ばれない


正直言うと「なぜこれから作るiOS10対応のアプリをSwift2.3で書くんだろう?」というところです。(もちろんSwift2対応の既存資産が大量にあるのでしょうが…。)  
AppleはiOS10のAPIについてSwift2対応のドキュメントを出す予定はありませんし、Xcode8では新規プロジェクトのテンプレートも用意されておらず、エディター上でのサポートも極めて限定的にしか働きません。  
たとえ、コンパイラーの設定をSwift2(Legacy)にしてあったとしても、Xcodeが提示したサジェスチョンは「Swift3用のものである可能性が高い」と思っていてください。

そう言うわけですから、もしあなたがSwift2.3での開発を続けるのであれば、あてになるのはXcodeでも、Swift用のドキュメントでもなく、Objective-
C用のドキュメントだけ、ということになります。

あなたが実装しようとしているメソッドは、Objective-Cでは以下のような定義になっています。

[userNotificationCenter:willPresentNotification:withCompletionHandler:](https://developer.apple.com/reference/usernotifications/unusernotificationcenterdelegate/1649518-usernotificationcenter?language=objc)

> Declaration
[code]

>     - (void)userNotificationCenter:(UNUserNotificationCenter *)center
>            willPresentNotification:(UNNotification *)notification
>              withCompletionHandler:(void
> (^)(UNNotificationPresentationOptions options))completionHandler;
>  
[/code]

これをSwift2流にimportしたらどうなるか、あなたはXcodeには頼れず自分で翻訳しないといけません。  
とりあえずこの例の場合のメソッドヘッダは、こうなるでしょう。

[code]

    func userNotificationCenter(center: UNUserNotificationCenter,
                                willPresentNotification notification: UNNotification,
                                withCompletionHandler completionHandler: (UNNotificationPresentationOptions) -> Void) {
    
[/code]

お試し下さい。ただ、この部分が無事に動くようになったとしても、この先を考えると大変ですね。ネット上の情報などを見てもSwift3への移行に関する情報は急速に充実してきています。既存資産があれば、大変な作業であることはわかっているのですが、いずれやらなければいけないことですし、(特に新規にコーディングが必要な部分がそれなりにあるのであれば)早めにSwift3への移行を検討された方が良いように思われます。


CC BY-SA 3.0
2016-08-04T12:32:34.787
28064
2016-08-04T12:32:34.787
13972
28063
answer