2013-03-03 27 views
15

Tôi không nhận được thông báo về newsstand khi ứng dụng không chạy, dưới đây là những gì tôi đã làm.Chỉ nhận thông báo Newsstand khi ứng dụng đang chạy

Ứng dụng có các phím plist thích hợp 'UINewsstandApp = YES' và 'UIBackgroundModes = newsstand-content'.

Trong ủy nhiệm ứng dụng, tôi đăng ký tất cả các loại thông báo và nhận mã thông báo từ APNS, từ phía máy chủ (tôi đang sử dụng gem gọi là Grocer) i thiết lập chứng chỉ dev và gửi push thông thường. .

nếu tôi gửi một quầy tạp chí, tôi nhận được nếu ứng dụng đang chạy trên 'didReceiveRemoteNotification', nhưng khi ứng dụng không chạy, tôi không nhận được gì trong trung tâm thông báo, chủ yếu là vì 'Grocer' có trọng tải sau {"aps": {"content-available": 1}} và không thể thêm bất kỳ khóa nào khác (cảnh báo, huy hiệu, v.v.)

vì vậy tôi nghĩ rằng tôi không nên nhận bất kỳ điều gì trong trung tâm thông báo, tôi nhìn cho 'UIApplicationLaunchOptionsRemoteNotificationKey' trong tùy chọn khởi chạy và sau đó viết tệp để đảm bảo rằng ứng dụng chạy dưới nền, tệp không bao giờ được viết như vậy

NSDictionary *remoteNotif = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey]; 

if(remoteNotif) 
    { 
     NSString *cachePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 
     NSString *filePath = [cachePath stringByAppendingPathExtension:@"pushreceived.txt"]; 
     [@"testing" writeToFile:filePath atomically:YES encoding:NSASCIIStringEncoding error:nil]; 
    } 

Tôi có NKDontThrottleNewsstandContentNotifications được đặt thành true trong các giá trị mặc định của người dùng và sau đó tôi đồng bộ hóa để đảm bảo.

khi ứng dụng đang chạy, dù có bao nhiêu lần tôi gửi push, tôi luôn luôn có được một cuộc gọi lại vào "didReceiveRemoteNotification", với "nội dung có sẵn" thích hợp

nếu ứng dụng được đóng hoặc trong nền, không có gì xảy ra.

Cập nhật:

tôi quản lý để thay đổi đá quý mà gửi payload thông báo, đây là từ điển nó sẽ gửi

{"aps"=> 
    { 
    "alert"=>"Hello iPhone!!", 
    "content-available"=>1, 
    "badge"=>1, 
    "sound"=>"default" 
    } 
} 

và đây từ điển UserInfo tôi nhận được trên ứng dụng của tôi (trong khi chạy)

{ 
    aps =  { 
     alert = "Hello iPhone!!"; 
     badge = 1; 
     "content-available" = 1; 
     sound = default; 
    }; 
} 

hãy lưu ý các dấu ngoặc kép quanh nội dung có sẵn, điều này có nghĩa là APNS đã phân tích cú pháp đó dưới dạng khóa tùy chỉnh?

Trả lời

3

Để nhận thông báo khi ứng dụng của bạn đang chạy ẩn, bạn cần thêm phương thức applicationDidEnterBackgroud vào lớp chính của mình. Từ số Apple documentation:

Ứng dụng cũng có thể tìm thấy thông báo cục bộ hữu ích khi chúng chạy ẩn và một số thông báo, dữ liệu hoặc mục khác có thể quan tâm đến người dùng. Trong trường hợp này, họ sẽ trình bày thông báo ngay lập tức bằng phương thức UIApplication presentLocalNotificationNow: (iOS cung cấp cho ứng dụng một thời gian giới hạn để chạy trong nền). Listing 2-2 minh họa cách bạn có thể thực hiện việc này.


- (void)applicationDidEnterBackground:(UIApplication *)application { 
    NSLog(@"Application entered background state."); 
    // bgTask is instance variable 
    NSAssert(self->bgTask == UIInvalidBackgroundTask, nil); 

    bgTask = [application beginBackgroundTaskWithExpirationHandler: ^{ 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      [application endBackgroundTask:self->bgTask]; 
      self->bgTask = UIInvalidBackgroundTask; 
     }); 
    }]; 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     while ([application backgroundTimeRemaining] > 1.0) { 

      // Replace this code with your notification handling process 

      NSString *friend = [self checkForIncomingChat]; 
      if (friend) { 
       UILocalNotification *localNotif = [[UILocalNotification alloc] init]; 
       if (localNotif) { 
        localNotif.alertBody = [NSString stringWithFormat: 
         NSLocalizedString(@"%@ has a message for you.", nil), friend]; 
        localNotif.alertAction = NSLocalizedString(@"Read Message", nil); 
        localNotif.soundName = @"alarmsound.caf"; 
        localNotif.applicationIconBadgeNumber = 1; 
        [application presentLocalNotificationNow:localNotif]; 
        [localNotif release]; 
        friend = nil; 
        break; 
       } 
      } 
     } 
     [application endBackgroundTask:self->bgTask]; 
     self->bgTask = UIInvalidBackgroundTask; 
    }); 

} 

Cũng note:

Bởi vì loại thông báo chỉ được hỗ trợ cho các ứng dụng không chạy là biểu tượng-huy hiệu, chỉ cần vượt qua NSRemoteNotificationTypeBadge như tham số của registerForRemoteNotificationTypes :.

+0

thông báo quầy báo 'trong lý thuyết' sẽ có thể khởi động ứng dụng ngay cả khi nó được tắt bằng 'UIApplicationLaunchOptionsRemoteNotificationKey' .. điều đó không xảy ra tại – Zoidberg

+0

@Zoidberg câu trả lời này có hữu ích không? http://stackoverflow.com/a/4296282/187954 –

+0

Thật đáng buồn, nó không phải là, đó là bản chất những gì tôi đang làm trong các mã trong câu hỏi của tôi: < – Zoidberg

2

Hãy thử những trò kiểm tra sự tỉnh táo:

  • Trong Cài đặt -> Newsstand, bạn có nội dung tải về tự động như trên cho ứng dụng của bạn.
  • Đảm bảo rằng bạn đã sử dụng [[UIApplication sharedApplication] registerForRemoteNotificationTypes:UIRemoteNotificationTypeNewsstandContentAvailability] somehwere trong ứng dụng của mình.
  • Đảm bảo rằng bạn đã yêu cầu chế độ nền là 'newsstand-content' trong plist của bạn.
  • Chạy ứng dụng trong thiết bị, không có trong trình mô phỏng.

Nếu bạn đã làm đúng, bạn sẽ nhận được thông báo trong didReceiveRemoteNotification ngay cả khi ứng dụng của bạn không chạy.

Các vấn đề liên quan