一: 申請微信小程序NFC的URL Scheme
直達(dá)鏈接:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/NFC.html
二: 換起NFC功能
@property (strong, nonatomic) NFCTagReaderSession *session;
if (NFCTagReaderSession.readingAvailable == NO)
[GHLoadingView showPopViewMessage:@"該機(jī)型不支持NFC功能!" success:NO andDismissTime:0.5];
return;
}
self.session = [[NFCTagReaderSession alloc] initWithPollingOption:(NFCPollingISO14443 | NFCPollingISO15693 | NFCPollingISO15693) delegate:self queue:dispatch_get_main_queue()];
self.session.alertMessage = @"查找卡片,請將卡片靠近手機(jī)";
[self.session beginSession]; //開始識別 彈出識別提示框
三: 寫入數(shù)據(jù)
#pragma mark --- NFCTagReaderSessionDelegate ---
- (void)tagReaderSession:(NFCTagReaderSession *)session didDetectTags:(NSArray<__kindof id<NFCTag>> *)tags API_AVAILABLE(ios(13.0)) {
id<NFCMiFareTag> cuurentTag = [tags firstObject];
id<NFCMiFareTag> mifareTag = [cuurentTag asNFCMiFareTag];
if (mifareTag.type != NFCTagTypeMiFare){
[self invalidateSessionWitgMsg:@"NFC類型不可用" success:NO];
return;
}
// 先建立連接
MJWeakSelf
[self.session connectToTag:mifareTag completionHandler:^(NSError * _Nullable error) {
// 獲取卡片狀態(tài):判斷是否可以寫入
if (error){
[weakSelf invalidateSessionWitgMsg:@"NFC連接失敗" success:NO];
return;
}
[cuurentTag queryNDEFStatusWithCompletionHandler:^(NFCNDEFStatus status, NSUInteger capacity, NSError * _Nullable error) {
// 寫入
if (status != NFCNDEFStatusReadWrite) {
[weakSelf invalidateSessionWitgMsg:@"NFC無法寫入" success:NO];
return;
}
NSMutableArray *nfcArray = [NSMutableArray arrayWithCapacity:2];
{
NSString *type = @"U";
NSData *typeData = [type dataUsingEncoding:NSUTF8StringEncoding];
NSString *identifier = @"1001";
NSData *identifierData = [identifier dataUsingEncoding:NSUTF8StringEncoding];
NSString *payloadStr = @"URL Scheme";
NSData *payloadData = [payloadStr dataUsingEncoding:NSUTF8StringEncoding];
Byte byte[] = {0x00};
NSData *data = [NSData dataWithBytes:byte length:1];
NSMutableData *tmpData = [[NSMutableData alloc] init];
[tmpData appendData:data];
[tmpData appendData:payloadData];
NFCNDEFPayload *NDEFPayload = [[NFCNDEFPayload alloc] initWithFormat:NFCTypeNameFormatNFCWellKnown type:typeData identifier:identifierData payload:tmpData];
[nfcArray addObject:NDEFPayload];
}
{
NSString *type = @"android.com:pkg";
NSData *typeData = [type dataUsingEncoding:NSUTF8StringEncoding];
NSString *identifier = @"1001";
NSData *identifierData = [identifier dataUsingEncoding:NSUTF8StringEncoding];
NSString *payloadStr = @"com.tencent.mm";
NSData *payloadData = [payloadStr dataUsingEncoding:NSUTF8StringEncoding];
NFCNDEFPayload *NDEFPayload = [[NFCNDEFPayload alloc] initWithFormat:NFCTypeNameFormatNFCExternal type:typeData identifier:identifierData payload:payloadData];
[nfcArray addObject:NDEFPayload];
}
NFCNDEFMessage *message = [[NFCNDEFMessage alloc] initWithNDEFRecords:nfcArray];
[cuurentTag writeNDEF:message completionHandler:^(NSError * _Nullable error) {
NSString *msg = error?@"NFC寫入失敗":@"NFC寫入成功";
[weakSelf invalidateSessionWitgMsg:msg success:error==nil];
}];
}];
}];
}
四: 參數(shù)傳遞
如果想要實(shí)現(xiàn)NFC喚起小程序打開指定界面,且傳入?yún)?shù)就得在服務(wù)端實(shí)現(xiàn)請求scheme
接口參數(shù):
NSDictionary *dic = @{
@"jump_wxa":@{
@"query":@"code=xxx&p=xxx",
@"env_version":@"develop",
@"path":@"page/index"
},
@"model_id":model_id,
@"sn":@"xxxxxxx"
};
query:傳入你想傳的參數(shù),必須符合url參數(shù)規(guī)則(xx=xx&xx=xx)
env_version:換起的小程序環(huán)境版本,
path:喚起的小程序指定頁面路徑
sn:設(shè)備的sn,可以根據(jù)實(shí)際情況傳入,沒有限制,比如傳一個當(dāng)前任務(wù)的id,同一個sn只會生成唯一的scheme
注意:在切換env_version環(huán)境的時候必須也更換sn拼接規(guī)則,不然同一個sn在開發(fā)環(huán)境生成的scheme在正式環(huán)境不會重新生成,這樣會喚起開發(fā)版的小程序.sn的拼接最好寫成:env_version+ID