Làm cách nào để nhận Mã thông báo thiết bị để thông báo từ xa trong iOS 8? Tôi đã sử dụng phương thức didRegisterForRemoteNotificationsWithDeviceToken
trong AppDelegate
iOS <8 và nó trả về mã thông báo thiết bị. Nhưng trong iOS 8 thì không.
Làm cách nào để nhận Mã thông báo thiết bị để thông báo từ xa trong iOS 8? Tôi đã sử dụng phương thức didRegisterForRemoteNotificationsWithDeviceToken
trong AppDelegate
iOS <8 và nó trả về mã thông báo thiết bị. Nhưng trong iOS 8 thì không.
Câu trả lời:
Bạn sẽ biết làm thế nào để làm điều đó.
Đầu tiên:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
thêm mã như thế này
if ([application respondsToSelector:@selector(registerUserNotificationSettings:)]) {
#ifdef __IPHONE_8_0
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeAlert
| UIUserNotificationTypeBadge
| UIUserNotificationTypeSound) categories:nil];
[application registerUserNotificationSettings:settings];
#endif
} else {
UIRemoteNotificationType myTypes = UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound;
[application registerForRemoteNotificationTypes:myTypes];
}
nếu bạn không sử dụng cả Xcode 5 và Xcode 6 , hãy thử mã này
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];
}
(Cảm ơn lời nhắc của @zeiteisen @dmur)
Thứ hai:
Thêm chức năng này
#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
Và bạn có thể đưa deviceToken vào
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
nếu nó vẫn không hoạt động, hãy sử dụng chức năng này và NSLog lỗi
-(void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error
UIUserNotificationSettings
hoặc UIApplication
nói về cách điều này được yêu cầu cho iOS 8. Thay vào đó, nó bị chôn vùi trong các điểm khác biệt về API của họ.
if ([application respondsToSelector:@selector(registerUserNotificationSettings:)]) {
kiểm tra, như zeiteisen đã làm trong câu trả lời của anh ấy.
Cách đăng ký iOS 8 và tiếp tục hỗ trợ các phiên bản cũ hơn
UIApplication *application = [UIApplication sharedApplication];
if ([application respondsToSelector:@selector(registerUserNotificationSettings:)]) {
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeBadge
|UIUserNotificationTypeSound
|UIUserNotificationTypeAlert) categories:nil];
[application registerUserNotificationSettings:settings];
} else {
UIRemoteNotificationType myTypes = UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound;
[application registerForRemoteNotificationTypes:myTypes];
}
và trong ứng dụng ủy quyền thêm
- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings {
[application registerForRemoteNotifications];
}
iOS8 có thể nhận thông báo im lặng mà không cần xin phép. Gọi điện thoại
- (void)registerForRemoteNotifications
. Sau đó application:didRegisterForRemoteNotificationsWithDeviceToken:
sẽ được gọi là
Lưu ý: lệnh gọi lại với mã thông báo chỉ được gọi nếu ứng dụng đã đăng ký thành công thông báo người dùng bằng chức năng bên dưới hoặc nếu tính năng Làm mới ứng dụng nền được bật.
Kiểm tra ứng dụng Cài đặt cho bạn nếu bất kỳ loại thông báo nào được bật. Nếu không, bạn sẽ không nhận được mã thông báo thiết bị.
Giờ đây, bạn có thể nhận thông báo im lặng với
aps {
content-available: 1
}
trong tải thông báo
Nhưng thông báo xuất hiện vẫn cần sự cho phép. Gọi
UIUserNotificationType types = UIUserNotificationTypeSound | UIUserNotificationTypeBadge | UIUserNotificationTypeAlert;
UIUserNotificationSettings *notificationSettings = [UIUserNotificationSettings settingsForTypes:types categories:nil];
[application registerUserNotificationSettings:notificationSettings];
Mã này nên yêu cầu sự cho phép.
Bây giờ bạn đã sẵn sàng để nhận thông báo đẩy
OS8 can receive silent notifications without asking for permission
chút. Điều đó đã khiến tôi phát điên và đây là nơi duy nhất tôi tìm thấy một chút hữu ích!
if
tuyên bố đầu tiên của bạn , bạn nên sử dụng UIUserNotificationTypeSound
thay vì UIRemoteNotificationTypeSound
, vì UIRemoteNotificationType
không được dùng trong iOS 8.
Trong trường hợp của tôi, tôi đã thực hiện các bản cập nhật cần thiết để yêu cầu quyền truy cập thông báo đẩy cho iOS 7 và iOS 8, tuy nhiên, tôi đã không triển khai lệnh gọi lại mới khi người dùng iOS 8 cấp quyền truy cập. Tôi cần thêm phương thức này vào đại biểu ứng dụng của mình.
- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings {
[application registerForRemoteNotifications];
}
Nếu bạn đang sử dụng Xamarin.iOS để xây dựng ứng dụng di động của mình, bạn có thể sử dụng đoạn mã này để yêu cầu đăng ký thông báo đẩy
if (UIDevice.CurrentDevice.CheckSystemVersion(8,0))
{
UIUserNotificationType userNotificationTypes = UIUserNotificationType.Alert | UIUserNotificationType.Badge | UIUserNotificationType.Sound;
UIUserNotificationSettings settings = UIUserNotificationSettings.GetSettingsForTypes(userNotificationTypes, null);
UIApplication.SharedApplication.RegisterUserNotificationSettings(settings);
}
else
{
UIRemoteNotificationType notificationTypes = UIRemoteNotificationType.Alert | UIRemoteNotificationType.Badge | UIRemoteNotificationType.Sound;
UIApplication.SharedApplication.RegisterForRemoteNotificationTypes(notificationTypes);
}
Ngoài ra, bạn sẽ cần ghi đè DidRegisterUserNotificationSettings
phương thức để lấy mã thông báo thiết bị được trả về từ máy chủ APNS:
public override void DidRegisterUserNotificationSettings(UIApplication application, UIUserNotificationSettings notificationSettings)
{
application.RegisterForRemoteNotifications();
}
Câu trả lời của Madao ( https://stackoverflow.com/a/24488562/859742 ) là đúng nhưng ....
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIRemoteNotificationTypeBadge
nên "đúng" hơn
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert) categories:nil];
Các cờ đó có cùng giá trị mặt nạ bit và đó là lý do tại sao cả hai sẽ hoạt động nhưng không UIUserNotificationSettings
yêu cầu .UIUserNotificationType
UIRemoteNotificationType
Ngoài ra tôi sẽ gọi
[application registerUserNotificationSettings:settings];
Trong AppDelegate
phương thức (tùy thuộc vào quyền được cấp),
- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings
Tôi nghĩ rằng cách tốt hơn để giữ khả năng tương thích ngược mà chúng ta có thể làm với cách tiếp cận này, nó đang hoạt động cho trường hợp của tôi, hy vọng sẽ hiệu quả với bạn. Cũng khá dễ hiểu.
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0)
{
[[UIApplication sharedApplication] registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge) categories:nil]];
[[UIApplication sharedApplication] registerForRemoteNotifications];
}
else
{
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:
(UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert)];
}
UIUserNotificationType types = UIUserNotificationTypeBadge |
UIUserNotificationTypeSound | UIUserNotificationTypeAlert;
UIUserNotificationSettings *mySettings =
[UIUserNotificationSettings settingsForTypes:types categories:nil];
[[UIApplication sharedApplication] registerUserNotificationSettings:mySettings];
[application registerForRemoteNotifications];