cod*_*nd1 9 macos objective-c apple-push-notifications ios cloudkit
我正在使用CloudKit来存储用户数据,并希望在更改记录或创建新记录时获得推送通知.但它不起作用......
我注册了这样的订阅:
- (void) updateCloudSubscriptions {
NSPredicate *allPredicate = [NSPredicate predicateWithFormat:@"TRUEPREDICATE"];
CKSubscription *newOrUpdateSubscription = [[CKSubscription alloc]
initWithRecordType:kMyRecordType predicate:allPredicate options:
(CKSubscriptionOptionsFiresOnRecordCreation | CKSubscriptionOptionsFiresOnRecordUpdate)];
CKNotificationInfo *newOrUpdateNotificationInfo = [CKNotificationInfo new];
newOrUpdateNotificationInfo.shouldBadge = NO;
newOrUpdateNotificationInfo.shouldSendContentAvailable = YES;
newOrUpdateSubscription.notificationInfo = newOrUpdateNotificationInfo;
CKDatabase *publicDatabase = [[CKContainer containerWithIdentifier:kMyContainerID]
publicCloudDatabase];
[publicDatabase saveSubscription:newOrUpdateSubscription
completionHandler:^(CKSubscription *theSubscription, NSError *saveError) {
if (saveError){
//error handling
}
NSLog(@"Subscription created");
}];
}
Run Code Online (Sandbox Code Playgroud)
这成功了.在CloudKit仪表板上,正确创建订阅.
在我的AppDelegate中,我现在有以下内容:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
UIUserNotificationSettings *notificationSettings = [UIUserNotificationSettings settingsForTypes:
(UIUserNotificationTypeNone | UIUserNotificationTypeAlert |
UIUserNotificationTypeBadge | UIUserNotificationTypeSound) categories:nil];
[application registerUserNotificationSettings:notificationSettings];
[application registerForRemoteNotifications];
}
Run Code Online (Sandbox Code Playgroud)
并实现了这些委托方法:
- (void)application:(UIApplication *)application
didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
NSLog(@"%@ with token = %@", NSStringFromSelector(_cmd), deviceToken);
}
- (void)application:(UIApplication *)application
didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {
NSLog(@"%@ with error = %@", NSStringFromSelector(_cmd), error);
}
- (void)application:(UIApplication *)application
didReceiveRemoteNotification:(NSDictionary *)userInfo {
NSLog(@"%@", NSStringFromSelector(_cmd));
}
Run Code Online (Sandbox Code Playgroud)
didRegisterForRemoteNotificationsWithDeviceToken使用令牌成功调用.但从didReceiveRemoteNotification未被称为.
我通过更改我的应用程序的Mac版本和iPhone版本上的值来测试这一点.两者都上传更改但都不会触发通知.我也尝试直接在仪表板上更改值,但这也不会导致通知.
我在这里错过了什么?
如果相关:我使用的是XCode 6.4的OS X 10.10
我激活了apsd日志记录,但只收到这样的消息:
Jul 12 18:25:29 Mac.local apsd[44748]: APSMessageStore - Saving database.
Jul 12 18:25:29 Mac.local apsd[44748]: APSMessageStore - Destroying database.
Jul 12 18:25:29 Mac.local apsd[44748]: APSMessageStore - Closed database.
Jul 12 18:25:29 Mac.local apsd[44748]: APSMessageStore - Reopening database
Jul 12 18:25:29 Mac.local apsd[44748]: APSMessageStore - Initializing database on thread: <NSThread: 0x7f8f1bf80dd0>{number = 55, name = (null)}
Jul 12 18:25:29 Mac.local apsd[44748]: APSMessageStore - Enabling auto vacuum.
Jul 12 18:25:29 Mac.local apsd[44748]: APSMessageStore - Enabling WAL journal mode.
Jul 12 18:25:29 Mac.local apsd[44748]: APSMessageStore - Enabling Foreign Key support.
Run Code Online (Sandbox Code Playgroud)
Dav*_*ing 12
在2015年WWDC CloudKit提示和技巧视频指出,如果要发送一个无声推送通知,您需要设置shouldSendContentAvailable为true你notificationInfo字典,就像这样:
let notificationInfo = CKNotificationInfo()
notificationInfo.shouldSendContentAvailable = true
subscription.notificationInfo = notificationInfo
Run Code Online (Sandbox Code Playgroud)
您的通知注册为iOS 8是正确的,但在OS X,你必须使用registerForRemoteNotificationTypes:的方法NSApplication和iOS 7 registerForRemoteNotificationTypes:的方法UIApplication.文件:
应用必须注册Apple推送通知服务(APN)才能接收应用推送提供商发送的远程通知.在iOS 8及更高版本中,注册有四个阶段:
- 使用registerUserNotificationSettings:注册您的应用支持的通知类型:
- 通过调用应用程序的registerForRemoteNotifications方法注册以通过APN接收推送通知.
- 将服务器返回给应用程序委托的设备令牌存储为成功注册,或者正常处理注册失败.
- 将设备令牌转发给应用程序的推送提供程序.
(在iOS 7中,代替前两个步骤,通过调用UIApplication的registerForRemoteNotificationTypes:方法进行注册,在OS X中通过调用NSApplication的registerForRemoteNotificationTypes:方法进行注册.)
同时实现didReceiveRemoteNotification:fetchCompletionHandler:而不是didReceiveRemoteNotification:
使用此方法处理应用程序的传入远程通知.与应用程序:didReceiveRemoteNotification:方法不同,只有当您的应用程序在前台运行时才会调用该方法,系统会在您的应用程序在前台或后台运行时调用此方法.此外,如果您启用了远程通知后台模式,系统将启动您的应用程序(或将其从暂停状态唤醒),并在远程通知到达时将其置于后台状态.但是,如果用户强行退出,系统不会自动启动您的应用.在这种情况下,用户必须重新启动应用程序或重新启动设备,然后系统才会再次尝试自动启动应用程序.
如果您希望通知唤醒您的应用,请务必编辑Info.plist并选中"启用后台模式"和"远程通知"复选框:

由于您需要一个静默通知,根据文档,您应该只将"content-available"标志发送到1,这样才是正确的.但是还有其他用户遇到静默通知问题,显然,将"声音"属性作为空字符串发送确实有帮助(请参阅此问题),因此您可以尝试设置CKNotificationInfo.soundName为空字符串.
| 归档时间: |
|
| 查看次数: |
2629 次 |
| 最近记录: |