[Xamarin iOS] iOS 9.0 이상에서 웹뷰(WebView)를 사용할때 "http" 사이트가 동작하지 않는다.
보안 문제 때문에 9.0부터는 'http'를 기본 지원하지 않습니다.
권한을 수정하여 'http' 사이트도 볼 수 있도록 해봅시다.
0. 테스트 환경 만들기
자마린 크로스 플랫폼 프로젝트를 생성하고 'MainPage.xaml'을 아래와 같이 작성합니다.
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:WebViewTest"
x:Class="WebViewTest.MainPage">
<ContentPage.Content>
<ScrollView x:Name="svMain">
<WebView x:Name="wvMain" />
</ScrollView>
</ContentPage.Content>
</ContentPage>
'MainPage.xaml.cs'의 생성자를 아래와 같이 작성해 줍니다.
public MainPage()
{
InitializeComponent();
wvMain.Source = new UrlWebViewSource
{
Url = "http://google.com",
};
wvMain.VerticalOptions = LayoutOptions.FillAndExpand;
}
이제 테스트를 해보면 구글이 뜨지 않는 것을 알 수 있습니다.
1. 권한 추가
'http'를 사용하기 위해 권한을 추가합니다.
그런데 그냥 'Info.plist'파일을 열면 강제로 'iOS 매니페스트 편집기'가 실행되면서 임의로 지정된 값들을 날려버리는 문제가 있습니다.
그러므로 직접 XML 편집기를 실행하여 편집해야 합니다.
솔루션 탐색기 > 'Info.plist'을 선택 > 오른쪽 클릭 > '다른 프로그램으로 열기' 선택 > 'XML (텍스트) 편집기'를 선택합니다
전체를 허용하려면 '<dict>' 태그 바로 아래에 다음 값을 넣어 줍니다.
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
특정 도메인만 허용하려면?
만약 특정 도메인만 허용하고 싶다면 아래 코드와 같은 방식으로 도메인을 추가하고 권한을 설정하면 됩니다.
(참고 : xamarin guides - App Transport Security)
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>www.the-domain-name.com</key>
<dict>
<key>NSExceptionMinimumTLSVersion</key>
<string>TLSv1.0</string>
<key>NSExceptionRequiresForwardSecrecy</key>
<false/>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSIncludesSubdomains</key>
<true/>
</dict>
</dict>
</dict>
2. 테스트
권한 설정이 다 되었으면 이제 테스트를 해봅시다.
잘나오네요 ㅎㅎㅎ
3. 오류 해결
오류를 정리합니다.
3-1. 32bit는 지원하지 않는다는 오류
Invalid architecture: i386. 32-bit architectures are not supported when deployment target is 11 or later.
해결방법은 최소 버전을 지정하는 방법입니다.
참고 : [Xamarin iOS] iOS 웹뷰(WebView)에서 "32bit 아키텍처는 11 이상에서 지원되지 않는다." 오류
마무리
자마린 문제라기보다는 플랫폼별로 사상이나 컨샙문제로 인해서 권한이나 기능허용 여부가 다른 것이 제일 큰 문제인 것 같습니다.
이런 문제들만 해결되면 대부분 코드를 자마린 PCL쪽에서 처리할 수 있기 때문에 별문제 없이 진행됩니다 ㅎㅎㅎ
프로젝트 파일