App Transport Security has blocked a cleartext HTTP (http://) Solved

App Transport Security has blocked

สวัสดีครับ วันนี้ผมจะมาแนะนำวิธีแก้ปัญหาที่บอกเลยว่า “ต้องเจอทุกคน!” ในการเขียน app iOS ยุคนี้

ขอเล่าที่มาของปัญหานี้สักเล็กน้อยนะครับ ตั้งแต่มี iOS 9 เกิดขึ้นมา Xcode ก็ปรับตัวตามโดยออกมาเป็น Xcode 7 โดยมีการอัพเกรดที่สำคัญหลายๆอย่างด้วยกัน แต่จุดนี้ที่จะให้ดูคือการให้ความสำคัญในเรื่องของความปลอดภัยในการเรียกใช้ข้อมูลจาก network หรือเรียกง่ายๆคือการเรียกใช้งาน API นั่นเองครับ

หลายๆคนคงเคยใช้งาน AFNetwork, Alamofile หรือหากใครโหดๆหน่อยใช้งาน API โดยไม่ผ่าน framework ดังกล่าว ก็จะต้องใช้งาน NSURLRequest แน่นอน ปัญหาที่พบเลยนั่นคือ… “ทำไมข้อมูลมันไม่มานะ url ก็ถูกต้องแล้วนี่นา?” หากได้สังเกตที่ Consol ด้านล่างแล้วจะพบข้อความ error ปรากฎดังนี้

App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure. Temporary exceptions can be configured via your app’s Info.plist file.
Error Domain=NSCocoaErrorDomain Code=3840 “No value.” UserInfo={NSDebugDescription=No value.}

แปลเป็นภาษาง่ายๆเลยก็คือ ต่อไปนี้ห้ามเรียกใช้ http:// แล้วนะ มันไม่ปลอดภัย ต้องใช้งานด้วย https:// เท่านั้น

แน่นอนว่าบางคนก็ไม่พร้อมที่จะมี server ที่รองรับ https ในการใช้งาน แบบนี้จะทำอย่างไร ก็แก้ได้ง่ายๆด้วย 2 วิธีครับ
1. บอก Xcode ไปเลย “ไม่เป็นไรนะ ไม่ต้องห่วงฉัน ฉันยังอยากจะใช้งาน http แบบเดิม ขอบคุณครัช”
วิธีนี้ต้องไปเพิ่มค่าที่ info.plist โดยใส่ค่านี้ลงไป

<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>

2. บอก Xcode ว่า “ขอให้ฉันใช้ http เถอะนะ ขอแค่เป็นบาง url ก็พอแล้ว(ครัช)”
ทำตามนี้เลยครับที่ info.plist เช่นเดิม

<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<!– url ที่ต้องการขอยกเว้น–>
<key>yourserver.com</key>
<dict>
<!–Include to allow subdomains–>
<key>NSIncludesSubdomains</key>
<true/>
<!–Include to allow HTTP requests–>
<key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
<true/>
<!–Include to specify minimum TLS version–>
<key>NSTemporaryExceptionMinimumTLSVersion</key>
<string>TLSv1.1</string>
</dict>
</dict>
</dict>

ลองทำตามดูนะครับ สบายหายห่วง แก้ไขปัญหาได้แน่นอน

Credit: http://stackoverflow.com/questions/31254725/transport-security-has-blocked-a-cleartext-http