1. 程式人生 > >iOS 10 Today 的適配

iOS 10 Today 的適配

NCWidgetProviding

- (void)widgetActiveDisplayModeDidChange:(NCWidgetDisplayMode)activeDisplayMode withMaximumSize:(CGSize)maxSize NS_AVAILABLE_IOS(10_0);

這是iOS10新出的API,today多了展開和摺疊兩種模式,當模組發生改變之後就會呼叫這個方法。

activeDisplayMode 為NCWidgetDisplayModeCompact 、NCWidgetDisplayModeExpanded, maxSize為today的最大支援的size。

activeDisplayMode還可以通過self.extensionContext.widgetActiveDisplayMode獲得

maxSize可以通過[self.extensionContext widgetMaximumSizeForDisplayMode:NCWidgetDisplayModeExpanded]獲得。

當然 [self.extensionContext widgetMaximumSizeForDisplayMode:NCWidgetDisplayModeCompact]獲得摺疊下的最小支援size。

widgetActiveDisplayMode是一個只讀變數,與此還有一個widgetLargestAvailableDisplayMode屬性,NCWidgetDisplayModeCompact 表示不支援摺疊和展開,只能是摺疊模式了,需要設定為

self.extensionContext.widgetLargestAvailableDisplayMode = NCWidgetDisplayModeExpanded;

才支援摺疊和展開

最小支援

iPhone5 iPhone6 iPhone6 P
豎屏 304(width,就是兩邊為8),110(height) 359,110 398,110
橫屏 420,110 420,110 420,110

最大支援

iPhone5 iPhone6 iPhone6 P
豎屏 [鎖屏進入],(width)304,(height)528;[通知欄下拉]304,396 [鎖屏進入]359,616;[通知欄下拉]359,528 [鎖屏進入]398,660;[通知欄下拉]398,572
橫屏 [鎖屏進入]420,高度待測試;[通知欄下拉]420,176 [鎖屏進入]420,高度待測試;[通知欄下拉]420,220 [鎖屏進入]420,352;[通知欄下拉]420,264

注意的是iOS10 today有三個入口就是,鎖屏,iPhone home的第一個tab頁面,通知欄下拉,前兩個對高度的限制是一樣的且會寬鬆一些,通知欄下拉則對高度限制嚴格些,一般來說不能超出當前螢幕顯示範圍。

today佈局

today 預設是 storyboard佈局的,如果想要使用程式碼佈局。需要把today中Info.plist的

<key>NSExtension</key>
<dict>
<key>NSExtensionMainStoryboard</key>
<string>MainInterface</string>
<key>NSExtensionPointIdentifier</key>
<string>com.apple.widget-extension</string>
</dict>

修改為

<key>NSExtension</key>
<dict>
<key>NSExtensionMainStoryboard</key>
<string> NSExtensionPointIdentifier</string>
<key>NSExtensionPointIdentifier</key>
<string>com.apple.widget-extension</string>
</dict>

調起app

通過

[self.extensionContext openURL:[NSURL URLWithString:urlString] completionHandler:^(BOOL success) { 
NSLog(@"open url result:%d",success); 
}];

就可以調起app了,

然後在app端的appdelegate裡面下面方法接收。

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

資料共享

app 和 today都有各自的空間,但也有共享的空間group。

通過NSUserDefaults共享資料

NSUserDefaults *shared = [[NSUserDefaults alloc] initWithSuiteName:@"group.c
om.xxx"];

可以通過這個userdefaults讀寫group的資料,suiteName是需要在capabilities裡面配置的,userdefaults和filemanager是共用的。

NSURL *containerURL = [[NSFileManager defaultManager] containerURLForSecuri
tyApplicationGroupIdentifier:@"group.com.xxx"]; 

而NSFileManager則可以通過上面的url進行讀寫。

程式碼共享

如果一個檔案需要在today和app內都用的話,則只要.m檔案的targetmembership勾選兩個就可以了。

如果 在你的工程裡面有自己的其他 framework target。 如果你想用這個target裡面檔案,則可以在這個target的general裡面勾選allow app extension API only。

如果對於一個類app和extension都可以呼叫,但是你其中的某些程式碼塊想區分。

你可以在today target裡面新增巨集定義 ,Build Settings - Preprocessor Macros下面新增

TARGET_IS_EXTENSION=1

使用的話就是

#ifndef TARGET_IS_EXTENSION

#endif

iOS 10 支援的裝置

iPhone 7
iPhone 7 Plus
iPhone 6s
iPhone 6s Plus
iPhone 6
iPhone 6 Plus
iPhone SE
iPhone 5s
iPhone 5c
iPhone 5

iPad Pro 12.9 英寸
iPad Pro 9.7 英寸
iPad Air 2
iPad Air
iPad 第四代
iPad mini 4
iPad mini 3
iPad mini 2

iPod touch 第六代