2016-04-11 31 views
17

Tôi đã tìm thấy this question nên đã giúp tôi, nhưng giải pháp không có tác dụng đối với tôi và tôi không chắc liệu có điều gì đó đã thay đổi hay không.WatchKit SMS với nội dung cài đặt trước

let messageBody = "hello" 
let urlSafeBody = messageBody.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLHostAllowedCharacterSet()) 
print("URLSAFEBODY: \(urlSafeBody)") 
WKExtension.sharedExtension().openSystemURL(NSURL(string: "sms:&body=\(urlSafeBody)")!) 

Khi mã này được thực thi, tôi nhận được thông báo tùy chọn urlSafeBody là lực không được mở trong khi không dẫn đến sự cố. Tại sao là urlSafeBody không? Tôi biết rằng tôi là lực lượng mở nó, nhưng tôi không hiểu tại sao nó không bao giờ sau khi được giao một cách rõ ràng.

+4

Đây là câu hỏi hợp lệ, không cần bỏ phiếu xuống .. – dbf

Trả lời

9

Nó không phải là urlSafeBody là không. Như bạn có thể nhìn thấy từ tuyên bố in của bạn, nó có chứa một chuỗi tùy chọn:

URLSAFEBODY: Tùy chọn ("hello")

Đó thực sự sẽ bật ra được một vấn đề đối với các chuỗi trong tiếp theo tuyên bố, vì bạn chưa mở chuỗi đó trước khi nó được nội suy.

Nếu bạn kiểm tra URL chuỗi NSURL của bạn, bạn sẽ thấy nó chứa:

sms: & body = Tùy chọn ("hello")

Điều này sẽ gây ra NSURL khởi để không thành công vì URL chuỗi của nó không đúng định dạng. Các lỗi nghiêm trọng sau đó xảy ra vì bạn bắt buộc phải tháo kết quả bằng không từ NSURL(string:)

Làm thế nào để giải quyết này:

Bạn muốn có điều kiện unwrap bất kỳ chuỗi mà có thể là con số không. Bạn có thể làm điều này thông qua if let hoặc guard let tùy chọn ràng buộc:

let messageBody = "hello" 
let urlSafeBody = messageBody.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLHostAllowedCharacterSet()) 
if let urlSafeBody = urlSafeBody, url = NSURL(string: "sms:&body=\(urlSafeBody)") { 
    WKExtension.sharedExtension().openSystemURL(url) 
} 

Chú ý rằng urlSafeBody được tháo trước khi nó được sử dụng trong suy chuỗi, và url cũng được tháo sau khi khởi tạo.

Vì chắc chắn rằng url không phải là số không, nó có thể được chuyển an toàn đến openSystemURL.

Bạn nên luôn cố gắng tránh các biến không tháo gỡ lực có thể là 0, vì điều đó chắc chắn sẽ dẫn đến sự cố.

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