

<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Swift &#8211; Max的程式語言筆記</title>
	<atom:link href="https://stackoverflow.max-everyday.com/tag/swift/feed/" rel="self" type="application/rss+xml" />
	<link>https://stackoverflow.max-everyday.com</link>
	<description>我要當一個豬頭，快樂過每一天</description>
	<lastBuildDate>Wed, 30 May 2018 08:42:03 +0000</lastBuildDate>
	<language>zh-TW</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.1</generator>

<image>
	<url>https://stackoverflow.max-everyday.com/wp-content/uploads/2017/02/max-stackoverflow-256.png</url>
	<title>Swift &#8211; Max的程式語言筆記</title>
	<link>https://stackoverflow.max-everyday.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>How can we programmatically detect which iOS version is device running on?</title>
		<link>https://stackoverflow.max-everyday.com/2018/05/how-can-we-programmatically-detect-which-ios-version-is-device-running-on/</link>
					<comments>https://stackoverflow.max-everyday.com/2018/05/how-can-we-programmatically-detect-which-ios-version-is-device-running-on/#respond</comments>
		
		<dc:creator><![CDATA[max-stackoverflow]]></dc:creator>
		<pubDate>Wed, 30 May 2018 08:42:03 +0000</pubDate>
				<category><![CDATA[iOS筆記]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[Swift]]></category>
		<guid isPermaLink="false">http://stackoverflow.max-everyday.com/?p=2394</guid>

					<description><![CDATA[有些功能，需要新的版本 iOS 才能執行，所以需...]]></description>
										<content:encoded><![CDATA[<p>有些功能，需要新的版本 iOS 才能執行，所以需要判斷 iOS 版本。解法如下：</p>
<p>From iOS 8 we can use the new <code>isOperatingSystemAtLeastVersion</code> method on <code>NSProcessInfo</code></p>
<pre class="lang-c prettyprint prettyprinted"><code>   <span class="typ">NSOperatingSystemVersion</span><span class="pln"> ios8_0_1 </span><span class="pun">=</span> <span class="pun">(</span><span class="typ">NSOperatingSystemVersion</span><span class="pun">){</span><span class="lit">8</span><span class="pun">,</span> <span class="lit">0</span><span class="pun">,</span> <span class="lit">1</span><span class="pun">};</span>
   <span class="kwd">if</span> <span class="pun">([[</span><span class="typ">NSProcessInfo</span><span class="pln"> processInfo</span><span class="pun">]</span><span class="pln"> isOperatingSystemAtLeastVersion</span><span class="pun">:</span><span class="pln">ios8_0_1</span><span class="pun">])</span> <span class="pun">{</span>
      <span class="com">// iOS 8.0.1 and above logic</span>
   <span class="pun">}</span> <span class="kwd">else</span> <span class="pun">{</span>
      <span class="com">// iOS 8.0.0 and below logic</span>
   <span class="pun">}</span></code></pre>
<p>Beware that this will crash on iOS 7, as the API didn&#8217;t exist prior to iOS 8. If you&#8217;re supporting iOS 7 and below, you can safely perform the check with</p>
<pre class="lang-c prettyprint prettyprinted"><code><span class="kwd">if</span> <span class="pun">([</span><span class="typ">NSProcessInfo</span><span class="pln"> instancesRespondToSelector</span><span class="pun">:</span><span class="lit">@selector</span><span class="pun">(</span><span class="pln">isOperatingSystemAtLeastVersion</span><span class="pun">:)])</span> <span class="pun">{</span>
  <span class="com">// conditionally check for any version &gt;= iOS 8 using 'isOperatingSystemAtLeastVersion'</span>
<span class="pun">}</span> <span class="kwd">else</span> <span class="pun">{</span>
  <span class="com">// we're on iOS 7 or below</span>
<span class="pun">}</span></code></pre>
<hr />
<p>解法2號：</p>
<p><strong>Best current version</strong>, without need to deal with numeric search within NSString is to define <code>macros</code>(See original answer: <a href="https://stackoverflow.com/a/5337804/492624">Check iPhone iOS Version</a>)</p>
<p>Those macros do exist in github, see: <a href="https://github.com/carlj/CJAMacros/blob/master/CJAMacros/CJAMacros.h" rel="noreferrer">https://github.com/carlj/CJAMacros/blob/master/CJAMacros/CJAMacros.h</a></p>
<p>Like this:</p>
<pre class="lang-c prettyprint prettyprinted"><code><span class="com">#define</span><span class="pln"> SYSTEM_VERSION_EQUAL_TO</span><span class="pun">(</span><span class="pln">v</span><span class="pun">)</span>                  <span class="pun">([[[</span><span class="typ">UIDevice</span><span class="pln"> currentDevice</span><span class="pun">]</span><span class="pln"> systemVersion</span><span class="pun">]</span><span class="pln"> compare</span><span class="pun">:</span><span class="pln">v options</span><span class="pun">:</span><span class="typ">NSNumericSearch</span><span class="pun">]</span> <span class="pun">==</span> <span class="typ">NSOrderedSame</span><span class="pun">)</span>
<span class="com">#define</span><span class="pln"> SYSTEM_VERSION_GREATER_THAN</span><span class="pun">(</span><span class="pln">v</span><span class="pun">)</span>              <span class="pun">([[[</span><span class="typ">UIDevice</span><span class="pln"> currentDevice</span><span class="pun">]</span><span class="pln"> systemVersion</span><span class="pun">]</span><span class="pln"> compare</span><span class="pun">:</span><span class="pln">v options</span><span class="pun">:</span><span class="typ">NSNumericSearch</span><span class="pun">]</span> <span class="pun">==</span> <span class="typ">NSOrderedDescending</span><span class="pun">)</span>
<span class="com">#define</span><span class="pln"> SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO</span><span class="pun">(</span><span class="pln">v</span><span class="pun">)</span>  <span class="pun">([[[</span><span class="typ">UIDevice</span><span class="pln"> currentDevice</span><span class="pun">]</span><span class="pln"> systemVersion</span><span class="pun">]</span><span class="pln"> compare</span><span class="pun">:</span><span class="pln">v options</span><span class="pun">:</span><span class="typ">NSNumericSearch</span><span class="pun">]</span> <span class="pun">!=</span> <span class="typ">NSOrderedAscending</span><span class="pun">)</span>
<span class="com">#define</span><span class="pln"> SYSTEM_VERSION_LESS_THAN</span><span class="pun">(</span><span class="pln">v</span><span class="pun">)</span>                 <span class="pun">([[[</span><span class="typ">UIDevice</span><span class="pln"> currentDevice</span><span class="pun">]</span><span class="pln"> systemVersion</span><span class="pun">]</span><span class="pln"> compare</span><span class="pun">:</span><span class="pln">v options</span><span class="pun">:</span><span class="typ">NSNumericSearch</span><span class="pun">]</span> <span class="pun">==</span> <span class="typ">NSOrderedAscending</span><span class="pun">)</span>
<span class="com">#define</span><span class="pln"> SYSTEM_VERSION_LESS_THAN_OR_EQUAL_TO</span><span class="pun">(</span><span class="pln">v</span><span class="pun">)</span>     <span class="pun">([[[</span><span class="typ">UIDevice</span><span class="pln"> currentDevice</span><span class="pun">]</span><span class="pln"> systemVersion</span><span class="pun">]</span><span class="pln"> compare</span><span class="pun">:</span><span class="pln">v options</span><span class="pun">:</span><span class="typ">NSNumericSearch</span><span class="pun">]</span> <span class="pun">!=</span> <span class="typ">NSOrderedDescending</span><span class="pun">)</span></code></pre>
<p>and use them like this:</p>
<pre class="lang-c prettyprint prettyprinted"><code><span class="kwd">if</span> <span class="pun">(</span><span class="pln">SYSTEM_VERSION_LESS_THAN</span><span class="pun">(@</span><span class="str">"5.0"</span><span class="pun">))</span> <span class="pun">{</span>
    <span class="com">// code here</span>
<span class="pun">}</span>

<span class="kwd">if</span> <span class="pun">(</span><span class="pln">SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO</span><span class="pun">(@</span><span class="str">"6.0"</span><span class="pun">))</span> <span class="pun">{</span>
    <span class="com">// code here</span>
<span class="pun">}</span></code></pre>
<hr />
<h1>Outdated version below</h1>
<p>to get OS version:</p>
<pre class="lang-c prettyprint prettyprinted"><code><span class="pun">[[</span><span class="typ">UIDevice</span><span class="pln"> currentDevice</span><span class="pun">]</span><span class="pln"> systemVersion</span><span class="pun">]</span></code></pre>
<p>returns string, which can be turned into int/float via</p>
<pre class="lang-c prettyprint prettyprinted"><code><span class="pun">-[</span><span class="typ">NSString</span><span class="pln"> floatValue</span><span class="pun">]</span>
<span class="pun">-[</span><span class="typ">NSString</span><span class="pln"> intValue</span><span class="pun">]</span></code></pre>
<p>like this</p>
<blockquote><p>Both values (floatValue, intValue) will be stripped due to its type, 5.0.1 will become 5.0 or 5 (float or int), for comparing precisely, you will have to separate it to array of INTs check accepted answer here: <a href="https://stackoverflow.com/a/3339787/492624">Check iPhone iOS Version</a></p></blockquote>
<pre class="lang-c prettyprint prettyprinted"><code><span class="typ">NSString</span> <span class="pun">*</span><span class="pln">ver </span><span class="pun">=</span> <span class="pun">[[</span><span class="typ">UIDevice</span><span class="pln"> currentDevice</span><span class="pun">]</span><span class="pln"> systemVersion</span><span class="pun">];</span>
<span class="typ">int</span><span class="pln"> ver_int </span><span class="pun">=</span> <span class="pun">[</span><span class="pln">ver intValue</span><span class="pun">];</span>
<span class="typ">float</span><span class="pln"> ver_float </span><span class="pun">=</span> <span class="pun">[</span><span class="pln">ver floatValue</span><span class="pun">];</span></code></pre>
<p>and compare like this</p>
<pre class="lang-c prettyprint prettyprinted"><code><span class="typ">NSLog</span><span class="pun">(@</span><span class="str">"System Version is %@"</span><span class="pun">,[[</span><span class="typ">UIDevice</span><span class="pln"> currentDevice</span><span class="pun">]</span><span class="pln"> systemVersion</span><span class="pun">]);</span>
<span class="typ">NSString</span> <span class="pun">*</span><span class="pln">ver </span><span class="pun">=</span> <span class="pun">[[</span><span class="typ">UIDevice</span><span class="pln"> currentDevice</span><span class="pun">]</span><span class="pln"> systemVersion</span><span class="pun">];</span>
<span class="typ">float</span><span class="pln"> ver_float </span><span class="pun">=</span> <span class="pun">[</span><span class="pln">ver floatValue</span><span class="pun">];</span>
<span class="kwd">if</span> <span class="pun">(</span><span class="pln">ver_float </span><span class="pun">&lt;</span> <span class="lit">5.0</span><span class="pun">)</span> <span class="kwd">return</span> <span class="kwd">false</span><span class="pun">;</span></code></pre>
<p><strong>For Swift 4.0 syntax</strong></p>
<p>below example is just checking if the device is of <code>iOS11</code> or greater version.</p>
<pre class="lang-c prettyprint prettyprinted"><code><span class="pln">let systemVersion </span><span class="pun">=</span> <span class="typ">UIDevice</span><span class="pun">.</span><span class="pln">current</span><span class="pun">.</span><span class="pln">systemVersion
</span><span class="kwd">if</span><span class="pln"> systemVersion</span><span class="pun">.</span><span class="pln">cgFloatValue </span><span class="pun">&gt;=</span> <span class="lit">11.0</span> <span class="pun">{</span>
    <span class="com">//"for ios 11"</span>
  <span class="pun">}</span>
<span class="kwd">else</span><span class="pun">{</span>
   <span class="com">//"ios below 11")</span>
  <span class="pun">}</span></code></pre>
<p>&nbsp;</p>
<hr />
<p>解法3號：</p>
<div class="post-text">
<h3>The quick answer …</h3>
<p>As of Swift 2.0, you can use <code>#available</code> in an <code>if</code> or <code>guard</code> to protect code that should only be run on certain systems.</p>
<p><code>if #available(iOS 9, *) {}</code></p>
<p>In Objective-C, you need to check the system version and perform a comparison.</p>
<p><code>[[NSProcessInfo processInfo] operatingSystemVersion]</code> in iOS 8 and above.</p>
<p>As of Xcode 9:</p>
<p><code>if (@available(iOS 9, *)) {}</code></p>
<h2>The full answer …</h2>
<p>In Objective-C, and Swift in rare cases, it&#8217;s better to avoid relying on the operating system version as an indication of device or OS capabilities. There is usually a more reliable method of checking whether a particular feature or class is available.</p>
<p><strong>Checking for the presence of APIs:</strong></p>
<p>For example, you can check if <code>UIPopoverController</code> is available on the current device using <code>NSClassFromString</code>:</p>
<pre class="lang-c prettyprint prettyprinted"><code><span class="kwd">if</span> <span class="pun">(</span><span class="typ">NSClassFromString</span><span class="pun">(@</span><span class="str">"UIPopoverController"</span><span class="pun">))</span> <span class="pun">{</span>
    <span class="com">// Do something</span>
<span class="pun">}</span></code></pre>
<p>For weakly linked classes, it is safe to message the class, directly. Notably, this works for frameworks that aren&#8217;t explicitly linked as &#8220;Required&#8221;. For missing classes, the expression evaluates to nil, failing the condition:</p>
<pre class="lang-c prettyprint prettyprinted"><code><span class="kwd">if</span> <span class="pun">([</span><span class="typ">LAContext</span> <span class="kwd">class</span><span class="pun">])</span> <span class="pun">{</span>
    <span class="com">// Do something</span>
<span class="pun">}</span></code></pre>
<p>Some classes, like <code>CLLocationManager</code> and <code>UIDevice</code>, provide methods to check device capabilities:</p>
<pre class="lang-c prettyprint prettyprinted"><code><span class="kwd">if</span> <span class="pun">([</span><span class="typ">CLLocationManager</span><span class="pln"> headingAvailable</span><span class="pun">])</span> <span class="pun">{</span>
    <span class="com">// Do something</span>
<span class="pun">}</span></code></pre>
<p><strong>Checking for the presence of symbols:</strong></p>
<p>Very occasionally, you must check for the presence of a constant. This came up in iOS 8 with the introduction of <code>UIApplicationOpenSettingsURLString</code>, used to load Settings app via <code>-openURL:</code>. The value didn&#8217;t exist prior to iOS 8. Passing nil to this API will crash, so you must take care to verify the existence of the constant first:</p>
<pre class="lang-c prettyprint prettyprinted"><code><span class="kwd">if</span> <span class="pun">(&amp;</span><span class="typ">UIApplicationOpenSettingsURLString</span> <span class="pun">!=</span><span class="pln"> NULL</span><span class="pun">)</span> <span class="pun">{</span>
    <span class="pun">[[</span><span class="typ">UIApplication</span><span class="pln"> sharedApplication</span><span class="pun">]</span><span class="pln"> openURL</span><span class="pun">:[</span><span class="pln">NSURL </span><span class="typ">URLWithString</span><span class="pun">:</span><span class="typ">UIApplicationOpenSettingsURLString</span><span class="pun">]];</span>
<span class="pun">}</span></code></pre>
<p><strong>Comparing against the operating system version:</strong></p>
<p>Let&#8217;s assume you&#8217;re faced with the relatively rare need to check the operating system version. For projects targeting iOS 8 and above, <code>NSProcessInfo</code> includes a method for performing version comparisons with less chance of error:</p>
<pre class="lang-c prettyprint prettyprinted"><code><span class="pun">-</span> <span class="pun">(</span><span class="pln">BOOL</span><span class="pun">)</span><span class="pln">isOperatingSystemAtLeastVersion</span><span class="pun">:(</span><span class="typ">NSOperatingSystemVersion</span><span class="pun">)</span><span class="pln">version</span></code></pre>
<p>Projects targeting older systems can use <code>systemVersion</code> on <code>UIDevice</code>. Apple uses it in their <a href="http://developer.apple.com/iphone/library/samplecode/GLSprite/Listings/Classes_EAGLView_m.html" rel="noreferrer">GLSprite</a> sample code.</p>
<pre class="lang-c prettyprint prettyprinted"><code><span class="com">// A system version of 3.1 or greater is required to use CADisplayLink. The NSTimer</span>
<span class="com">// class is used as fallback when it isn't available.</span>
<span class="typ">NSString</span> <span class="pun">*</span><span class="pln">reqSysVer </span><span class="pun">=</span> <span class="pun">@</span><span class="str">"3.1"</span><span class="pun">;</span>
<span class="typ">NSString</span> <span class="pun">*</span><span class="pln">currSysVer </span><span class="pun">=</span> <span class="pun">[[</span><span class="typ">UIDevice</span><span class="pln"> currentDevice</span><span class="pun">]</span><span class="pln"> systemVersion</span><span class="pun">];</span>
<span class="kwd">if</span> <span class="pun">([</span><span class="pln">currSysVer compare</span><span class="pun">:</span><span class="pln">reqSysVer options</span><span class="pun">:</span><span class="typ">NSNumericSearch</span><span class="pun">]</span> <span class="pun">!=</span> <span class="typ">NSOrderedAscending</span><span class="pun">)</span> <span class="pun">{</span><span class="pln">
    displayLinkSupported </span><span class="pun">=</span><span class="pln"> TRUE</span><span class="pun">;</span>
<span class="pun">}</span></code></pre>
<p>If for whatever reason you decide that <code>systemVersion</code> is what you want, make sure to treat it as an string or you risk truncating the patch revision number (eg. 3.1.2 -&gt; 3.1).</p>
</div>
<div class="grid mb0 fw-wrap ai-start jc-end gs8 gsy">
<div class="grid--cell mr16"></div>
</div>
]]></content:encoded>
					
					<wfw:commentRss>https://stackoverflow.max-everyday.com/2018/05/how-can-we-programmatically-detect-which-ios-version-is-device-running-on/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Swift Attempt to present UIAlertController whose view is not in the window hierarchy</title>
		<link>https://stackoverflow.max-everyday.com/2018/04/swift-attempt-to-present-uialertcontroller-whose-view-is-not-in-the-window-hierarchy/</link>
					<comments>https://stackoverflow.max-everyday.com/2018/04/swift-attempt-to-present-uialertcontroller-whose-view-is-not-in-the-window-hierarchy/#respond</comments>
		
		<dc:creator><![CDATA[max-stackoverflow]]></dc:creator>
		<pubDate>Tue, 24 Apr 2018 14:04:54 +0000</pubDate>
				<category><![CDATA[iOS筆記]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[Swift]]></category>
		<guid isPermaLink="false">http://stackoverflow.max-everyday.com/?p=2283</guid>

					<description><![CDATA[針對相機元件（UIImagePickerCont...]]></description>
										<content:encoded><![CDATA[<p>針對相機元件（UIImagePickerController）結束（dismiss)後，無法顯示錯誤訊息（UIAlertController）的處理。</p>
<p>我的解法是，在關閉 picker 的時候，在 完成時再去做 pop alert.</p>
<blockquote>
<pre>picker.dismiss(animated: true, completion: {
self.present(alertController, animated: true, completion: {
})
})</pre>
</blockquote>
<hr />
<p>其他解法：</p>
<p>Found a solution <a href="https://stackoverflow.com/questions/24854802/presenting-a-view-controller-modally-from-an-action-sheets-delegate-in-ios8">here</a>. I&#8217;m probably doing it wrong but if not it might be an Apple bug. The workaround is to delay the presentation of the <code>UIAlertController</code>:</p>
<pre class="lang-swift prettyprint prettyprinted"><code><span class="pln">dispatch</span><span class="pun">_</span><span class="pln">async</span><span class="pun">(</span><span class="pln">dispatch</span><span class="pun">_</span><span class="pln">get</span><span class="pun">_</span><span class="pln">main</span><span class="pun">_</span><span class="pln">queue</span><span class="pun">(),</span> <span class="pun">^{</span>
    <span class="kwd">self</span><span class="pun">.</span><span class="pln">presentViewController</span><span class="pun">(</span><span class="pln">alertController</span><span class="pun">,</span><span class="pln"> animated</span><span class="pun">:</span> <span class="lit">true</span><span class="pun">,</span><span class="pln"> completion</span><span class="pun">:</span> <span class="lit">nil</span><span class="pun">)</span>
<span class="pun">})</span></code></pre>
<p><strong>EDIT</strong>: I found another workaround (I don&#8217;t use the solution I put down here anymore). I had to change this because the Twitter login was also breaking my transitions between VCs.</p>
<p>I now call a specific <code>UIViewController</code> (I called it something like <code>TWLoginVC</code>) where I do all the Twitter login and other stuff. The view is just black so the user don&#8217;t see the process is actually done in another VC (he just has to pick up the Twitter user he wants to login with). I guess you could also put a clear background to be even more invisible.</p>
<p>When I call this view controller and dismiss it, the transition is not applied to it and I don&#8217;t have any more problem with it.</p>
<hr />
<p><strong>EDIT</strong> Update for Swift:</p>
<pre class="lang-swift prettyprint prettyprinted"><code><span class="typ">DispatchQueue</span><span class="pun">.</span><span class="pln">main</span><span class="pun">.</span><span class="pln">async</span><span class="pun">{</span>
     <span class="kwd">self</span><span class="pun">.</span><span class="pln">present</span><span class="pun">(</span><span class="pln">alertController</span><span class="pun">,</span><span class="pln"> animated</span><span class="pun">:</span> <span class="lit">true</span><span class="pun">,</span><span class="pln"> completion</span><span class="pun">:</span> <span class="lit">nil</span><span class="pun">)</span>
<span class="pun">}</span></code></pre>
]]></content:encoded>
					
					<wfw:commentRss>https://stackoverflow.max-everyday.com/2018/04/swift-attempt-to-present-uialertcontroller-whose-view-is-not-in-the-window-hierarchy/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>How to make your iOS apps more secure with SSL pinning</title>
		<link>https://stackoverflow.max-everyday.com/2018/04/how-to-make-your-ios-apps-more-secure-with-ssl-pinning/</link>
					<comments>https://stackoverflow.max-everyday.com/2018/04/how-to-make-your-ios-apps-more-secure-with-ssl-pinning/#respond</comments>
		
		<dc:creator><![CDATA[max-stackoverflow]]></dc:creator>
		<pubDate>Tue, 17 Apr 2018 13:21:02 +0000</pubDate>
				<category><![CDATA[iOS筆記]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[Swift]]></category>
		<guid isPermaLink="false">http://stackoverflow.max-everyday.com/?p=2252</guid>

					<description><![CDATA[swift 和 obj-c 完成 ssl 的寫法...]]></description>
										<content:encoded><![CDATA[<p>swift 和 obj-c 完成 ssl 的寫法如下：</p>
<hr />
<p>We can start by instantiating an NSURLSession object with the default session configuration.</p>
<h5>Swift</h5>
<pre class="highlight c"><code><span class="n">self</span><span class="p">.</span><span class="n">urlSession</span> <span class="o">=</span> <span class="n">NSURLSession</span><span class="p">(</span><span class="n">configuration</span><span class="o">:</span> <span class="n">NSURLSessionConfiguration</span><span class="p">.</span><span class="n">defaultSessionConfiguration</span><span class="p">(),</span> <span class="n">delegate</span><span class="o">:</span> <span class="n">self</span><span class="p">,</span> <span class="n">delegateQueue</span><span class="o">:</span> <span class="n">nil</span><span class="p">)</span>
</code></pre>
<h5>Objective C</h5>
<pre class="highlight c"><code><span class="n">NSURLSessionConfiguration</span> <span class="o">*</span><span class="n">sessionConfig</span> <span class="o">=</span> <span class="p">[</span><span class="n">NSURLSessionConfiguration</span> <span class="n">defaultSessionConfiguration</span><span class="p">];</span>
<span class="n">self</span><span class="p">.</span><span class="n">urlSession</span> <span class="o">=</span> <span class="p">[</span><span class="n">NSURLSession</span> <span class="n">sessionWithConfiguration</span><span class="o">:</span><span class="n">sessionConfig</span> <span class="n">delegate</span><span class="o">:</span><span class="n">self</span> <span class="n">delegateQueue</span><span class="o">:</span><span class="n">nil</span><span class="p">];</span></code></pre>
<hr />
<p>use the <strong>dataTaskWithURL:completionHandler:</strong> method for the SSL pinning test. The request we send will look something like this:</p>
<h5>Swift</h5>
<pre class="highlight c"><code><span class="n">self</span><span class="p">.</span><span class="n">urlSession</span><span class="o">?</span><span class="p">.</span><span class="n">dataTaskWithURL</span><span class="p">(</span><span class="n">NSURL</span><span class="p">(</span><span class="n">string</span><span class="o">:</span><span class="n">self</span><span class="p">.</span><span class="n">urlTextField</span><span class="p">.</span><span class="n">text</span><span class="o">!</span><span class="p">)</span><span class="o">!</span><span class="p">,</span> <span class="n">completionHandler</span><span class="o">:</span> <span class="p">{</span> <span class="p">(</span><span class="n">NSData</span> <span class="n">data</span><span class="p">,</span> <span class="n">NSURLResponse</span> <span class="n">response</span><span class="p">,</span> <span class="n">NSError</span> <span class="n">error</span><span class="p">)</span> <span class="n">Void</span> <span class="n">in</span>
    <span class="c1">// response management code
</span><span class="p">}).</span><span class="n">resume</span><span class="p">()</span>
</code></pre>
<h5>Objective C</h5>
<pre class="highlight c"><code><span class="p">[[</span><span class="n">self</span><span class="p">.</span><span class="n">urlSession</span> <span class="n">dataTaskWithURL</span><span class="o">:</span><span class="p">[</span><span class="n">NSURL</span> <span class="n">URLWithString</span><span class="o">:</span><span class="n">self</span><span class="p">.</span><span class="n">textField</span><span class="p">.</span><span class="n">text</span><span class="p">]</span> <span class="n">completionHandler</span><span class="o">:^</span><span class="p">(</span><span class="n">NSData</span> <span class="o">*</span> <span class="n">_Nullable</span> <span class="n">data</span><span class="p">,</span> <span class="n">NSURLResponse</span> <span class="o">*</span> <span class="n">_Nullable</span> <span class="n">response</span><span class="p">,</span> <span class="n">NSError</span> <span class="o">*</span> <span class="n">_Nullable</span> <span class="n">error</span><span class="p">)</span> <span class="p">{</span>
        <span class="c1">// response management code
</span>    <span class="p">}]</span> <span class="n">resume</span><span class="p">];</span></code></pre>
<hr />
<p>implemented within the <strong>URLSession:didReceiveChallenge:completionHandler:delegate</strong>method. Note that, upon the creation of the NSURLSession object, we assigned self as the delegate so that this method is called on our object.</p>
<h5>Swift</h5>
<pre class="highlight c"><code><span class="n">func</span> <span class="nf">URLSession</span><span class="p">(</span><span class="n">session</span><span class="o">:</span> <span class="n">NSURLSession</span><span class="p">,</span>  <span class="n">didReceiveChallenge</span> <span class="n">challenge</span><span class="o">:</span> <span class="n">NSURLAuthenticationChallenge</span><span class="p">,</span> <span class="n">completionHandler</span> <span class="p">(</span><span class="n">NSURLSessionAuthChallengeDisposition</span><span class="p">,</span> <span class="n">NSURLCredential</span><span class="o">?</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Void</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">let</span> <span class="n">serverTrust</span> <span class="o">=</span> <span class="n">challenge</span><span class="p">.</span><span class="n">protectionSpace</span><span class="p">.</span><span class="n">serverTrust</span>
    <span class="n">let</span> <span class="n">certificate</span> <span class="o">=</span> <span class="n">SecTrustGetCertificateAtIndex</span><span class="p">(</span><span class="n">serverTrust</span><span class="o">!</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>

    <span class="c1">// Set SSL policies for domain name check
</span>    <span class="n">let</span> <span class="n">policies</span> <span class="o">=</span> <span class="n">NSMutableArray</span><span class="p">();</span>
    <span class="n">policies</span><span class="p">.</span><span class="n">addObject</span><span class="p">(</span><span class="n">SecPolicyCreateSSL</span><span class="p">(</span><span class="nb">true</span><span class="p">,</span> <span class="p">(</span><span class="n">challenge</span><span class="p">.</span><span class="n">protectionSpace</span><span class="p">.</span><span class="n">host</span><span class="p">)))</span>
    <span class="n">SecTrustSetPolicies</span><span class="p">(</span><span class="n">serverTrust</span><span class="o">!</span><span class="p">,</span> <span class="n">policies</span><span class="p">);</span>

    <span class="c1">// Evaluate server certificate
</span>    <span class="n">var</span> <span class="n">result</span><span class="o">:</span> <span class="n">SecTrustResultType</span> <span class="o">=</span> <span class="mi">0</span>
    <span class="n">SecTrustEvaluate</span><span class="p">(</span><span class="n">serverTrust</span><span class="o">!</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">result</span><span class="p">)</span>
    <span class="n">let</span> <span class="n">isServerTrusted</span><span class="o">:</span><span class="n">Bool</span> <span class="o">=</span> <span class="p">(</span><span class="n">Int</span><span class="p">(</span><span class="n">result</span><span class="p">)</span> <span class="o">==</span> <span class="n">kSecTrustResultUnspecified</span> <span class="o">||</span> <span class="n">Int</span><span class="p">(</span><span class="n">result</span><span class="p">)</span> <span class="o">==</span> <span class="n">kSecTrustResultProceed</span><span class="p">)</span>

    <span class="c1">// Get local and remote cert data
</span>    <span class="n">let</span> <span class="n">remoteCertificateData</span><span class="o">:</span><span class="n">NSData</span> <span class="o">=</span> <span class="n">SecCertificateCopyData</span><span class="p">(</span><span class="n">certificate</span><span class="o">!</span><span class="p">)</span>
    <span class="n">let</span> <span class="n">pathToCert</span> <span class="o">=</span> <span class="n">NSBundle</span><span class="p">.</span><span class="n">mainBundle</span><span class="p">().</span><span class="n">pathForResource</span><span class="p">(</span><span class="n">githubCert</span><span class="p">,</span> <span class="n">ofType</span><span class="o">:</span> <span class="s">"cer"</span><span class="p">)</span>
    <span class="n">let</span> <span class="n">localCertificate</span><span class="o">:</span><span class="n">NSData</span> <span class="o">=</span> <span class="n">NSData</span><span class="p">(</span><span class="n">contentsOfFile</span><span class="o">:</span> <span class="n">pathToCert</span><span class="o">!</span><span class="p">)</span><span class="o">!</span>

    <span class="k">if</span> <span class="p">(</span><span class="n">isServerTrusted</span> <span class="o">&amp;&amp;</span> <span class="n">remoteCertificateData</span><span class="p">.</span><span class="n">isEqualToData</span><span class="p">(</span><span class="n">localCertificate</span><span class="p">))</span> <span class="p">{</span>
        <span class="n">let</span> <span class="n">credential</span><span class="o">:</span><span class="n">NSURLCredential</span> <span class="o">=</span> <span class="n">NSURLCredential</span><span class="p">(</span><span class="n">forTrust</span><span class="o">:</span> <span class="n">serverTrust</span><span class="o">!</span><span class="p">)</span>
        <span class="n">completionHandler</span><span class="p">(.</span><span class="n">UseCredential</span><span class="p">,</span> <span class="n">credential</span><span class="p">)</span>
    <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
        <span class="n">completionHandler</span><span class="p">(.</span><span class="n">CancelAuthenticationChallenge</span><span class="p">,</span> <span class="n">nil</span><span class="p">)</span>
    <span class="p">}</span>
<span class="p">}</span>

</code></pre>
<h5>Objective C</h5>
<pre class="highlight c"><code><span class="o">-</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span><span class="n">URLSession</span><span class="o">:</span><span class="p">(</span><span class="n">NSURLSession</span> <span class="o">*</span><span class="p">)</span><span class="n">session</span> <span class="n">didReceiveChallenge</span><span class="o">:</span><span class="p">(</span><span class="n">NSURLAuthenticationChallenge</span> <span class="o">*</span><span class="p">)</span><span class="n">challenge</span> <span class="n">completionHandler</span><span class="o">:</span><span class="p">(</span><span class="kt">void</span> <span class="p">(</span><span class="o">^</span><span class="p">)(</span><span class="n">NSURLSessionAuthChallengeDisposition</span><span class="p">,</span> <span class="n">NSURLCredential</span> <span class="o">*</span> <span class="n">_Nullable</span><span class="p">))</span><span class="n">completionHandler</span> <span class="p">{</span>

    <span class="c1">// Get remote certificate
</span>    <span class="n">SecTrustRef</span> <span class="n">serverTrust</span> <span class="o">=</span> <span class="n">challenge</span><span class="p">.</span><span class="n">protectionSpace</span><span class="p">.</span><span class="n">serverTrust</span><span class="p">;</span>
    <span class="n">SecCertificateRef</span> <span class="n">certificate</span> <span class="o">=</span> <span class="n">SecTrustGetCertificateAtIndex</span><span class="p">(</span><span class="n">serverTrust</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>

    <span class="c1">// Set SSL policies for domain name check
</span>    <span class="n">NSMutableArray</span> <span class="o">*</span><span class="n">policies</span> <span class="o">=</span> <span class="p">[</span><span class="n">NSMutableArray</span> <span class="n">array</span><span class="p">];</span>
    <span class="p">[</span><span class="n">policies</span> <span class="n">addObject</span><span class="o">:</span><span class="p">(</span><span class="n">__bridge_transfer</span> <span class="n">id</span><span class="p">)</span><span class="n">SecPolicyCreateSSL</span><span class="p">(</span><span class="nb">true</span><span class="p">,</span> <span class="p">(</span><span class="n">__bridge</span> <span class="n">CFStringRef</span><span class="p">)</span><span class="n">challenge</span><span class="p">.</span><span class="n">protectionSpace</span><span class="p">.</span><span class="n">host</span><span class="p">)];</span>
    <span class="n">SecTrustSetPolicies</span><span class="p">(</span><span class="n">serverTrust</span><span class="p">,</span> <span class="p">(</span><span class="n">__bridge</span> <span class="n">CFArrayRef</span><span class="p">)</span><span class="n">policies</span><span class="p">);</span>

    <span class="c1">// Evaluate server certificate
</span>    <span class="n">SecTrustResultType</span> <span class="n">result</span><span class="p">;</span>
    <span class="n">SecTrustEvaluate</span><span class="p">(</span><span class="n">serverTrust</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">result</span><span class="p">);</span>
    <span class="n">BOOL</span> <span class="n">certificateIsValid</span> <span class="o">=</span> <span class="p">(</span><span class="n">result</span> <span class="o">==</span> <span class="n">kSecTrustResultUnspecified</span> <span class="o">||</span> <span class="n">result</span> <span class="o">==</span> <span class="n">kSecTrustResultProceed</span><span class="p">);</span>

    <span class="c1">// Get local and remote cert data
</span>    <span class="n">NSData</span> <span class="o">*</span><span class="n">remoteCertificateData</span> <span class="o">=</span> <span class="n">CFBridgingRelease</span><span class="p">(</span><span class="n">SecCertificateCopyData</span><span class="p">(</span><span class="n">certificate</span><span class="p">));</span>
    <span class="n">NSString</span> <span class="o">*</span><span class="n">pathToCert</span> <span class="o">=</span> <span class="p">[[</span><span class="n">NSBundle</span> <span class="n">mainBundle</span><span class="p">]</span><span class="n">pathForResource</span><span class="o">:</span><span class="err">@</span><span class="s">"github.com"</span> <span class="n">ofType</span><span class="o">:</span><span class="err">@</span><span class="s">"cer"</span><span class="p">];</span>
    <span class="n">NSData</span> <span class="o">*</span><span class="n">localCertificate</span> <span class="o">=</span> <span class="p">[</span><span class="n">NSData</span> <span class="n">dataWithContentsOfFile</span><span class="o">:</span><span class="n">pathToCert</span><span class="p">];</span>

    <span class="c1">// The pinnning check
</span>    <span class="k">if</span> <span class="p">([</span><span class="n">remoteCertificateData</span> <span class="n">isEqualToData</span><span class="o">:</span><span class="n">localCertificate</span><span class="p">]</span> <span class="o">&amp;&amp;</span> <span class="n">certificateIsValid</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">NSURLCredential</span> <span class="o">*</span><span class="n">credential</span> <span class="o">=</span> <span class="p">[</span><span class="n">NSURLCredential</span> <span class="n">credentialForTrust</span><span class="o">:</span><span class="n">serverTrust</span><span class="p">];</span>
        <span class="n">completionHandler</span><span class="p">(</span><span class="n">NSURLSessionAuthChallengeUseCredential</span><span class="p">,</span> <span class="n">credential</span><span class="p">);</span>
    <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
        <span class="n">completionHandler</span><span class="p">(</span><span class="n">NSURLSessionAuthChallengeCancelAuthenticationChallenge</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">);</span>
    <span class="p">}</span>
<span class="p">}</span></code></pre>
<hr />
<p>如果不使用 local certificate:</p>
<p class="p1"><span class="s1"><span class="Apple-converted-space">    </span></span>// Get remote certificate</p>
<p class="p2"><span class="s1"><span class="Apple-converted-space">    </span></span>SecTrustRef<span class="s1"> serverTrust = challenge.</span>protectionSpace<span class="s1">.</span>serverTrust<span class="s1">;</span></p>
<p class="p3"><span class="Apple-converted-space">    </span></p>
<p class="p1"><span class="s1"><span class="Apple-converted-space">    </span></span>// Set SSL policies for domain name check</p>
<p class="p2"><span class="s1"><span class="Apple-converted-space">    </span></span>NSMutableArray<span class="s1"> *policies = [</span>NSMutableArray array<span class="s1">];</span></p>
<p class="p2"><span class="s1"><span class="Apple-converted-space">    </span>[policies </span>addObject<span class="s1"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f641.png" alt="🙁" class="wp-smiley" style="height: 1em; max-height: 1em;" /></span><span class="s2">__bridge_transfer</span> <span class="s2">id</span><span class="s1">)</span>SecPolicyCreateSSL<span class="s1">(</span><span class="s2">true</span><span class="s1">, (</span><span class="s2">__bridge</span> CFStringRef<span class="s1">)challenge.</span>protectionSpace<span class="s1">.</span>host<span class="s1">)];</span></p>
<p class="p4"><span class="s3"><span class="Apple-converted-space">    </span></span><span class="s4">SecTrustSetPolicies</span><span class="s3">(serverTrust, (</span><span class="s2">__bridge</span> <span class="s4">CFArrayRef</span><span class="s3">)policies);</span></p>
<p class="p3"><span class="Apple-converted-space">    </span></p>
<p class="p1"><span class="s1"><span class="Apple-converted-space">    </span></span>// Evaluate server certificate</p>
<p class="p2"><span class="s1"><span class="Apple-converted-space">    </span></span>SecTrustResultType<span class="s1"> result;</span></p>
<p class="p5"><span class="Apple-converted-space">    </span><span class="s5">SecTrustEvaluate</span>(serverTrust, &amp;result);</p>
<p class="p5"><span class="Apple-converted-space">    </span><span class="s6">BOOL</span> certificateIsValid = (result == <span class="s5">kSecTrustResultUnspecified</span> || result == <span class="s5">kSecTrustResultProceed</span>);</p>
<p class="p3"><span class="Apple-converted-space">    </span></p>
<p class="p1"><span class="s1"><span class="Apple-converted-space">    </span></span>// The pinnning check</p>
<p class="p5"><span class="Apple-converted-space">    </span><span class="s6">if</span> (certificateIsValid) {</p>
<p class="p2"><span class="s1"><span class="Apple-converted-space">        </span></span>NSURLCredential<span class="s1"> *credential = [</span>NSURLCredential credentialForTrust<span class="s1">:serverTrust];</span></p>
<p class="p5"><span class="Apple-converted-space">        </span>completionHandler(<span class="s5">NSURLSessionAuthChallengeUseCredential</span>, credential);</p>
<p class="p5"><span class="Apple-converted-space">    </span>} <span class="s6">else</span> {</p>
<p class="p2"><span class="s1"><span class="Apple-converted-space">        </span>completionHandler(</span>NSURLSessionAuthChallengeCancelAuthenticationChallenge<span class="s1">, </span><span class="s2">NULL</span><span class="s1">);</span></p>
<p class="p5"><span class="Apple-converted-space">    </span>}</p>
<p>&nbsp;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://stackoverflow.max-everyday.com/2018/04/how-to-make-your-ios-apps-more-secure-with-ssl-pinning/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>[iOS] Get the domain part of an URL string?</title>
		<link>https://stackoverflow.max-everyday.com/2018/04/ios-get-the-domain-part-of-an-url-string/</link>
					<comments>https://stackoverflow.max-everyday.com/2018/04/ios-get-the-domain-part-of-an-url-string/#respond</comments>
		
		<dc:creator><![CDATA[max-stackoverflow]]></dc:creator>
		<pubDate>Fri, 13 Apr 2018 14:47:16 +0000</pubDate>
				<category><![CDATA[iOS筆記]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[Swift]]></category>
		<guid isPermaLink="false">http://stackoverflow.max-everyday.com/?p=2249</guid>

					<description><![CDATA[Objective-C NSString* ur...]]></description>
										<content:encoded><![CDATA[<p><strong>Objective-C</strong></p>
<pre class="lang-c prettyprint prettyprinted"><code><span class="typ">NSString</span><span class="pun">*</span><span class="pln"> urlString </span><span class="pun">=</span> <span class="pun">@</span><span class="str">"http://someurl.com/something"</span><span class="pun">;</span><span class="pln">
NSURL</span><span class="pun">*</span><span class="pln"> url </span><span class="pun">=</span> <span class="pun">[</span><span class="pln">NSURL </span><span class="typ">URLWithString</span><span class="pun">:</span><span class="pln">urlString</span><span class="pun">];</span>
<span class="typ">NSString</span><span class="pun">*</span><span class="pln"> domain </span><span class="pun">=</span> <span class="pun">[</span><span class="pln">url host</span><span class="pun">];</span></code></pre>
<p><strong>Swift 2</strong></p>
<pre class="lang-c prettyprint prettyprinted"><code><span class="pln">var urlString </span><span class="pun">=</span> <span class="str">"http://someurl.com/something"</span><span class="pln">
var url </span><span class="pun">=</span><span class="pln"> NSURL</span><span class="pun">(</span><span class="pln">string</span><span class="pun">:</span><span class="pln"> urlString</span><span class="pun">)</span><span class="pln">
var domain </span><span class="pun">=</span><span class="pln"> url</span><span class="pun">?.</span><span class="pln">host</span></code></pre>
<p><strong>Swift 3+</strong></p>
<pre class="lang-c prettyprint prettyprinted"><code><span class="pln">var urlString </span><span class="pun">=</span> <span class="str">"http://someurl.com/something"</span><span class="pln">
var url </span><span class="pun">=</span><span class="pln"> URL</span><span class="pun">(</span><span class="pln">string</span><span class="pun">:</span><span class="pln"> urlString</span><span class="pun">)</span><span class="pln">
var domain </span><span class="pun">=</span><span class="pln"> url</span><span class="pun">?.</span><span class="pln">host</span></code></pre>
]]></content:encoded>
					
					<wfw:commentRss>https://stackoverflow.max-everyday.com/2018/04/ios-get-the-domain-part-of-an-url-string/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Module compiled with Swift 4.0.3 cannot be imported in Swift 4.1</title>
		<link>https://stackoverflow.max-everyday.com/2018/04/module-compiled-with-swift-4-0-3-cannot-be-imported-in-swift-4-1/</link>
					<comments>https://stackoverflow.max-everyday.com/2018/04/module-compiled-with-swift-4-0-3-cannot-be-imported-in-swift-4-1/#respond</comments>
		
		<dc:creator><![CDATA[max-stackoverflow]]></dc:creator>
		<pubDate>Thu, 12 Apr 2018 03:30:36 +0000</pubDate>
				<category><![CDATA[iOS筆記]]></category>
		<category><![CDATA[Debug]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[Swift]]></category>
		<guid isPermaLink="false">http://stackoverflow.max-everyday.com/?p=2236</guid>

					<description><![CDATA[不知何時升到 xcode 9.3, 別人用 xc...]]></description>
										<content:encoded><![CDATA[<p>不知何時升到 xcode 9.3, 別人用 xcode 9.2 寫的 library 會無法 build.</p>
<p>I got new error message:</p>
<blockquote>
<pre>Module compiled with Swift 4.0.3 cannot be imported in Swift 4.1</pre>
</blockquote>
<p><img fetchpriority="high" decoding="async" class="alignnone size-full wp-image-2237" src="https://stackoverflow.max-everyday.com/wp-content/uploads/2018/04/Screenshot-2018-04-12-10.55.00_result.jpg" alt="" width="900" height="114" srcset="https://stackoverflow.max-everyday.com/wp-content/uploads/2018/04/Screenshot-2018-04-12-10.55.00_result.jpg 900w, https://stackoverflow.max-everyday.com/wp-content/uploads/2018/04/Screenshot-2018-04-12-10.55.00_result-600x76.jpg 600w, https://stackoverflow.max-everyday.com/wp-content/uploads/2018/04/Screenshot-2018-04-12-10.55.00_result-768x97.jpg 768w" sizes="(max-width: 900px) 100vw, 900px" /></p>
<p>&nbsp;</p>
<p>because AirWatch SDK 18.3 not support xcode 9.3, I try to download and install swift toolchain 4.0.3 from URL:</p>
<p><a href="https://swift.org/download/#releases">https://swift.org/download/#releases</a></p>
<p><img decoding="async" class="alignnone size-full wp-image-2238" src="https://stackoverflow.max-everyday.com/wp-content/uploads/2018/04/Screenshot-2018-04-12-10.55.14_result.jpg" alt="" width="900" height="582" srcset="https://stackoverflow.max-everyday.com/wp-content/uploads/2018/04/Screenshot-2018-04-12-10.55.14_result.jpg 900w, https://stackoverflow.max-everyday.com/wp-content/uploads/2018/04/Screenshot-2018-04-12-10.55.14_result-600x388.jpg 600w, https://stackoverflow.max-everyday.com/wp-content/uploads/2018/04/Screenshot-2018-04-12-10.55.14_result-768x497.jpg 768w" sizes="(max-width: 900px) 100vw, 900px" /></p>
<p>Switch toolchain to swift 4.0.3:</p>
<p><img decoding="async" class="alignnone size-full wp-image-2239" src="https://stackoverflow.max-everyday.com/wp-content/uploads/2018/04/Screenshot-2018-04-12-11.26.34.jpg" alt="" width="543" height="299" /></p>
<p>&nbsp;</p>
<p>and I got new error message with crash:</p>
<blockquote>
<pre>dyld: Library not loaded: @rpath/libswiftAVFoundation.dylib
 Referenced from: /private/var/containers/Bun

dle/Application/90D24C8C-3ADD-46C7-B57E-4DA9B9B80BFE/AirWatchSDK18.3.app/Frameworks/AWSDK.framework/AWSDK
 Reason: Incompatible library version: AWSDK requires version 1.0.0 or later, but libswiftAVFoundation.dylib provides version 0.0.0</pre>
</blockquote>
<p><img loading="lazy" decoding="async" class="alignnone size-full wp-image-2240" src="https://stackoverflow.max-everyday.com/wp-content/uploads/2018/04/Screenshot-2018-04-12-10.59.32_result.jpg" alt="" width="900" height="204" srcset="https://stackoverflow.max-everyday.com/wp-content/uploads/2018/04/Screenshot-2018-04-12-10.59.32_result.jpg 900w, https://stackoverflow.max-everyday.com/wp-content/uploads/2018/04/Screenshot-2018-04-12-10.59.32_result-600x136.jpg 600w, https://stackoverflow.max-everyday.com/wp-content/uploads/2018/04/Screenshot-2018-04-12-10.59.32_result-768x174.jpg 768w" sizes="auto, (max-width: 900px) 100vw, 900px" /></p>
<p>&nbsp;</p>
<p>原因是：</p>
<p>Apple states that you can&#8217;t mix and match binaries built with different versions of Swift: <a href="https://developer.apple.com/swift/blog/?id=2" rel="nofollow">https://developer.apple.com/swift/blog/?id=2</a></p>
<p>I have two choices:</p>
<ul>
<li>1: Waiting for new SDK support xcode 9.3</li>
<li>2: down-grade to xcode 9.2</li>
</ul>
<p>&nbsp;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://stackoverflow.max-everyday.com/2018/04/module-compiled-with-swift-4-0-3-cannot-be-imported-in-swift-4-1/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Open PDF Documents in swift</title>
		<link>https://stackoverflow.max-everyday.com/2018/03/open-pdf-documents-in-swift/</link>
					<comments>https://stackoverflow.max-everyday.com/2018/03/open-pdf-documents-in-swift/#respond</comments>
		
		<dc:creator><![CDATA[max-stackoverflow]]></dc:creator>
		<pubDate>Tue, 27 Mar 2018 03:54:22 +0000</pubDate>
				<category><![CDATA[iOS筆記]]></category>
		<category><![CDATA[Swift]]></category>
		<guid isPermaLink="false">http://stackoverflow.max-everyday.com/?p=2180</guid>

					<description><![CDATA[使用下面的範例，就可以開啟  PDF 來 pre...]]></description>
										<content:encoded><![CDATA[<p>使用下面的範例，就可以開啟  PDF 來 preview 也可以 OpenIn 到其他 app 裡。</p>
<p>Obj-C 的範例：<br />
<a href="https://stackoverflow.max-everyday.com/2017/05/open-pdf-documents-in-ios/">https://stackoverflow.max-everyday.com/2017/05/open-pdf-documents-in-ios/</a></p>
<p>Swift 範例：</p>
<pre class="lang-swift prettyprint prettyprinted"><code><span class="kwd">class</span> <span class="typ">ViewController</span><span class="pun">:</span> <span class="typ">UIViewController</span><span class="pun">,</span> <span class="typ">UIDocumentInteractionControllerDelegate</span> <span class="pun">{</span>

    <span class="kwd">var</span><span class="pln"> docController</span><span class="pun">:</span><span class="typ">UIDocumentInteractionController</span><span class="pun">!</span>


    <span class="kwd">override</span> <span class="kwd">func</span><span class="pln"> viewDidLoad</span><span class="pun">()</span> <span class="pun">{</span>
        <span class="kwd">super</span><span class="pun">.</span><span class="pln">viewDidLoad</span><span class="pun">()</span>
        <span class="com">// Do any additional setup after loading the view, typically from a nib.
</span>
        <span class="kwd">if</span> <span class="kwd">let</span><span class="pln"> fileURL </span><span class="pun">=</span> <span class="typ">NSBundle</span><span class="pun">.</span><span class="pln">mainBundle</span><span class="pun">().</span><span class="pln">pathForResource</span><span class="pun">(</span><span class="str">"SamplePDF1"</span><span class="pun">,</span><span class="pln"> ofType</span><span class="pun">:</span> <span class="str">"pdf"</span><span class="pun">)</span> <span class="pun">{</span> <span class="com">// Use if let to unwrap to fileURL variable if file exists
</span><span class="pln">            docController </span><span class="pun">=</span> <span class="typ">UIDocumentInteractionController</span><span class="pun">(</span><span class="pln">URL</span><span class="pun">:</span><span class="pln"> NSURL</span><span class="pun">(</span><span class="pln">fileURLWithPath</span><span class="pun">:</span><span class="pln"> fileURL</span><span class="pun">))</span><span class="pln">

            docController</span><span class="pun">.</span><span class="pln">name </span><span class="pun">=</span><span class="pln"> NSURL</span><span class="pun">(</span><span class="pln">fileURLWithPath</span><span class="pun">:</span><span class="pln"> fileURL</span><span class="pun">).</span><span class="pln">lastPathComponent

            docController</span><span class="pun">.</span><span class="pln">delegate </span><span class="pun">=</span> <span class="kwd">self</span><span class="pln">

            docController</span><span class="pun">.</span><span class="pln">presentPreviewAnimated</span><span class="pun">(</span><span class="lit">true</span><span class="pun">)</span>
        <span class="pun">}</span>


    <span class="pun">}</span>

    <span class="kwd">func</span><span class="pln"> documentInteractionControllerViewControllerForPreview</span><span class="pun">(</span><span class="pln">controller</span><span class="pun">:</span> <span class="typ">UIDocumentInteractionController</span><span class="pun">)</span> <span class="pun">-&gt;</span> <span class="typ">UIViewController</span> <span class="pun">{</span>
        <span class="kwd">return</span> <span class="kwd">self</span>
    <span class="pun">}</span>
     <span class="kwd">func</span><span class="pln"> documentInteractionControllerDidEndPreview</span><span class="pun">(</span><span class="pln">controller</span><span class="pun">:</span> <span class="typ">UIDocumentInteractionController</span><span class="pun">)</span> <span class="pun">{</span><span class="pln">
        docController </span><span class="pun">=</span> <span class="lit">nil</span>
    <span class="pun">}</span></code></pre>
]]></content:encoded>
					
					<wfw:commentRss>https://stackoverflow.max-everyday.com/2018/03/open-pdf-documents-in-swift/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Sharing text or image with UIActivityViewController in Swift</title>
		<link>https://stackoverflow.max-everyday.com/2018/03/sharing-text-or-image-with-uiactivityviewcontroller-in-swift/</link>
					<comments>https://stackoverflow.max-everyday.com/2018/03/sharing-text-or-image-with-uiactivityviewcontroller-in-swift/#respond</comments>
		
		<dc:creator><![CDATA[max-stackoverflow]]></dc:creator>
		<pubDate>Tue, 27 Mar 2018 02:26:02 +0000</pubDate>
				<category><![CDATA[iOS筆記]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[Swift]]></category>
		<guid isPermaLink="false">http://stackoverflow.max-everyday.com/?p=2177</guid>

					<description><![CDATA[使用 swift 分享「文字」和「圖片」 在 i...]]></description>
										<content:encoded><![CDATA[<p>使用 swift 分享「文字」和「圖片」 在 iOS app.</p>
<p>source code:</p>
<hr />
<pre class="lang-swift prettyprint prettyprinted"><code><span class="kwd">import</span> <span class="typ">UIKit</span>
<span class="kwd">class</span> <span class="typ">ViewController</span><span class="pun">:</span> <span class="typ">UIViewController</span> <span class="pun">{</span>

    <span class="com">// share text
</span>    <span class="pun">@</span><span class="typ">IBAction</span> <span class="kwd">func</span><span class="pln"> shareTextButton</span><span class="pun">(_</span><span class="pln"> sender</span><span class="pun">:</span> <span class="typ">UIButton</span><span class="pun">)</span> <span class="pun">{</span>

        <span class="com">// text to share
</span>        <span class="kwd">let</span><span class="pln"> text </span><span class="pun">=</span> <span class="str">"This is some text that I want to share."</span>

        <span class="com">// set up activity view controller
</span>        <span class="kwd">let</span><span class="pln"> textToShare </span><span class="pun">=</span> <span class="pun">[</span><span class="pln"> text </span><span class="pun">]</span>
        <span class="kwd">let</span><span class="pln"> activityViewController </span><span class="pun">=</span> <span class="typ">UIActivityViewController</span><span class="pun">(</span><span class="pln">activityItems</span><span class="pun">:</span><span class="pln"> textToShare</span><span class="pun">,</span><span class="pln"> applicationActivities</span><span class="pun">:</span> <span class="lit">nil</span><span class="pun">)</span><span class="pln">
        activityViewController</span><span class="pun">.</span><span class="pln">popoverPresentationController</span><span class="pun">?.</span><span class="pln">sourceView </span><span class="pun">=</span> <span class="kwd">self</span><span class="pun">.</span><span class="pln">view </span><span class="com">// so that iPads won't crash
</span>
        <span class="com">// exclude some activity types from the list (optional)
</span><span class="pln">        activityViewController</span><span class="pun">.</span><span class="pln">excludedActivityTypes </span><span class="pun">=</span> <span class="pun">[</span> <span class="typ">UIActivityType</span><span class="pun">.</span><span class="pln">airDrop</span><span class="pun">,</span> <span class="typ">UIActivityType</span><span class="pun">.</span><span class="pln">postToFacebook </span><span class="pun">]</span>

        <span class="com">// present the view controller
</span>        <span class="kwd">self</span><span class="pun">.</span><span class="pln">present</span><span class="pun">(</span><span class="pln">activityViewController</span><span class="pun">,</span><span class="pln"> animated</span><span class="pun">:</span> <span class="lit">true</span><span class="pun">,</span><span class="pln"> completion</span><span class="pun">:</span> <span class="lit">nil</span><span class="pun">)</span>

    <span class="pun">}</span>

    <span class="com">// share image
</span>    <span class="pun">@</span><span class="typ">IBAction</span> <span class="kwd">func</span><span class="pln"> shareImageButton</span><span class="pun">(_</span><span class="pln"> sender</span><span class="pun">:</span> <span class="typ">UIButton</span><span class="pun">)</span> <span class="pun">{</span>

        <span class="com">// image to share
</span>        <span class="kwd">let</span><span class="pln"> image </span><span class="pun">=</span> <span class="typ">UIImage</span><span class="pun">(</span><span class="pln">named</span><span class="pun">:</span> <span class="str">"Image"</span><span class="pun">)</span>

        <span class="com">// set up activity view controller
</span>        <span class="kwd">let</span><span class="pln"> imageToShare </span><span class="pun">=</span> <span class="pun">[</span><span class="pln"> image</span><span class="pun">!</span> <span class="pun">]</span>
        <span class="kwd">let</span><span class="pln"> activityViewController </span><span class="pun">=</span> <span class="typ">UIActivityViewController</span><span class="pun">(</span><span class="pln">activityItems</span><span class="pun">:</span><span class="pln"> imageToShare</span><span class="pun">,</span><span class="pln"> applicationActivities</span><span class="pun">:</span> <span class="lit">nil</span><span class="pun">)</span><span class="pln">
        activityViewController</span><span class="pun">.</span><span class="pln">popoverPresentationController</span><span class="pun">?.</span><span class="pln">sourceView </span><span class="pun">=</span> <span class="kwd">self</span><span class="pun">.</span><span class="pln">view </span><span class="com">// so that iPads won't crash
</span>
        <span class="com">// exclude some activity types from the list (optional)
</span><span class="pln">        activityViewController</span><span class="pun">.</span><span class="pln">excludedActivityTypes </span><span class="pun">=</span> <span class="pun">[</span> <span class="typ">UIActivityType</span><span class="pun">.</span><span class="pln">airDrop</span><span class="pun">,</span> <span class="typ">UIActivityType</span><span class="pun">.</span><span class="pln">postToFacebook </span><span class="pun">]</span>

        <span class="com">// present the view controller
</span>        <span class="kwd">self</span><span class="pun">.</span><span class="pln">present</span><span class="pun">(</span><span class="pln">activityViewController</span><span class="pun">,</span><span class="pln"> animated</span><span class="pun">:</span> <span class="lit">true</span><span class="pun">,</span><span class="pln"> completion</span><span class="pun">:</span> <span class="lit">nil</span><span class="pun">)</span>
    <span class="pun">}</span>

<span class="pun">}</span></code></pre>
<hr />
<p>執行畫面：</p>
<p>左文字，右圖片。</p>
<p><img loading="lazy" decoding="async" class="alignnone size-full wp-image-2178" src="https://stackoverflow.max-everyday.com/wp-content/uploads/2018/03/Screenshot-2018-03-27-10.24.50.jpg" alt="" width="661" height="480" srcset="https://stackoverflow.max-everyday.com/wp-content/uploads/2018/03/Screenshot-2018-03-27-10.24.50.jpg 661w, https://stackoverflow.max-everyday.com/wp-content/uploads/2018/03/Screenshot-2018-03-27-10.24.50-600x436.jpg 600w" sizes="auto, (max-width: 661px) 100vw, 661px" /></p>
]]></content:encoded>
					
					<wfw:commentRss>https://stackoverflow.max-everyday.com/2018/03/sharing-text-or-image-with-uiactivityviewcontroller-in-swift/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>[iOS] Fatal error: Call of deleted method</title>
		<link>https://stackoverflow.max-everyday.com/2018/03/ios-fatal-error-call-of-deleted-method/</link>
					<comments>https://stackoverflow.max-everyday.com/2018/03/ios-fatal-error-call-of-deleted-method/#respond</comments>
		
		<dc:creator><![CDATA[max-stackoverflow]]></dc:creator>
		<pubDate>Wed, 14 Mar 2018 09:29:05 +0000</pubDate>
				<category><![CDATA[iOS筆記]]></category>
		<category><![CDATA[Debug]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[Swift]]></category>
		<guid isPermaLink="false">http://stackoverflow.max-everyday.com/?p=2129</guid>

					<description><![CDATA[這個錯誤很神奇，變數內容都有，但是 xcode ...]]></description>
										<content:encoded><![CDATA[<p>這個錯誤很神奇，變數內容都有，但是 xcode 會報錯誤。</p>
<p><img loading="lazy" decoding="async" class="alignnone size-full wp-image-2130" src="https://stackoverflow.max-everyday.com/wp-content/uploads/2018/03/Screenshot-2018-03-14-17.16.07.jpg" alt="" width="930" height="405" srcset="https://stackoverflow.max-everyday.com/wp-content/uploads/2018/03/Screenshot-2018-03-14-17.16.07.jpg 930w, https://stackoverflow.max-everyday.com/wp-content/uploads/2018/03/Screenshot-2018-03-14-17.16.07-600x261.jpg 600w, https://stackoverflow.max-everyday.com/wp-content/uploads/2018/03/Screenshot-2018-03-14-17.16.07-768x334.jpg 768w" sizes="auto, (max-width: 930px) 100vw, 930px" /></p>
<p>我的解法很簡單，因為可以透過 String(describing: your_object) 把物件變成字串，所以直接判斷 String 的內容即可。source code:</p>
<blockquote>
<pre class="p1"><span class="s1">let</span> preventCopyPaste: <span class="s2">Bool</span>? = restrictionsPayloadString.<span class="s2">contains</span>(<span class="s3">"- preventCopyPaste&lt;Bool&gt;: true"</span>)</pre>
</blockquote>
<p>&nbsp;</p>
<p>實際上 restrictionsPayload 物件內容：</p>
<pre> restrictionsPayload: 
 Class Type: RestrictionsPayload
 - preventCopyPaste&lt;Bool&gt;: true
 - restrictDocumentToApps&lt;Bool&gt;: true
 - allowedApplications&lt;Array&lt;String&gt;&gt;: []
 - printingEnabled&lt;Bool&gt;: false
 - enableDataLossPrevention&lt;Bool&gt;: true
 - enableWatermark&lt;Bool&gt;: true
 - watermarkOverlay&lt;Optional&lt;String&gt;&gt;: Optional("中華電信 max")
 - preventCustomKeyboards&lt;Bool&gt;: false
 - enableMailComposing&lt;Bool&gt;: false
 - enableLocationReporting&lt;Bool&gt;: true
 - enableDataBackup&lt;Bool&gt;: false
 - enableCameraAccess&lt;Bool&gt;: true</pre>
<p>&nbsp;</p>
<hr />
<p>試了以下的解法，完成無作用</p>
<p>modify schema:</p>
<p><img loading="lazy" decoding="async" class="alignnone size-full wp-image-2133" src="https://stackoverflow.max-everyday.com/wp-content/uploads/2018/03/eUXJE.png" alt="" width="866" height="471" srcset="https://stackoverflow.max-everyday.com/wp-content/uploads/2018/03/eUXJE.png 866w, https://stackoverflow.max-everyday.com/wp-content/uploads/2018/03/eUXJE-600x326.png 600w, https://stackoverflow.max-everyday.com/wp-content/uploads/2018/03/eUXJE-768x418.png 768w" sizes="auto, (max-width: 866px) 100vw, 866px" /></p>
<p>In this configuration, if your project build settings does not allow testability in this release mode then setting custom breakpoints or app crashes do not let you debug properly and you are served the <code>fatal error: call of deleted method</code></p>
<p>&nbsp;</p>
<p>Check the project build settings for &#8220;<strong>testability</strong>&#8220;.</p>
<p><img loading="lazy" decoding="async" class="alignnone size-full wp-image-2134" src="https://stackoverflow.max-everyday.com/wp-content/uploads/2018/03/WcL8G.png" alt="" width="575" height="168" /></p>
<p>&nbsp;</p>
<p>Ensure it is &#8220;Yes&#8221; for the build configuration you are testing under.</p>
<p>In my case, I temporarily enabled <strong>testability</strong> for <strong>Release</strong> by making it <strong>Yes</strong>.</p>
<p>from: <a href="https://stackoverflow.com/questions/45051325/ios-swift-how-to-debug-sigabrt-fatal-error-call-of-deleted-method-from-a-coc">https://stackoverflow.com/questions/45051325/ios-swift-how-to-debug-sigabrt-fatal-error-call-of-deleted-method-from-a-coc</a></p>
<hr />
<p>附上可能有問題的 Object</p>
<pre class="p1">@objc(AWProfile) public class Profile : NSObject {

<span class="Apple-converted-space">    </span>/** @name Generic Profile Information */

<span class="Apple-converted-space">    </span>public private(set) var displayName: String?

<span class="Apple-converted-space">    </span>public private(set) var comments: String?

<span class="Apple-converted-space">    </span>public private(set) var identifier: String?

<span class="Apple-converted-space">    </span>public private(set) var organization: String?

<span class="Apple-converted-space">    </span>public private(set) var uuid: String?

<span class="Apple-converted-space">    </span>public private(set) var version: Int?

<span class="Apple-converted-space">    </span>public internal(set) var profileType: AWSDK.AWSDK.ConfigurationProfileType

<span class="Apple-converted-space">    </span>public private(set) var isSDKProfile: Bool

<span class="Apple-converted-space">    </span>public private(set) var timeStamp: TimeInterval?

<span class="Apple-converted-space">    </span>public private(set) var dictionaryToStore: [String : Any]

<span class="Apple-converted-space">    </span>/** @name SDK Profile Payloads */

<span class="Apple-converted-space">    </span>public private(set) var geofencePayload: AWSDK.GeofencePayload?

<span class="Apple-converted-space">    </span>public private(set) var analyticsPayload: AWSDK.AnalyticsPayload?

<span class="Apple-converted-space">    </span>public private(set) var restrictionsPayload: AWSDK.RestrictionsPayload?

<span class="Apple-converted-space">    </span>public private(set) var compliancePayload: AWSDK.CompliancePayload?

<span class="Apple-converted-space">    </span>public private(set) var authenticationPayload: AWSDK.AuthenticationPayload?

<span class="Apple-converted-space">    </span>public private(set) var brandingPayload: AWSDK.BrandingPayload?

<span class="Apple-converted-space">    </span>public private(set) var breezyPayload: AWSDK.BreezyPayload?

<span class="Apple-converted-space">    </span>public private(set) var customPayload: AWSDK.CustomPayload?

<span class="Apple-converted-space">    </span>public private(set) var offlineAccessPayload: AWSDK.OfflineAccessPayload?

<span class="Apple-converted-space">    </span>public private(set) var networkAccessPayload: AWSDK.NetworkAccessPayload?

<span class="Apple-converted-space">    </span>public private(set) var contentFilteringPayload: AWSDK.ContentFilteringPayload?

<span class="Apple-converted-space">    </span>public private(set) var websiteFilteringPayload: AWSDK.WebsiteFilteringPayload?

<span class="Apple-converted-space">    </span>@objc(initWithInfo:) public init(info: [String : Any])

}

extension Profile {

<span class="Apple-converted-space">    </span>@objc public func toDictionary() -&gt; [String : Any]

}

extension Profile {

<span class="Apple-converted-space">    </span>@objc override public func isEqual(_ object: Any?) -&gt; Bool

}

extension Profile {

<span class="Apple-converted-space">    </span>@objc override public var description: String { get }

}

extension Profile {

<span class="Apple-converted-space">    </span>public class func fromData(_ data: Data) -&gt; AWSDK.Profile?

<span class="Apple-converted-space">    </span>public func toData() -&gt; Data?

}</pre>
<hr />
<pre class="p1">@objc(AWRestrictionsPayload) public class RestrictionsPayload : AWSDK.ProfilePayload {

<span class="Apple-converted-space">    </span>/** A boolean indicating if Copy and Cut actions are allowed. */

<span class="Apple-converted-space">    </span>public fileprivate(set) var preventCopyPaste: Bool

<span class="Apple-converted-space">    </span>/** A boolean indicating if Copy and Cut actions are allowed. */

<span class="Apple-converted-space">    </span>@available(swift, deprecated: 6.0, message: "preventCopyAndCut is deprecated, use preventCopyPaste instead")

<span class="Apple-converted-space">    </span>public fileprivate(set) var preventCopyAndCut: Bool

<span class="Apple-converted-space">    </span>/** A boolean indicating whether to only allow open document in allowed list of app */

<span class="Apple-converted-space">    </span>public fileprivate(set) var restrictDocumentToApps: Bool

<span class="Apple-converted-space">    </span>/** A list of Apps that're allowed to open documents */

<span class="Apple-converted-space">    </span>public fileprivate(set) var allowedApplications: [String]

<span class="Apple-converted-space">    </span>/** A boolean indicating if printing is allowed. */

<span class="Apple-converted-space">    </span>public fileprivate(set) var printingEnabled: Bool

<span class="Apple-converted-space">    </span>/** A boolean indicating if data loss prevention is enabled. */

<span class="Apple-converted-space">    </span>public fileprivate(set) var enableDataLossPrevention: Bool

<span class="Apple-converted-space">    </span>/** A boolean indicating if watermark should be displayed on content that has watermark. */

<span class="Apple-converted-space">    </span>public fileprivate(set) var enableWatermark: Bool

<span class="Apple-converted-space">    </span>/** The string that indicate the watermark overlay on the content. */

<span class="Apple-converted-space">    </span>public fileprivate(set) var watermarkOverlay: String?

<span class="Apple-converted-space">    </span>public fileprivate(set) var enableMailComposing: Bool

<span class="Apple-converted-space">    </span>public fileprivate(set) var enableLocationReporting: Bool

<span class="Apple-converted-space">    </span>public fileprivate(set) var enableDataBackup: Bool

<span class="Apple-converted-space">    </span>public fileprivate(set) var enableCameraAccess: Bool

<span class="Apple-converted-space">    </span>override public class func payloadType() -&gt; String

}</pre>
]]></content:encoded>
					
					<wfw:commentRss>https://stackoverflow.max-everyday.com/2018/03/ios-fatal-error-call-of-deleted-method/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>[iOS] Error: dyld: Library not loaded: @rpath/libswiftAVFoundation.dylib</title>
		<link>https://stackoverflow.max-everyday.com/2018/03/ios-error-dyld-library-not-loaded-rpath-libswiftavfoundation-dylib/</link>
					<comments>https://stackoverflow.max-everyday.com/2018/03/ios-error-dyld-library-not-loaded-rpath-libswiftavfoundation-dylib/#respond</comments>
		
		<dc:creator><![CDATA[max-stackoverflow]]></dc:creator>
		<pubDate>Tue, 13 Mar 2018 10:00:58 +0000</pubDate>
				<category><![CDATA[iOS筆記]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[Swift]]></category>
		<guid isPermaLink="false">http://stackoverflow.max-everyday.com/?p=2123</guid>

					<description><![CDATA[在整合 AirWatch Swift SDK 但...]]></description>
										<content:encoded><![CDATA[<p>在整合 AirWatch Swift SDK 但是透過 Objective-C 來開發，會遇到這一個 Error, 程式會 Crash.</p>
<p>解法：</p>
<p>updating the Build Setting</p>
<p>Always Embed Swift Standard Libraries to Yes</p>
<p>Try to do clean, build and then run the project.</p>
<p><img loading="lazy" decoding="async" class="alignnone size-full wp-image-2124" src="https://stackoverflow.max-everyday.com/wp-content/uploads/2018/03/Screenshot-2018-03-13-16.32.02.jpg" alt="" width="1744" height="594" srcset="https://stackoverflow.max-everyday.com/wp-content/uploads/2018/03/Screenshot-2018-03-13-16.32.02.jpg 1744w, https://stackoverflow.max-everyday.com/wp-content/uploads/2018/03/Screenshot-2018-03-13-16.32.02-600x204.jpg 600w, https://stackoverflow.max-everyday.com/wp-content/uploads/2018/03/Screenshot-2018-03-13-16.32.02-768x262.jpg 768w, https://stackoverflow.max-everyday.com/wp-content/uploads/2018/03/Screenshot-2018-03-13-16.32.02-1024x349.jpg 1024w" sizes="auto, (max-width: 1744px) 100vw, 1744px" /></p>
<p>&nbsp;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://stackoverflow.max-everyday.com/2018/03/ios-error-dyld-library-not-loaded-rpath-libswiftavfoundation-dylib/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>[iOS] Pass optional block or closure to a function in Swift</title>
		<link>https://stackoverflow.max-everyday.com/2018/02/ios-pass-optional-block-or-closure-to-a-function-in-swift/</link>
					<comments>https://stackoverflow.max-everyday.com/2018/02/ios-pass-optional-block-or-closure-to-a-function-in-swift/#respond</comments>
		
		<dc:creator><![CDATA[max-stackoverflow]]></dc:creator>
		<pubDate>Tue, 13 Feb 2018 07:04:25 +0000</pubDate>
				<category><![CDATA[iOS筆記]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[Swift]]></category>
		<guid isPermaLink="false">http://stackoverflow.max-everyday.com/?p=2065</guid>

					<description><![CDATA[古時候objective-c 寫法： - (vo...]]></description>
										<content:encoded><![CDATA[<p>古時候objective-c 寫法：</p>
<pre>- (void)hardProcessingWithString:(NSString *)input withCompletion:(void (^)(NSString *result))block;

[object hardProcessingWithString:@"commands" withCompletion:^(NSString *result){
	NSLog(result);
}];</pre>
<hr />
<p>swift 寫法：</p>
<pre>func hardProcessingWithString(input: String, completion: <span style="color: #ff0000;">(result: String) -&gt; Void</span>) {
	...
	completion("we finished!")
}</pre>
<p>加入紅色框框處就做完了，結束，在爸爸的主程式準備一個</p>
<pre class="p1"><span class="Apple-converted-space">    </span><span class="s1">func</span> imageUploadComplete(ret: <span class="s2">String</span>) {

<span class="Apple-converted-space">        </span><span class="s2">print</span>(<span class="s3">"Hello:"</span> + ret)

<span class="Apple-converted-space">    </span>}</pre>
<p>在副程式存取 completion:</p>
<pre class="p1">completion(dataString!)</pre>
]]></content:encoded>
					
					<wfw:commentRss>https://stackoverflow.max-everyday.com/2018/02/ios-pass-optional-block-or-closure-to-a-function-in-swift/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
