28985


Swift2.2 でコーディングしていたプログラムを Xcode のバージョンアップを行い Swift3.0
にコードをコンバートしました。コンバートした結果出現したエラーは何とか取り除いた？のですがデータストアの installation
に端末が登録されなくなってしまいました。 AppDelegate.swift のコードは現在このようになっています。(関係がありそうな部分を抜き出してます)

[code]

    import UIKit
    
    @UIApplicationMain
    class AppDelegate: UIResponder, UIApplicationDelegate {
        var window: UIWindow?
        //********** APIキーの設定 **********
        let applicationkey = ""
        let clientkey      = ""
    
        func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
            // Override point for customization after application launch.
            //********** SDKの初期化 **********
            NCMB.setApplicationKey(applicationkey, clientKey: clientkey)
    
            // デバイストークンの要求
            if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_7_1){
                /** iOS8以上 **/
                //通知のタイプを設定したsettingを用意
                let type : UIUserNotificationType = [.alert, .badge, .sound]
                let setting = UIUserNotificationSettings(types: type, categories: nil)
                //通知のタイプを設定
                application.registerUserNotificationSettings(setting)
                //DevoceTokenを要求
                application.registerForRemoteNotifications()
            }
    
            return true
        }
    
        // デバイストークンが取得されたら呼び出されるメソッド
        private func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData){
            print("デバイストークンメソッド");
            // 端末情報を扱うNCMBInstallationのインスタンスを作成
            let installation = NCMBInstallation.current()
            // デバイストークンの設定
            installation?.setDeviceTokenFrom(deviceToken as Data!)
            // 端末情報をデータストアに登録
            installation?.saveInBackground { (error) -> Void in
                if (error != nil){
                    // 端末情報の登録に失敗した時の処理
    
                }else{
                    // 端末情報の登録に成功した時の処理
    
                }
            }
        }
    }
    
[/code]

Swift2.2 の時のコードは[ここ](https://github.com/NIFTYCloud-
mbaas/SwiftPushApp?_hsenc=p2ANqtz-9LjZD_6OYENzHLIZ23XioumGYiW72rNo-y20y0EEiwtzWPKfDI-
dldrqNPd3VXHTIl3xhM_FY4oBrPhDgell1gSkvrUw&_hsmi=32904303)のサイトに書いてあるサンプルとほぼ同じです。  
installation に端末が登録されるにはどうすればいいでしょうか？よろしくお願いします。


CC BY-SA 3.0
2016-09-19T06:46:42.900
28979
2016-09-19T10:45:12.097
18842
question
swift
Swift3.0 で mobile backend を利用したプッシュ通知について


「デバイストークンが取得されたら呼び出されるメソッド」が呼び出されているかどうかは確認されたでしょうか。動くはずの処理が全く動いていないという場合、「データストアの
installation に端末が登録」される処理が実際に走っているかをデバッガ等で確認して、その情報を質問文に記入するようにしてください。

* * *

Swift3への移行で不可解なエラーが出た時には常に最新のリファレンスを確認するようにしてください。

[application(_:didRegisterForRemoteNotificationsWithDeviceToken:)](https://developer.apple.com/reference/uikit/uiapplicationdelegate/1622958-application)

> ## Declaration
[code]

>     optional func application(_ application: UIApplication,
>
> didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data)
>  
[/code]

気づきにくいですが、`application:`の前に`_`が記載されています。Swift
3ではメソッド・関数の先頭のパラメータもパラメータラベル(外部名)を持つのがデフォルトになったので、先頭パラメータにラベルがないことを明示的に示してやる必要があります。

また、2つ目のパラメータのデータ型が`Data`になっています。この違いも見逃してはくれないので、気をつけてください。

* * *

さらに、メソッド宣言に`private`修飾子を付けてしまっています。警告を解消するためにXcodeの紛らわしいサジェスチョンに従ってしまっただけかもしれませんが、Swiftという言語の基本はしっかり覚えて、その修飾子が何をしているのかはわかっておいてください。

`private`を宣言に付加することは、その宣言をスコープ(メソッド宣言の場合にはclass全体)の外には見せないことを表します。したがって、iOSの実行コードからはそのメソッドは見えないということになってしまい、上の修正をしたとしても、そのメソッドがiOSの中から呼ばれることはありません。

* * *

上記2つの事柄を修正すると、あなたのメソッドのヘッダ部はこんな風になります。

[code]

        func application(_ application: UIApplication,
                         didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data){
    
[/code]

お試しください。


CC BY-SA 3.0
2016-09-19T10:45:12.097
28985
2016-09-19T10:45:12.097
13972
28979
answer