[Unity3D] เราจะแก้ปัญหา NSURLErrorDomain error -1012 ใน WWW class ของ Unity 5 ใน iOS ได้อย่างไร? by

30
May
0

เนื่องจากตอนนี้ Unity 5 ก็ออกมาสักพักใหญ่แล้ว แถมฟรีอีกตะหาก (ถ้ารายได้ไม่ถึงเป้า) เราก็ควรจะใช้ Unity 5 กันใช่ไหมครับ แต่ช่วงนี้ Unity 5 ได้ทำ bug (อันใหญ่หลวง) เอาไว้ นั่นคือหากเราใช้ WWW class เรียกไปที่ URL ใดๆ ที่เป็น https จะทำให้ไม่สามารถรับข้อมูลจาก URL นั้นๆ ได้เลย จะ WWW class จะแจ้ง error กลับมาว่า

The operation couldn’t be completed. (NSURLErrorDomain error -1012.)

ซึ่งเว็บเกมของผมเป็น HTTPS ทั้งหมดจึงกระทบเต็มๆ และบางคนอาจจะคิดว่าผมไม่พบปัญหานี้หรอก แต่ถ้าคุณต้องมีการเรียก Profile picture จาก  Facebook แล้วละก็ยังไงคุณก็จะถูกบังคับให้เรียกผ่าน HTTPS โดยอัตโนมัติ ถึง URL จะไม่ได้ระบุเป็น HTTPS  ก็ตาม เช่น http://graph.facebook.com/my_facebook_id/picture แต่สุดท้าย Facebook ก็จะ Redirect ไปยังที่อยู่รูปจริงๆ ที่เป็น HTTPS อยู่ดี และทำให้ไม่สามารถแสดงรูป profile facebook ได้ในที่สุด

จริงๆ แล้วปัญหานี้มีการแจ้งกันมาตั้งแต่เดือนมีนาคมแล้ว และ Unity ก็บอกว่าแก้ไปแล้วในเวอร์ชั่น 5.x.x แต่จนแล้วจนรอดก็ยังไม่ได้แก้จริงสักที ณ เวอร์ชั่นปัจจุบัน 5.0.1f ล่าสุดก็ยังไม่ได้แก้ ดังนั้นเราคงจะรอกันไม่ได้ ต้องหาวิธีแก้กันเอง โดยวิธีแก้ก็คือให้สร้างไฟล์ชื่อว่า CustomConnection.mm ขึ้นมา และใส่ code ด้านล่างลงไป

#include "Unity/WWWConnection.h"
@interface UnityWWWCustomRequestProvider : UnityWWWRequestDefaultProvider
{
}
+ (NSMutableURLRequest*)allocRequestForHTTPMethod:(NSString*)method url:(NSURL*)url headers:(NSDictionary*)headers;
@end
@implementation UnityWWWCustomRequestProvider
+ (NSMutableURLRequest*)allocRequestForHTTPMethod:(NSString*)method url:(NSURL*)url headers:(NSDictionary*)headers
{
NSMutableURLRequest* request = [super allocRequestForHTTPMethod:method url:url headers:headers];
// let's pretend for security reasons we dont want ANY cache nor cookies
request.cachePolicy = NSURLRequestReloadIgnoringLocalCacheData;
[request setHTTPShouldHandleCookies:NO];
return request;
}
@end
@interface UnityWWWCustomConnectionDelegate : UnityWWWConnectionSelfSignedCertDelegate
{
}
@end
@implementation UnityWWWCustomConnectionDelegate
- (NSCachedURLResponse*)connection:(NSURLConnection*)connection willCacheResponse:(NSCachedURLResponse*)cachedResponse
{
// we dont want caching
return nil;
}
- (void)connection:(NSURLConnection*)connection didReceiveResponse:(NSURLResponse*)response
{
[super connection:connection didReceiveResponse:response];
}
@end
IMPL_WWW_DELEGATE_SUBCLASS(UnityWWWCustomConnectionDelegate);
IMPL_WWW_REQUEST_PROVIDER(UnityWWWCustomRequestProvider);

จากนั้นเซพไปที่ Assets/Plugins/iOS/CustomConnection.mm เท่านี้เป็นอันจบ ไม่ต้องไป set path ใดๆ เพิ่มเติม Unity จะจัดการของมันเองต่ออัตโนมัติ โดยหลักการทำงานของมันคือการแก้ไข class WWW ของ Unity ด้วยตัวเราเองผ่าน Plugin เพื่อ bypass cache บางอย่างที่ WWW ทำงานผิดพลาด สามารถอ่านรายละเอียดเพิ่มเติมได้ที่ Manual หน้านี้ครับ

ซึ่งวิธีแก้วิธีนี้ก็มาจากคนของ Unity นั่นแหละมาโพสต์บอกใน Forum ของเขาเองที่มีคนถาม แต่ด้วยเหตุผลประการใดก็ไม่อาจทราบได้ ตัว Unity หลักๆ กลับไม่ถูกแก้ไขเสียทีจนเราต้องมาแก้ไขเองนี่แหละ เท่านี้เป็นอันจบพิธีครับ :)

[Unity] วิธีเพิ่ม frameworks หรือ library ให้กับ XCode โดยอัตโนมัติ by

30
Nov
0

เคยไหมที่ Build project Unity for iOS แล้วต้องมา add framework/library เพิ่มเอง? Build กี่ทีก็ต้องมา add เองทุกครั้ง วันนี้ผมมีวิธีช่วยให้ไม่ต้องทำอย่างนั้นแล้ว :)

หมายเหตุ: ก่อนอื่นต้องบอกก่อนว่าผมใช้ Library Facebook for Unity ในการทำอยู่แล้วจึงสามารถทำแบบนี้ได้ หากใครไม่ได้ใช้อาจจะต้องดึงไฟล์บางส่วนมาใช้เอง หรือใช้ Library mod-pbxproj แทน แต่ผมลองแล้วมันไม่สำเร็จ (ฮ่าๆ)

วิธีการก็ง่ายมาก ถ้าใช้ Library Facebook for Unity อยู่แล้ว ให้เข้าไปแก้ไฟล์ Assets/Facebook/Editor/iOS/fixup.projmods โดยหน้าตาจะเป็นดังนี้


{
"group": "Facebook",
"patches": [],
"libs": [
"libsqlite3.0.dylib:weak",
"Facebook/Editor/iOS/FacebookSDK/FacebookSDK.a:",
],
"librarysearchpaths": [
"Facebook/Editor/iOS/FacebookSDK/",
],
"frameworks": [
"Accounts.framework:weak",
"AdSupport.framework:weak",
"Social.framework:weak",
"Security.framework:weak",
],
"headerpaths": [
"Facebook/Editor/iOS",
"Facebook/Scripts"
],
"files": [
"Facebook/Editor/iOS/FbUnityInterface.mm",
"Facebook/Editor/iOS/FbUnityInterface.h",
"Facebook/Scripts/NativeDialogModes.cs",
],
"folders": [],
"excludes": ["^.*\\.meta$", "^.*\\.mdown^", "^.*\\.pdf$"]
}

จะเป็นไฟล์ JSON เรามาดูทีละส่วน

  • libs : ให้ใส่พวกไฟล์ .a หรือ .dylib (อย่าลืมใส่ :weak, : ตามตัวอย่าง)
  • frameworks: ใส่พวก .framework (อย่าลืมใส่ :weak ตามตัวอย่าง)
  • files: ใส่พวก .mm, .h, .cs

เพียงเราเพิ่ม comma เขียนต่ออีกบรรทัดในแต่ละส่วน แล้วสั่ง Build เราก็จะได้ Project XCode ที่ไม่ต้องมา add library เองให้เมื่อยอีกต่อไป ง่ายมากๆ เลยใช่ไหม :) ตัวอย่างสิ่งที่ผมเพิ่มเข้าไปตามด้านล่าง


{
"group": "Facebook",
"patches": [],
"libs": [
"libsqlite3.0.dylib:weak",
"libz.dylib:weak",
"Facebook/Editor/iOS/FacebookSDK/FacebookSDK.a:",
],
"librarysearchpaths": [
"Facebook/Editor/iOS/FacebookSDK/",
],
"frameworks": [
"Accounts.framework:weak",
"AdSupport.framework:weak",
"Social.framework:weak",
"Security.framework:weak",
"CoreTelephony.framework:weak",
"MessageUI.framework:weak",
"EventKitUI.framework:weak",
"EventKit.framework:weak",
"CoreData.framework:weak"
],
"headerpaths": [
"Facebook/Editor/iOS",
"Facebook/Scripts"
],
"files": [
"Facebook/Editor/iOS/FbUnityInterface.mm",
"Facebook/Editor/iOS/FbUnityInterface.h",
"Facebook/Scripts/NativeDialogModes.cs",
],
"folders": [],
"excludes": ["^.*\\.meta$", "^.*\\.mdown^", "^.*\\.pdf$"]
}

 เราชนะรอบ 4 | ยืมเงิน 3000 ด่วน | แอพกู้เงิน | แอพเงินด่วน | สินเชื่อออนไลน์อนุมัติทันที | Site Map | กู้เงินก้อน | กระเป๋าตัง | thisshop และ ยืมเงินฉุกเฉิน 5000 ด่วน