現在、Xcode6ベータ版(最初のバージョン)を使用しています。 parse.comを使用して、プッシュ通知を実装しようとしています。私のアプリデリゲートでは、
[application registerForRemoteNotifications];
IOS 8ベータ版のiPhoneで実行すると、アプリはプッシュ通知を有効にするかどうかを尋ねません。対応するapplication:didRegisterForRemoteNotificationsWithDeviceToken:
が呼び出されることはありません。ただし、ios7 iPhoneで実行しようとすると、アプリがクラッシュし、unrecognized selector
registerForRemoteNotifications
メソッドのエラー。
次に、以前のバージョンのXcode(バージョン5.0)で実行しようとしましたが、コンパイルエラーno visible @interface declares registerForRemoteNotifications
このエラーはiOS 8への移行に伴うバグに関係していると思いますが、この問題をどのように解決できるかわかりません。
あなたはそれを行う方法を知っているでしょう。
最初:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
このようなコードを追加
#ifdef __IPHONE_8_0
//Right, that is the point
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound) categories:nil];
[[UIApplication sharedApplication] registerUserNotificationSettings:settings];
#else
//register to receive notifications
UIRemoteNotificationType myTypes = UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound;
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:myTypes];
#endif
第二:
この機能を追加
#ifdef __IPHONE_8_0
- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings
{
//register to receive notifications
[application registerForRemoteNotifications];
}
- (void)application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forRemoteNotification:(NSDictionary *)userInfo completionHandler:(void(^)())completionHandler
{
//handle the actions
if ([identifier isEqualToString:@"declineAction"]){
}
else if ([identifier isEqualToString:@"answerAction"]){
}
}
#endif
そして、あなたはdeviceTokenを
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
それでも機能しない場合は、この関数を使用して、NSLog error
-(void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error
いくつかの観察:
このコードのようにセレクターの存在をテストします。
func registerForPushForiOS7AndAbove(){
UIApplication.sharedApplication()
let application = UIApplication.sharedApplication()
if application.respondsToSelector(Selector("registerUserNotificationSettings:")) {
let notifSettings = UIUserNotificationSettings(forTypes: .Sound | .Alert | .Badge,
categories: nil)
application.registerUserNotificationSettings(notifSettings)
application.registerForRemoteNotifications()
}
else{
application.registerForRemoteNotificationTypes( .Sound | .Alert | .Badge )
}
}
(PListのUIBackgroundModesをお見逃しなく。機能で実行できます)
次のコードスニペットを使用して、iOS 8の通知に登録するだけです。
UIUserNotificationSettings *settings =
[UIUserNotificationSettings
settingsForTypes: (UIUserNotificationTypeBadge |
UIUserNotificationTypeSound |
UIUserNotificationTypeAlert)
categories:nil];
[[UIApplication sharedApplication] registerUserNotificationSettings:settings];
UIUserNotificationType
の代わりにUIRemoteNotificationType
を使用してください!
IOS 8では、システムはユーザーにアプリがプッシュ(リモート)通知を送信することを許可するよう要求しません。これはデフォルトで許可されています。
ユーザーは[設定]> [アプリ]> [通知]> [通知を許可]でアプリからの通知の許可をオプトアウトできます。
registerForRemoteNotifications
メソッドはiOS8から利用可能です。
application:didRegisterForRemoteNotificationsWithDeviceToken:
デリゲートメソッドは、登録が成功した場合にのみ呼び出されます。失敗が発生した場合、application:didFailToRegisterForRemoteNotificationsWithError:
方法。
詳細については、以下を参照してください。 IApplication Class reference
また、アプリの通知が有効になっていることを確認しますSettings -> Notifications -> YourApp -> Enable_Notifications
ドキュメントによると、デバイスがプッシュサーバーとの永続的な接続を持つまで、コールバックは発生しません。したがって、利用可能なWi-Fiまたはデータ接続がない場合、コールバックは発生しません-およびAppleはこれをエラー状態と見なしません。didFailを引き起こす可能性のあるエラーのみ。 。コールバックは、証明書/アプリの許可が正しくない問題(開発の問題)であるか、ユーザーが許可を拒否しました。
プッシュ通知プログラミングガイド を実行してください