アプリにプッシュ通知を実装するには、デバイストークンが必要です。
iOS 8ではdidRegisterForRemoteNotificationsWithDeviceToken
メソッドが機能しないため、デバイストークンを取得するにはどうすればよいですか。アプリデリゲートでこのコードを試しましたが、デバイストークンを取得できません。
[[UIApplication sharedApplication] registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge) categories:nil]];
[[UIApplication sharedApplication] registerForRemoteNotifications];
あなたはそれを行う方法を知っているでしょう。
最初:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
このようなコードを追加
#ifdef __IPHONE_8_0
//Right, that is the point
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIRemoteNotificationTypeBadge
|UIRemoteNotificationTypeSound
|UIRemoteNotificationTypeAlert) categories:nil];
[[UIApplication sharedApplication] registerUserNotificationSettings:settings];
#else
//register to receive notifications
UIRemoteNotificationType myTypes = UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound;
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:myTypes];
#endif
Xcode 5とXcode 6の両方を使用しない場合、このコードを試してください
if ([application respondsToSelector:@selector(registerUserNotificationSettings:)]) {
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIRemoteNotificationTypeBadge
|UIRemoteNotificationTypeSound
|UIRemoteNotificationTypeAlert) categories:nil];
[application registerUserNotificationSettings:settings];
} else {
UIRemoteNotificationType myTypes = UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound;
[application registerForRemoteNotificationTypes:myTypes];
}
(@ zeiteisen @dmurのリマインドをありがとう)
第二:
この機能を追加
#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
古いiOSバージョンでクラッシュした場合に備えて、@ Madaoの応答に小さな検証を追加します。
#ifdef __IPHONE_8_0
if(NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_7_1) {
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeBadge|UIUserNotificationTypeSound|UIUserNotificationTypeAlert) categories:nil];
[[UIApplication sharedApplication] registerUserNotificationSettings:settings];
}
#endif
UIRemoteNotificationType myTypes = UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeNewsstandContentAvailability;
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:myTypes];
__IPHONE_8_0
マクロは、古いバージョンのxCode/iOSでコンパイルできるようにするだけで、コンパイルエラーや警告は表示されませんが、iOS 7以前のデバイスでコードを実行するとクラッシュします。
IOS8でデバイストークンを取得するには+
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
//This code will work in iOS 8.0 xcode 6.0 or later
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0)
{
[[UIApplication sharedApplication] registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge) categories:nil]];
[[UIApplication sharedApplication] registerForRemoteNotifications];
}
else
{
[[UIApplication sharedApplication] registerForRemoteNotificationTypes: (UIRemoteNotificationTypeNewsstandContentAvailability| UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)];
}
return YES;
}
- (void)application:(UIApplication*)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken
{
NSString* deviceToken = [[[[deviceToken description]
stringByReplacingOccurrencesOfString: @"<" withString: @""]
stringByReplacingOccurrencesOfString: @">" withString: @""]
stringByReplacingOccurrencesOfString: @" " withString: @""] ;
NSLog(@"Device_Token -----> %@\n",deviceToken);
}
この質問に対する他の見劣りする答えは別として、必要なすべてのデリゲートメソッドを実装した情報に基づいた開発者にこの問題が発生する可能性が最も高い理由は、ワイルドカードプロビジョニングプロファイルを使用していることです(なぜそうしないのですか?開発アプリの作成とテストがとても簡単になります!)
この場合、おそらくError Domain=NSCocoaErrorDomain Code=3000 "no valid 'aps-environment' entitlement string found for application"
エラーが表示されます
通知をテストするには、実際には2000年以降に戻ってdeveloper.Apple.comにログインし、プッシュ通知を有効にしてアプリケーション固有のプロビジョニングプロファイルを設定する必要があります。
@madoaの答えは絶対に正しいです。 シミュレータでは機能していませんに注意してください。
この場合
-(void)application:(UIApplication *)application
didFailToRegisterForRemoteNotificationsWithError:(NSError *)error
エラーREMOTE_NOTIFICATION_SIMULATOR_NOT_SUPPORTED_NSERRORで呼び出されます
開発者アカウントで、アプリIDにプッシュ通知が正しく設定されていることを確認してから、プロビジョニングプロファイルを再生成してダウンロードする必要があります。私の問題は、プロビジョニングプロファイルをダウンロードしたが、xcodeが間違ったプロファイルを実行していたことです。これを修正するには、ターゲットビルド設定に移動し、コード署名までスクロールして、プロビジョニングプロファイルセクションの下で、生成したものの名前と一致する正しいプロビジョニングプロファイルを使用していることを確認します(オプションがある場合は、ドロップダウンがあります複数インストールされています)。
これが解決策です。
applicationDidFinishLaunchingWithOptionsで:
{
UIUserNotificationType types = UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert;
UIUserNotificationSettings *mySettings = [UIUserNotificationSettings settingsForTypes:types categories:nil];
[[UIApplication sharedApplication] registerUserNotificationSettings:mySettings];
}
- (void)application:(UIApplication*)application didRegisterUserNotificationSettings:(nonnull UIUserNotificationSettings *)notificationSettings
{
[application registerForRemoteNotifications];
}
- (void)application:(UIApplication*)application didFailToRegisterForRemoteNotificationsWithError:(nonnull NSError *)error
{
NSLog(@" Error while registering for remote notifications: %@", error);
}
- (void)application:(UIApplication*)application didRegisterForRemoteNotificationsWithDeviceToken:(nonnull NSData *)deviceToken
{
NSLog(@"Device Token is : %@", deviceToken);
}