iMessage extension 是ios10才能支持的新特性,發布于2016年2月的WWDC蘋果發布會官方資料,有兩種方式創建,第一可以單獨寫一個iMessage application 發布到iMessage App Store(在iMessage app看到的那個App Store),但是這樣只能在iMessage App Store上看到,在main App Store(平時使用的app store) 上看不到,第二種可以在原有的項目中加入iMessage extension,這樣在兩處的app store 都可以看到,無論從哪個app store安裝,安裝其中一個,另一個就會附帶被安裝,因此在app中加入iMessage extension對應用的推廣有一定的幫助,單獨發布imessage extension并沒有優勢(除非是做表情)。下面先寫一個demo,然后說一下遇到的坑。
我用的是xcode8.2.1,左上角file-->new-->target-->iMessage extension,創建完成后,在MessagesViewController中自定義一些界面,具體怎么做很簡單,貼一篇別人寫的文章iOS10中Messages獨立應用與擴展插件詳析,講的很詳細了,現在我主要講在主app中加入imessage extension和從imessage 跳到主app注意事項。
1.使用URLSchemes的方式跳轉到主app。在主app中定義一個URLSchemes:選中主app的TARGET-->info-->URL Type,添加一個URL Type,identify隨便保證唯一就好,URL Schemes也保證唯一,比如extensionURLSchemes。
2.在MessagesViewController類中,重寫幾個方法:
? -(void)didSelectMessage:(MSMessage *)message conversation:(MSConversation *)conversation{
[self.extensionContext openURL:[NSURL URLWithString:[NSString stringWithFormat:@"extensionURLSchemes://"]] completionHandler:nil];
}
其中extensionURLSchemes后的冒號和斜杠一定要有,當點擊imesage時就能跳到主app了,但是第二次點擊同一條imessage時就跳不了,原因是第一次跳過去后,imessage app就已經退出了(很容易就退出了,界面消失就退出),因此第二次點擊imessage時不會調用-(void)didSelectMessage:(MSMessage *)message conversation:(MSConversation *)conversation方法,而是調用-(void)willBecomeActiveWithConversation:(MSConversation *)conversation方法,因此也要在這個方法中做跳轉邏輯
(void)willBecomeActiveWithConversation:(MSConversation *)conversation{
if (conversation.selectedMessage) {
[self.extensionContext openURL:[NSURL URLWithString:[NSString stringWithFormat:@"extensionURLSchemes://"]] completionHandler:nil];
}
}
3.IMessage extension 和主app通信一般使用NSUserDefaults的方式:capabilityes-->App Group,添加一個group,名字唯一即可,并且鉤上,在IMessage extension中也加入到同一個group中,現在兩個target在同一個group中可以通信了,比如group的名字是extensionGroup,比如可以這樣存取數據
NSUserDefaults *group = [[NSUserDefaults alloc]initWithSuiteName:@"extensionGroup"];
[group setObject:@"我的extension" forKey:@"groupKey"];//存值
[group synchronize];//一定要記得
NSString *value = [group objectForKey:@"groupKey"];//取值
4.IMessage extension 可以和主app共享代碼:選擇.m文件,在右邊欄target membership中勾選上,所有關聯到的文件都必須選上;還可以通過 frameWork共享代碼:file-->new-->target-->cocoa touch framework ,然后選擇新建的framework,在Build Phase-->compile sources中加入需要共享的代碼,然后在別的target的Build Phase-->compile sources中刪掉加入framework的.m文件,在Build Phase-->Link Binary With Binaries 中加入framework,就可以共享代碼了,但是cocoa touch framework是iOS8才有的,如果主app支持版本低于iOS8,最好不要用cocoa touch framework做代共享,還有pod進來的第三方框架,直接
target '我是extensiontarget' do
pod? 'SDWebImageWebP',? '8.0.12'
.........
end
這樣就可以了,上面'我是extensiontarget'不能是cocoa touch framework
大概就是這么多,有什么問題可以加我QQ交流:1529075810