IOS 8とのアプリの互換性を確認しています。ログインコンソールを表示しています「アプリケーションアイコンにバッジを付けようとしましたが、ユーザーからアプリケーションにバッジを付ける許可を受け取っていません」誰でもこの警告を取り除くために私を助けてください。はい、私のアプリはアプリアイコンとTabBarアイコンにバッジを表示します。
AppDelegateで行ったこと
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// registering for remote notifications
[self registerForRemoteNotification];
return YES;
}
- (void)registerForRemoteNotification {
if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0")) {
UIUserNotificationType types = UIUserNotificationTypeSound | UIUserNotificationTypeBadge | UIUserNotificationTypeAlert;
UIUserNotificationSettings *notificationSettings = [UIUserNotificationSettings settingsForTypes:types categories:nil];
[[UIApplication sharedApplication] registerUserNotificationSettings:notificationSettings];
} else {
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)];
}
}
#ifdef __IPHONE_8_0
- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings {
[application registerForRemoteNotifications];
}
#endif
Appleは、通知を登録してバッジを操作するための新しいAPIを作成します。
WWDC 2014セッションビデオを参照してください: https://developer.Apple.com/videos/wwdc/2014/?id=71 、 http://asciiwwdc.com/2014/sessions/ 71 (テキスト版)および https://developer.Apple.com/library/ios/documentation/UIKit/Reference/UIApplication_Class/index.html#//Apple_ref/occ/instm/UIApplication/registerUserNotificationSettings :
ユーザーは[設定]でUIUserNotificationType (UIUserNotificationTypeBadge, UIUserNotificationTypeSound, UIUserNotificationTypeAlert)
ごとにアクセス許可を変更できます。
バッジを変更する前に、権限を確認する必要があります。
AppDelegateのコードサンプル:
- (BOOL)checkNotificationType:(UIUserNotificationType)type
{
UIUserNotificationSettings *currentSettings = [[UIApplication sharedApplication] currentUserNotificationSettings];
return (currentSettings.types & type);
}
- (void)setApplicationBadgeNumber:(NSInteger)badgeNumber
{
UIApplication *application = [UIApplication sharedApplication];
if(SYSTEM_VERSION_LESS_THAN(@"8.0")) {
application.applicationIconBadgeNumber = badgeNumber;
}
else {
if ([self checkNotificationType:UIUserNotificationTypeBadge]) {
NSLog(@"badge number changed to %d", badgeNumber);
application.applicationIconBadgeNumber = badgeNumber;
}
else {
NSLog(@"access denied for UIUserNotificationTypeBadge");
}
}
}
#define SYSTEM_VERSION_LESS_THAN(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)
CurrentUserNotificationSettingsメソッドは、UIアプリケーションインスタンスで使用でき、最新のユーザー通知設定を提供します。
バッジ番号の使用:
[self setApplicationBadgeNumber:0];
の代わりに
application.applicationIconBadgeNumber = 0;
使用できます
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000
if ([[UIApplication sharedApplication] respondsToSelector:@selector(registerUserNotificationSettings:)])
{
[[UIApplication sharedApplication] registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge) categories:nil]];
[[UIApplication sharedApplication] registerForRemoteNotifications];
} else
{
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:
(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)];
}
#else
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:
(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)];
#endif
Swiftで解決策を探しているときに、この答えに出会いました。私は次のことをしました(iOS 8を想定):
UIApplication.sharedApplication().registerUserNotificationSettings(UIUserNotificationSettings(forTypes: UIUserNotificationType.Sound | UIUserNotificationType.Alert | UIUserNotificationType.Badge, categories: nil))
UIApplication.sharedApplication().registerForRemoteNotifications()
IOSバージョンiをチェックするのではなく、リモート通知で行うように、UIUserNotificationSettingsが存在するかどうかをチェックし、BadgeTypeに登録します。
Class userNotification = NSClassFromString(@"UIUserNotificationSettings");
if (userNotification)
{
UIUserNotificationSettings* notificationSettings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound categories:nil];
[[UIApplication sharedApplication] registerUserNotificationSettings:notificationSettings];
}
ローカル通知を使用する場合は、以下のコードを使用します。
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000
[[UIApplication sharedApplication] registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge) categories:nil]];
[[UIApplication sharedApplication] registerForRemoteNotifications];
#else
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:
(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)];
#endif
iOS 8には、registerUserNotificationSettings:
というアプリケーションメソッドがあります。ドキュメントの一部には、「アプリがバックグラウンドでアラートを表示したり、サウンドを再生したり、アイコンをバッジした場合、起動サイクル中にこのメソッドを呼び出して、そのような方法でユーザーにアラートする許可を要求する必要があります」と書かれています。
使用できます
if(SYSTEM_VERSION_LESS_THAN(@"8.0"))
{
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:
(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)];
}
else
{
[[UIApplication sharedApplication] registerForRemoteNotifications];
}
....
#define SYSTEM_VERSION_LESS_THAN(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)
プッシュ通知の場合、それはそれを解決すると思います、シミュレータの私の場合、プッシュをサポートしていないのでこの警告が表示され、ユーザーはその警告を受け取るよりも許可を拒否します。ありがとうございました。
+ (BOOL)canBadgeTheApp {
BOOL canBadgeTheApp;
if ([UIDevice currentDevice].systemVersion.doubleValue >= 8) {
UIUserNotificationType types = [[[UIApplication sharedApplication] currentUserNotificationSettings] types];
canBadgeTheApp = ((types & UIRemoteNotificationTypeBadge) != 0);
} else {
canBadgeTheApp = YES;
}
return canBadgeTheApp;
}
「スイフト」の場合、上記のコード:
final func checkNotificationType(type : UIUserNotificationType) -> Bool {
let application = UIApplication.sharedApplication()
if application.respondsToSelector(Selector("registerUserNotificationSettings:")) {
// iOS8 and above
let currentSettings : UIUserNotificationSettings = application.currentUserNotificationSettings()
let types = currentSettings.types
return types.rawValue & type.rawValue > 0
}else{
return true
}
}
必要なものは
if (floor(NSFoundationVersionNumber) >= NSFoundationVersionNumber_iOS_8_0) {
// here you go with iOS 8
} else {
}