2015-12-15 22 views
5

Theo tài liệu của Apple, tôi có thể đăng ký thông báo im lặng bằng cách thêm "content-available" = 1 khóa-giá trị trong aps từ điển tải trọng. Tôi muốn ứng dụng của mình thức dậy dưới nền khi có thông báo im lặng. Tôi đặt App downloads content in response to push notifications giá trị cho Required background modes trong info.plist của tôiThông báo đẩy im lặng của Apple có thể khởi chạy ứng dụng của tôi trong nền không?

Đây là từ điển tải trọng của tôi

{"aps": 
     { 
     "alert":"Notification alert","badge":1,"sound":"default","content-available":1 
     } 
} 

Tôi nhận được callbacks trong -(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler trong khi ứng dụng của tôi là ở chế độ nền. Nhưng câu hỏi của tôi là chúng ta có thể gọi lại cho phương thức này hay bất kỳ phương thức nào khác khi ứng dụng của chúng ta ở trạng thái bị giết không?

Tôi không muốn người dùng ứng dụng của mình thấy thông báo nhưng tôi muốn ứng dụng của tôi thực hiện một số tác vụ nhất định bằng cách đánh thức nó trong nền thông qua thông báo im lặng.

Mọi đề xuất sẽ được đánh giá cao.

Trả lời

4

Khi thiết bị nhận được thông báo đẩy với content-available thiết lập, ứng dụng của bạn sẽ được khởi chạy trong nền của Apple. Người dùng sẽ không nhận thức được điều đó. From the docs:

nội dung có sẵn: Cung cấp khóa này với giá trị là 1 để cho biết rằng nội dung mới có sẵn. Bao gồm khóa và giá trị này có nghĩa là khi ứng dụng của bạn được khởi chạy ở chế độ nền hoặc tiếp tục lại, -application:didReceiveRemoteNotification:fetchCompletionHandler: được gọi.

+0

Bạn nói đúng nhưng vấn đề là nếu đơn đăng ký của tôi ở trạng thái bị giết và thông báo im lặng đến trước khi ứng dụng của tôi không khởi chạy ở chế độ nền. –

+0

Bạn có chắc chắn không? Điều này có thể khó gỡ lỗi. Bạn có thể thấy nó dễ nhất (nếu Xcode debug-fu của bạn không phải là 100%) để viết nhật ký cho một tệp khi ứng dụng của bạn được khởi chạy để bạn có thể thấy ứng dụng đang kích hoạt ngay cả khi bạn không được đính kèm với Trình gỡ lỗi Xcode. Công nghệ này chắc chắn hoạt động, nhưng [có một số quirks thường xuyên] (http://stackoverflow.com/questions/19239737/silent-push-notification-in-ios-7-does-not-work). – TwoStraws

+1

Nếu ứng dụng của bạn bị người dùng chấm dứt theo cách thủ công, điều này thường được thực hiện như một gợi ý của hệ điều hành mà người dùng * thực sự * không muốn nó chạy. Chắc chắn một số quy trình "nền" khác trong iOS (ví dụ: chuyển tệp nền bằng NSURLSession) cụ thể * không * khởi động ứng dụng của bạn như bình thường nếu nó bị giết khỏi trình chuyển đổi ứng dụng.Tôi không biết về trường hợp cụ thể này, nhưng nó sẽ không làm tôi ngạc nhiên khi thấy rằng một ứng dụng được chấm dứt thủ công sẽ không đánh thức thông báo đẩy cho đến khi nó được người dùng bắt đầu lại theo cách thủ công. –

4

Tôi đã phải đối mặt với một loại kịch bản tương tự, tôi đã viết mã này để gỡ lỗi nếu ứng dụng của tôi đang thức dậy trên thông báo im lặng hay không.

-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler 
{ 
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    NSString *str = [defaults objectForKey:@"key"]; 
    if (str == nil) { 
     str = @"didReceiveRemoteNotification"; 
    }else{ 
     str = [NSString stringWithFormat:@"%@, didReceiveRemoteNotification",str]; 
    } 
    [defaults setObject:str forKey:@"key"]; 
    [defaults synchronize]; 
} 

Mã này hoạt động như thế, nếu bạn thức dậy hơn bạn sẽ nhận được gọi lại trong phương thức này và tên phương thức sẽ được viết bằng NSUserDefaults. Vì vậy, khi bạn gỡ lỗi ứng dụng của mình theo cách thủ công, bạn có thể thấy giá trị của biến số str chuỗi, nếu có chuỗi didReceiveRemoteNotification hơn bạn sẽ biết rằng ứng dụng của bạn đã thức dậy.

Lưu ý: Tính năng này chỉ hoạt động ở chế độ nền cho tôi. Tôi nhận được giá trị khi tôi không buộc chặt chẽ (chấm dứt bằng tay) ứng dụng của tôi nhưng khi tôi buộc đóng ứng dụng của tôi từ trình chuyển đổi ứng dụng tôi sẽ không nhận được bất kỳ giá trị nào.

Tôi hy vọng nó hoạt động.

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