2016-11-16 27 views
7

Sử dụng khung Thông báo người dùng có sẵn trong iOS 10 tôi đã cố kích hoạt thông báo bất cứ khi nào Người dùng nhập vị trí địa lý cụ thể bằng cách sử dụng UNLocationNotificationTrigger. Khi tôi thử kiểm tra nó thông qua trình mô phỏng bằng cách mô phỏng vị trí địa lý, thông báo không được kích hoạt, nhưng Trình quản lý vị trí trả về vị trí địa lý được cập nhật. Điều này có nên được thử nghiệm trong thiết bị thực thay vì chạy nó trong giả lập không?UNLocationNotificationTrigger- Không hoạt động trong trình mô phỏng

+0

Tôi đang gặp sự cố khi nhận thông báo trên thiết bị thực. :/ – Rihards

+0

Tôi có thể nhận được thông báo được kích hoạt dựa trên ngày và giờ sử dụng Khung thông báo người dùng trên cả trình mô phỏng và thiết bị. Tôi chưa kiểm tra thông báo dựa trên vị trí trong thiết bị. – Ashok

+0

Bạn đã cố gắng khắc phục sự cố chưa? Nếu không tôi có thể cho bạn một bàn tay. –

Trả lời

2

Theo Apple Documentation:

Apps phải yêu cầu quyền truy cập vào dịch vụ định vị và phải có điều khoản khi-trong-sử dụng để sử dụng lớp này. Để yêu cầu quyền sử dụng dịch vụ vị trí, hãy gọi phương thức requestWhenInUseAuthorization() của CLLocationManager trước khi lên lịch cho bất kỳ trình kích hoạt dựa trên vị trí nào.

Tuy nhiên với các trình mô phỏng/thiết bị của tôi "khi sử dụng" không đủ, quyền phải được đặt thành "Luôn luôn".

Như vậy, thêm phím này để pinfo.list bạn

<key>NSLocationAlwaysUsageDescription</key> 
<string>We use your location to warn you when there are adorable cats nearby</string> 

Sau đó kích hoạt địa điểm. Xác định trình kích hoạt của bạn chỉ khi bạn chắc chắn mình được ủy quyền luôn, ví dụ: tôi đã làm điều đó ở đây trong didChangeAuthorizationStatus:

class myClass : CLLocationManagerDelegate { 

var locationManager: CLLocationManager() 

func init() { 
    // Note: defining the location manager locally in this function won't work 
    // var locationManager: CLLocationManager() 
    // as it gets gargabe collected too early. 

    locationManager.delegate = self 
    locationManager.requestAlwaysAuthorization() 
    UNUserNotificationCenter.current().delegate = self 
    UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound]) {(accepted, error) in 
    if !accepted { 
     logger.info("Notification access denied.") 
    } 

} 

// MARK CLLocationManagerDelegate: 
func locationManager(manager: CLLocationManager, 
        didChangeAuthorizationStatus status: CLAuthorizationStatus) 
{ 
    if status == .AuthorizedAlways { 

     let region = CLCircularRegion(center: CLLocationCoordinate2D(latitude: 61.446812, longitude: 23.859914), 
        radius: 1000, identifier: "test") 
     logger.info("Notification will trigger at \(region)") 
     region.notifyOnEntry = true 
     region.notifyOnExit = false 

     let trigger = UNLocationNotificationTrigger(region: region, repeats:true) 

     let content = UNMutableNotificationContent() 
     content.title = "Oh Dear !" 
     content.body = "It's working!" 
     content.sound = UNNotificationSound.default() 

     let request = UNNotificationRequest(identifier: "textNotification", content: content, trigger: trigger) 

     UNUserNotificationCenter.current().removeAllPendingNotificationRequests() 
     UNUserNotificationCenter.current().add(request) {(error) in 
      if let error = error { 
       print("Uh oh! We had an error: \(error)") 
      } 
     } 

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