2012-04-24 39 views
18

Phương thức ủy nhiệm ứng dụng của tôi applicationDidBecomeActive: được gọi hai lần để khởi chạy ứng dụng lần đầu tiên. Tôi có một phần mã mà tôi chỉ muốn thực hiện một lần & mà tôi đã đặt vào applicationDidBecomeActive:applicationDidBecomeActive nhận được gọi hai lần

Tôi nên làm gì?

+2

không stack trace trông như thế nào khi bạn thiết lập một breakpoint trên applicationDidBecomeActive :? Nó giống hệt nhau cho cả hai cuộc gọi? Nếu không (và nó không nên), thì điều đó sẽ dẫn bạn đến vấn đề của bạn. –

Trả lời

35

Tôi gặp sự cố. Tôi đang sử dụng Dịch vụ vị trí. Khi khởi chạy lần đầu tiên sau khi tôi nhấn vào "OK" trên cảnh báo dịch vụ vị trí, applicationDidBecomeActive của tôi được gọi một lần nữa, đó là hành vi iOS bình thường.

+0

Ứng dụng của tôi yêu cầu xác thực mỗi lần nó hoạt động. Với cảnh báo vị trí này, người dùng được yêu cầu nhập mật khẩu ngay sau khi cảnh báo bật lên. Tôi cần tránh tình huống đó xảy ra. –

+0

@LocPham: Đề xuất của tôi sẽ là giữ một biến mẫu trong tệp triển khai ứng dụng ủy nhiệm và tăng là bất cứ khi nào applicationDidBecomeActive được gọi. Không thực thi mã cảnh báo đăng nhập của bạn khi biến này có giá trị> 1. Đừng quên đặt lại mã đó. Ngoài ra, đề xuất này hoàn toàn dựa trên yêu cầu của bạn mà không thấy mã của bạn. Có thể là một cách tốt hơn là tốt. – Abhinav

0

Bạn có thể tạo một phiên bản lớp của bạn trong Trình tạo giao diện VÀ trong mã AppDelegate của bạn, có lẽ không?

+0

kiểm tra tốt làm một NSLog (@ "% x", (int) tự); trong đại biểu đó, hãy đảm bảo nó là cùng một cá thể ... –

+0

Ngay cả khi trường hợp này xảy ra, chính đối tượng ứng dụng cũng chỉ có thể có một đại biểu và sẽ chỉ gửi tin nhắn một lần. –

+0

@Grady: Có một thông số định dạng cho con trỏ: 'NSLog (@"% p ", tự);' –

0

Nếu bạn có mã bạn muốn gọi một lần duy nhất khi ứng dụng khởi động, sau đó sử dụng

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 

để thay thế.

Nếu không, ứng dụngDidBecomeActive sẽ được gọi bất cứ khi nào ứng dụng của bạn hoạt động trở lại, do đó không chỉ có ý nghĩa gấp đôi trong trường hợp của bạn mà mỗi lần người dùng chuyển về ứng dụng của bạn sau khi chuyển sang ứng dụng khác.

+0

Chuyển đổi giữa các ứng dụng là tốt. Tôi muốn mã được thực thi thời gian đó. Nhưng trên bản thân lần đầu tiên, nó được gọi hai lần. – Abhinav

1

Tôi không biết điều này có hữu ích hay không, nhưng tôi chỉ gặp vấn đề tương tự với ứng dụng hoàn toàn đơn giản không sử dụng Dịch vụ vị trí và tôi phát hiện ra đó là ảo ảnh. Xem thông báo đăng nhập tôi nhận được:

2012-12-22 10:47:45.329 Bizarro[10416:907] start applicationDidBecomeActive: 
2012-12-22 10:47:45.333 Bizarro[10416:907] end applicationDidBecomeActive: 
2012-12-22 10:47:45.329 Bizarro[10416:907] start applicationDidBecomeActive: 
2012-12-22 10:47:45.333 Bizarro[10416:907] end applicationDidBecomeActive: 

Xem kỹ. Nhìn vào số lần. Các tin nhắn đầu tiên và thứ ba có cùng một lúc. Tin nhắn thứ hai và thứ tư có cùng thời gian. Họ là những tin nhắn tương tự! Đó là lỗi Xcode; nó không liên quan gì đến mã của tôi. Xcode đang báo cáo cùng một thông điệp tường trình hai lần.

Trong trường hợp của tôi, tôi đã có thể ngăn chặn điều này bằng cách tắt tất cả Hành vi để chạy -> Tạo đầu ra.

9

Điều này là do thông báo vị trí hoặc thông báo đẩy.

Sau khi thông báo vị trí/đẩy gốc đã bị loại bỏ, applicationDidBecomeActive sẽ được gọi.

+2

Làm cách nào để chúng tôi phân biệt chính xác giữa ứng dụng "true" applicationDidBecomeActive: khi ứng dụng của chúng tôi thực sự đi vào nền so với cưỡng bức đã đi vào nền do cảnh báo vị trí? –

+0

Ứng dụng của tôi yêu cầu xác thực mỗi lần nó hoạt động. Với cảnh báo vị trí này, người dùng được yêu cầu nhập mật khẩu ngay sau khi cảnh báo bật lên. Tôi cần tránh tình huống đó xảy ra. –

2

Với Xcode 6 có một lý do mới điều này có thể xảy ra: khi bạn khởi chạy ứng dụng trong trình mô phỏng có thể thay đổi kích thước, applicationDidBecomeActive: sẽ được gọi hai lần. Ứng dụng sẽ khởi chạy ứng dụng với lớp kích thước mặc định và sau đó áp dụng kích thước bạn sử dụng lần cuối — ngay cả khi bạn đang sử dụng các giá trị mặc định. Bất cứ khi nào một thay đổi trong lớp kích thước được áp dụng, applicationDidBecomeActive: được gọi.

7

Nếu bạn chỉ muốn gọi mã của mình một lần khi ứng dụng hoạt động, hãy thử gọi mã đó từ hai phương pháp. 1. didFinishLaunchingWithOptions 2. applicationWillEnterForeground

thay vì gọi nó chỉ từ applicationDidBecomeActive.

+1

Đây phải là câu trả lời được chấp nhận. – Darko

0

gì về:

  • Tăng trên applicationDidBecomeActive
  • Decrement vào các sự kiện gọi lại các điều khoản yêu cầu hoặc cảnh báo khác mà kích hoạt khác applicationDidBecomeActive khi đóng cửa.
0

Khi ứng dụng ra mắt đầu tiên thời gian nó gọi liên tục,

  1. didFinishLaunchingWithOptions
  2. applicationDidBecomeActive (Twice)

Khi chúng ta mở Control Center nó chỉ gọi,

applicationDidBecomeActive 

Khi ứng dụng đến từ nền foreground nó gọi tuần tự

  1. applicationWillEnterForeground
  2. applicationDidBecomeActive
Các vấn đề liên quan