30

Hiện tại tôi đang phát triển một Ứng dụng dựa trên web, nơi Người dùng phải đăng nhập trước tiên.iPhone "Đánh dấu vào màn hình chính" xóa cookie và phiên?

Khi tôi mở Trang bằng iPhone Safari, hãy đăng nhập và khởi động lại Safari, tôi vẫn đăng nhập (Cookie & ID phiên vẫn được đặt).

Nhưng khi tôi thêm trang này với "Thêm vào màn hình chính", mỗi lần tôi bấm vào biểu tượng cho trang đó, tôi phải đăng nhập lại.

Tôi không tìm thấy bất kỳ thông tin nào về điều đó. Tôi có thể làm gì để người dùng của tôi có thể đặt trang này thành màn hình chính làm biểu tượng và vẫn không phải đăng nhập mỗi khi họ mở nó?

Trả lời

3

Có bộ nhớ lưu trữ khóa-giá trị liên tục và bộ nhớ cơ sở dữ liệu có sẵn cho các ứng dụng web. Bạn có thể lưu dữ liệu xác thực của mình bằng cách sử dụng đối tượng localStorage và sử dụng XMLHttpRequest để gửi dữ liệu đó đến máy chủ. Một tùy chọn khác là lưu dữ liệu liên tục của bạn trong cơ sở dữ liệu SQLite, tuy nhiên, đây không phải là giải pháp thích hợp trong trường hợp của bạn. Khám phá số Client-Side Storage and Offline Applications Programming Guide của Apple để biết chi tiết/ví dụ.

+1

:) yên tĩnh phức tạp chỉ để có được kết quả tương tự như trình duyệt Safari. Bạn có ví dụ đơn giản nào không. Chỉ để lưu COOKIES thực tế, vì vậy khi tôi khởi động lại người dùng ví dụ không phải đăng nhập lại. –

+2

Nếu bạn muốn gắn bó với cookie, câu trả lời @favo sẽ là lựa chọn tốt hơn vì: i. cookie được thêm vào tiêu đề http trong thế giới thực, thêm nó vào URL có hiệu ứng tương tự ii. người dùng không thể thay đổi URL nếu ứng dụng màn hình chính của bạn (web clip) đang chạy trong "chế độ độc lập". Một điều cuối cùng: Nếu bạn quan tâm đến bảo mật, bạn có thể sử dụng localStorage để kích thích xác thực 2 chiều. – vincicat

+0

Tôi đã thử điều này. Nó không hoạt động bằng cách sử dụng "đánh dấu vào màn hình chính". Tôi không thể tìm thấy bất kỳ bằng chứng bằng văn bản nào, nhưng từ tất cả các thử nghiệm của tôi, nó xóa cả cookie và localStorage mỗi khi bạn mở nó. –

13

Cách tiếp cận thực sự đơn giản có thể là sử dụng mã thông báo duy nhất trong URL dấu trang có thể phục vụ bạn như một số nhận dạng thiết bị duy nhất.

Ví dụ: http://myWebApp.com/?token=randomId29238/1

Mã có thể được tạo ra ở phía máy chủ tại thời gian mở cửa của các ứng dụng trong Mobile Safari và trước khi người dùng được nhắc nhở với "Add to Home Screen" thông tin. Mã thông báo sau đó có thể được thêm vào URL bằng cách sử dụng chuyển hướng nhanh (… & token = randomToken) hoặc băm vị trí (… # randomToken).

Bất cứ khi nào Dấu trang hiện được mở từ Màn hình chính, mã thông báo được gửi đến máy chủ của bạn và bạn có thể xác định phiên hoạt động của người dùng. Bạn cũng có thể sử dụng mã thông báo làm id phiên vĩnh viễn, nhưng tôi khuyên bạn không nên sử dụng mã đó vì lo ngại về bảo mật.

Để cho phép đăng xuất và đăng nhập trong tương lai, bạn luôn có thể chỉ định phiên mới cho mã thông báo.

Mã thông báo sẽ phân phối bạn làm số nhận dạng thiết bị duy nhất bất cứ khi nào người dùng sẽ mở lại liên kết của bạn từ Màn hình chính.

+0

Tại sao bỏ phiếu xuống? – favo

+0

Tôi nghĩ rằng tôi có thể đã phát hiện ra một chiến lược dễ dàng hơn và thanh lịch hơn, nhưng tôi chưa thể thử nghiệm nó dưới các phiên bản iOS trước 6.0. Tôi đã đăng một câu trả lời dưới đây cho thấy làm thế nào. –

9

Có một giải pháp đơn giản và dễ dàng hơn, thanh lịch hơn favo.

Ít nhất theo iOS 4.2.1, 5.1.1, 6.0 và 6.1 (Tôi không thể kiểm tra các phiên bản khác), nếu bạn kéo dài tuổi thọ của cookie phiên theo cách thủ công, Safari sẽ giữ cookie phiên và thậm chí cho phép chia sẻ phiên giữa phiên bản 'màn hình chính được cài đặt' của ứng dụng web và lượt truy cập thông thường thông qua Safari.

Bí quyết là để làm điều này:

// Start or resume session 
session_start(); 

// Extend cookie life time by an amount of your liking 
$cookieLifetime = 365 * 24 * 60 * 60; // A year in seconds 
setcookie(session_name(),session_id(),time()+$cookieLifetime); 

Đối với một cuộc thảo luận phức tạp hơn của chiến lược này bạn có thể có một cái nhìn vào câu trả lời của tôi về câu hỏi này:

Maintain PHP Session in web app on iPhone

+2

Chỉ cần cố gắng này về một vấn đề tôi đã có, tốt đẹp ít lừa Wilbo, đã cứu tôi rất nhiều thời gian và công sức. – Steven

+0

Tôi không thể làm việc này trên iOS7, theo như tôi có thể biết, không có cookie nào được duy trì ngay cả khi đặt rõ ràng thời gian cookie ra – SWa

+1

Xin chào Kyle, vừa thử nghiệm điều này trong iOS 7.1.1 và nó hoạt động tốt cho tôi (phiên khôi phục thành công sau khi khởi động lại thiết bị). Bạn có chắc chắn ID phiên thực sự thay đổi không? Giải pháp này không lưu trữ một cách kỳ diệu nội dung mà người dùng đang xem, nó chỉ giữ lại cookie phiên để máy chủ của bạn có thể nhận ra cùng một phiên sau đó.Nhưng vẫn còn tùy thuộc vào máy chủ của bạn để nhớ người dùng ở đâu trong phiên đó và sau đó phân phát nội dung đó khi anh ấy quay trở lại ứng dụng web của bạn. –

1

Tôi sẽ để mở rộng thêm một chút về câu trả lời của Waldo Baggins.

Khi tôi gặp phải vấn đề này, tôi phát hiện ra lý do điều này xảy ra là cookie phiên được đặt trên máy chủ thường không có giá trị hết hạn. Hành vi mặc định trong trường hợp này là để trình duyệt loại bỏ cookie khi trình duyệt được đóng/mở lại. Vì trình duyệt không gửi lại cookie khi mở lại, máy chủ không có cách nào để xác định phiên, ngay cả khi nó chưa hết hạn trên máy chủ và do đó, người dùng của bạn được chuyển hướng trở lại trang đăng nhập.

Khi người dùng đang sử dụng trang web của bạn ở chế độ ứng dụng web (biểu tượng được thêm vào màn hình chính), iOS xử lý điều hướng đến/từ ứng dụng giống như cách máy tính để bàn xử lý việc đóng và mở lại trình duyệt và mất phiên khi mở lại. Vì vậy, theo đề nghị của Wilbo và đặt thời gian hết hạn cho cookie, iOS sẽ kiểm tra xem cookie có hết hạn khi người dùng điều hướng trở lại ứng dụng của bạn hay không, và gửi lại cookie, do đó duy trì phiên làm việc . Giá trị của 1 năm trong câu trả lời của Wilbo dài một cách lố bịch, bạn thường muốn thiết lập điều này thành 8 hoặc 24 giờ, và lý tưởng đồng bộ hóa nó với giá trị hết thời gian hết hạn mà bạn đã đặt trên máy chủ. Lưu ý rằng như là một tác dụng phụ, khi trang web của bạn được truy cập từ trình duyệt trên máy tính để bàn và người dùng đóng và mở lại trình duyệt, phiên sẽ tiếp tục tồn tại và người dùng vẫn sẽ đăng nhập, điều này sẽ không được đăng nhập t đã được các trường hợp trước đây (trừ khi họ đang duyệt web tư nhân). Tính năng "Đăng xuất" của bạn sẽ phải xử lý đúng cách hết hạn cookie này.

Đối với một ứng dụng web Java sử dụng web.xml phiên bản 3.0 hoặc cao hơn, cách dễ nhất để làm điều này là để sửa đổi <session-config> như sau:

<session-config> 
    <session-timeout>600</session-timeout> <!-- In minutes --> 
    <cookie-config> 
     <http-only>true</http-only> 
     <secure>true</secure> 
     <max-age>36000</max-age> <!-- In seconds --> 
    </cookie-config> 
</session-config> 
Các vấn đề liên quan