Browsed by
Category: iOS

Bắt HTTP Request trên máy ảo iOS

Bắt HTTP Request trên máy ảo iOS

Hoàn cảnh

Mấy nay đang đánh vật với cái app gửi rồi nhận HTTP request các kiểu. Phải là đang xài Windows thì còn đỡ, có Fiddler thần thánh thì đừng hỏi (không có Fiddler chắc không tồn tại một số không nhỏ các app trên WP Store :3 ). Nhưng mà trên Mac thì không có sẵn vậy. Mặc dù source .NET core đã public nhưng mà chắc vẫn phải chờ một thời gian nữa trước khi các app .NET được port qua cho Mac. Hàng free như Wireshark thì không đủ trình xài, hàng chất như Charles thì không có tiền xài. Thành ra bữa giờ đều phải xài dev tool của trình duyệt, ngồi bắt request rồi code giả lập trở lại.

Rắc rối xảy ra khi vừa nãy gửi một cái GET request từ code, đặt breakpoint trong callback nhưng hoàn toàn không thấy gọi về. Cay! Quyết tâm đào lại Google một lần nữa, lần này thì đào được cái Burp Suite này. Thằng này bản full của nó cũng một đống tiền, hên cái là bản free vẫn đáp ứng đủ yêu cầu. Thế là kéo về chiến.

Cài

Thằng này viết bằng Java nên các bạn chịu khó cài JRE các kiểu trước khi chạy. Chạy được rồi thì vẫn chưa xài được đâu, phải vào config cho nó tí. Trong giao diện chính của nó, các bạn đổi qua tab Proxy (và chúng ta cũng chỉ chủ yếu là việc ở tab này thôi), trong tab Options, các bạn chọn item mặc định có sẵn trong khung Proxy Listeners rồi click Edit. Cửa sổ khác hiện ra, các bạn tick vào tùy chọn All interfaces. Thế là xong, cứ ok hết các kiểu, nó có hiện thông báo gì cũng mặc kệ nó.

Tiếp theo là config cho máy. Các bạn vào System References > Network > chọn connection nào mà bạn muốn theo dõi rồi nhấn Advanced. Cửa sổ hiện ra, các bạn đổi qua tab Proxies rồi enable cái Web Proxy (HTTP) lên, ở phần Web Proxy Server, các bạn tiến hành set Server như hình, port thì phải giống với cái port mới config khi nãy bên thằng Burp Suite. Nếu các bạn muốn bắt thêm HTTPS thì enable luôn thằng ở dưới rồi set thông số tương tự. (Nhưng mà tí nữa xài xong thì nhớ disable tụi này đi :v)

Giờ quay lại thằng Burp Suite, thử reload vài trang bằng trình duyệt để test, thằng Burp Suite nó sẽ bắt hết HTTP request rồi nhét vào tab HTTP history. Đến đây muốn xài với máy ảo thì các bạn tiến hành restart máy ảo (nếu đang chạy) hoặc chạy nó rồi xài. Lưu ý là giữa các lần thay đổi proxy cho máy thì chúng ta phải restart máy ảo thì thay đổi mới có tác dụng.

Nếu

Câu hỏi là: máy ảo chạy ngon rồi, giờ giả dụ deploy ra chạy trên máy thật rồi muốn bắt thì phải làm sao? Cái này cũng không khó, trên iOS device các bạn connect vào cùng một mạng với Mac, sau đó set Manual Proxy bằng cách vào Settings > Wi-Fi > chọn mạng đang connect, kéo xuống dưới cùng rồi set thông tin server + port tương ứng.

Câu hỏi tiếp theo là: port thì biết rồi, y chang khi nãy, còn server thì lấy đâu ra? Câu trả lời là server chính là local IP của Mac, muốn xem cái này thì trên Mac các bạn mở Network References ra (ở đâu chắc khỏi nói nữa ha :v), IP nó sẽ nằm ngay dưới Connection Status.

Kết

Mình vừa xài thử, tất nhiên là không đã như Fiddler, nhưng mà nói chung cũng thỏa mãn, hàng free không dám đòi hỏi nhiều :3 Có điều cài xong ngồi bắt request cho đã vẫn không thấy callback được gọi. PM hỏi thánh thì thánh chỉ, hóa ra là do chơi ngu, đặt breakpoint trong success callback mà không đặt trong failure callback :'( request bị lỗi, nó không gọi về là phải :'(

Chúc các bạn thành công!

YOLO \m/

 

[Xcode] Git và xử lý xung đột với file .pbxproj

[Xcode] Git và xử lý xung đột với file .pbxproj

Vướng

Mình chuyển qua dùng Git cũng được một thời gian, nhưng cũng chỉ dùng như một trình sao lưu code, gần đây thì bắt đầu tập thói quen branch theo các flow phổ biến. Về phía Xcode, Xcode đã tích hợp luôn Git vào từ phiên bản 4, rất tiện để dev (mặc dù mình thấy xài Terminal thì tiện hơn).

Nhưng tách branch lại sinh ra vấn đề khác.

Trong một project gần đây, mình tách một branch usermodel để build user model, mình tách một branch facebooklogin để nhét cái tính năng đăng nhập bằng Facebook. Sau khi dev xong cả 2, mình tiến hành merge usermodel vào facebooklogin (đăng nhập xong thì phải có cái gì đó để lưu thông tin user chứ).

Conflict!

Và cụ thể là ở file project.pbxproj.

Tìm

Đào Google một hồi thì biết project.pbxproj là một file có thể đọc dưới dạng text, nội dung của nó được cấu trúc dưới dạng namevalue, thằng Apple gọi nó là Property Lists, không hẳn giống nhưng mà có chung tư tưởng với JSON. Nhiệm vụ của con khủng long này lưu lại tất cả cấu trúc project hiện tại của bạn: gồm có những file nào, group nào, cái nào nằm trong cái nào, cái nào link cái nào, blah blah blah. Vậy nên việc merge 2 branch này và gặp conflict cũng là điều dễ hiểu, nhất là khi một branch add một đống các file này còn branch kia lại add một đống các file khác. Về mặt lý thuyết thì chúng ta vẫn có thể xử lý conflict bằng tay (đằng nào thì nó cũng có cấu trúc mà :3), nhưng mà thử mở con khủng long này lên thì choáng cmnl :v Bạn nào bảo merge tay không sao thì còn khủng long hơn cả nó :v

Gỡ

Google thêm tí thì đào được giải pháp từ chỗ này, cách làm là tạo một file .gitattributes, nhét vào trong thư mục gốc của project (là cái thư mục có chưa file .xcodeproj ấy :3), file đó sẽ có nội dung như sau:

*.pbxproj binary merge=union

Save lại là xong, giờ merge ngon lành.

Hiểu

Lệnh trên có 2 phần:

  • Phần đầu là tên các file sẽ được áp dụng, cụ thể ở đây là tất cả những file có ext là pbxproj.
  • Phần sau sẽ là các flag:
    • Flag binary : xem file này như là một file binary. Về bản chất, flag binary  tương đương với việc xài kết hợp cùng lúc flag -crlf  (không động đến CRLF) và flag -diff  (không đụng đến khi so sánh).
    • Flag merge=union : lúc merge thì nhét cả 2 cái vào 1 hộ tao.

Túm lại là câu lệnh có nghĩa là: với những file có đuôi pbxproj thì bỏ qua mấy cái vấn đề với CRLF, lúc diff thì đừng có lên nó ra, còn lúc merge thì cứ nhét chung cả 2 cái vô một.

Thế là xong :v chúc các bạn thành công :3

YOLO \m/

Cài đặt và tạo project Cocos2d-x trên Mac OS

Cài đặt và tạo project Cocos2d-x trên Mac OS

Mấy nay tự dưng nổi hứng muốn ngâm cứu tí về game cho iOS. Dạo một vòng thì một số giải pháp được đưa ra:

  • SpriteKit: thằng này của Apple cho không biếu không, làm nhanh gọn lẹ, phải cái chỉ hỗ trợ iOS 7, thế nên là next, nghe đâu 30% tổng số máy iPhone hiện giờ vẫn còn chạy iOS 6 trở xuống.
  • Unity: ngon, và khủng, phải cái muốn xài full tính năng thì phải trả phí, mặc dù không biết có xài hết tính năng không nhưng mà cứ có phí là next.

Nên là mình quyết định sẽ đâm đầu vào Cocos 1 chuyến, nhanh gọn, lại là hàng free. Đến đây lại có thêm 2 lựa chọn khác (rắc rối vãi):

  • Cocos2D: mainly target iOS nên vì thế sẽ phát triển hoàn toàn bằng Objective-C (code Obj-C một thời gian tự dưng thấy yêu hẳn), tất nhiên cũng sẽ hỗ trợ mạnh mẽ Swift (cứ xem cái tên miền là thấy).
  • Cocos2d-x: cross-platform mạnh mẽ hơn, nhưng sẽ dev bằng C++.

Cocos2D về mặt lý thuyết thì vẫn là cross-platform, nhưng nếu muốn đẻ thêm 1 bản Android thì phải thông qua Apportable. Mình chả biết nó là thằng nào, lại chả thấy đề cập đến việc port qua Windows Phone, cho nên là next. Mình sẽ dùng Cocos2d-x, mặc dù dev bằng C++ thì mệt, nhưng mà *nghe đâu* thằng này hỗ trợ quản lý bộ nhớ hết rồi, nên đại khái là không xoắn.

Thế là tải source về các kiểu, chuẩn bị hết rồi, nhưng ngay bước đầu tiên, bạn Cocos2d-x (từ giờ sẽ gọi là CCX) đã tát cho mình ngay một phát rất nhanh và mạnh: không cài đặt được

Mình thử dán mắt vào để soi, nhưng rõ ràng là không sao chỗ nào cả. Sau một hồi đào xới Google thì mình mò được cái StackOverflow, bảo là từ bản 3.1 trở đi phải cài bằng cách khác, chứ cách cũ không còn xài được nữa.

Cài đặt

Hóa ra hướng dẫn tất cả đều nằm trong file README.md trong thư mục tải về, mịa nó trước giờ có bao giờ đọc file README đâu.

Và cụ thể như sau:

$ cd [ĐƯỜNG_DẪN_ĐẾN_THƯ_MỤC_VỪA_TẢI]
$ ./setup.py

Trong quá trình cài đặt nó sẽ hỏi thêm vài thành phần khác nữa như NDK các kiểu, ở đây mình chỉ target iOS nên chỉ cần Enter để bỏ qua mấy cái này.

Sau khi cài đặt xong, nó sẽ yêu cầu bạn execute thêm một câu lệnh nữa để các biến hệ thống nó làm việc, cứ việc làm theo, chả mất gì (thực ra nếu không làm thì lãnh hậu quả ráng chịu =)))) ).

Tạo project

Việc tạo project không còn đơn giản như các phiên bản trước: chỉ cần mở Xcode và chọn các template vừa được cài sẵn. Bây giờ bạn phải tạo project bằng dòng lệnh. Cú pháp đầy đủ như sau.

$ cocos new [-h] [-p PACKAGE_NAME] -l {cpp,lua,js} [-d DIRECTORY]
            [-t TEMPLATE_NAME] [--ios-bundleid IOS_BUNDLEID]
            [--mac-bundleid MAC_BUNDLEID] [--no-native]
            [PROJECT_NAME]

Có rất nhiều flag để dùng, để hiểu rõ hơn về các flag, các bạn có thể dùng lệnh

$ cocos new -h

Ở đây, mình sẽ tạo một project mới tên là TestGame, có package name giống với bundle id là com.quangltp.TestGame, sẽ viết bằng C++, và lưu vào đường dẫn /Volumes/Data/Projects, nên câu lệnh cụ thể mình sẽ xài là

$ cocos new TestGame -p com.quangltp.TestGame --ios-bundleid com.quangltp.com.TestGame -l cpp -d /Volumes/Data/Projects

Câu lệnh này nhìn thì kinh vậy, chứ bản chất của nó chỉ là copy project mẫu có sẵn trong đống vừa tải về khi nãy, dán vào đường dẫn bạn chỉ định, đồng thời đổi tên các thứ linh tinh theo ý bạn thôi.

Sau đó…

Thế là xong. Giờ bạn có thể thử build và chạy thử bằng Xcode hay bằng dòng lệnh, tùy, hoặc có thể dev theo các tut mà bạn tìm được.

Bài này chủ yếu là để mình chia sẻ giái pháp với các bạn gặp rắc rối giống mình, không có ý định viết sê ri các bài hướng dẫn hay gì cả.

Chúc các bạn may mắn!

YOLO \m/