我将在App的didFinishLaunchingWithOptions方法中创建我的两个didFinishLaunchingWithOptions。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
UIUserNotificationSettings *notificationSettings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert categories:nil];
[[UIApplication sharedApplication] registerUserNotificationSettings:notificationSettings];
[[UIApplication sharedApplication] registerForRemoteNotifications];
_myContainer = [CKContainer containerWithIdentifier:@"iCloud.com.isaranjha.Copyfeed"];
_privateDatabase = [_myContainer privateCloudDatabase];
[_privateDatabase fetchSubscriptionWithID:@"subscription" completionHandler:^(CKSubscription *subscription, NSError *error){
if (subscription) {
} else {
NSPredicate *predicate = [NSPredicate predicateWithValue:YES];
CKSubscription *subscription = [[CKSubscription alloc] initWithRecordType:@"Strings" predicate:predicate subscriptionID:@"subscription" options:CKSubscriptionOptionsFiresOnRecordCreation | CKSubscriptionOptionsFiresOnRecordDeletion | CKSubscriptionOptionsFiresOnRecordUpdate];
CKNotificationInfo *notificationInfo = [CKNotificationInfo new];
notificationInfo.alertBody = @"";
notificationInfo.shouldSendContentAvailable = YES;
subscription.notificationInfo = notificationInfo;
[_privateDatabase saveSubscription:subscription completionHandler:^(CKSubscription *subscription, NSError *error) {
}];
}
}];
[_privateDatabase fetchSubscriptionWithID:@"subscription1" completionHandler:^(CKSubscription *subscription, NSError *error){
if (subscription) {
} else {
NSPredicate *predicate1 = [NSPredicate predicateWithValue:YES];
CKSubscription *subscription1 = [[CKSubscription alloc] initWithRecordType:@"Images" predicate:predicate1 subscriptionID:@"subscription1" options:CKSubscriptionOptionsFiresOnRecordCreation | CKSubscriptionOptionsFiresOnRecordDeletion | CKSubscriptionOptionsFiresOnRecordUpdate];
CKNotificationInfo *notificationInfo1 = [CKNotificationInfo new];
notificationInfo1.shouldSendContentAvailable = YES;
notificationInfo1.alertBody = @"";
subscription1.notificationInfo = notificationInfo1;
[_privateDatabase saveSubscription:subscription1 completionHandler:^(CKSubscription *subscription, NSError *error) {
}];
}
}];
ViewController *view = [[ViewController alloc] init];
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:view];
self.window.rootViewController = navController;
return YES;
}这些都是成功创建的,因为当我注销NSError时,它返回null,每次我打开应用程序之后,它都能够正确地获取它们。然而,当一个记录被创建或删除时,在一个设备上,比如在一个iPhone上,通知不会在另一个设备上触发(或者没有正确地接收到),比如Mac。下面是我如何监听我的Mac上的通知。
- (void)application:(NSApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
NSLog(@"CKSubscription received.");
CKQueryNotification *cloudKitNotification = [CKQueryNotification notificationFromRemoteNotificationDictionary:userInfo];
[[NSNotificationCenter defaultCenter] postNotificationName:@"CloudKitUpdated" object:nil userInfo:@{@"ckNotification" : cloudKitNotification}];
}不幸的是,NSLog从不开火。
发布于 2015-06-22 22:11:28
你有一个空的警报器
通知Info1.警报体=@“;
这样,当应用程序不活动时,您将不会收到推送通知。当您手动激活应用程序时,您将能够使用CKFetchNotificationChangesOperation查询通知。下面是我如何在EVCloudKitDao中使用它的一个片段
public func fetchChangeNotifications(skipRecordID: CKRecordID?, inserted:(recordID:String, item: EVCloudKitDataObject) -> Void, updated:(recordID: String, item: EVCloudKitDataObject) -> Void, deleted:(recordId: String) -> Void, completed:()-> Void) {
var defaults = NSUserDefaults.standardUserDefaults()
var array: [NSObject] = [NSObject]()
var operation = CKFetchNotificationChangesOperation(previousServerChangeToken: self.previousChangeToken)
operation.notificationChangedBlock = { notification in
if notification.notificationType == .Query {
if var queryNotification = notification as? CKQueryNotification {
array.append(notification.notificationID)
if skipRecordID != nil && skipRecordID?.recordName != queryNotification.recordID.recordName {
if queryNotification.queryNotificationReason == .RecordDeleted {
deleted(recordId: queryNotification.recordID.recordName)
} else {
EVCloudKitDao.publicDB.getItem(queryNotification.recordID.recordName, completionHandler: { item in
EVLog("getItem: recordType = \(EVReflection.swiftStringFromClass(item)), with the keys and values:")
EVReflection.logObject(item)
if queryNotification.queryNotificationReason == .RecordCreated {
inserted(recordID: queryNotification.recordID.recordName, item: item)
} else if queryNotification.queryNotificationReason == .RecordUpdated {
updated(recordID: queryNotification.recordID.recordName, item: item)
}
}, errorHandler: { error in
EVLog("ERROR: getItem for change notification.\n\(error.description)")
})
}
}
}
}
}
operation.fetchNotificationChangesCompletionBlock = { changetoken, error in
var op = CKMarkNotificationsReadOperation(notificationIDsToMarkRead: array)
op.start()
EVLog("changetoken = \(changetoken)")
self.previousChangeToken = changetoken
if operation.moreComing {
self.fetchChangeNotifications(skipRecordID, inserted: inserted, updated: updated, deleted: deleted, completed:completed)
} else {
completed()
}
}
operation.start()
}当应用程序处于活动状态时,您应该在应用程序didReceiveRemoteNotification中接收通知。
https://stackoverflow.com/questions/30926075
复制相似问题