2012-03-26 1 views
5

Я не говорю о UIWebView, я хочу открыть приложение для мобильных сафари, используя NSURLRequest.iOS: Можно ли открыть NSURLRequest прямо в Safari?

Почему? В моем приложении пользователь уже зарегистрировался на нашем веб-сервере. Я хочу дать пользователю возможность запуска веб-страницы без повторного ввода их учетных данных. Однако я не могу использовать GET, потому что это приведет к их учетным данным в URL-адресе.

Итак, можно ли открыть приложение для сафари (а не UIWebView) из моего приложения с помощью NSURLRequest или POST в другой форме?

+2

Какую форму управления сеансами вы используете? И, если на то пошло, почему это дорого, чтобы пользователь повторно аутентифицировался в границах учетных данных? – MrGomez

+0

Я никогда не говорил, что это дорого, но главная причина в том, что это то, чего хочет наш клиент. Что касается управления сеансами, веб-сервис MVC 3 .NET, и я считаю, что это всего лишь куки-файл (который мы бы не хотели отправлять по URL-адресу по тем же причинам, что и пароль). – mtmurdock

+0

Я вижу. В конечном счете, вы должны отправить какую-то форму учетных данных через провод, чтобы обеспечить безопасность. Если вы предоставляете HTTPS и разрешаете Safari правильно проверять сертификаты, я рекомендую некоторое понятие идентификатора сеанса или купона аутентификации, отправленного вашим клиентом по проводке. Разве этого было бы недостаточно? – MrGomez

ответ

10

Я собираюсь положить шею на линию и сказать нет - нет способа передать NSURLRequest непосредственно в Safari. (Первичный) среда связи между приложениями в iOS - это доступ к URL-адресам; нет единого механизма передачи объектов из одного приложения в другое.

Я думаю, что лучшее, что вы собираетесь сделать, это получить one-time key со своего веб-сервера в приложении, а затем поместить в Safari с URL-адресом. И, если можно, сделайте это через HTTPS, чтобы URL-адрес и компоненты запроса были видны только после того, как согласование TLS преуспело. Это должно помешать кому-либо еще увидеть соответствующие учетные данные и не дать им быть полезными, даже если они получены другими способами (например, кто-то рядом с вами, копируя URL-адрес с вашего экрана).

+0

Это интересное решение. Я не уверен, могу ли я гарантировать соединение https, но если могу, это может сработать. – mtmurdock

+0

Я немного нейтрален в этом ответе. Я хочу повысить его, но он оставляет большую часть интересных деталей из [как создать сильный одноразовый ключ] (https://en.wikipedia.org/wiki/One-time_pad) и технические подробности Согласование HTTPS, гарантирующее учетные данные в форме пути, не просачивается в мир. В противном случае, я согласен. :) – MrGomez

+0

@MrGomez он оставляет детали из-за того, что мои знания о деталях довольно неточны. Я отметил ответ в качестве вики сообщества, поэтому, надеюсь, кто-то хороший сможет заполнить эти биты? – Tommy

0

Было бы проще использовать NSURL, или просто NSString, или просто char *, если на то пошло. Я не уверен, работает ли это на iPhone, так как iPhone работает параллельно с Darwin, как OSX, но есть некоторые ограничения на iPhone. Это, безусловно, работает на Mac.

NSString *url = @"http://www.apple.com"; 
    NSURL *myURL = [NSURL URLWithString:url]; 
    system([ [NSString 
       stringWithFormat:@"Open -a Safari %@", 
       [NSString stringWithContentsOfURL:myURL encoding:NSUTF8StringEncoding error:NULL] ] 
      cStringUsingEncoding:NSUTF8StringEncoding]); 

Кроме того, я мог бы предположить, что это плохая идея (если ее можно избежать). Как пользователь iPhone, я уверен, что я не одинок, когда обнаруживаю, что это очень раздражает, когда разработчики отвлекают меня от приложения, в котором я сейчас.

+0

Перечитывая свой вопрос, я думаю, что, возможно, неправильно понял его. Извините за бесполезный ответ. – anthropomorphic

+1

На iPhone вы должны использовать '[[UIApplication sharedApplication] openURL: myURL]' вместо того, чтобы открывать системный вызов. Вы получите Safari в соответствии с правилами Apple для третьих сторон, дублирующих встроенные функции, поэтому он в основном такой же, как '[[NSWorkspace sharedWorkspace] openURL: myURL]' на OS X, за исключением того, что вы можете быть уверены, что получите Safari, как предусмотрено исходящий плакат. – Tommy

+0

Полезно знать, спасибо. Я новичок на этом сайте, мне интересно, удалить ли этот пост или оставить его как есть? – anthropomorphic