Đặt lại cài đặt thông báo đẩy cho ứng dụng


173

Tôi đang phát triển một ứng dụng với thông báo đẩy. Để kiểm tra tất cả các cách tương tác người dùng có thể, tôi muốn kiểm tra ứng dụng của mình khi người dùng từ chối bật thông báo đẩy cho ứng dụng của tôi trong lần bắt đầu đầu tiên.

registerForRemoteNotificationTypesTuy nhiên, hộp thoại (được khởi tạo bởi ) chỉ xuất hiện một lần cho mỗi ứng dụng. Làm cách nào để đặt lại bộ nhớ cho hệ điều hành iPhone của ứng dụng. Xóa ứng dụng và cài đặt lại không giúp được gì.

Câu trả lời:


300

Lưu ý kỹ thuật TN2265: Xử lý sự cố Thông báo đẩy

Lần đầu tiên một ứng dụng hỗ trợ đẩy đăng ký thông báo đẩy, iOS sẽ hỏi người dùng nếu họ muốn nhận thông báo cho ứng dụng đó. Khi người dùng đã phản hồi với cảnh báo này, nó sẽ không được hiển thị lại trừ khi thiết bị được khôi phục hoặc ứng dụng đã được gỡ cài đặt ít nhất một ngày.

Nếu bạn muốn mô phỏng lần chạy ứng dụng lần đầu tiên, bạn có thể để ứng dụng được gỡ cài đặt trong một ngày. Bạn có thể đạt được thứ hai mà không cần thực sự chờ đợi một ngày bằng cách đặt đồng hồ hệ thống chuyển tiếp một ngày trở lên, tắt hoàn toàn thiết bị, sau đó bật lại thiết bị.

Cập nhật: Như đã lưu ý trong các bình luận bên dưới, giải pháp này đã ngừng hoạt động kể từ iOS 5.1. Tôi sẽ khuyến khích nộp một lỗi với Apple để họ có thể cập nhật tài liệu của họ. Giải pháp hiện tại dường như đang đặt lại nội dung và cài đặt của thiết bị.

Cập nhật: Ghi chú công nghệ đã được cập nhật với các bước mới hoạt động chính xác kể từ iOS 7.

  1. Xóa ứng dụng của bạn khỏi thiết bị.
  2. Tắt hoàn toàn thiết bị và bật lại.
  3. Chuyển đến Cài đặt> Chung> Ngày & Giờ và đặt ngày trước một ngày trở lên.
  4. Tắt thiết bị hoàn toàn một lần nữa và bật lại.

CẬP NHẬT kể từ iOS 9

Chỉ cần xóa và cài đặt lại ứng dụng sẽ đặt lại trạng thái thông báo notDetermined(nghĩa là lời nhắc sẽ xuất hiện).

Cảm ơn câu trả lời của Gomfucius dưới đây: https://stackoverflow.com/a/33247900/704804


16
Có ai đã thử w / iOS 5.1 này chưa? Tôi đã thực hiện chính xác các bước này và tôi vẫn không thể thiết lập lại thiết bị ... Tôi thậm chí đã thử cài đặt đồng hồ trên máy Mac của mình trước khi cài đặt nó qua Xcode.
nrj

1
Ditto ... Tôi đã không nhận được một lời nhắc.
Cướp

2
Apple đã thêm một yêu cầu mới vào hướng dẫn gửi của AppStore, dựa trên ứng dụng để hiển thị lời nhắc. Điều này có thể gợi ý rằng lời nhắc tự động đã bị xóa trong iOS 5.1. Tuy nhiên, không có API để truy vấn cài đặt trung tâm thông báo, vì vậy không chắc mục đích của lời nhắc là gì. Xem phản hồi của tôi về một vấn đề tương tự: stackoverflow.com/questions/10191006/ Kẻ
Greg

10
Chuyện này thật vớ vẩn. Apple không nhận ra rằng các nhà phát triển hoặc thậm chí người dùng có thể muốn đặt lại những thứ này mà không cần sử dụng một cách giải quyết thực sự tồi?
sudo

2
Khi tôi thử điều này trong trình giả lập, tôi nhận được lỗi Code = 3010 "thông báo từ xa không được hỗ trợ trong trình giả lập"
Thomas Zimmer

48

Một cách khác để thử nghiệm giải pháp cho vấn đề này là chỉ cần thay đổi id gói của bạn. Chỉ cần đừng quên thay đổi lại sau khi bạn đã hoàn tất!


12
Bạn cũng không cần tạo chứng chỉ cho id ứng dụng mới để kiểm tra chứ?
Tony

1
Điều này sẽ chỉ hoạt động nếu bạn sử dụng hồ sơ cung cấp dựa trên ký tự đại diện - nếu không, bạn sẽ cần tạo một hồ sơ cho gói mới.
Zorayr

Ngay cả khi bạn cần tạo một hồ sơ mới, đó chỉ là nhấp vào nút "Khắc phục sự cố" và chờ vài giây - nhanh hơn nhiều so với việc trải qua tất cả các chu kỳ khởi động lại.
Ilya

đây là giải pháp nhanh nhất Nó hoạt động khá tốt cho tôi! Khi thay đổi bundle_id, bạn sẽ không thể ký ứng dụng với cùng "hồ sơ cung cấp". Nhưng đừng lo lắng, trong xCode (phiên bản 7.1.1 của tôi), bạn có thể nhấp vào "sửa lỗi" và nó thực hiện công việc. Đồng thời, đừng quên onglet "Khả năng", nơi bạn có thể có một số mục để "sửa chữa" (bằng cách nhấp vào nút "sửa lỗi") và sau đó, nó sẽ hoạt động rất tốt!
Đầm Pháp

Câu trả lời này là một lựa chọn hợp pháp nhưng vẫn là bản sửa lỗi cho tình huống dại dột từ Apple. Tôi không sửa đổi bundleID, cũng không chuyển đổi đồng hồ thiết bị. Chỉ cần thích hợp, bất kỳ nhà phát triển nào cũng có thể viết một số mã ngắn hiển thị UIAlertView hỏi "Cho phép thông báo đẩy?" .. Có = gọi phương thức đăng ký; Không = gọi didFailToRegisterForRemoteNotutionsWithError (vv) .. đó là giải pháp của riêng tôi, mang đi của tôi sau khi đọc Hỏi & Đáp này. Về mặt kỹ thuật, đó là cách tốt nhất, để cung cấp cho người dùng nhận thức về thông tin bảo mật ... TẠI SAO đẩy phải được bật hoặc tùy chọn.
Tom Pace

36

Trên iOS 9.0.2, tôi nhận được "thông báo thông báo đẩy đăng ký" mỗi lần tôi xóa ứng dụng và cài đặt lại. Điều này đúng cho cả tải xuống sản xuất AppStore và chế độ adhoc.

CẬP NHẬT: Được xác nhận rằng nó đang hoạt động cho iOS 9.x


1
Tôi trải nghiệm hành vi tương tự cho iOS 9.x. Tôi khuyên bạn nên chỉnh sửa câu trả lời ban đầu bằng cách thêm CẬP NHẬT:
Yevhen Dubinin

3
Cuối cùng! Không còn xóa ứng dụng, tắt thiết bị, đặt đồng hồ theo thời gian chuyển tiếp và một số thứ ngớ ngẩn như thế này.
mkeremkeskin

19

Như đã lưu ý, cách tiếp cận để đặt lại trạng thái thông báo cho một ứng dụng trên thiết bị được thay đổi cho iOS5 mới hơn.

Điều này hoạt động với tôi trên iOS6:

  • Xóa ứng dụng khỏi thiết bị
  • Đặt thời gian của thiết bị trước hai ngày trở lên
  • Khởi động lại thiết bị
  • Đặt thời gian của thiết bị trước hai ngày trở lên
  • Khởi động lại thiết bị
  • Cài đặt và chạy lại ứng dụng

Tuy nhiên, điều này sẽ chỉ làm cho dấu nhắc ban đầu xuất hiện lại - nó sẽ không xóa bất kỳ nội dung liên quan đến trạng thái đẩy nào khác.


Làm việc cho tôi cũng vậy trên ios7, bạn phải thay đổi ngày hai lần một lần không hoạt động
Nath

1
Cảm ơn bạn! Điều này thậm chí hoạt động trên iOS 8 (Tôi phải đặt lại quyền đẩy cho Twitter.app, vì nó không có cài đặt "Huy hiệu biểu tượng ứng dụng" trong ngăn tùy chọn trong Cài đặt).
gklka

9

Số nguyên: /private/var/mobile/L Library / RemoteNotification / Cleans.plist

... chứa các khách hàng đã đăng ký cho thông báo đẩy. Xóa mục nhập ứng dụng của bạn sẽ khiến lời nhắc xuất hiện lại


11
Câu trả lời vô ích nếu bạn phát triển cho App Store
samvermette

20
Nếu điều này là có thể đối với các công cụ bẻ khóa, thì các nhà phát triển có thể thực hiện trên một chiếc điện thoại không jailbreak, đúng không? Và đó KHÔNG phải là một câu trả lời vô ích, bởi vì đây không phải là thứ bạn đưa vào một ứng dụng để gửi đến cửa hàng. Đó là để các nhà phát triển thực hiện KIỂM TRA THỜI GIAN.
Oscar

1
Tệp này không phải là một phần của iOS 5.x.
gmogames

Xem câu trả lời được cập nhật như một phần của câu hỏi này: stackoverflow.com/questions/13021066/iêng
AriX

7

Làm nó lập trình dường như làm việc cho tôi mọi lúc. Tôi có một bản dựng với dòng sau không bị lỗi:

 [[UIApplication sharedApplication] unregisterForRemoteNotifications];

Tôi chạy nó mỗi khi tôi muốn hủy đăng ký khỏi PN. Bạn có thể phải kết thúc ứng dụng một cách rõ ràng từ danh sách gần đây và chơi xung quanh với Trung tâm thông báo trong ứng dụng Cài đặt để làm cho đúng.

Ngoài ra, lời nhắc UI yêu cầu người dùng đăng ký PN có thể không hiển thị. Không chắc chắn nếu đã bị vô hiệu hóa trong bất kỳ phiên bản iOS gần đây.


Làm việc cho tôi iOS 10 / iPhone 6S. Lưu ý rằng tôi chưa đăng ký, sau đó xóa ứng dụng trước khi cài đặt lại.
Gabriel Jensen

5

Như ianolito đã nói, thiết lập ngày sẽ hoạt động:

Bạn có thể đạt được thứ hai mà không cần thực sự chờ đợi một ngày bằng cách đặt đồng hồ hệ thống chuyển tiếp một ngày trở lên, tắt hoàn toàn thiết bị, sau đó bật lại thiết bị.

Tôi nhận thấy trên thiết bị của mình (iPhone 4, iOS 6.1.2) cài đặt đồng hồ hệ thống một ngày về phía trước hoặc thậm chí một vài ngày không hoạt động với tôi. Vì vậy, tôi đặt ngày chuyển tiếp một tháng và sau đó nó đã hoạt động và ứng dụng của tôi hiển thị lại thông báo nhắc nhở.

Hy vọng điều này sẽ giúp cho bất cứ ai, nó có thể là loại đau đầu!


1
Vui lòng không trả lời với "Hệ điều hành mới nhất" - nó luôn thay đổi. Hành vi này dường như vẫn bị hỏng trong 6.1.2, nhưng có lẽ nó đã hoạt động trong 6.0.1?
patr1ck

Đã chỉnh sửa câu trả lời, vẫn có điều này trong 6.1.2 có và trước đó trong 6.0.1. Nó chỉ hoạt động với tôi nếu tôi ít nhất đặt ngày +1 tháng.
Vincent Cohen

1
Tôi cũng đã nghe thấy điều 24 giờ, vì vậy đã thử nó và nó không hoạt động trong 2 ngày nâng cao. Đặt nó là thích 3 tháng kể từ bây giờ và cửa sổ bật lên cho phép xuất hiện trở lại! Cảm ơn!
marcshilling

Bài cũ nhưng vui mừng khi thấy nó vẫn còn giúp đỡ! Chúc may mắn :)
Vincent Cohen

5

Tôi đồng ý với micmdk .. Tôi đã thiết lập môi trường phát triển với Thông báo đẩy và cần một cách để đặt lại điện thoại của mình giống như cài đặt ban đầu và chỉ những bước chính xác này hoạt động với tôi, đòi hỏi phải khởi động lại HAI thiết bị:

Từ APPLE TECH DOC:

Đặt lại Thông báo quyền thông báo đẩy trên iOS Lần đầu tiên ứng dụng hỗ trợ đẩy đăng ký thông báo đẩy, iOS hỏi người dùng nếu họ muốn nhận thông báo cho ứng dụng đó. Khi người dùng đã phản hồi với cảnh báo này, nó sẽ không được hiển thị lại trừ khi thiết bị được khôi phục hoặc ứng dụng đã được gỡ cài đặt ít nhất một ngày.

Nếu bạn muốn mô phỏng lần chạy ứng dụng lần đầu tiên, bạn có thể để ứng dụng được gỡ cài đặt trong một ngày. Bạn có thể đạt được thứ hai mà không cần thực sự chờ đợi một ngày bằng cách làm theo các bước sau:

  1. Xóa ứng dụng của bạn khỏi thiết bị.

  2. Tắt hoàn toàn thiết bị và bật lại.

  3. Chuyển đến Cài đặt> Chung> Ngày & Giờ và đặt ngày trước một ngày trở lên.

  4. Tắt thiết bị hoàn toàn một lần nữa và bật lại.


Điều này đã được đề cập là không còn làm việc trong một câu trả lời khác.
Beau Nouvelle

Nó hoạt động tốt. Điều ngừng hoạt động trong iOS 5.1 là phiên bản của câu trả lời khác, bỏ qua phần khởi động lại giữa việc xóa ứng dụng và đặt đồng hồ trước.
dgatwood

3

Tôi đã tự hỏi về điều này trong quá khứ và đi đến kết luận rằng nó không thực sự là một trường hợp thử nghiệm hợp lệ cho mã của tôi. Tôi không nghĩ rằng mã ứng dụng của bạn thực sự có thể cho biết sự khác biệt giữa ai đó từ chối thông báo lần đầu tiên hoặc sau đó vô hiệu hóa nó khỏi cài đặt thông báo iPhone. Đúng là trải nghiệm người dùng là khác nhau nhưng điều đó được ẩn bên trong lệnh gọi để đăng kýForRemoteNotificationTypes.

Gọi unregisterForRemoteNotutions không xóa hoàn toàn ứng dụng khỏi cài đặt thông báo - mặc dù nó sẽ xóa nội dung của cài đặt cho ứng dụng đó. Vì vậy, điều này vẫn không khiến hộp thoại được hiển thị lần thứ hai cho người dùng vào lần tiếp theo ứng dụng chạy (ít nhất là không phải trên phiên bản 3.1.3 mà tôi hiện đang thử nghiệm). Nhưng như tôi nói ở trên có lẽ bạn không nên lo lắng về điều đó.


Tôi đã hy vọng cho một câu trả lời tốt hơn, nhưng tôi đoán là không có. Dẫu sao cũng xin cảm ơn!
hanno

3

Ghi chú công nghệ tương tự như được đề cập trong câu trả lời được chấp nhận ( TN2265 - Thông báo khắc phục sự cố đẩy) đã được cập nhật với một giải pháp cho iOS 5 trở lên.

Tóm lại: tạo một bản sao lưu và khôi phục từ nó mỗi lần.

Trên iOS 5 trở lên, hãy đặt lại cảnh báo quyền thông báo đẩy bằng cách khôi phục thiết bị từ bản sao lưu (r. 11450187). Dưới đây là các bước để làm điều này một cách hiệu quả:

  1. Sử dụng Trình tổ chức Xcode để cài đặt ứng dụng của bạn trên thiết bị. Điều quan trọng là cài đặt ứng dụng lần đầu tiên mà không chạy nó.
  2. Sử dụng iTunes để sao lưu thiết bị.
  3. Chạy ứng dụng. Thông báo quyền thông báo đẩy sẽ được trình bày.
  4. Khi bạn muốn đặt lại cảnh báo quyền thông báo đẩy, hãy khôi phục thiết bị từ bản sao lưu bạn đã tạo ở bước đầu tiên.

Nó có thể đã đề nghị rằng tại một thời điểm, nhưng nó không còn nữa. Đề xuất hiện tại là xóa ứng dụng, khởi động lại, đặt đồng hồ chuyển tiếp, khởi động lại, tùy chọn đặt đồng hồ trở lại đúng ngày giờ và chạy ứng dụng.
dgatwood

2

Apple Tech Note cũng mô tả bạn có thể khôi phục thiết bị để đặt lại hộp thoại Thông báo đẩy.

Điều đó không nói rằng bạn cũng có thể sử dụng tùy chọn "Chung -> Đặt lại -> Xóa tất cả nội dung và cài đặt" trên chính thiết bị (iOS 5.x).


1
Để biết giá trị của nó: Tôi chỉ thử 'xóa tất cả các cài đặt' và điều đó không hiệu quả.
Dùng

8
Và "tất cả nội dung và cài đặt" thực sự hoạt động, cảm ơn! Nhưng lựa chọn hạt nhân thần thánh, Batman! Điều đó hoàn toàn điên rồ.
Groxx

94
Tôi đã nghe nói mua một thiết bị mới cũng xóa cảnh báo thông báo đẩy!
samvermette

Tôi đã thử mua một thiết bị mới, nhưng nó cũng không hoạt động. Sau khi đưa thiết bị mới vào thanh thiên tài, họ đã làm việc một số phép thuật và sửa chữa để kiếm thêm tiền ... Tôi ngạc nhiên sau nhiều năm, Apple vẫn không cung cấp một cách thực tế và đơn giản để đặt lại quyền đẩy. Thật nực cười
Chris

1

Ngoài câu trả lời của ianolito.

Có vấn đề tương tự với một ứng dụng tôi đã tải xuống một năm trước và từ chối thông báo đẩy ban đầu. Bây giờ muốn thông báo đẩy trở lại, các bước này đã hoạt động với tôi trên iOS 7 beta. Không chắc chắn điểm nào đã kích hoạt chính xác.

  • Đóng và xóa ứng dụng.
  • Chuyển đến cài đặt iCloud của bạn và xóa ứng dụng khỏi iCloud. Thực hiện việc này trên tất cả các thiết bị khác nơi bạn đã sao lưu iCloud cho các ứng dụng được bật. Sau khi tắt và xóa, tạo một bản sao lưu mới. Ứng dụng không nên được liệt kê nữa trong các bản sao lưu. (Đây có thể là lý do tại sao Ghi chú kỹ thuật từ Apple được mô tả bởi ianolito đã ngừng hoạt động trong iOS 5, do iCloud được giới thiệu trong iOS 5 và nhiều ứng dụng đã sao lưu iCloud cho các ứng dụng được bật.)
  • Chuyển đến cài đặt thời gian của bạn và đặt thời gian hơn 1 tháng trước.
  • Tắt iPhone (không thiết lập lại).
  • Đợi một chút, bật lại và tải xuống ứng dụng một lần nữa.
  • Bắt đầu ứng dụng và tôi đã được trình bày lại hộp thoại.
  • Cho phép sao lưu ứng dụng một lần nữa, vì nó vẫn bị vô hiệu hóa. Đúng thời gian.

Cảm ơn chúa tôi đã không phải "Xóa tất cả nội dung và cài đặt". Có lẽ nó sẽ giúp được ai đó.


1

Gần đây tôi gặp vấn đề tương tự với ứng dụng gốc phản ứng. Phiên bản iPhone OS là 13.1 Tôi đã gỡ cài đặt ứng dụng và thử cài đặt ứng dụng và nhận thấy cả quyền truy cập vị trí và thông báo đều không được nhắc.

Khi kiểm tra cài đặt, tôi có thể thấy ứng dụng của mình đã được bật cho vị trí (từ lần cài đặt trước) tuy nhiên không có mục tương ứng nào chống lại thông báo Đã thử gỡ cài đặt và khởi động lại mà không cài đặt thời gian, nó không hoạt động. Btw, tôi cũng đã thử tải xuống ứng dụng Appstore, vẫn hành vi tương tự.

Vấn đề chỉ được giải quyết sau khi cài đặt thời gian của thiết bị.


0

Sau nhiều giờ tìm kiếm và không gặp may mắn với những gợi ý ở trên, điều này có tác dụng như một cơ duyên cho 3.x +

override func viewDidLoad() {
        super.viewDidLoad()


            requestAuthorization()

}

func requestAuthorization() {

        if #available(iOS 10.0, *) {

            UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge]) { (granted, error) in
                print("Access granted: \(granted.description)")
            }

        } else {
            // Fallback on earlier versions
        }

    }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.