2016-02-22 14 views
11

プッシュ通知をテストする2つのサンプル(単一ビュー)プロジェクトを作成しました。通知設定コード以外のコードは次のように追加しませんでした。swift 2:目的-cとは対照的にプッシュ通知の代理コールバックなし

Project1の(スイフト2):

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 

    let settings = UIUserNotificationSettings(forTypes: [.Alert, .Badge, .Sound], categories: nil) 
    UIApplication.sharedApplication().registerUserNotificationSettings(settings) 
    UIApplication.sharedApplication().registerForRemoteNotifications() 

    return true 
} 

func application(application: UIApplication, didRegisterUserNotificationSettings notificationSettings: UIUserNotificationSettings) { 

    print("didRegisterUserNotificationSettings got called") 

} 

func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) { 

    let trimmedDeviceToken = deviceToken.description .stringByTrimmingCharactersInSet(NSCharacterSet(charactersInString: "<>")) 
     .stringByReplacingOccurrencesOfString(" ", withString: "") 
    print("Device Token \(trimmedDeviceToken)") 

} 

func application(application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: NSError) { 
    print("Failed to get token, error: \(error)") 
} 

Project2を(対物-C):

-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 

UIUserNotificationSettings* notificationSettings = 
[UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeSound | UIUserNotificationTypeAlert|UIUserNotificationTypeBadge) categories:nil]; 

[application registerUserNotificationSettings:notificationSettings]; 
[application registerForRemoteNotifications]; 

return YES; 
} 

    -(void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings { 

NSLog(@"didRegisterUserNotificationSettings got called"); 

} 

    -(void)application:(UIApplication*)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken 
{ 

NSString* newToken = [deviceToken description]; 
newToken = [newToken stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"<>"]]; 
newToken = [newToken stringByReplacingOccurrencesOfString:@" " withString:@""]; 

NSLog(@"Device Token %@", newToken); 
} 

    -(void)application:(UIApplication*)application didFailToRegisterForRemoteNotificationsWithError:(NSError*)error 
{ 
     NSLog(@"Failed to get token, error: %@", error); 
} 

objective-cプロジェクトは、テストされたすべてのデバイスで正常に動作します。リモート通知のために自身を登録し、デリゲートコールバックメソッドでデバイストークンを受け取りますが、迅速なプロジェクトはデリゲートコールバックを取得できません。

は、私は重複としてこの質問をマークする前に試したものを読む:

1)のAppIDは、プッシュ通知が有効である
2)プッシュ証明書の種類は、生産およびプロビジョニングプロファイルは、アドホック生産
3)両方のプロジェクトで使用されています同じAppID、プッシュ証明書、プロビジョニングプロファイル
4)両方のプロジェクトがすべてiOS 9.2を実行している3種類のiPhone(5、6 & 6Plus)でテストされ、インストールごとにそのアプリケーションが削除され、何度も再起動されます。
5 )は、2つのXcode 7.2との両方のプロジェクトを構築しましたMACプロマシン
6)3つのiPhoneはすべてファイアウォールなしでインターネット接続を使用しており、すべてのポートが開いています(this technical noteに記載されています)。また、3つのデバイスのインターネット接続をWIFIではなく3G接続に変更しました。
8)プロジェクト設定で通知をプッシュ - >両方のプロジェクトの機能(ただし、この時点ではテストしても効果がありません)
8)Xcode Run(トップボタン)とExport ipa package for両方のプロジェクト
9)は、メソッドregisterForRemoteNotifications
10とSWIFTの両方に(アプリケーション)Objective-CのとUIApplication.sharedApplicationため&(【のUIApplication sharedApplicationは()))、新規のAppID別のブランドを試みたプッシュ証明書とのプロファイルをプロビジョニング試み両方のプロジェクト。これらすべての試行後にObjective-Cのプロジェクトが正常に動作してdidRegisterForRemoteNotificationsWithDeviceTokenメソッドを介してデバイストークンを受信するが、迅速な1が動作しない

上記のよう
11)は、両方のプロジェクトを削除し、同じコードを持つ別の2つの新しいプロジェクトを作成しました。

私は3 APNは、AppleがPersistentConnectionLogging.mobileconfigプロファイルを使用してiPhone 6Plusデバイスからログファイルを生成している、とuploaded them hereは、(apsd_2016_02_24_11_36_29+0300.logファイル内のObjective-CのプロジェクトBundleIDはXXXXX.push.notificationで、迅速なプロジェクトBundleIDがXXXXX.apnsswiftある)

答えて

4

それは、この奇妙な問題の背後にある理由はNSLogとは対照的に、デバイスのログに出力を表示しませんSWIFTのprint方法であり、迅速なアプリは問題がないことが判明し、それだけでメッセージを表示するためにNSLogを使用する必要がありますプッシュ通知デリゲートコールバックメソッド。

//print("Device Token \(trimmedDeviceToken)") 
NSLog("Device Token: %@",trimmedDeviceToken) 
2

がありますSwiftのバージョンでapplication:didFinishLaunchingWithOptions:がまったく呼び出されていることを100%確信していますか?あなたが忘れてしまったことかもしれません。 Swift版でアプリデリゲートの名前を設定しますか?チェックするには、Swift application:didFinishLaunchingWithOptions:にロギングコードを追加してください。

また、Swiftアプリケーションデリゲートクラスに@objcを追加してください(それがまだない場合は)。dynamicキーワードをデリゲートメソッドに追加してみてください。

UIApplication.sharedApplication()application(別のロングショット)に置き換えてください。