2015-04-30 18 views
9

Tôi gặp sự cố khi tìm cách chuyển sang Safari từ ứng dụng gốc trong iOS 7 trở lên. Tôi đã sử dụng UIApplication.sharedApplication.openURL(), nhưng điều đó sẽ mở ra một tab mới. Tôi muốn trả lại người dùng cho trang hiện tại mà anh/cô ấy đã xem trước đó mà không cần mở tab mới. Tôi tìm thấy this SO bài, nhưng nó là một vài năm tuổi, vì vậy tôi đã hy vọng mọi thứ đã thay đổi kể từ đó.iOS - Trở về Safari từ ứng dụng gốc mà không cần mở Tab mới

Đây là công việc tôi đang hình dung:

  1. dùng chạm vào một liên kết trên một trang HTML trên Safari để mở/cài đặt ứng dụng của tôi
  2. tài thực hiện một hành động trên ứng dụng của tôi
  3. Sau người dùng thực hiện xong hành động, ứng dụng của tôi sẽ tự động mở Safari và người dùng quay lại trang nơi anh/cô ấy đã rời khỏi

Google đã thực hiện điều này bằng ứng dụng Google Maps của họ. Nếu bạn tìm kiếm địa chỉ trên google.com trên Safari, bạn có thể nhấn vào bản đồ xuất hiện trong kết quả tìm kiếm và nó sẽ mở ứng dụng Maps. Ở đầu ứng dụng Maps sẽ là thanh "Quay lại Safari" mà bạn có thể nhấn. Khi bạn nhấn vào nó, bạn sẽ được trả về Safari mà không cần tải một tab khác. Tôi dường như không thể tìm thấy bất kỳ điều gì liên quan đến cách Google thực hiện việc này. Nếu tôi có thể tái tạo hành vi đó trong ứng dụng của tôi, điều đó sẽ hoạt động tốt.

Bất kỳ trợ giúp nào sẽ được đánh giá rất nhiều!

+0

Vui lòng xem câu trả lời của tôi và dự án Github. –

Trả lời

7

Có cách để thực hiện những gì bạn muốn bằng API iOS chuẩn. Không cần phải sử dụng các thành phần bên ngoài.

Bạn kiểm soát trang web và ứng dụng của mình để biết URL chính xác có liên kết đến ứng dụng của bạn.

Đây là các bước:

1) Trong ứng dụng của bạn, xác định lược đồ URL tùy chỉnh. Trong trường hợp này, giả sử bạn sử dụng lược đồ myawesomeapp://. Bạn có thể làm điều này trong dự án Xcode của bạn bằng cách đi đến phần Thông tin của mục tiêu của bạn. Xem dưới đây

Defining a custom URL scheme

2) Trong trang web của bạn, bạn cần phải xử lý hai kịch bản: ứng dụng cài đặt/không được cài đặt. Nó chỉ là vấn đề phát hiện nếu một ứng dụng phản ứng lại sơ đồ myawesomeapp://.

Để phát hiện từ trang web của bạn nếu ứng dụng của bạn không được cài đặt vui lòng tham khảo this post

tôi sẽ giải thích trường hợp ứng dụng của bạn đã được cài đặt.

Hãy nói rằng các trang web có chứa liên kết là:

http://www.mywebsite.com/mypage.html#mytag

Các liên kết mà bạn cung cấp trong trang web của bạn phải vượt qua một số thông số để ứng dụng và là một trong những nên là URL mà bạn muốn ứng dụng trở về. Sau với ví dụ các liên kết có thể là:

myawesomeapp://?action=my_action_1&sourceurl=http%3A%2F%2Fwww.mywebsite.com%2Fmypage.html%23mytag

Lưu ý rằng URL bạn vượt qua như một tham số trong chương trình này có được URL encoded hoặc nó sẽ không hoạt động đúng.

3) Trong đại biểu ứng dụng của bạn, bạn cần phải thực hiện phương pháp này:

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation

Trong phương pháp này, phân tích cú pháp URL, giải mã các mục truy vấn và vượt qua sourceURL với bộ điều khiển xem có trách nhiệm xử lý các hành động trước khi gọi nó. Trong trường hợp này, tôi thiết lập một thuộc tính công khai trong ViewController để lưu trữ URL.

@property (nonatomic, strong) NSURL *sourceURL;

4) Trong điều khiển xem khi người dùng kết thúc sự tương tác, bạn chỉ cần gọi:

[[UIApplication sharedApplication] openURL:self.sourceURL];

self.sourceURL chứa URL của trang web của bạn, Safari sẽ được tung ra với URL. Tuy nhiên, vì trang đó đã được mở, iOS phát hiện và mở lại trang đó.

Tôi có một dự án mẫu trong số Github page thực hiện tất cả điều này.

Và để hoàn thành, sau khi bạn cài đặt các dự án mẫu trong iPhone của bạn, mở này bài stack overflow từ điện thoại di động Safari và open my awesome app

Một khi ứng dụng được mở ra, bấm vào nút và bạn sẽ trở lại stack overflow này bài đăng.

+2

Wow, cảm ơn vì sự phản hồi tuyệt vời và toàn diện !! Tôi sẽ xem xét lại câu trả lời này và thử nó vào thứ ba! – Alexander

+0

@Alexander cho tôi biết nếu bạn cần trợ giúp về dự án Github. –

+1

Tuyệt vời, tôi hiểu nó hoạt động! Cảm ơn bạn rất nhiều vì câu trả lời chi tiết của bạn và mã mẫu! Có cách nào để ngăn Safari tải lại trang sau khi nó mở tab hiện tại không? – Alexander

1

Hành vi bạn mô tả chính xác là những gì FB's AppLinks được thiết kế cho và bạn sẽ nhận được hành vi tương tự với tất cả các ứng dụng iOS hỗ trợ ứng dụng đó (khá nhiều) ngoài hộp!

Bằng cách này, Google Maps sử dụng cùng một thành phần: bạn có thể thấy nó nếu bạn mở Google Maps từ giả sử Fantastical.app! enter image description here

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